ETH Price: $3,385.08 (+1.12%)

Contract

0xBD7e92Cf6F857be8541FCa6abfB72aeF8e16c307
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Prodigy Bot (PRO) (@$0.2156)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve214600282024-12-22 19:08:4732 hrs ago1734894527IN
Prodigy Bot: PRO Token
0 ETH0.000166946.36699251
Transfer214554852024-12-22 3:54:5947 hrs ago1734839699IN
Prodigy Bot: PRO Token
0 ETH0.000408257.34981088
Transfer214188062024-12-17 0:55:477 days ago1734396947IN
Prodigy Bot: PRO Token
0 ETH0.0006643711.95828983
Approve213886012024-12-12 19:45:3511 days ago1734032735IN
Prodigy Bot: PRO Token
0 ETH0.0017557937.81432662
Approve213701032024-12-10 5:45:4713 days ago1733809547IN
Prodigy Bot: PRO Token
0 ETH0.0006133413.20951208
Transfer213692432024-12-10 2:52:3514 days ago1733799155IN
Prodigy Bot: PRO Token
0 ETH0.0012823123.08560916
Approve213622742024-12-09 3:32:3515 days ago1733715155IN
Prodigy Bot: PRO Token
0 ETH0.00044629.67226031
Transfer213622512024-12-09 3:27:5915 days ago1733714879IN
Prodigy Bot: PRO Token
0 ETH0.000575169.5349558
Approve213220122024-12-03 12:35:2320 days ago1733229323IN
Prodigy Bot: PRO Token
0 ETH0.0012056726
Approve213219852024-12-03 12:29:5920 days ago1733228999IN
Prodigy Bot: PRO Token
0 ETH0.0011732125.3
Approve213137742024-12-02 8:56:4721 days ago1733129807IN
Prodigy Bot: PRO Token
0 ETH0.0010788123.38544063
Approve213002702024-11-30 11:43:3523 days ago1732967015IN
Prodigy Bot: PRO Token
0 ETH0.000397648.56412248
Approve212996572024-11-30 9:39:4723 days ago1732959587IN
Prodigy Bot: PRO Token
0 ETH0.000414928.99428496
Transfer212981382024-11-30 4:34:3523 days ago1732941275IN
Prodigy Bot: PRO Token
0 ETH0.000370036.66182295
Approve212948002024-11-29 17:21:2324 days ago1732900883IN
Prodigy Bot: PRO Token
0 ETH0.0005547320.90827159
Approve212926722024-11-29 10:11:3524 days ago1732875095IN
Prodigy Bot: PRO Token
0 ETH0.0005986912.89409423
Approve212926712024-11-29 10:11:2324 days ago1732875083IN
Prodigy Bot: PRO Token
0 ETH0.0004675610.06993002
Approve212760102024-11-27 2:09:4727 days ago1732673387IN
Prodigy Bot: PRO Token
0 ETH0.000433879.35639025
Approve212759732024-11-27 2:02:2327 days ago1732672943IN
Prodigy Bot: PRO Token
0 ETH0.0005532411.91521768
Transfer212759402024-11-27 1:55:4727 days ago1732672547IN
Prodigy Bot: PRO Token
0 ETH0.000542299.76505442
Approve212577532024-11-24 12:58:3529 days ago1732453115IN
Prodigy Bot: PRO Token
0 ETH0.000735615.86303802
Approve212246012024-11-19 21:54:4734 days ago1732053287IN
Prodigy Bot: PRO Token
0 ETH0.0008287417.87625848
Transfer211742062024-11-12 21:11:2341 days ago1731445883IN
Prodigy Bot: PRO Token
0 ETH0.0013584735.35665552
Approve211535602024-11-10 0:03:4744 days ago1731197027IN
Prodigy Bot: PRO Token
0 ETH0.0005345820.14854349
Approve211523892024-11-09 20:08:5944 days ago1731182939IN
Prodigy Bot: PRO Token
0 ETH0.0006584814.2
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
213323822024-12-04 23:20:4719 days ago1733354447
Prodigy Bot: PRO Token
0.00642313 ETH
213323822024-12-04 23:20:4719 days ago1733354447
Prodigy Bot: PRO Token
0.00642313 ETH
213220222024-12-03 12:37:2320 days ago1733229443
Prodigy Bot: PRO Token
0.00660215 ETH
213220222024-12-03 12:37:2320 days ago1733229443
Prodigy Bot: PRO Token
0.00660215 ETH
213219882024-12-03 12:30:3520 days ago1733229035
Prodigy Bot: PRO Token
0.00679218 ETH
213219882024-12-03 12:30:3520 days ago1733229035
Prodigy Bot: PRO Token
0.00679218 ETH
213096042024-12-01 18:58:4722 days ago1733079527
Prodigy Bot: PRO Token
0.00690024 ETH
213096042024-12-01 18:58:4722 days ago1733079527
Prodigy Bot: PRO Token
0.00690024 ETH
212948162024-11-29 17:24:3524 days ago1732901075
Prodigy Bot: PRO Token
0.00663875 ETH
212948162024-11-29 17:24:3524 days ago1732901075
Prodigy Bot: PRO Token
0.00663875 ETH
212760122024-11-27 2:10:1127 days ago1732673411
Prodigy Bot: PRO Token
0.00661852 ETH
212760122024-11-27 2:10:1127 days ago1732673411
Prodigy Bot: PRO Token
0.00661852 ETH
212607152024-11-24 22:53:4729 days ago1732488827
Prodigy Bot: PRO Token
0.00673802 ETH
212607152024-11-24 22:53:4729 days ago1732488827
Prodigy Bot: PRO Token
0.00673802 ETH
212577552024-11-24 12:58:5929 days ago1732453139
Prodigy Bot: PRO Token
0.0068245 ETH
212577552024-11-24 12:58:5929 days ago1732453139
Prodigy Bot: PRO Token
0.0068245 ETH
211633572024-11-11 8:50:1142 days ago1731315011
Prodigy Bot: PRO Token
0.00683074 ETH
211633572024-11-11 8:50:1142 days ago1731315011
Prodigy Bot: PRO Token
0.00683074 ETH
211523942024-11-09 20:09:5944 days ago1731182999
Prodigy Bot: PRO Token
0.00714299 ETH
211523942024-11-09 20:09:5944 days ago1731182999
Prodigy Bot: PRO Token
0.00714299 ETH
210877612024-10-31 19:37:3553 days ago1730403455
Prodigy Bot: PRO Token
0.00729089 ETH
210877612024-10-31 19:37:3553 days ago1730403455
Prodigy Bot: PRO Token
0.00729089 ETH
210106852024-10-21 1:31:5964 days ago1729474319
Prodigy Bot: PRO Token
0.00705433 ETH
210106852024-10-21 1:31:5964 days ago1729474319
Prodigy Bot: PRO Token
0.00705433 ETH
209950512024-10-18 21:10:5966 days ago1729285859
Prodigy Bot: PRO Token
0.00675681 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ProdigyBot

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-31
*/

/**
 * This is the utility token for the Prodigy Bot, a Telegram multichain trading tool suite.
 *
 * https://prodigybot.io/
 * https://t.me/ProdigySniper/
 * https://t.me/ProdigySniperBot/
 *
 * $$$$$$$\                            $$\ $$\                     $$\                  $$\     
 * $$  __$$\                           $$ |\__|                    $$ |                 $$ |    
 * $$ |  $$ | $$$$$$\   $$$$$$\   $$$$$$$ |$$\  $$$$$$\  $$\   $$\ $$$$$$$\   $$$$$$\ $$$$$$\   
 * $$$$$$$  |$$  __$$\ $$  __$$\ $$  __$$ |$$ |$$  __$$\ $$ |  $$ |$$  __$$\ $$  __$$\\_$$  _|  
 * $$  ____/ $$ |  \__|$$ /  $$ |$$ /  $$ |$$ |$$ /  $$ |$$ |  $$ |$$ |  $$ |$$ /  $$ | $$ |    
 * $$ |      $$ |      $$ |  $$ |$$ |  $$ |$$ |$$ |  $$ |$$ |  $$ |$$ |  $$ |$$ |  $$ | $$ |$$\ 
 * $$ |      $$ |      \$$$$$$  |\$$$$$$$ |$$ |\$$$$$$$ |\$$$$$$$ |$$$$$$$  |\$$$$$$  | \$$$$  |
 * \__|      \__|       \______/  \_______|\__| \____$$ | \____$$ |\_______/  \______/   \____/ 
 *                                             $$\   $$ |$$\   $$ |                             
 *                                             \$$$$$$  |\$$$$$$  |                             
 *                                              \______/  \______/                              
 */

// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;

/**
 * @notice Simple ERC20 implementation from Solady.
 * @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC20.sol)
 * @notice EIP-2612 has been removed due to concerns of userbase not being familiar with the security risks of signatures.
 * @notice Hooks removed since they could be called twice during tax events.
 * @notice Burn is removed as there is no intended use.
 */
abstract contract ERC20 {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The total supply has overflowed.
    error TotalSupplyOverflow();

    /// @dev The allowance has overflowed.
    error AllowanceOverflow();

    /// @dev The allowance has underflowed.
    error AllowanceUnderflow();

    /// @dev Insufficient balance.
    error InsufficientBalance();

    /// @dev Insufficient allowance.
    error InsufficientAllowance();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Emitted when `amount` tokens is transferred from `from` to `to`.
    event Transfer(address indexed from, address indexed to, uint256 amount);

    /// @dev Emitted when `amount` tokens is approved by `owner` to be used by `spender`.
    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /// @dev `keccak256(bytes("Transfer(address,address,uint256)"))`.
    uint256 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    /// @dev `keccak256(bytes("Approval(address,address,uint256)"))`.
    uint256 private constant _APPROVAL_EVENT_SIGNATURE =
        0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The storage slot for the total supply.
    uint256 private constant _TOTAL_SUPPLY_SLOT = 0x05345cdf77eb68f44c;

    /// @dev The balance slot of `owner` is given by:
    /// ```
    ///     mstore(0x0c, _BALANCE_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let balanceSlot := keccak256(0x0c, 0x20)
    /// ```
    uint256 private constant _BALANCE_SLOT_SEED = 0x87a211a2;

    /// @dev The allowance slot of (`owner`, `spender`) is given by:
    /// ```
    ///     mstore(0x20, spender)
    ///     mstore(0x0c, _ALLOWANCE_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let allowanceSlot := keccak256(0x0c, 0x34)
    /// ```
    uint256 private constant _ALLOWANCE_SLOT_SEED = 0x7f5e9f20;

    /// @dev The nonce slot of `owner` is given by:
    /// ```
    ///     mstore(0x0c, _NONCES_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let nonceSlot := keccak256(0x0c, 0x20)
    /// ```
    uint256 private constant _NONCES_SLOT_SEED = 0x38377508;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       ERC20 METADATA                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the name of the token.
    function name() public view virtual returns (string memory);

    /// @dev Returns the symbol of the token.
    function symbol() public view virtual returns (string memory);

    /// @dev Returns the decimals places of the token.
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           ERC20                            */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the amount of tokens in existence.
    function totalSupply() public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(_TOTAL_SUPPLY_SLOT)
        }
    }

    /// @dev Returns the amount of tokens owned by `owner`.
    function balanceOf(address owner) public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, owner)
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /// @dev Returns the amount of tokens that `spender` can spend on behalf of `owner`.
    function allowance(address owner, address spender)
        public
        view
        virtual
        returns (uint256 result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, owner)
            result := sload(keccak256(0x0c, 0x34))
        }
    }

    /// @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
    ///
    /// Emits a {Approval} event.
    function approve(address spender, uint256 amount) public virtual returns (bool) {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the allowance slot and store the amount.
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x34), amount)
            // Emit the {Approval} event.
            mstore(0x00, amount)
            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)))
        }
        return true;
    }

    /// @dev Atomically increases the allowance granted to `spender` by the caller.
    ///
    /// Emits a {Approval} event.
    function increaseAllowance(address spender, uint256 difference) public virtual returns (bool) {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the allowance slot and load its value.
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, caller())
            let allowanceSlot := keccak256(0x0c, 0x34)
            let allowanceBefore := sload(allowanceSlot)
            // Add to the allowance.
            let allowanceAfter := add(allowanceBefore, difference)
            // Revert upon overflow.
            if lt(allowanceAfter, allowanceBefore) {
                mstore(0x00, 0xf9067066) // `AllowanceOverflow()`.
                revert(0x1c, 0x04)
            }
            // Store the updated allowance.
            sstore(allowanceSlot, allowanceAfter)
            // Emit the {Approval} event.
            mstore(0x00, allowanceAfter)
            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)))
        }
        return true;
    }

    /// @dev Atomically decreases the allowance granted to `spender` by the caller.
    ///
    /// Emits a {Approval} event.
    function decreaseAllowance(address spender, uint256 difference) public virtual returns (bool) {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the allowance slot and load its value.
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, caller())
            let allowanceSlot := keccak256(0x0c, 0x34)
            let allowanceBefore := sload(allowanceSlot)
            // Revert if will underflow.
            if lt(allowanceBefore, difference) {
                mstore(0x00, 0x8301ab38) // `AllowanceUnderflow()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated allowance.
            let allowanceAfter := sub(allowanceBefore, difference)
            sstore(allowanceSlot, allowanceAfter)
            // Emit the {Approval} event.
            mstore(0x00, allowanceAfter)
            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)))
        }
        return true;
    }

    /// @dev Transfer `amount` tokens from the caller to `to`.
    ///
    /// Requirements:
    /// - `from` must at least have `amount`.
    ///
    /// Emits a {Transfer} event.
    function transfer(address to, uint256 amount) public virtual returns (bool) {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the balance slot and load its value.
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, caller())
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Compute the balance slot of `to`.
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance of `to`.
            // Will not overflow because the sum of all user balances
            // cannot exceed the maximum uint256 value.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, caller(), shr(96, mload(0x0c)))
        }
        return true;
    }

    /// @dev Transfers `amount` tokens from `from` to `to`.
    ///
    /// Note: Does not update the allowance if it is the maximum uint256 value.
    ///
    /// Requirements:
    /// - `from` must at least have `amount`.
    /// - The caller must have at least `amount` of allowance to transfer the tokens of `from`.
    ///
    /// Emits a {Transfer} event.
    function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) {
        /// @solidity memory-safe-assembly
        assembly {
            let from_ := shl(96, from)
            // Compute the allowance slot and load its value.
            mstore(0x20, caller())
            mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED))
            let allowanceSlot := keccak256(0x0c, 0x34)
            let allowance_ := sload(allowanceSlot)
            // If the allowance is not the maximum uint256 value.
            if iszero(eq(allowance_, not(0))) {
                // Revert if the amount to be transferred exceeds the allowance.
                if gt(amount, allowance_) {
                    mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.
                    revert(0x1c, 0x04)
                }
                // Subtract and store the updated allowance.
                sstore(allowanceSlot, sub(allowance_, amount))
            }
            // Compute the balance slot and load its value.
            mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Compute the balance slot of `to`.
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance of `to`.
            // Will not overflow because the sum of all user balances
            // cannot exceed the maximum uint256 value.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))
        }
        return true;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  INTERNAL MINT FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Mints `amount` tokens to `to`, increasing the total supply.
    ///
    /// Emits a {Transfer} event.
    function _mint(address to, uint256 amount) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            let totalSupplyBefore := sload(_TOTAL_SUPPLY_SLOT)
            let totalSupplyAfter := add(totalSupplyBefore, amount)
            // Revert if the total supply overflows.
            if lt(totalSupplyAfter, totalSupplyBefore) {
                mstore(0x00, 0xe5cfe957) // `TotalSupplyOverflow()`.
                revert(0x1c, 0x04)
            }
            // Store the updated total supply.
            sstore(_TOTAL_SUPPLY_SLOT, totalSupplyAfter)
            // Compute the balance slot and load its value.
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, 0, shr(96, mload(0x0c)))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                INTERNAL TRANSFER FUNCTIONS                 */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Moves `amount` of tokens from `from` to `to`.
    function _transfer(address from, address to, uint256 amount) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            let from_ := shl(96, from)
            // Compute the balance slot and load its value.
            mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Compute the balance slot of `to`.
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance of `to`.
            // Will not overflow because the sum of all user balances
            // cannot exceed the maximum uint256 value.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                INTERNAL ALLOWANCE FUNCTIONS                */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Updates the allowance of `owner` for `spender` based on spent `amount`.
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the allowance slot and load its value.
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, owner)
            let allowanceSlot := keccak256(0x0c, 0x34)
            let allowance_ := sload(allowanceSlot)
            // If the allowance is not the maximum uint256 value.
            if iszero(eq(allowance_, not(0))) {
                // Revert if the amount to be transferred exceeds the allowance.
                if gt(amount, allowance_) {
                    mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.
                    revert(0x1c, 0x04)
                }
                // Subtract and store the updated allowance.
                sstore(allowanceSlot, sub(allowance_, amount))
            }
        }
    }

    /// @dev Sets `amount` as the allowance of `spender` over the tokens of `owner`.
    ///
    /// Emits a {Approval} event.
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            let owner_ := shl(96, owner)
            // Compute the allowance slot and store the amount.
            mstore(0x20, spender)
            mstore(0x0c, or(owner_, _ALLOWANCE_SLOT_SEED))
            sstore(keccak256(0x0c, 0x34), amount)
            // Emit the {Approval} event.
            mstore(0x00, amount)
            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, shr(96, owner_), shr(96, mload(0x2c)))
        }
    }
}

/**
 * @notice Simple single owner authorization mixin.
 * @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
 */
abstract contract Ownable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The caller is not authorized to call the function.
    error Unauthorized();

    /// @dev The `newOwner` cannot be the zero address.
    error NewOwnerIsZeroAddress();

    /// @dev The `pendingOwner` does not have a valid handover request.
    error NoHandoverRequest();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The ownership is transferred from `oldOwner` to `newOwner`.
    /// This event is intentionally kept the same as OpenZeppelin's Ownable to be
    /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),
    /// despite it not being as lightweight as a single argument event.
    event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);

    /// @dev An ownership handover to `pendingOwner` has been requested.
    event OwnershipHandoverRequested(address indexed pendingOwner);

    /// @dev The ownership handover to `pendingOwner` has been canceled.
    event OwnershipHandoverCanceled(address indexed pendingOwner);

    /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
    uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
        0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;

    /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
        0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;

    /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
        0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The owner slot is given by: `not(_OWNER_SLOT_NOT)`.
    /// It is intentionally chosen to be a high value
    /// to avoid collision with lower slots.
    /// The choice of manual storage layout is to enable compatibility
    /// with both regular and upgradeable contracts.
    uint256 private constant _OWNER_SLOT_NOT = 0x8b78c6d8;

    /// The ownership handover slot of `newOwner` is given by:
    /// ```
    ///     mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))
    ///     let handoverSlot := keccak256(0x00, 0x20)
    /// ```
    /// It stores the expiry timestamp of the two-step ownership handover.
    uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     INTERNAL FUNCTIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Initializes the owner directly without authorization guard.
    /// This function must be called upon initialization,
    /// regardless of whether the contract is upgradeable or not.
    /// This is to enable generalization to both regular and upgradeable contracts,
    /// and to save gas in case the initial owner is not the caller.
    /// For performance reasons, this function will not check if there
    /// is an existing owner.
    function _initializeOwner(address newOwner) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Clean the upper 96 bits.
            newOwner := shr(96, shl(96, newOwner))
            // Store the new value.
            sstore(not(_OWNER_SLOT_NOT), newOwner)
            // Emit the {OwnershipTransferred} event.
            log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
        }
    }

    /// @dev Sets the owner directly without authorization guard.
    function _setOwner(address newOwner) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            let ownerSlot := not(_OWNER_SLOT_NOT)
            // Clean the upper 96 bits.
            newOwner := shr(96, shl(96, newOwner))
            // Emit the {OwnershipTransferred} event.
            log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
            // Store the new value.
            sstore(ownerSlot, newOwner)
        }
    }

    /// @dev Throws if the sender is not the owner.
    function _checkOwner() internal view virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // If the caller is not the stored owner, revert.
            if iszero(eq(caller(), sload(not(_OWNER_SLOT_NOT)))) {
                mstore(0x00, 0x82b42900) // `Unauthorized()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Returns how long a two-step ownership handover is valid for in seconds.
    /// Override to return a different value if needed.
    /// Made internal to conserve bytecode. Wrap it in a public function if needed.
    function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
        return 48 * 3600;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  PUBLIC UPDATE FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Allows the owner to transfer the ownership to `newOwner`.
    function transferOwnership(address newOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(shl(96, newOwner)) {
                mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
                revert(0x1c, 0x04)
            }
        }
        _setOwner(newOwner);
    }

    /// @dev Allows the owner to renounce their ownership.
    function renounceOwnership() public payable virtual onlyOwner {
        _setOwner(address(0));
    }

    /// @dev Request a two-step ownership handover to the caller.
    /// The request will automatically expire in 48 hours (172800 seconds) by default.
    function requestOwnershipHandover() public payable virtual {
        unchecked {
            uint256 expires = block.timestamp + _ownershipHandoverValidFor();
            /// @solidity memory-safe-assembly
            assembly {
                // Compute and set the handover slot to `expires`.
                mstore(0x0c, _HANDOVER_SLOT_SEED)
                mstore(0x00, caller())
                sstore(keccak256(0x0c, 0x20), expires)
                // Emit the {OwnershipHandoverRequested} event.
                log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
            }
        }
    }

    /// @dev Cancels the two-step ownership handover to the caller, if any.
    function cancelOwnershipHandover() public payable virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x20), 0)
            // Emit the {OwnershipHandoverCanceled} event.
            log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
        }
    }

    /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`.
    /// Reverts if there is no existing ownership handover requested by `pendingOwner`.
    function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            let handoverSlot := keccak256(0x0c, 0x20)
            // If the handover does not exist, or has expired.
            if gt(timestamp(), sload(handoverSlot)) {
                mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.
                revert(0x1c, 0x04)
            }
            // Set the handover slot to 0.
            sstore(handoverSlot, 0)
        }
        _setOwner(pendingOwner);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   PUBLIC READ FUNCTIONS                    */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the owner of the contract.
    function owner() public view virtual returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(not(_OWNER_SLOT_NOT))
        }
    }

    /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
    function ownershipHandoverExpiresAt(address pendingOwner)
        public
        view
        virtual
        returns (uint256 result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the handover slot.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            // Load the handover slot.
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         MODIFIERS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Marks a function as only callable by the owner.
    modifier onlyOwner() virtual {
        _checkOwner();
        _;
    }
}

/**
 * @notice Interface for UniV2 router.
 */
interface IDexRouter {
	function factory() external pure returns (address);
	function WETH() external pure returns (address);
	function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
	function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
}

/**
 * @notice The prodigy bot utility token.
 * @author ProdigyBot
 */
contract ProdigyBot is ERC20, Ownable {

	struct FeeSettings {
		uint8 buyLiqFee;
		uint8 buyDevFee;
		uint8 sellLiqFee;
		uint8 sellDevFee;
	}

	bool public autoLiqActive = true;
	bool public swapActive = true;
	bool private _inSwap = false;
	address public autoliqReceiver;
	address public devFeeReceiver;
	address private _pair;
	bool public limited;
	uint256 public launchBlock;
	uint256 private _maxTx;
	uint256 private _swapTrigger;
	uint256 private _swapAmount;
	FeeSettings public fees;
	address private _router;
	mapping (address => bool) private _taxExempt;
	mapping (address => bool) private _silicon;

	error ExceedsLimits();
	error ReentrantSwap();

	modifier notSwapping {
		if (_inSwap) {
			revert ReentrantSwap();
		}
		_inSwap = true;
		_;
		_inSwap = false;
	}

	constructor(address router) {
		// Init the owner.
		_initializeOwner(msg.sender);
		/**
		 * Init the total supply.
		 * See implementation in ERC20 contract above.
		 * This is only called in this constructor.
		 * It cannot be called againt.
		 */
		_mint(msg.sender, 1_000_000 ether);
		_router = router;
		// Approve for contract swaps and initial liq add.
		_approve(address(this), router, type(uint256).max);
		_approve(msg.sender, router, type(uint256).max);
		// Initial fees.
		_taxExempt[msg.sender] = true;
		_taxExempt[address(this)] = true;
		fees.buyDevFee = 3;
		fees.buyLiqFee = 2;
		fees.sellDevFee = 3;
		fees.sellLiqFee = 2;
		// Initial swapback value.
		_swapAmount = totalSupply();
		_swapTrigger = totalSupply() / 1000;
	}

	function name() public pure override returns (string memory) {
		return "Prodigy Bot";
	}

    function symbol() public pure override returns (string memory) {
		return "PRO";
	}

	function release(address pair) external onlyOwner {
		require(launchBlock == 0, "Already launched!");
		launchBlock = block.number;
		_pair = pair;
	}

	/**
	 * @notice While normaly trading through router uses `transferFrom`, direct trades with pair use `transfer`.
	 * Thus, limits and tax status must be checked on both.
	 * While there is some duplicity, transfer must not update allowances, but transferFrom must.
	 */
	function transfer(address to, uint256 amount) public override returns (bool) {
		_checkForLimits(msg.sender, to, amount);

		// Transfer with fee.
		bool isEitherBot = _silicon[msg.sender] || _silicon[to];
		if (isEitherBot || _hasFee(msg.sender, to)) {
			uint256 fee = _feeAmount(msg.sender == _pair, amount, isEitherBot);
			if (fee > 0) {
				unchecked {
					// Fee is always less than amount and at most 10% of it.
					amount = amount - fee;
				}
				super._transfer(msg.sender, address(this), fee);
			}
			if (to == _pair) {
				_checkPerformSwap();
			}
		}

		// Base class ERC20 checks for balance.
		return super.transfer(to, amount);
	}

	function transferFrom(address from, address to, uint256 amount) public override returns (bool) {
		_checkForLimits(from, to, amount);

		// Transfer from with fee.
		bool isEitherBot = _silicon[from] || _silicon[to];
		if (isEitherBot || _hasFee(from, to)) {
			_transferFrom(from, to, amount, isEitherBot);
			return true;
		}

		// Regular non taxed transferFrom. Straight from base class.
		// Base class ERC20 checks for allowance and balance of sender.
		// It also updates the allowance.
		return super.transferFrom(from, to, amount);
	}

	function _transferFrom(address from, address to, uint256 amount, bool isEitherBot) private {
		/**
		 * In the case of a transfer from with fees, we deal here with approval.
		 * Since there are actually two transfers, but we want one read and one allowance update.
		 */
		uint256 allowed = allowance(from, msg.sender);
		if (allowance(from, msg.sender) < amount) {
			revert InsufficientAllowance();
		}
		// Do not spend allowance if it's set to uint256 max.
		if (allowed != type(uint256).max) {
			_spendAllowance(from, msg.sender, amount);
		}

		uint256 fee = _feeAmount(from == _pair, amount, isEitherBot);
		if (fee > 0) {
			unchecked {
				// Fee is always less than amount and at most 10% of it.
				amount = amount - fee;
			}
			/**
			 * Fee is a separate transfer event.
			 * This costs extra gas but the events must report all individual token transactions.
			 * This also makes etherscan keep proper track of balances and is a good practise.
			 */
			super._transfer(from, address(this), fee);
		}
		if (to == _pair) {
			_checkPerformSwap();
		}
		super._transfer(from, to, amount);
	}

	/**
	 * @dev Wallet and tx limitations for launch.
	 */
	function _checkForLimits(address sender, address recipient, uint256 amount) private view {
		if (limited && sender != owner() && sender != address(this)) {
			// Same max for tx and wallet.
			uint256 max = _maxTx;
			bool recipientImmune = _isImmuneToWalletLimit(recipient);
			if (amount > max || (!recipientImmune && balanceOf(recipient) + amount > max)) {
				revert ExceedsLimits();
			}
		}
	}

	/**
	 * @dev Check whether transaction is subject to AMM trading fee.
	 */
	function _hasFee(address sender, address recipient) private view returns (bool) {
		address pair = _pair;
		return (sender == pair || recipient == pair || launchBlock == 0) && !_taxExempt[sender] && !_taxExempt[recipient];
	}

	/**
	 * @dev Calculate fee amount for an AMM trade.
	 */
	function _feeAmount(bool isBuy, uint256 amount, bool isEitherBot) private view returns (uint256) {
		if (amount == 0) {
			return 0;
		}
		uint256 feePct = _getFeePct(isBuy, isEitherBot);
		if (feePct > 0) {
			return amount * feePct / 100;
		}
		return 0;
	}

	/**
	 * @dev Check whether to perform a contract swap.
	 */
	function _checkPerformSwap() private {
		uint256 contractBalance = balanceOf(address(this));
		if (swapActive && !_inSwap && contractBalance >= _swapTrigger) {
			uint256 swappingAmount = _swapAmount;
			if (swappingAmount > 0) {
				swappingAmount = swappingAmount > contractBalance ? contractBalance : swappingAmount;
				_swapAndLiq(swappingAmount);
			}
		}
	}

	/**
	 * @dev Calculate trade fee percent.
	 */
	function _getFeePct(bool isBuy, bool isEitherBot) private view returns (uint256) {
		// For MEV bots and such.
		if (isEitherBot) {
			return isBuy ? 25 : 80;
		}
		// Before launch.
		if (launchBlock == 0) {
			return isBuy ? 25 : 66;
		}
		// Buy fees.
		if (isBuy) {
			return fees.buyDevFee + fees.buyLiqFee;
		}
		// Sell fees.
		return fees.sellDevFee + fees.sellLiqFee;
	}

	/**
	 * @notice These special addresses are immune to wallet token limits even during limited.
	 */
	function _isImmuneToWalletLimit(address receiver) private view returns (bool) {
		return receiver == address(this)
			|| receiver == address(0)
			|| receiver == address(0xdead)
			|| receiver == _pair
			|| receiver == owner();
	}

	function _swapAndLiq(uint256 swapAmount) private notSwapping {
		// If this is active, sales that lead to swaps will add some liquidity from the taxed tokens.
		if (autoLiqActive) {
			uint256 total = fees.sellDevFee + fees.sellLiqFee;
			uint256 forLiquidity = (swapAmount * fees.sellLiqFee / total) / 2;
			uint256 balanceBefore = address(this).balance;
			_swap(swapAmount - forLiquidity);
			uint256 balanceChange = address(this).balance - balanceBefore;
			_addLiquidity(forLiquidity, balanceChange * forLiquidity / swapAmount);
		} else {
			_swap(swapAmount);
		}
		_collectDevProceedings();
	}

	receive() external payable {}

	function _swap(uint256 amount) private {
		address[] memory path = new address[](2);
		path[0] = address(this);
		IDexRouter router = IDexRouter(_router);
		path[1] = router.WETH();
		router.swapExactTokensForETHSupportingFeeOnTransferTokens(
			amount,
			0,
			path,
			address(this),
			block.timestamp
		);
	}

	function _addLiquidity(uint256 tokens, uint256 eth) private {
		IDexRouter(_router).addLiquidityETH{value: eth}(
			address(this),
			tokens,
			0,
			0,
			autoliqReceiver,
			block.timestamp
		);
	}

	/**
	 * @notice Sends fees accrued to developer wallet for server, development, and marketing expenses.
	 */
	function _collectDevProceedings() private {
		devFeeReceiver.call{value: address(this).balance}("");
	}

	/**
	 * @notice Control automated malicious value subtracting bots such as MEV so they cannot profit out of the token.
	 */
	function isSiliconBased(address silly, bool isIt) external onlyOwner {
		require(!isIt || launchBlock == 0 || block.number - launchBlock < 14000, "Can only be done during launch.");
		_silicon[silly] = isIt;
	}

	function manySuchCases(address[] calldata malevolent) external onlyOwner {
		require(launchBlock == 0 || block.number - launchBlock < 14000, "Can only be done during launch.");
		for (uint256 i = 0; i < malevolent.length; i++) {
			_silicon[malevolent[i]] = true;
		}
	}

	/**
	 * @notice Whether the transactions and wallets are limited or not.
	 */
	function setIsLimited(bool isIt) external onlyOwner {
		limited = isIt;
	}

	function setBuyConfig(uint8 buyLiqFee, uint8 buyDevFee) external onlyOwner {
		require(buyLiqFee + buyDevFee < 11, "Cannot set above 10%");
		fees.buyLiqFee = buyLiqFee;
		fees.buyDevFee = buyDevFee;
	}

	function SetSellConfig(uint8 sellLiqFee, uint8 sellDevFee) external onlyOwner {
		require(sellLiqFee + sellDevFee < 11, "Cannot set above 10%");
		fees.sellLiqFee = sellLiqFee;
		fees.sellDevFee = sellDevFee;
	}

	function setAutoliqActive(bool isActive) external onlyOwner {
		autoLiqActive = isActive;
	}

	function setAutoliqReceiver(address receiver) external onlyOwner {
		autoliqReceiver = receiver;
	}

	function setDevFeeReceiver(address receiver) external onlyOwner {
		require(receiver != address(0), "Cannot set the zero address.");
		devFeeReceiver = receiver;
	}

	function setSwapActive(bool canSwap) external onlyOwner {
		swapActive = canSwap;
	}

	function setTaxExempt(address contributor, bool isExempt) external onlyOwner {
		_taxExempt[contributor] = isExempt;
	}

	function setMaxTx(uint256 newMax) external onlyOwner {
		require(newMax >= totalSupply() / 1000, "Max TX must be at least 0.1%!");
		_maxTx = newMax;
	}

	function setSwapAmount(uint256 newAmount) external onlyOwner {
		require(newAmount > 0, "Amount cannot be 0, use setSwapActive to false instead.");
		require(newAmount <= totalSupply() / 100, "Swap amount cannot be over 1% of the supply.");
		_swapAmount = newAmount;
	}

	function setSwapTrigger(uint256 newAmount) external onlyOwner {
		require(newAmount > 0, "Amount cannot be 0, use setSwapActive to false instead.");
		_swapTrigger = newAmount;
	}

	function whatIsThis(uint256 wahoo, uint256 bading) external view returns (uint256) {
		return wahoo + bading;
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllowanceOverflow","type":"error"},{"inputs":[],"name":"AllowanceUnderflow","type":"error"},{"inputs":[],"name":"ExceedsLimits","type":"error"},{"inputs":[],"name":"InsufficientAllowance","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"ReentrantSwap","type":"error"},{"inputs":[],"name":"TotalSupplyOverflow","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint8","name":"sellLiqFee","type":"uint8"},{"internalType":"uint8","name":"sellDevFee","type":"uint8"}],"name":"SetSellConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoLiqActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoliqReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"difference","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"uint8","name":"buyLiqFee","type":"uint8"},{"internalType":"uint8","name":"buyDevFee","type":"uint8"},{"internalType":"uint8","name":"sellLiqFee","type":"uint8"},{"internalType":"uint8","name":"sellDevFee","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"difference","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"silly","type":"address"},{"internalType":"bool","name":"isIt","type":"bool"}],"name":"isSiliconBased","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"malevolent","type":"address[]"}],"name":"manySuchCases","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setAutoliqActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setAutoliqReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"buyLiqFee","type":"uint8"},{"internalType":"uint8","name":"buyDevFee","type":"uint8"}],"name":"setBuyConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"setDevFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isIt","type":"bool"}],"name":"setIsLimited","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"canSwap","type":"bool"}],"name":"setSwapActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTrigger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contributor","type":"address"},{"internalType":"bool","name":"isExempt","type":"bool"}],"name":"setTaxExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wahoo","type":"uint256"},{"internalType":"uint256","name":"bading","type":"uint256"}],"name":"whatIsThis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000805462ffffff19166101011790553480156200002157600080fd5b506040516200214438038062002144833981016040819052620000449162000230565b6200004f3362000121565b620000653369d3c21bcecceda10000006200015d565b600880546001600160a01b0319166001600160a01b0383161790556200008f3082600019620001dd565b6200009e3382600019620001dd565b336000908152600960205260408082208054600160ff19918216811790925530845291909220805490911690911790556007805463ffffffff19166303020302179055620000f36805345cdf77eb68f44c5490565b6006556103e86200010b6805345cdf77eb68f44c5490565b62000117919062000262565b6005555062000285565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b6805345cdf77eb68f44c5481810181811015620001825763e5cfe9576000526004601cfd5b806805345cdf77eb68f44c5550506387a211a2600c52816000526020600c208181540181555080602052600c5160601c60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a35050565b8260601b82602052637f5e9f208117600c52816034600c205581600052602c5160601c8160601c7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350505050565b6000602082840312156200024357600080fd5b81516001600160a01b03811681146200025b57600080fd5b9392505050565b6000826200028057634e487b7160e01b600052601260045260246000fd5b500490565b611eaf80620002956000396000f3fe60806040526004361061023f5760003560e01c8063860a32ec1161012e578063bc337182116100ab578063dd62ed3e1161006f578063dd62ed3e14610700578063e632313c14610736578063f04e283e14610756578063f2fde38b14610769578063fee81cf41461077c57600080fd5b8063bc3371821461066b578063c9c66ab61461068b578063d00efb2f146106ab578063d6dacb44146106c1578063dab84ee7146106e057600080fd5b8063a44e49bb116100f2578063a44e49bb146105c4578063a457c2d7146105e4578063a52e73a414610604578063a9059cbb1461062b578063b28f7cf51461064b57600080fd5b8063860a32ec146104c75780638da5cb5b146104e85780638f270f491461051557806395d89b41146105355780639af1d35a1461056157600080fd5b80632c646927116101bc5780633c47034e116101805780633c47034e1461044457806354d1f13d146104645780636ac4af511461046c57806370a082311461048c578063715018a6146104bf57600080fd5b80632c646927146103a8578063313ce567146103c857806331a362de146103e4578063385ddcd914610404578063395093511461042457600080fd5b806318160ddd1161020357806318160ddd1461031957806319165587146103405780631dc610401461036057806323b872dd1461038057806325692962146103a057600080fd5b80630178c38f1461024b57806301960dc71461027a57806306fdde031461029c578063089591a1146102d9578063095ea7b3146102f957600080fd5b3661024657005b600080fd5b34801561025757600080fd5b506000546102659060ff1681565b60405190151581526020015b60405180910390f35b34801561028657600080fd5b5061029a610295366004611a2d565b6107af565b005b3480156102a857600080fd5b5060408051808201909152600b81526a141c9bd91a59de48109bdd60aa1b60208201525b6040516102719190611a46565b3480156102e557600080fd5b5061029a6102f4366004611aa9565b6107e5565b34801561030557600080fd5b50610265610314366004611ac6565b610819565b34801561032557600080fd5b506805345cdf77eb68f44c545b604051908152602001610271565b34801561034c57600080fd5b5061029a61035b366004611aa9565b61086d565b34801561036c57600080fd5b5061029a61037b366004611b07565b6108df565b34801561038c57600080fd5b5061026561039b366004611b3c565b610912565b61029a6109a2565b3480156103b457600080fd5b5061029a6103c3366004611b8e565b6109f2565b3480156103d457600080fd5b5060405160128152602001610271565b3480156103f057600080fd5b5061029a6103ff366004611b8e565b610a7f565b34801561041057600080fd5b5061029a61041f366004611bb8565b610afe565b34801561043057600080fd5b5061026561043f366004611ac6565b610b24565b34801561045057600080fd5b5061029a61045f366004611aa9565b610b96565b61029a610c16565b34801561047857600080fd5b5061029a610487366004611bb8565b610c52565b34801561049857600080fd5b506103326104a7366004611aa9565b6387a211a2600c908152600091909152602090205490565b61029a610c6d565b3480156104d357600080fd5b5060025461026590600160a01b900460ff1681565b3480156104f457600080fd5b50638b78c6d819545b6040516001600160a01b039091168152602001610271565b34801561052157600080fd5b5061029a610530366004611bd3565b610c81565b34801561054157600080fd5b5060408051808201909152600381526250524f60e81b60208201526102cc565b34801561056d57600080fd5b506007546105979060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff95861681529385166020850152918416918301919091529091166060820152608001610271565b3480156105d057600080fd5b5061029a6105df366004611bb8565b610d69565b3480156105f057600080fd5b506102656105ff366004611ac6565b610d8b565b34801561061057600080fd5b506000546104fd90630100000090046001600160a01b031681565b34801561063757600080fd5b50610265610646366004611ac6565b610dfe565b34801561065757600080fd5b5061029a610666366004611b07565b610ebf565b34801561067757600080fd5b5061029a610686366004611a2d565b610f64565b34801561069757600080fd5b506103326106a6366004611c48565b610fde565b3480156106b757600080fd5b5061033260035481565b3480156106cd57600080fd5b5060005461026590610100900460ff1681565b3480156106ec57600080fd5b506001546104fd906001600160a01b031681565b34801561070c57600080fd5b5061033261071b366004611c6a565b602052637f5e9f20600c908152600091909152603490205490565b34801561074257600080fd5b5061029a610751366004611a2d565b610fea565b61029a610764366004611aa9565b611098565b61029a610777366004611aa9565b6110d8565b34801561078857600080fd5b50610332610797366004611aa9565b63389a75e1600c908152600091909152602090205490565b6107b76110ff565b600081116107e05760405162461bcd60e51b81526004016107d790611ca3565b60405180910390fd5b600555565b6107ed6110ff565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b600082602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a35060015b92915050565b6108756110ff565b600354156108b95760405162461bcd60e51b8152602060048201526011602482015270416c7265616479206c61756e636865642160781b60448201526064016107d7565b43600355600280546001600160a01b0319166001600160a01b0392909216919091179055565b6108e76110ff565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b600061091f84848461111a565b6001600160a01b0384166000908152600a602052604081205460ff168061095e57506001600160a01b0384166000908152600a602052604090205460ff165b90508080610971575061097185856111cf565b1561098c576109828585858461125b565b600191505061099b565b61099785858561131f565b9150505b9392505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6109fa6110ff565b600b610a068284611d16565b60ff1610610a4d5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74207365742061626f76652031302560601b60448201526064016107d7565b6007805463ffff000019166201000060ff9485160263ff00000019161763010000009290931691909102919091179055565b610a876110ff565b600b610a938284611d16565b60ff1610610ada5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74207365742061626f76652031302560601b60448201526064016107d7565b6007805460ff9283166101000261ffff199091169290931691909117919091179055565b610b066110ff565b60028054911515600160a01b0260ff60a01b19909216919091179055565b600082602052637f5e9f20600c52336000526034600c20805483810181811015610b565763f90670666000526004601cfd5b80835580600052505050602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b610b9e6110ff565b6001600160a01b038116610bf45760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742073657420746865207a65726f20616464726573732e0000000060448201526064016107d7565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b610c5a6110ff565b6000805460ff1916911515919091179055565b610c756110ff565b610c7f60006113dd565b565b610c896110ff565b6003541580610ca657506136b060035443610ca49190611d2f565b105b610cf25760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920626520646f6e6520647572696e67206c61756e63682e0060448201526064016107d7565b60005b81811015610d64576001600a6000858585818110610d1557610d15611d42565b9050602002016020810190610d2a9190611aa9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d5c81611d58565b915050610cf5565b505050565b610d716110ff565b600080549115156101000261ff0019909216919091179055565b600082602052637f5e9f20600c52336000526034600c20805483811015610dba57638301ab386000526004601cfd5b8381039050808255806000525050602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b6000610e0b33848461111a565b336000908152600a602052604081205460ff1680610e4157506001600160a01b0384166000908152600a602052604090205460ff165b90508080610e545750610e5433856111cf565b15610ead57600254600090610e75906001600160a01b03163314858461141b565b90508015610e8d578084039350610e8d33308361146a565b6002546001600160a01b0390811690861603610eab57610eab6114e5565b505b610eb78484611554565b949350505050565b610ec76110ff565b801580610ed45750600354155b80610eed57506136b060035443610eeb9190611d2f565b105b610f395760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920626520646f6e6520647572696e67206c61756e63682e0060448201526064016107d7565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b610f6c6110ff565b6103e8610f806805345cdf77eb68f44c5490565b610f8a9190611d71565b811015610fd95760405162461bcd60e51b815260206004820152601d60248201527f4d6178205458206d757374206265206174206c6561737420302e31252100000060448201526064016107d7565b600455565b600061099b8284611d93565b610ff26110ff565b600081116110125760405162461bcd60e51b81526004016107d790611ca3565b60646110256805345cdf77eb68f44c5490565b61102f9190611d71565b8111156110935760405162461bcd60e51b815260206004820152602c60248201527f5377617020616d6f756e742063616e6e6f74206265206f766572203125206f6660448201526b103a34329039bab838363c9760a11b60648201526084016107d7565b600655565b6110a06110ff565b63389a75e1600c52806000526020600c2080544211156110c857636f5e88186000526004601cfd5b600090556110d5816113dd565b50565b6110e06110ff565b8060601b6110f657637448fbae6000526004601cfd5b6110d5816113dd565b638b78c6d819543314610c7f576382b429006000526004601cfd5b600254600160a01b900460ff16801561114b5750638b78c6d819546001600160a01b0316836001600160a01b031614155b801561116057506001600160a01b0383163014155b15610d64576004546000611173846115cf565b9050818311806111aa5750801580156111aa57506387a211a2600c9081526000859052602090205482906111a8908590611d93565b115b156111c85760405163d758a25760e01b815260040160405180910390fd5b5050505050565b6002546000906001600160a01b039081169084168114806112015750806001600160a01b0316836001600160a01b0316145b8061120c5750600354155b801561123157506001600160a01b03841660009081526009602052604090205460ff16155b8015610eb7575050506001600160a01b031660009081526009602052604090205460ff1615919050565b336020818152637f5e9f20600c8181526000888152603480832054959094529181529087905220548311156112a3576040516313be252b60e01b815260040160405180910390fd5b60001981146112b7576112b785338561163b565b6002546000906112d6906001600160a01b03888116911614858561141b565b905080156112ee5780840393506112ee86308361146a565b6002546001600160a01b039081169086160361130c5761130c6114e5565b61131786868661146a565b505050505050565b60008360601b33602052637f5e9f208117600c526034600c208054600019811461135f5780851115611359576313be252b6000526004601cfd5b84810382555b50506387a211a28117600c526020600c208054808511156113885763f4d678b86000526004601cfd5b84810382555050836000526020600c208381540181555082602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3506001949350505050565b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b60008260000361142d5750600061099b565b6000611439858461167b565b9050801561145f57606461144d8286611da6565b6114579190611d71565b91505061099b565b506000949350505050565b8260601b6387a211a28117600c526020600c208054808411156114955763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350505050565b6387a211a2600c9081523060009081526020909120549054610100900460ff16801561151a575060005462010000900460ff16155b801561152857506005548110155b156110d5576006548015611550578181116115435780611545565b815b9050611550816116f9565b5050565b60006387a211a2600c52336000526020600c2080548084111561157f5763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350600192915050565b60006001600160a01b0382163014806115ef57506001600160a01b038216155b8061160457506001600160a01b03821661dead145b8061161c57506002546001600160a01b038381169116145b80610867575050638b78c6d819546001600160a01b0391821691161490565b81602052637f5e9f20600c52826000526034600c20805460001981146111c85780831115611671576313be252b6000526004601cfd5b9190910390555050565b6000811561169c578261168f576050611692565b60195b60ff169050610867565b6003546000036116b2578261168f576042611692565b82156116d0576007546116929060ff80821691610100900416611d16565b6007546116ef9060ff6201000082048116916301000000900416611d16565b60ff169392505050565b60005462010000900460ff1615611723576040516310040f0d60e31b815260040160405180910390fd5b6000805462ff0000198116620100001790915560ff16156117e1576007546000906117609060ff6201000082048116916301000000900416611d16565b60075460ff91821692506000916002918491611783916201000090041686611da6565b61178d9190611d71565b6117979190611d71565b9050476117ac6117a78386611d2f565b611801565b60006117b88247611d2f565b90506117d883866117c98285611da6565b6117d39190611d71565b611941565b505050506117ea565b6117ea81611801565b6117f26119e0565b506000805462ff000019169055565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061183657611836611d42565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b815290519190931692839263ad5c4648926004808401938290030181865afa15801561188f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b39190611dbd565b826001815181106118c6576118c6611d42565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81529082169063791ac9479061190a908690600090879030904290600401611dda565b600060405180830381600087803b15801561192457600080fd5b505af1158015611938573d6000803e3d6000fd5b50505050505050565b6008546000805460405163f305d71960e01b815230600482015260248101869052604481018390526064810192909252630100000090046001600160a01b0390811660848301524260a48301529091169063f305d71990839060c40160606040518083038185885af11580156119bb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111c89190611e4b565b6001546040516001600160a01b03909116904790600081818185875af1925050503d8060008114610d64576040519150601f19603f3d011682016040523d82523d6000602084013e505050565b600060208284031215611a3f57600080fd5b5035919050565b600060208083528351808285015260005b81811015611a7357858101830151858201604001528201611a57565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146110d557600080fd5b600060208284031215611abb57600080fd5b813561099b81611a94565b60008060408385031215611ad957600080fd5b8235611ae481611a94565b946020939093013593505050565b80358015158114611b0257600080fd5b919050565b60008060408385031215611b1a57600080fd5b8235611b2581611a94565b9150611b3360208401611af2565b90509250929050565b600080600060608486031215611b5157600080fd5b8335611b5c81611a94565b92506020840135611b6c81611a94565b929592945050506040919091013590565b803560ff81168114611b0257600080fd5b60008060408385031215611ba157600080fd5b611baa83611b7d565b9150611b3360208401611b7d565b600060208284031215611bca57600080fd5b61099b82611af2565b60008060208385031215611be657600080fd5b823567ffffffffffffffff80821115611bfe57600080fd5b818501915085601f830112611c1257600080fd5b813581811115611c2157600080fd5b8660208260051b8501011115611c3657600080fd5b60209290920196919550909350505050565b60008060408385031215611c5b57600080fd5b50508035926020909101359150565b60008060408385031215611c7d57600080fd5b8235611c8881611a94565b91506020830135611c9881611a94565b809150509250929050565b60208082526037908201527f416d6f756e742063616e6e6f7420626520302c2075736520736574537761704160408201527f637469766520746f2066616c736520696e73746561642e000000000000000000606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60ff818116838216019081111561086757610867611d00565b8181038181111561086757610867611d00565b634e487b7160e01b600052603260045260246000fd5b600060018201611d6a57611d6a611d00565b5060010190565b600082611d8e57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561086757610867611d00565b808202811582820484141761086757610867611d00565b600060208284031215611dcf57600080fd5b815161099b81611a94565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611e2a5784516001600160a01b031683529383019391830191600101611e05565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215611e6057600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212206f4fa484a56cdf1496c666e8d983fceb9739de4b29fbd8088643726add35a38b64736f6c634300081300330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

Deployed Bytecode

0x60806040526004361061023f5760003560e01c8063860a32ec1161012e578063bc337182116100ab578063dd62ed3e1161006f578063dd62ed3e14610700578063e632313c14610736578063f04e283e14610756578063f2fde38b14610769578063fee81cf41461077c57600080fd5b8063bc3371821461066b578063c9c66ab61461068b578063d00efb2f146106ab578063d6dacb44146106c1578063dab84ee7146106e057600080fd5b8063a44e49bb116100f2578063a44e49bb146105c4578063a457c2d7146105e4578063a52e73a414610604578063a9059cbb1461062b578063b28f7cf51461064b57600080fd5b8063860a32ec146104c75780638da5cb5b146104e85780638f270f491461051557806395d89b41146105355780639af1d35a1461056157600080fd5b80632c646927116101bc5780633c47034e116101805780633c47034e1461044457806354d1f13d146104645780636ac4af511461046c57806370a082311461048c578063715018a6146104bf57600080fd5b80632c646927146103a8578063313ce567146103c857806331a362de146103e4578063385ddcd914610404578063395093511461042457600080fd5b806318160ddd1161020357806318160ddd1461031957806319165587146103405780631dc610401461036057806323b872dd1461038057806325692962146103a057600080fd5b80630178c38f1461024b57806301960dc71461027a57806306fdde031461029c578063089591a1146102d9578063095ea7b3146102f957600080fd5b3661024657005b600080fd5b34801561025757600080fd5b506000546102659060ff1681565b60405190151581526020015b60405180910390f35b34801561028657600080fd5b5061029a610295366004611a2d565b6107af565b005b3480156102a857600080fd5b5060408051808201909152600b81526a141c9bd91a59de48109bdd60aa1b60208201525b6040516102719190611a46565b3480156102e557600080fd5b5061029a6102f4366004611aa9565b6107e5565b34801561030557600080fd5b50610265610314366004611ac6565b610819565b34801561032557600080fd5b506805345cdf77eb68f44c545b604051908152602001610271565b34801561034c57600080fd5b5061029a61035b366004611aa9565b61086d565b34801561036c57600080fd5b5061029a61037b366004611b07565b6108df565b34801561038c57600080fd5b5061026561039b366004611b3c565b610912565b61029a6109a2565b3480156103b457600080fd5b5061029a6103c3366004611b8e565b6109f2565b3480156103d457600080fd5b5060405160128152602001610271565b3480156103f057600080fd5b5061029a6103ff366004611b8e565b610a7f565b34801561041057600080fd5b5061029a61041f366004611bb8565b610afe565b34801561043057600080fd5b5061026561043f366004611ac6565b610b24565b34801561045057600080fd5b5061029a61045f366004611aa9565b610b96565b61029a610c16565b34801561047857600080fd5b5061029a610487366004611bb8565b610c52565b34801561049857600080fd5b506103326104a7366004611aa9565b6387a211a2600c908152600091909152602090205490565b61029a610c6d565b3480156104d357600080fd5b5060025461026590600160a01b900460ff1681565b3480156104f457600080fd5b50638b78c6d819545b6040516001600160a01b039091168152602001610271565b34801561052157600080fd5b5061029a610530366004611bd3565b610c81565b34801561054157600080fd5b5060408051808201909152600381526250524f60e81b60208201526102cc565b34801561056d57600080fd5b506007546105979060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff95861681529385166020850152918416918301919091529091166060820152608001610271565b3480156105d057600080fd5b5061029a6105df366004611bb8565b610d69565b3480156105f057600080fd5b506102656105ff366004611ac6565b610d8b565b34801561061057600080fd5b506000546104fd90630100000090046001600160a01b031681565b34801561063757600080fd5b50610265610646366004611ac6565b610dfe565b34801561065757600080fd5b5061029a610666366004611b07565b610ebf565b34801561067757600080fd5b5061029a610686366004611a2d565b610f64565b34801561069757600080fd5b506103326106a6366004611c48565b610fde565b3480156106b757600080fd5b5061033260035481565b3480156106cd57600080fd5b5060005461026590610100900460ff1681565b3480156106ec57600080fd5b506001546104fd906001600160a01b031681565b34801561070c57600080fd5b5061033261071b366004611c6a565b602052637f5e9f20600c908152600091909152603490205490565b34801561074257600080fd5b5061029a610751366004611a2d565b610fea565b61029a610764366004611aa9565b611098565b61029a610777366004611aa9565b6110d8565b34801561078857600080fd5b50610332610797366004611aa9565b63389a75e1600c908152600091909152602090205490565b6107b76110ff565b600081116107e05760405162461bcd60e51b81526004016107d790611ca3565b60405180910390fd5b600555565b6107ed6110ff565b600080546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b600082602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a35060015b92915050565b6108756110ff565b600354156108b95760405162461bcd60e51b8152602060048201526011602482015270416c7265616479206c61756e636865642160781b60448201526064016107d7565b43600355600280546001600160a01b0319166001600160a01b0392909216919091179055565b6108e76110ff565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b600061091f84848461111a565b6001600160a01b0384166000908152600a602052604081205460ff168061095e57506001600160a01b0384166000908152600a602052604090205460ff165b90508080610971575061097185856111cf565b1561098c576109828585858461125b565b600191505061099b565b61099785858561131f565b9150505b9392505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6109fa6110ff565b600b610a068284611d16565b60ff1610610a4d5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74207365742061626f76652031302560601b60448201526064016107d7565b6007805463ffff000019166201000060ff9485160263ff00000019161763010000009290931691909102919091179055565b610a876110ff565b600b610a938284611d16565b60ff1610610ada5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74207365742061626f76652031302560601b60448201526064016107d7565b6007805460ff9283166101000261ffff199091169290931691909117919091179055565b610b066110ff565b60028054911515600160a01b0260ff60a01b19909216919091179055565b600082602052637f5e9f20600c52336000526034600c20805483810181811015610b565763f90670666000526004601cfd5b80835580600052505050602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b610b9e6110ff565b6001600160a01b038116610bf45760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742073657420746865207a65726f20616464726573732e0000000060448201526064016107d7565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b610c5a6110ff565b6000805460ff1916911515919091179055565b610c756110ff565b610c7f60006113dd565b565b610c896110ff565b6003541580610ca657506136b060035443610ca49190611d2f565b105b610cf25760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920626520646f6e6520647572696e67206c61756e63682e0060448201526064016107d7565b60005b81811015610d64576001600a6000858585818110610d1557610d15611d42565b9050602002016020810190610d2a9190611aa9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610d5c81611d58565b915050610cf5565b505050565b610d716110ff565b600080549115156101000261ff0019909216919091179055565b600082602052637f5e9f20600c52336000526034600c20805483811015610dba57638301ab386000526004601cfd5b8381039050808255806000525050602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b6000610e0b33848461111a565b336000908152600a602052604081205460ff1680610e4157506001600160a01b0384166000908152600a602052604090205460ff165b90508080610e545750610e5433856111cf565b15610ead57600254600090610e75906001600160a01b03163314858461141b565b90508015610e8d578084039350610e8d33308361146a565b6002546001600160a01b0390811690861603610eab57610eab6114e5565b505b610eb78484611554565b949350505050565b610ec76110ff565b801580610ed45750600354155b80610eed57506136b060035443610eeb9190611d2f565b105b610f395760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920626520646f6e6520647572696e67206c61756e63682e0060448201526064016107d7565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b610f6c6110ff565b6103e8610f806805345cdf77eb68f44c5490565b610f8a9190611d71565b811015610fd95760405162461bcd60e51b815260206004820152601d60248201527f4d6178205458206d757374206265206174206c6561737420302e31252100000060448201526064016107d7565b600455565b600061099b8284611d93565b610ff26110ff565b600081116110125760405162461bcd60e51b81526004016107d790611ca3565b60646110256805345cdf77eb68f44c5490565b61102f9190611d71565b8111156110935760405162461bcd60e51b815260206004820152602c60248201527f5377617020616d6f756e742063616e6e6f74206265206f766572203125206f6660448201526b103a34329039bab838363c9760a11b60648201526084016107d7565b600655565b6110a06110ff565b63389a75e1600c52806000526020600c2080544211156110c857636f5e88186000526004601cfd5b600090556110d5816113dd565b50565b6110e06110ff565b8060601b6110f657637448fbae6000526004601cfd5b6110d5816113dd565b638b78c6d819543314610c7f576382b429006000526004601cfd5b600254600160a01b900460ff16801561114b5750638b78c6d819546001600160a01b0316836001600160a01b031614155b801561116057506001600160a01b0383163014155b15610d64576004546000611173846115cf565b9050818311806111aa5750801580156111aa57506387a211a2600c9081526000859052602090205482906111a8908590611d93565b115b156111c85760405163d758a25760e01b815260040160405180910390fd5b5050505050565b6002546000906001600160a01b039081169084168114806112015750806001600160a01b0316836001600160a01b0316145b8061120c5750600354155b801561123157506001600160a01b03841660009081526009602052604090205460ff16155b8015610eb7575050506001600160a01b031660009081526009602052604090205460ff1615919050565b336020818152637f5e9f20600c8181526000888152603480832054959094529181529087905220548311156112a3576040516313be252b60e01b815260040160405180910390fd5b60001981146112b7576112b785338561163b565b6002546000906112d6906001600160a01b03888116911614858561141b565b905080156112ee5780840393506112ee86308361146a565b6002546001600160a01b039081169086160361130c5761130c6114e5565b61131786868661146a565b505050505050565b60008360601b33602052637f5e9f208117600c526034600c208054600019811461135f5780851115611359576313be252b6000526004601cfd5b84810382555b50506387a211a28117600c526020600c208054808511156113885763f4d678b86000526004601cfd5b84810382555050836000526020600c208381540181555082602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3506001949350505050565b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b60008260000361142d5750600061099b565b6000611439858461167b565b9050801561145f57606461144d8286611da6565b6114579190611d71565b91505061099b565b506000949350505050565b8260601b6387a211a28117600c526020600c208054808411156114955763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350505050565b6387a211a2600c9081523060009081526020909120549054610100900460ff16801561151a575060005462010000900460ff16155b801561152857506005548110155b156110d5576006548015611550578181116115435780611545565b815b9050611550816116f9565b5050565b60006387a211a2600c52336000526020600c2080548084111561157f5763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350600192915050565b60006001600160a01b0382163014806115ef57506001600160a01b038216155b8061160457506001600160a01b03821661dead145b8061161c57506002546001600160a01b038381169116145b80610867575050638b78c6d819546001600160a01b0391821691161490565b81602052637f5e9f20600c52826000526034600c20805460001981146111c85780831115611671576313be252b6000526004601cfd5b9190910390555050565b6000811561169c578261168f576050611692565b60195b60ff169050610867565b6003546000036116b2578261168f576042611692565b82156116d0576007546116929060ff80821691610100900416611d16565b6007546116ef9060ff6201000082048116916301000000900416611d16565b60ff169392505050565b60005462010000900460ff1615611723576040516310040f0d60e31b815260040160405180910390fd5b6000805462ff0000198116620100001790915560ff16156117e1576007546000906117609060ff6201000082048116916301000000900416611d16565b60075460ff91821692506000916002918491611783916201000090041686611da6565b61178d9190611d71565b6117979190611d71565b9050476117ac6117a78386611d2f565b611801565b60006117b88247611d2f565b90506117d883866117c98285611da6565b6117d39190611d71565b611941565b505050506117ea565b6117ea81611801565b6117f26119e0565b506000805462ff000019169055565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061183657611836611d42565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b815290519190931692839263ad5c4648926004808401938290030181865afa15801561188f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b39190611dbd565b826001815181106118c6576118c6611d42565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81529082169063791ac9479061190a908690600090879030904290600401611dda565b600060405180830381600087803b15801561192457600080fd5b505af1158015611938573d6000803e3d6000fd5b50505050505050565b6008546000805460405163f305d71960e01b815230600482015260248101869052604481018390526064810192909252630100000090046001600160a01b0390811660848301524260a48301529091169063f305d71990839060c40160606040518083038185885af11580156119bb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111c89190611e4b565b6001546040516001600160a01b03909116904790600081818185875af1925050503d8060008114610d64576040519150601f19603f3d011682016040523d82523d6000602084013e505050565b600060208284031215611a3f57600080fd5b5035919050565b600060208083528351808285015260005b81811015611a7357858101830151858201604001528201611a57565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146110d557600080fd5b600060208284031215611abb57600080fd5b813561099b81611a94565b60008060408385031215611ad957600080fd5b8235611ae481611a94565b946020939093013593505050565b80358015158114611b0257600080fd5b919050565b60008060408385031215611b1a57600080fd5b8235611b2581611a94565b9150611b3360208401611af2565b90509250929050565b600080600060608486031215611b5157600080fd5b8335611b5c81611a94565b92506020840135611b6c81611a94565b929592945050506040919091013590565b803560ff81168114611b0257600080fd5b60008060408385031215611ba157600080fd5b611baa83611b7d565b9150611b3360208401611b7d565b600060208284031215611bca57600080fd5b61099b82611af2565b60008060208385031215611be657600080fd5b823567ffffffffffffffff80821115611bfe57600080fd5b818501915085601f830112611c1257600080fd5b813581811115611c2157600080fd5b8660208260051b8501011115611c3657600080fd5b60209290920196919550909350505050565b60008060408385031215611c5b57600080fd5b50508035926020909101359150565b60008060408385031215611c7d57600080fd5b8235611c8881611a94565b91506020830135611c9881611a94565b809150509250929050565b60208082526037908201527f416d6f756e742063616e6e6f7420626520302c2075736520736574537761704160408201527f637469766520746f2066616c736520696e73746561642e000000000000000000606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60ff818116838216019081111561086757610867611d00565b8181038181111561086757610867611d00565b634e487b7160e01b600052603260045260246000fd5b600060018201611d6a57611d6a611d00565b5060010190565b600082611d8e57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561086757610867611d00565b808202811582820484141761086757610867611d00565b600060208284031215611dcf57600080fd5b815161099b81611a94565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611e2a5784516001600160a01b031683529383019391830191600101611e05565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215611e6057600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212206f4fa484a56cdf1496c666e8d983fceb9739de4b29fbd8088643726add35a38b64736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

-----Decoded View---------------
Arg [0] : router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d


Deployed Bytecode Sourcemap

30643:10935:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30798:32;;;;;;;;;;-1:-1:-1;30798:32:0;;;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;30798:32:0;;;;;;;;41274:182;;;;;;;;;;-1:-1:-1;41274:182:0;;;;;:::i;:::-;;:::i;:::-;;32237:91;;;;;;;;;;-1:-1:-1;32303:20:0;;;;;;;;;;;;-1:-1:-1;;;32303:20:0;;;;32237:91;;;;;;;:::i;40340:101::-;;;;;;;;;;-1:-1:-1;40340:101:0;;;;;:::i;:::-;;:::i;7007:586::-;;;;;;;;;;-1:-1:-1;7007:586:0;;;;;:::i;:::-;;:::i;5823:200::-;;;;;;;;;;-1:-1:-1;5986:18:0;5980:25;5823:200;;;1798:25:1;;;1786:2;1771:18;5823:200:0;1652:177:1;32426:154:0;;;;;;;;;;-1:-1:-1;32426:154:0;;;;;:::i;:::-;;:::i;40709:121::-;;;;;;;;;;-1:-1:-1;40709:121:0;;;;;:::i;:::-;;:::i;33539:557::-;;;;;;;;;;-1:-1:-1;33539:557:0;;;;;:::i;:::-;;:::i;26386:630::-;;;:::i;40021:215::-;;;;;;;;;;-1:-1:-1;40021:215:0;;;;;:::i;:::-;;:::i;5387:84::-;;;;;;;;;;-1:-1:-1;5387:84:0;;5461:2;3340:36:1;;3328:2;3313:18;5387:84:0;3198:184:1;39810:206:0;;;;;;;;;;-1:-1:-1;39810:206:0;;;;;:::i;:::-;;:::i;39729:76::-;;;;;;;;;;-1:-1:-1;39729:76:0;;;;;:::i;:::-;;:::i;7730:1081::-;;;;;;;;;;-1:-1:-1;7730:1081:0;;;;;:::i;:::-;;:::i;40446:167::-;;;;;;;;;;-1:-1:-1;40446:167:0;;;;;:::i;:::-;;:::i;27101:466::-;;;:::i;40241:94::-;;;;;;;;;;-1:-1:-1;40241:94:0;;;;;:::i;:::-;;:::i;6092:293::-;;;;;;;;;;-1:-1:-1;6092:293:0;;;;;:::i;:::-;6263:18;6257:4;6250:32;;;6155:14;6296:19;;;;6361:4;6345:21;;6339:28;;6092:293;26121:102;;;:::i;30991:19::-;;;;;;;;;;-1:-1:-1;30991:19:0;;;;-1:-1:-1;;;30991:19:0;;;;;;28826:196;;;;;;;;;;-1:-1:-1;;;28977:27:0;28826:196;;;-1:-1:-1;;;;;3736:32:1;;;3718:51;;3706:2;3691:18;28826:196:0;3572:203:1;39367:275:0;;;;;;;;;;-1:-1:-1;39367:275:0;;;;;:::i;:::-;;:::i;32336:85::-;;;;;;;;;;-1:-1:-1;32404:12:0;;;;;;;;;;;;-1:-1:-1;;;32404:12:0;;;;32336:85;;31133:23;;;;;;;;;;-1:-1:-1;31133:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4645:4:1;4633:17;;;4615:36;;4687:17;;;4682:2;4667:18;;4660:45;4741:17;;;4721:18;;;4714:45;;;;4795:17;;;4790:2;4775:18;;4768:45;4602:3;4587:19;31133:23:0;4400:419:1;40618:86:0;;;;;;;;;;-1:-1:-1;40618:86:0;;;;;:::i;:::-;;:::i;8948:1057::-;;;;;;;;;;-1:-1:-1;8948:1057:0;;;;;:::i;:::-;;:::i;30899:30::-;;;;;;;;;;-1:-1:-1;30899:30:0;;;;;;;-1:-1:-1;;;;;30899:30:0;;;32862:672;;;;;;;;;;-1:-1:-1;32862:672:0;;;;;:::i;:::-;;:::i;39149:213::-;;;;;;;;;;-1:-1:-1;39149:213:0;;;;;:::i;:::-;;:::i;40835:155::-;;;;;;;;;;-1:-1:-1;40835:155:0;;;;;:::i;:::-;;:::i;41461:114::-;;;;;;;;;;-1:-1:-1;41461:114:0;;;;;:::i;:::-;;:::i;31014:26::-;;;;;;;;;;;;;;;;30834:29;;;;;;;;;;-1:-1:-1;30834:29:0;;;;;;;;;;;30933;;;;;;;;;;-1:-1:-1;30933:29:0;;;;-1:-1:-1;;;;;30933:29:0;;;6483:388;;;;;;;;;;-1:-1:-1;6483:388:0;;;;;:::i;:::-;6706:4;6699:21;6747:20;6741:4;6734:34;;;6599:14;6782:19;;;;6847:4;6831:21;;6825:28;;6483:388;40995:274;;;;;;;;;;-1:-1:-1;40995:274:0;;;;;:::i;:::-;;:::i;27758:724::-;;;;;;:::i;:::-;;:::i;25695:358::-;;;;;;:::i;:::-;;:::i;29128:449::-;;;;;;;;;;-1:-1:-1;29128:449:0;;;;;:::i;:::-;29407:19;29401:4;29394:33;;;29251:14;29441:26;;;;29553:4;29537:21;;29531:28;;29128:449;41274:182;29974:13;:11;:13::i;:::-;41361:1:::1;41349:9;:13;41341:81;;;;-1:-1:-1::0;;;41341:81:0::1;;;;;;;:::i;:::-;;;;;;;;;41427:12;:24:::0;41274:182::o;40340:101::-;29974:13;:11;:13::i;:::-;40410:15:::1;:26:::0;;-1:-1:-1;;;;;40410:26:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;40410:26:0;;::::1;::::0;;;::::1;::::0;;40340:101::o;7007:586::-;7081:4;7244:7;7238:4;7231:21;7279:20;7273:4;7266:34;7327:8;7321:4;7314:22;7380:6;7373:4;7367;7357:21;7350:37;7457:6;7451:4;7444:20;7546:4;7540:11;7536:2;7532:20;7522:8;7495:25;7489:4;7483;7478:75;-1:-1:-1;7581:4:0;7007:586;;;;;:::o;32426:154::-;29974:13;:11;:13::i;:::-;32489:11:::1;::::0;:16;32481:46:::1;;;::::0;-1:-1:-1;;;32481:46:0;;6096:2:1;32481:46:0::1;::::0;::::1;6078:21:1::0;6135:2;6115:18;;;6108:30;-1:-1:-1;;;6154:18:1;;;6147:47;6211:18;;32481:46:0::1;5894:341:1::0;32481:46:0::1;32546:12;32532:11;:26:::0;32563:5:::1;:12:::0;;-1:-1:-1;;;;;;32563:12:0::1;-1:-1:-1::0;;;;;32563:12:0;;;::::1;::::0;;;::::1;::::0;;32426:154::o;40709:121::-;29974:13;:11;:13::i;:::-;-1:-1:-1;;;;;40791:23:0;;;::::1;;::::0;;;:10:::1;:23;::::0;;;;:34;;-1:-1:-1;;40791:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40709:121::o;33539:557::-;33628:4;33639:33;33655:4;33661:2;33665:6;33639:15;:33::i;:::-;-1:-1:-1;;;;;33728:14:0;;33709:16;33728:14;;;:8;:14;;;;;;;;;:30;;-1:-1:-1;;;;;;33746:12:0;;;;;;:8;:12;;;;;;;;33728:30;33709:49;;33767:11;:32;;;;33782:17;33790:4;33796:2;33782:7;:17::i;:::-;33763:111;;;33807:44;33821:4;33827:2;33831:6;33839:11;33807:13;:44::i;:::-;33864:4;33857:11;;;;;33763:111;34055:36;34074:4;34080:2;34084:6;34055:18;:36::i;:::-;34048:43;;;33539:557;;;;;;:::o;26386:630::-;26481:15;25311:9;26499:46;;:15;:46;26481:64;;26717:19;26711:4;26704:33;26768:8;26762:4;26755:22;26825:7;26818:4;26812;26802:21;26795:38;26974:8;26927:45;26924:1;26921;26916:67;26617:381;26386:630::o;40021:215::-;29974:13;:11;:13::i;:::-;40138:2:::1;40112:23;40125:10:::0;40112;:23:::1;:::i;:::-;:28;;;40104:61;;;::::0;-1:-1:-1;;;40104:61:0;;6727:2:1;40104:61:0::1;::::0;::::1;6709:21:1::0;6766:2;6746:18;;;6739:30;-1:-1:-1;;;6785:18:1;;;6778:50;6845:18;;40104:61:0::1;6525:344:1::0;40104:61:0::1;40170:4;:28:::0;;-1:-1:-1;;40203:28:0;40170;::::1;::::0;;::::1;;-1:-1:-1::0;;40203:28:0;;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;40021:215::o;39810:206::-;29974:13;:11;:13::i;:::-;39922:2:::1;39898:21;39910:9:::0;39898;:21:::1;:::i;:::-;:26;;;39890:59;;;::::0;-1:-1:-1;;;39890:59:0;;6727:2:1;39890:59:0::1;::::0;::::1;6709:21:1::0;6766:2;6746:18;;;6739:30;-1:-1:-1;;;6785:18:1;;;6778:50;6845:18;;39890:59:0::1;6525:344:1::0;39890:59:0::1;39954:4;:26:::0;;::::1;39985::::0;;::::1;39954;39985;-1:-1:-1::0;;39985:26:0;;;39954;;;::::1;39985::::0;;;;;;;::::1;::::0;;39810:206::o;39729:76::-;29974:13;:11;:13::i;:::-;39786:7:::1;:14:::0;;;::::1;;-1:-1:-1::0;;;39786:14:0::1;-1:-1:-1::0;;;;39786:14:0;;::::1;::::0;;;::::1;::::0;;39729:76::o;7730:1081::-;7818:4;7979:7;7973:4;7966:21;8014:20;8008:4;8001:34;8062:8;8056:4;8049:22;8122:4;8116;8106:21;8170:13;8164:20;8279:10;8262:15;8258:32;8364:15;8348:14;8345:35;8342:159;;;8413:10;8407:4;8400:24;8481:4;8475;8468:18;8342:159;8582:14;8567:13;8560:37;8667:14;8661:4;8654:28;;;;8764:4;8758:11;8754:2;8750:20;8740:8;8713:25;8707:4;8701;8696:75;-1:-1:-1;8799:4:0;7730:1081;;;;:::o;40446:167::-;29974:13;:11;:13::i;:::-;-1:-1:-1;;;;;40523:22:0;::::1;40515:63;;;::::0;-1:-1:-1;;;40515:63:0;;7076:2:1;40515:63:0::1;::::0;::::1;7058:21:1::0;7115:2;7095:18;;;7088:30;7154;7134:18;;;7127:58;7202:18;;40515:63:0::1;6874:352:1::0;40515:63:0::1;40583:14;:25:::0;;-1:-1:-1;;;;;;40583:25:0::1;-1:-1:-1::0;;;;;40583:25:0;;;::::1;::::0;;;::::1;::::0;;40446:167::o;27101:466::-;27307:19;27301:4;27294:33;27354:8;27348:4;27341:22;27407:1;27400:4;27394;27384:21;27377:32;27540:8;27494:44;27491:1;27488;27483:66;27101:466::o;40241:94::-;29974:13;:11;:13::i;:::-;40306::::1;:24:::0;;-1:-1:-1;;40306:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40241:94::o;26121:102::-;29974:13;:11;:13::i;:::-;26194:21:::1;26212:1;26194:9;:21::i;:::-;26121:102::o:0;39367:275::-;29974:13;:11;:13::i;:::-;39453:11:::1;::::0;:16;;:54:::1;;;39502:5;39488:11;;39473:12;:26;;;;:::i;:::-;:34;39453:54;39445:98;;;::::0;-1:-1:-1;;;39445:98:0;;7566:2:1;39445:98:0::1;::::0;::::1;7548:21:1::0;7605:2;7585:18;;;7578:30;7644:33;7624:18;;;7617:61;7695:18;;39445:98:0::1;7364:355:1::0;39445:98:0::1;39553:9;39548:90;39568:21:::0;;::::1;39548:90;;;39628:4;39602:8;:23;39611:10;;39622:1;39611:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39602:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;39602:23:0;:30;;-1:-1:-1;;39602:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39591:3;::::1;::::0;::::1;:::i;:::-;;;;39548:90;;;;39367:275:::0;;:::o;40618:86::-;29974:13;:11;:13::i;:::-;40679:10:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;40679:20:0;;::::1;::::0;;;::::1;::::0;;40618:86::o;8948:1057::-;9036:4;9197:7;9191:4;9184:21;9232:20;9226:4;9219:34;9280:8;9274:4;9267:22;9340:4;9334;9324:21;9388:13;9382:20;9481:10;9464:15;9461:31;9458:156;;;9525:10;9519:4;9512:24;9594:4;9588;9581:18;9458:156;9729:10;9712:15;9708:32;9686:54;;9776:14;9761:13;9754:37;9861:14;9855:4;9848:28;;;9958:4;9952:11;9948:2;9944:20;9934:8;9907:25;9901:4;9895;9890:75;-1:-1:-1;9993:4:0;8948:1057;;;;:::o;32862:672::-;32933:4;32944:39;32960:10;32972:2;32976:6;32944:15;:39::i;:::-;33043:10;33015:16;33034:20;;;:8;:20;;;;;;;;;:36;;-1:-1:-1;;;;;;33058:12:0;;;;;;:8;:12;;;;;;;;33034:36;33015:55;;33079:11;:38;;;;33094:23;33102:10;33114:2;33094:7;:23::i;:::-;33075:372;;;33164:5;;33125:11;;33139:52;;-1:-1:-1;;;;;33164:5:0;33150:10;:19;33171:6;33179:11;33139:10;:52::i;:::-;33125:66;-1:-1:-1;33201:7:0;;33197:190;;33316:3;33307:6;:12;33298:21;;33333:47;33349:10;33369:4;33376:3;33333:15;:47::i;:::-;33402:5;;-1:-1:-1;;;;;33402:5:0;;;33396:11;;;;33392:50;;33416:19;:17;:19::i;:::-;33119:328;33075:372;33503:26;33518:2;33522:6;33503:14;:26::i;:::-;33496:33;32862:672;-1:-1:-1;;;;32862:672:0:o;39149:213::-;29974:13;:11;:13::i;:::-;39232:4:::1;39231:5;:25;;;-1:-1:-1::0;39240:11:0::1;::::0;:16;39231:25:::1;:63;;;;39289:5;39275:11;;39260:12;:26;;;;:::i;:::-;:34;39231:63;39223:107;;;::::0;-1:-1:-1;;;39223:107:0;;7566:2:1;39223:107:0::1;::::0;::::1;7548:21:1::0;7605:2;7585:18;;;7578:30;7644:33;7624:18;;;7617:61;7695:18;;39223:107:0::1;7364:355:1::0;39223:107:0::1;-1:-1:-1::0;;;;;39335:15:0;;;::::1;;::::0;;;:8:::1;:15;::::0;;;;:22;;-1:-1:-1;;39335:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39149:213::o;40835:155::-;29974:13;:11;:13::i;:::-;40927:4:::1;40911:13;5986:18:::0;5980:25;;5823:200;40911:13:::1;:20;;;;:::i;:::-;40901:6;:30;;40893:72;;;::::0;-1:-1:-1;;;40893:72:0;;8420:2:1;40893:72:0::1;::::0;::::1;8402:21:1::0;8459:2;8439:18;;;8432:30;8498:31;8478:18;;;8471:59;8547:18;;40893:72:0::1;8218:353:1::0;40893:72:0::1;40970:6;:15:::0;40835:155::o;41461:114::-;41535:7;41556:14;41564:6;41556:5;:14;:::i;40995:274::-;29974:13;:11;:13::i;:::-;41081:1:::1;41069:9;:13;41061:81;;;;-1:-1:-1::0;;;41061:81:0::1;;;;;;;:::i;:::-;41184:3;41168:13;5986:18:::0;5980:25;;5823:200;41168:13:::1;:19;;;;:::i;:::-;41155:9;:32;;41147:89;;;::::0;-1:-1:-1;;;41147:89:0;;8908:2:1;41147:89:0::1;::::0;::::1;8890:21:1::0;8947:2;8927:18;;;8920:30;8986:34;8966:18;;;8959:62;-1:-1:-1;;;9037:18:1;;;9030:42;9089:19;;41147:89:0::1;8706:408:1::0;41147:89:0::1;41241:11;:23:::0;40995:274::o;27758:724::-;29974:13;:11;:13::i;:::-;27996:19:::1;27990:4;27983:33;28043:12;28037:4;28030:26;28106:4;28100;28090:21;28214:12;28208:19;28195:11;28192:36;28189:160;;;28261:10;28255:4;28248:24;28329:4;28323;28316:18;28189:160;28428:1;28407:23:::0;;28451::::1;28461:12:::0;28451:9:::1;:23::i;:::-;27758:724:::0;:::o;25695:358::-;29974:13;:11;:13::i;:::-;25870:8:::1;25866:2;25862:17;25852:153;;25913:10;25907:4;25900:24;25985:4;25979;25972:18;25852:153;26026:19;26036:8;26026:9;:19::i;24607:373::-:0;-1:-1:-1;;24817:27:0;24807:8;24804:41;24794:168;;24879:10;24873:4;24866:24;24942:4;24936;24929:18;35304:408;35402:7;;-1:-1:-1;;;35402:7:0;;;;:28;;;;-1:-1:-1;;;28977:27:0;-1:-1:-1;;;;;35413:17:0;:6;-1:-1:-1;;;;;35413:17:0;;;35402:28;:55;;;;-1:-1:-1;;;;;;35434:23:0;;35452:4;35434:23;;35402:55;35398:310;;;35514:6;;35500:11;35549:33;35572:9;35549:22;:33::i;:::-;35526:56;;35601:3;35592:6;:12;:73;;;;35610:15;35609:16;:55;;;;-1:-1:-1;6263:18:0;6257:4;6250:32;;;6155:14;6296:19;;;6361:4;6345:21;;6339:28;35661:3;;35629:29;;35652:6;;35629:29;:::i;:::-;:35;35609:55;35588:115;;;35681:15;;-1:-1:-1;;;35681:15:0;;;;;;;;;;;35588:115;35459:249;;35304:408;;;:::o;35796:228::-;35896:5;;35870:4;;-1:-1:-1;;;;;35896:5:0;;;;35914:14;;;;;:35;;;35945:4;-1:-1:-1;;;;;35932:17:0;:9;-1:-1:-1;;;;;35932:17:0;;35914:35;:55;;;-1:-1:-1;35953:11:0;;:16;35914:55;35913:80;;;;-1:-1:-1;;;;;;35975:18:0;;;;;;:10;:18;;;;;;;;35974:19;35913:80;:106;;;;-1:-1:-1;;;;;;;;35998:21:0;;;;;:10;:21;;;;;;;;35997:22;;35796:228;-1:-1:-1;35796:228:0:o;34101:1138::-;34414:10;6706:4;6699:21;;;6747:20;6741:4;6734:34;;;34380:15;6782:19;;;6847:4;6831:21;;;6825:28;6699:21;;;;6734:34;;;6782:19;;;;6831:21;6825:28;-1:-1:-1;;34430:84:0;;;34485:23;;-1:-1:-1;;;34485:23:0;;;;;;;;;;;34430:84;-1:-1:-1;;34579:7:0;:28;34575:87;;34615:41;34631:4;34637:10;34649:6;34615:15;:41::i;:::-;34701:5;;34668:11;;34682:46;;-1:-1:-1;;;;;34693:13:0;;;34701:5;;34693:13;34708:6;34716:11;34682:10;:46::i;:::-;34668:60;-1:-1:-1;34737:7:0;;34733:412;;34849:3;34840:6;:12;34831:21;;35098:41;35114:4;35128;35135:3;35098:15;:41::i;:::-;35159:5;;-1:-1:-1;;;;;35159:5:0;;;35153:11;;;;35149:48;;35172:19;:17;:19::i;:::-;35201:33;35217:4;35223:2;35227:6;35201:15;:33::i;:::-;34192:1047;;34101:1138;;;;:::o;11905:2150::-;11993:4;12099;12095:2;12091:13;12194:8;12188:4;12181:22;12240:20;12233:5;12230:31;12224:4;12217:45;12313:4;12307;12297:21;12356:13;12350:20;12480:1;12476:6;12464:10;12461:22;12451:438;;12600:10;12592:6;12589:22;12586:162;;;12648:10;12642:4;12635:24;12724:4;12718;12711:18;12586:162;12866:6;12854:10;12850:23;12835:13;12828:46;12451:438;;;12987:18;12980:5;12977:29;12971:4;12964:43;13060:4;13054;13044:21;13104:15;13098:22;13196:11;13188:6;13185:23;13182:149;;;13241:10;13235:4;13228:24;13311:4;13305;13298:18;13182:149;13442:6;13429:11;13425:24;13408:15;13401:49;;;13527:2;13521:4;13514:16;13581:4;13575;13565:21;13835:6;13819:13;13813:20;13809:33;13794:13;13787:56;;13913:6;13907:4;13900:20;14008:4;14002:11;13998:2;13994:20;13986:5;13982:2;13978:14;13951:25;13945:4;13939;13934:81;-1:-1:-1;14043:4:0;;11905:2150;-1:-1:-1;;;;11905:2150:0:o;24040:506::-;-1:-1:-1;;24423:16:0;;-1:-1:-1;;;;;24277:26:0;;;;;;24383:38;24380:1;;24372:78;24501:27;24040:506::o;36090:268::-;36178:7;36196:6;36206:1;36196:11;36192:37;;-1:-1:-1;36222:1:0;36215:8;;36192:37;36233:14;36250:30;36261:5;36268:11;36250:10;:30::i;:::-;36233:47;-1:-1:-1;36289:10:0;;36285:56;;36332:3;36314:15;36323:6;36314;:15;:::i;:::-;:21;;;;:::i;:::-;36307:28;;;;;36285:56;-1:-1:-1;36352:1:0;;36090:268;-1:-1:-1;;;;36090:268:0:o;15910:1327::-;16088:4;16084:2;16080:13;16191:18;16184:5;16181:29;16175:4;16168:43;16264:4;16258;16248:21;16308:15;16302:22;16400:11;16392:6;16389:23;16386:149;;;16445:10;16439:4;16432:24;16515:4;16509;16502:18;16386:149;16646:6;16633:11;16629:24;16612:15;16605:49;;;16731:2;16725:4;16718:16;16785:4;16779;16769:21;17039:6;17023:13;17017:20;17013:33;16998:13;16991:56;;17117:6;17111:4;17104:20;17212:4;17206:11;17202:2;17198:20;17190:5;17186:2;17182:14;17155:25;17149:4;17143;17138:81;;15910:1327;;;:::o;36427:373::-;6263:18;6257:4;6250:32;;;36513:4;36469:23;6296:19;;;6361:4;6345:21;;;6339:28;36528:10;;;;;;;:22;;;;-1:-1:-1;36543:7:0;;;;;;;36542:8;36528:22;:57;;;;;36573:12;;36554:15;:31;;36528:57;36524:272;;;36618:11;;36639:18;;36635:156;;36700:15;36683:14;:32;:67;;36736:14;36683:67;;;36718:15;36683:67;36666:84;;36757:27;36769:14;36757:11;:27::i;:::-;36587:209;36464:336;36427:373::o;10200:1326::-;10270:4;10429:18;10423:4;10416:32;10475:8;10469:4;10462:22;10537:4;10531;10521:21;10581:15;10575:22;10673:11;10665:6;10662:23;10659:149;;;10718:10;10712:4;10705:24;10788:4;10782;10775:18;10659:149;10919:6;10906:11;10902:24;10885:15;10878:49;;;11004:2;10998:4;10991:16;11058:4;11052;11042:21;11312:6;11296:13;11290:20;11286:33;11271:13;11264:56;;11390:6;11384:4;11377:20;11479:4;11473:11;11469:2;11465:20;11455:8;11428:25;11422:4;11416;11411:75;-1:-1:-1;11514:4:0;10200:1326;;;;:::o;37359:237::-;37431:4;-1:-1:-1;;;;;37449:25:0;;37469:4;37449:25;;:55;;-1:-1:-1;;;;;;37482:22:0;;;37449:55;:90;;;-1:-1:-1;;;;;;37512:27:0;;37532:6;37512:27;37449:90;:115;;;-1:-1:-1;37559:5:0;;-1:-1:-1;;;;;37547:17:0;;;37559:5;;37547:17;37449:115;:142;;;-1:-1:-1;;;;28977:27:0;-1:-1:-1;;;;;37572:19:0;;;;;;;37359:237::o;17618:979::-;17863:7;17857:4;17850:21;17898:20;17892:4;17885:34;17946:5;17940:4;17933:19;18003:4;17997;17987:21;18046:13;18040:20;18170:1;18166:6;18154:10;18151:22;18141:438;;18290:10;18282:6;18279:22;18276:162;;;18338:10;18332:4;18325:24;18414:4;18408;18401:18;18276:162;18540:23;;;;18518:46;;-1:-1:-1;;17618:979:0:o;36856:394::-;36928:7;36975:11;36971:51;;;37001:5;:15;;37014:2;37001:15;;;37009:2;37001:15;36994:22;;;;;;36971:51;37051:11;;37066:1;37051:16;37047:56;;37082:5;:15;;37095:2;37082:15;;37047:56;37127:5;37123:61;;;37164:4;:14;37147:31;;37164:14;;;;;;37147;;;:31;:::i;37123:61::-;37230:4;:15;37212:33;;37230:15;;;;;;;37212;;;;:33;:::i;:::-;37205:40;;;36856:394;-1:-1:-1;;;36856:394:0:o;37601:614::-;31365:7;;;;;;;31361:47;;;31387:15;;-1:-1:-1;;;31387:15:0;;;;;;;;;;;31361:47;31412:7;:14;;-1:-1:-1;;31412:14:0;;;;;;;;37768:13;37764:418:::1;;;37823:4;:15:::0;37789:13:::1;::::0;37805:33:::1;::::0;37823:15:::1;::::0;;::::1;::::0;::::1;::::0;37805;;::::1;;:33;:::i;:::-;37881:4;:15:::0;37789:49:::1;::::0;;::::1;::::0;-1:-1:-1;37844:20:0::1;::::0;37908:1:::1;::::0;37789:49;;37868:28:::1;::::0;37881:15;;::::1;;37868:10:::0;:28:::1;:::i;:::-;:36;;;;:::i;:::-;37867:42;;;;:::i;:::-;37844:65:::0;-1:-1:-1;37939:21:0::1;37966:32;37972:25;37844:65:::0;37972:10;:25:::1;:::i;:::-;37966:5;:32::i;:::-;38004:21;38028:37;38052:13:::0;38028:21:::1;:37;:::i;:::-;38004:61:::0;-1:-1:-1;38071:70:0::1;38085:12:::0;38130:10;38099:28:::1;38085:12:::0;38004:61;38099:28:::1;:::i;:::-;:41;;;;:::i;:::-;38071:13;:70::i;:::-;37783:364;;;;37764:418;;;38159:17;38165:10;38159:5;:17::i;:::-;38186:24;:22;:24::i;:::-;-1:-1:-1::0;31447:5:0;31437:15;;-1:-1:-1;;31437:15:0;;;37601:614::o;38254:325::-;38322:16;;;38336:1;38322:16;;;;;;;;38298:21;;38322:16;;;;;;;;;;-1:-1:-1;38322:16:0;38298:40;;38361:4;38343;38348:1;38343:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38343:23:0;;;:7;;;;;;;;;;:23;;;;38402:7;;38425:13;;;-1:-1:-1;;;38425:13:0;;;;38402:7;;;;;;;38425:11;;:13;;;;;;;;;;38402:7;38425:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38415:4;38420:1;38415:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38415:23:0;;;:7;;;;;;;;;:23;38443:131;;-1:-1:-1;;;38443:131:0;;:57;;;;;;:131;;38506:6;;38518:1;;38525:4;;38543;;38554:15;;38443:131;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38293:286;;38254:325;:::o;38584:209::-;38660:7;;;38747:15;;38649:139;;-1:-1:-1;;;38649:139:0;;38710:4;38649:139;;;11006:34:1;11056:18;;;11049:34;;;11099:18;;;11092:34;;;11142:18;;;11135:34;;;;38747:15:0;;;-1:-1:-1;;;;;38747:15:0;;;11185:19:1;;;11178:44;38768:15:0;11238:19:1;;;11231:35;38660:7:0;;;;38649:35;;38692:3;;10940:19:1;;38649:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38911:105::-;38958:14;;:53;;-1:-1:-1;;;;;38958:14:0;;;;38985:21;;38958:53;;;;38985:21;38958:14;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39548:90:::1;39367:275:::0;;:::o;206:180:1:-;265:6;318:2;306:9;297:7;293:23;289:32;286:52;;;334:1;331;324:12;286:52;-1:-1:-1;357:23:1;;206:180;-1:-1:-1;206:180:1:o;391:548::-;503:4;532:2;561;550:9;543:21;593:6;587:13;636:6;631:2;620:9;616:18;609:34;661:1;671:140;685:6;682:1;679:13;671:140;;;780:14;;;776:23;;770:30;746:17;;;765:2;742:26;735:66;700:10;;671:140;;;675:3;860:1;855:2;846:6;835:9;831:22;827:31;820:42;930:2;923;919:7;914:2;906:6;902:15;898:29;887:9;883:45;879:54;871:62;;;;391:548;;;;:::o;944:131::-;-1:-1:-1;;;;;1019:31:1;;1009:42;;999:70;;1065:1;1062;1055:12;1080:247;1139:6;1192:2;1180:9;1171:7;1167:23;1163:32;1160:52;;;1208:1;1205;1198:12;1160:52;1247:9;1234:23;1266:31;1291:5;1266:31;:::i;1332:315::-;1400:6;1408;1461:2;1449:9;1440:7;1436:23;1432:32;1429:52;;;1477:1;1474;1467:12;1429:52;1516:9;1503:23;1535:31;1560:5;1535:31;:::i;:::-;1585:5;1637:2;1622:18;;;;1609:32;;-1:-1:-1;;;1332:315:1:o;1834:160::-;1899:20;;1955:13;;1948:21;1938:32;;1928:60;;1984:1;1981;1974:12;1928:60;1834:160;;;:::o;1999:315::-;2064:6;2072;2125:2;2113:9;2104:7;2100:23;2096:32;2093:52;;;2141:1;2138;2131:12;2093:52;2180:9;2167:23;2199:31;2224:5;2199:31;:::i;:::-;2249:5;-1:-1:-1;2273:35:1;2304:2;2289:18;;2273:35;:::i;:::-;2263:45;;1999:315;;;;;:::o;2319:456::-;2396:6;2404;2412;2465:2;2453:9;2444:7;2440:23;2436:32;2433:52;;;2481:1;2478;2471:12;2433:52;2520:9;2507:23;2539:31;2564:5;2539:31;:::i;:::-;2589:5;-1:-1:-1;2646:2:1;2631:18;;2618:32;2659:33;2618:32;2659:33;:::i;:::-;2319:456;;2711:7;;-1:-1:-1;;;2765:2:1;2750:18;;;;2737:32;;2319:456::o;2780:156::-;2846:20;;2906:4;2895:16;;2885:27;;2875:55;;2926:1;2923;2916:12;2941:252;3005:6;3013;3066:2;3054:9;3045:7;3041:23;3037:32;3034:52;;;3082:1;3079;3072:12;3034:52;3105:27;3122:9;3105:27;:::i;:::-;3095:37;;3151:36;3183:2;3172:9;3168:18;3151:36;:::i;3387:180::-;3443:6;3496:2;3484:9;3475:7;3471:23;3467:32;3464:52;;;3512:1;3509;3502:12;3464:52;3535:26;3551:9;3535:26;:::i;3780:615::-;3866:6;3874;3927:2;3915:9;3906:7;3902:23;3898:32;3895:52;;;3943:1;3940;3933:12;3895:52;3983:9;3970:23;4012:18;4053:2;4045:6;4042:14;4039:34;;;4069:1;4066;4059:12;4039:34;4107:6;4096:9;4092:22;4082:32;;4152:7;4145:4;4141:2;4137:13;4133:27;4123:55;;4174:1;4171;4164:12;4123:55;4214:2;4201:16;4240:2;4232:6;4229:14;4226:34;;;4256:1;4253;4246:12;4226:34;4309:7;4304:2;4294:6;4291:1;4287:14;4283:2;4279:23;4275:32;4272:45;4269:65;;;4330:1;4327;4320:12;4269:65;4361:2;4353:11;;;;;4383:6;;-1:-1:-1;3780:615:1;;-1:-1:-1;;;;3780:615:1:o;4824:248::-;4892:6;4900;4953:2;4941:9;4932:7;4928:23;4924:32;4921:52;;;4969:1;4966;4959:12;4921:52;-1:-1:-1;;4992:23:1;;;5062:2;5047:18;;;5034:32;;-1:-1:-1;4824:248:1:o;5077:388::-;5145:6;5153;5206:2;5194:9;5185:7;5181:23;5177:32;5174:52;;;5222:1;5219;5212:12;5174:52;5261:9;5248:23;5280:31;5305:5;5280:31;:::i;:::-;5330:5;-1:-1:-1;5387:2:1;5372:18;;5359:32;5400:33;5359:32;5400:33;:::i;:::-;5452:7;5442:17;;;5077:388;;;;;:::o;5470:419::-;5672:2;5654:21;;;5711:2;5691:18;;;5684:30;5750:34;5745:2;5730:18;;5723:62;5821:25;5816:2;5801:18;;5794:53;5879:3;5864:19;;5470:419::o;6240:127::-;6301:10;6296:3;6292:20;6289:1;6282:31;6332:4;6329:1;6322:15;6356:4;6353:1;6346:15;6372:148;6460:4;6439:12;;;6453;;;6435:31;;6478:13;;6475:39;;;6494:18;;:::i;7231:128::-;7298:9;;;7319:11;;;7316:37;;;7333:18;;:::i;7724:127::-;7785:10;7780:3;7776:20;7773:1;7766:31;7816:4;7813:1;7806:15;7840:4;7837:1;7830:15;7856:135;7895:3;7916:17;;;7913:43;;7936:18;;:::i;:::-;-1:-1:-1;7983:1:1;7972:13;;7856:135::o;7996:217::-;8036:1;8062;8052:132;;8106:10;8101:3;8097:20;8094:1;8087:31;8141:4;8138:1;8131:15;8169:4;8166:1;8159:15;8052:132;-1:-1:-1;8198:9:1;;7996:217::o;8576:125::-;8641:9;;;8662:10;;;8659:36;;;8675:18;;:::i;9119:168::-;9192:9;;;9223;;9240:15;;;9234:22;;9220:37;9210:71;;9261:18;;:::i;9424:251::-;9494:6;9547:2;9535:9;9526:7;9522:23;9518:32;9515:52;;;9563:1;9560;9553:12;9515:52;9595:9;9589:16;9614:31;9639:5;9614:31;:::i;9680:980::-;9942:4;9990:3;9979:9;9975:19;10021:6;10010:9;10003:25;10047:2;10085:6;10080:2;10069:9;10065:18;10058:34;10128:3;10123:2;10112:9;10108:18;10101:31;10152:6;10187;10181:13;10218:6;10210;10203:22;10256:3;10245:9;10241:19;10234:26;;10295:2;10287:6;10283:15;10269:29;;10316:1;10326:195;10340:6;10337:1;10334:13;10326:195;;;10405:13;;-1:-1:-1;;;;;10401:39:1;10389:52;;10496:15;;;;10461:12;;;;10437:1;10355:9;10326:195;;;-1:-1:-1;;;;;;;10577:32:1;;;;10572:2;10557:18;;10550:60;-1:-1:-1;;;10641:3:1;10626:19;10619:35;10538:3;9680:980;-1:-1:-1;;;9680:980:1:o;11277:306::-;11365:6;11373;11381;11434:2;11422:9;11413:7;11409:23;11405:32;11402:52;;;11450:1;11447;11440:12;11402:52;11479:9;11473:16;11463:26;;11529:2;11518:9;11514:18;11508:25;11498:35;;11573:2;11562:9;11558:18;11552:25;11542:35;;11277:306;;;;;:::o

Swarm Source

ipfs://6f4fa484a56cdf1496c666e8d983fceb9739de4b29fbd8088643726add35a38b

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Prodigy Bot is a multichain trading suite that allows you to manage assets and trading from a simple to use Telegram chat. The token allows holders to access premium features, discounted fees, and fee revenue.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.