ETH Price: $2,607.86 (+1.27%)

Token

PONG (PING)
 

Overview

Max Total Supply

100,000,000 PING

Holders

40

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
337,500 PING

Value
$0.00
0x250d1bfabc3a4c1578a492c27cf8d6695fc51098
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
pingpongToken

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-12
*/

/*
Website:https://www.pingpong.build/
Telegram:https://t.me/pingpongbuild
Twitter:https://twitter.com/pingpongbuild
Whitepaper:https://www.pingpong.build/whitepaperV0.1.1.pdf
*/

pragma solidity ^0.8.0;
 
/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
 
    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
 
 

 


 
pragma solidity ^0.8.0;
 
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;
 
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }
 
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }
 
    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }
 
    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
 

 


 
pragma solidity ^0.8.0;
 
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);
 
    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
 
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);
 
    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
 
    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);
 
    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);
 
    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https:
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);
 
    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
 
 

 


 
pragma solidity ^0.8.0;
 
/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);
 
    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);
 
    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}
 
 

 


 
pragma solidity ^0.8.0;
 
 

 


 
pragma solidity ^0.8.0;
 
 
 
/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https:
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;
 
    mapping(address => mapping(address => uint256)) private _allowances;
 
    uint256 private _totalSupply;
 
    string private _name;
    string private _symbol;
 
    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
 
    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }
 
    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
 
    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }
 
    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }
 
    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }
 
    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }
 
    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }
 
    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }
 
    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }
 
    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }
 
    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }
 
        return true;
    }
 
    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
 
        _beforeTokenTransfer(from, to, amount);
 
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            
            
            _balances[to] += amount;
        }
 
        emit Transfer(from, to, amount);
 
        _afterTokenTransfer(from, to, amount);
    }
 
    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
 
        _beforeTokenTransfer(address(0), account, amount);
 
        _totalSupply += amount;
        unchecked {
            
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
 
        _afterTokenTransfer(address(0), account, amount);
    }
 
    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
 
        _beforeTokenTransfer(account, address(0), amount);
 
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            
            _totalSupply -= amount;
        }
 
        emit Transfer(account, address(0), amount);
 
        _afterTokenTransfer(account, address(0), amount);
    }
 
    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
 
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
 
    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }
 
    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
 
    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}
 
 

 


 
pragma solidity ^0.8.0;
 
 
/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }
 
    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}
 
 

 
interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
 
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
 
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
 
    function createPair(address tokenA, address tokenB) external returns (address pair);
 
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}
 
interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);
 
    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
 
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
 
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
 
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
 
    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);
 
    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);
 
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;
 
    function initialize(address, address) external;
}
 
interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
 
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
 
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
 
interface IUniswapV2Router02 is IUniswapV2Router01{
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
 
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}
 
interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}
 
 
interface IUniswapV2ERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);
 
    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
 
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
 
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
 
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}
 
 

 

 
pragma solidity ^0.8.15;
 
 
 
 
contract pingpongToken is ERC20Burnable, Ownable {
    uint256 private constant TOTAL_SUPPLY = 100_000_000e18;
    address public marketingWallet;
    uint256 public maxPercentToSwap = 5;
    IUniswapV2Router02 public uniswapV2Router;
    address public  uniswapV2Pair;
 
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;
 
    bool private swapping;
    uint256 public swapTokensAtAmount;
    bool public isTradingEnabled;
    uint256 public openTradeBlock;
    uint256 public fastBlocks;
    uint256 public fastBlocks2;
 
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;
 
    event ExcludeFromFees(address indexed account);
    event FeesUpdated(uint256 sellFee, uint256 buyFee);
    event MarketingWalletChanged(address marketingWallet);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event SwapAndSendMarketing(uint256 tokensSwapped, uint256 bnbSend);
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
 
    uint256 public immutable fastBlockSellFee;
    uint256 public immutable fastBlockBuyFee;
    uint256 public sellFee;
    uint256 public buyFee;
 
    
    bool public _removeLimits;
    uint256 public maxTxAmount;
    uint256 public maxHolding;
    mapping(address => bool) public isExempt;
 
    mapping(address => bool) public bld;
    bool public blStopped = false;
 
    constructor (address router, address operator) ERC20("PONG", "PING")
    {
        _mint(owner(), TOTAL_SUPPLY);
 
        swapTokensAtAmount = TOTAL_SUPPLY / 1000;
        maxHolding = TOTAL_SUPPLY / 5000;
        maxTxAmount = TOTAL_SUPPLY / 5000;
        marketingWallet = operator;
 
        fastBlockSellFee = 90;
        fastBlockBuyFee = 90;
        sellFee = 25;
        buyFee = 25;
        fastBlocks = 4;
        fastBlocks2 = 12;
 
 
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router);
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
 
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
 
        _approve(address(this), address(uniswapV2Router), type(uint256).max);
 
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);
 
        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[DEAD] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(uniswapV2Router)] = true;
 
        
        isExempt[address(uniswapV2Router)] = true;
        isExempt[owner()] = true;
    }
 
    receive() external payable {
    }
 
    function openTrade() public onlyOwner {
        require(isTradingEnabled == false, "Trading is already open!");
        isTradingEnabled = true;
        openTradeBlock = block.number;
    }
 
    function extractTokens(address token) external onlyOwner {
        require(token != address(this), "3");
        if (token == address(0x0)) {
            payable(msg.sender).transfer(address(this).balance);
            return;
        }
        IERC20 ERC20token = IERC20(token);
        uint256 balance = ERC20token.balanceOf(address(this));
        ERC20token.transfer(msg.sender, balance);
    }
 
    function sendETH(address payable recipient, uint256 amount) internal {
        
        recipient.call{gas: 2300, value: amount}("");
    }
 
    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");
 
        _setAutomatedMarketMakerPair(pair, value);
    }
 
    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;
 
        emit SetAutomatedMarketMakerPair(pair, value);
    }
 
    
    function excludeFromFees(address account) external onlyOwner {
        require(!_isExcludedFromFees[account], "1");
        _isExcludedFromFees[account] = true;
 
        emit ExcludeFromFees(account);
    }
 
    function includeInFees(address account) external onlyOwner {
        require(_isExcludedFromFees[account], "2");
        _isExcludedFromFees[account] = false;
    }
 
    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }
 
    function updateFees(uint256 _sellFee, uint256 _buyFee) external onlyOwner {
        require(_sellFee <= 8, "Fee max");
        require(_buyFee <= 8, "Fee max");
        sellFee = _sellFee;
        buyFee = _buyFee;
 
        emit FeesUpdated(sellFee, buyFee);
    }
 
    function updateWallet(address _marketingWallet) external onlyOwner {
        require(_marketingWallet != marketingWallet, "Marketing wallet is already that address");
        marketingWallet = _marketingWallet;
        emit MarketingWalletChanged(marketingWallet);
    }
     function updateTaxes(uint256 _sellFee, uint256 _buyFee) external onlyOwner {
        sellFee = _sellFee;
        buyFee = _buyFee;
 
        emit FeesUpdated(sellFee, buyFee);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
 
        if (!swapping) {
            _check(from, to, amount);
        }
 
        if (!isExempt[from] && !isExempt[to]) {
            require(isTradingEnabled, "Trade is not open");
            if (openTradeBlock + fastBlocks2 > block.number) {
                require(tx.origin == to || automatedMarketMakerPairs[to], "early");
            }
        }
 
        uint _buyFee = buyFee;
        uint _sellFee = sellFee;
        if (openTradeBlock + fastBlocks > block.number) {
            _buyFee = fastBlockBuyFee;
            _sellFee = fastBlockSellFee;
        }
 
        if (amount == 0) {
            return;
        }
 
        bool takeFee = !swapping;
 
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
 
        uint256 toSwap = balanceOf(address(this));
 
        bool canSwap = toSwap >= swapTokensAtAmount && toSwap > 0 && !automatedMarketMakerPairs[from] && takeFee;
        if (canSwap &&
            !swapping) {
            swapping = true;
            uint256 pairBalance = balanceOf(uniswapV2Pair);
            if (toSwap > pairBalance * maxPercentToSwap / 100) {
                toSwap = pairBalance * maxPercentToSwap / 100;
            }
            swapAndSendMarketing(toSwap);
            swapping = false;
        }
 
        if (takeFee && to == uniswapV2Pair && _sellFee > 0) {
            uint256 fees = (amount * _sellFee) / 100;
            amount = amount - fees;
 
            super._transfer(from, address(this), fees);
        }
        else if (takeFee && from == uniswapV2Pair && _buyFee > 0) {
            uint256 fees = (amount * _buyFee) / 100;
            amount = amount - fees;
 
            super._transfer(from, address(this), fees);
        }
 
        super._transfer(from, to, amount);
    }
 
    
    function swapAndSendMarketing(uint256 tokenAmount) private {
 
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
 
        try uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, 
            path,
            address(this),
            block.timestamp) {}
        catch {
        }
 
        uint256 newBalance = address(this).balance;
        sendETH(payable(marketingWallet), newBalance);
 
        emit SwapAndSendMarketing(tokenAmount, newBalance);
    }
 
    function setSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
        require(newAmount > 0);
        swapTokensAtAmount = newAmount;
    }
 
    function setMaxPercentToSwap(uint256 newAmount) external onlyOwner {
        require(newAmount > 1, "too low");
        require(newAmount <= 10, "too high");
        maxPercentToSwap = newAmount;
    }
 
    function _check(
        address from,
        address to,
        uint256 amount
    ) internal {
        
        if (!_removeLimits) {
            require(!bld[from] && !bld[to], "bld");
 
            
            if (!isUnused(from, to) && !isExempt[to]) {
                _checkMaxTxAmount(to, amount);
                
                _checkMaxHoldingLimit(to, amount);
            }
        }
    }
 
    function _checkMaxTxAmount(address to, uint256 amount) internal view {
        require(amount <= maxTxAmount, "Amount exceeds max");
 
    }
 
    function _checkMaxHoldingLimit(address to, uint256 amount) internal view {
        if (to == uniswapV2Pair) {
            return;
        }
 
        require(balanceOf(to) + amount <= maxHolding, "Max holding exceeded max");
 
    }
 
    function blAdd(address[] memory addresses) external onlyOwner {
        require(!blStopped, "bl is stopped");
        for (uint i = 0; i < addresses.length; i++) {
            bld[addresses[i]] = true;
        }
    }
 
    function blRemove(address[] memory addresses) external onlyOwner {
        for (uint i = 0; i < addresses.length; i++) {
            bld[addresses[i]] = false;
        }
    }
 
    function removeBl() external onlyOwner {
        blStopped = true;
    }
 
    function isUnused(address from, address to) view public returns (bool){
        
        return (from == owner() || to == owner() || from == address(this) || to == address(this));
    }
 
    function removeLimits() external onlyOwner {
        _removeLimits = true;
    }
 
    function setMaxTxAmount(uint256 maxTxAmount_) external onlyOwner {
        maxTxAmount = maxTxAmount_;
    }
 
    function setMaxHolding(uint256 maxHolding_) external onlyOwner {
        maxHolding = maxHolding_;
    }
 
    function setExempt(address who, bool status) public onlyOwner {
        isExempt[who] = status;
    }
 
    function multiTransfer(address[] memory to, uint256[] memory amounts) external onlyOwner {
        require(to.length == amounts.length, "length mismatch");
 
        for (uint i = 0; i < to.length; i++) {
            _transfer(msg.sender, to[i], amounts[i]);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyFee","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketingWallet","type":"address"}],"name":"MarketingWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbSend","type":"uint256"}],"name":"SwapAndSendMarketing","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"_removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","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":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"blAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"blRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blStopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bld","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"extractTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fastBlockBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fastBlockSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fastBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fastBlocks2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"isUnused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxHolding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPercentToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openTradeBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeBl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxHolding_","type":"uint256"}],"name":"setMaxHolding","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setMaxPercentToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount_","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","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":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"updateTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"updateWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405260056007556018805460ff191690553480156200001f575f80fd5b50604051620030ce380380620030ce83398101604081905262000042916200074a565b60405180604001604052806004815260200163504f4e4760e01b8152506040518060400160405280600481526020016350494e4760e01b81525081600390816200008d91906200081d565b5060046200009c82826200081d565b505050620000b9620000b3620003fe60201b60201c565b62000402565b620000e2620000d06005546001600160a01b031690565b6a52b7d2dcc80cd2e400000062000453565b620000fb6103e86a52b7d2dcc80cd2e4000000620008e9565b600a55620001176113886a52b7d2dcc80cd2e4000000620008e9565b601555620001336113886a52b7d2dcc80cd2e4000000620008e9565b601455600680546001600160a01b0319166001600160a01b0383811691909117909155605a608081905260a052601960118190556012556004600d819055600c600e556040805163c45a015560e01b8152905185935f939085169263c45a015592818301926020928290030181865afa158015620001b3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001d9919062000909565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000225573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200024b919062000909565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000296573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002bc919062000909565b600880546001600160a01b038086166001600160a01b031992831681179093556009805491851691909216179055909150620002fc9030905f1962000518565b620003098160016200063f565b6001600f5f620003216005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff19968716179055600f84527f99629f56119585bf27511b6b7d295dffb54757453fcc3dabcf51d92028301f1080548616600190811790915530825283822080548716821790556008805484168352848320805488168317905554909216815260169384905291822080549094168117909355620003cc6005546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055506200095292505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216620004af5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060025f828254620004c291906200092c565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b0383166200057c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620004a6565b6001600160a01b038216620005df5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620004a6565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0382165f9081526010602052604090205481151560ff909116151503620006d65760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401620004a6565b6001600160a01b0382165f81815260106020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b505050565b80516001600160a01b038116811462000745575f80fd5b919050565b5f80604083850312156200075c575f80fd5b62000767836200072e565b915062000777602084016200072e565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620007a957607f821691505b602082108103620007c857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200072957805f5260205f20601f840160051c81016020851015620007f55750805b601f840160051c820191505b8181101562000816575f815560010162000801565b5050505050565b81516001600160401b0381111562000839576200083962000780565b62000851816200084a845462000794565b84620007ce565b602080601f83116001811462000887575f84156200086f5750858301515b5f19600386901b1c1916600185901b178555620008e1565b5f85815260208120601f198616915b82811015620008b75788860151825594840194600190910190840162000896565b5085821015620008d557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f826200090457634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156200091a575f80fd5b62000925826200072e565b9392505050565b808201808211156200094c57634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05161274c620009825f395f81816103c901526117d901525f818161080a01526117fc015261274c5ff3fe60806040526004361061035e575f3560e01c8063751039fc116101bd578063a457c2d7116100f2578063e2f4560511610092578063ec28438a1161006d578063ec28438a146109d7578063f2fde38b146109f6578063f60ae6ab14610a15578063fb201b1d14610a2a575f80fd5b8063e2f456051461098a578063e57f14e11461099f578063e7de382b146109be575f80fd5b8063afa4f3b2116100cd578063afa4f3b21461090a578063b62496f514610929578063c7214e2014610957578063dd62ed3e1461096b575f80fd5b8063a457c2d71461089e578063a9059cbb146108bd578063ad5dff73146108dc575f80fd5b80638da5cb5b1161015d5780639a7a23d6116101385780639a7a23d61461082c5780639bc7c8c01461084b5780639c7d15a21461086a5780639fde54f51461087f575f80fd5b80638da5cb5b146107c857806395d89b41146107e557806396483bc2146107f9575f80fd5b806379cc67901161019857806379cc6790146107565780638321e74014610775578063848b86e3146107945780638c0b5e22146107b3575f80fd5b8063751039fc1461070457806375f0a874146107185780637783252514610737575f80fd5b8063333e6f06116102935780634a30b386116102335780636db794371161020e5780636db794371461066f57806370a082311461068e578063715018a6146106c257806371d8a776146106d6575f80fd5b80634a30b3861461060a5780634dd0f946146106235780634fbee19314610638575f80fd5b80633d378b1c1161026e5780633d378b1c146105a257806342966c68146105b757806347062402146105d657806349bd5a5e146105eb575f80fd5b8063333e6f061461054f5780633381c64a146105645780633950935114610583575f80fd5b806316a2f82a116102fe57806320518758116102d957806320518758146104e157806323b872dd146105005780632b14ca561461051f578063313ce56714610534575f80fd5b806316a2f82a1461048f57806318160ddd146104ae5780631e89d545146104c2575f80fd5b806307ebd12f1161033957806307ebd12f146103f9578063095ea7b31461041a5780631006ee0c146104395780631694505e14610458575f80fd5b8063064a59d01461036957806306fdde0314610397578063071833a2146103b8575f80fd5b3661036557005b5f80fd5b348015610374575f80fd5b50600b546103829060ff1681565b60405190151581526020015b60405180910390f35b3480156103a2575f80fd5b506103ab610a3e565b60405161038e91906121be565b3480156103c3575f80fd5b506103eb7f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161038e565b348015610404575f80fd5b5061041861041336600461221e565b610ace565b005b348015610425575f80fd5b50610382610434366004612239565b610c34565b348015610444575f80fd5b50610418610453366004612263565b610c4d565b348015610463575f80fd5b50600854610477906001600160a01b031681565b6040516001600160a01b03909116815260200161038e565b34801561049a575f80fd5b506104186104a936600461221e565b610c9c565b3480156104b9575f80fd5b506002546103eb565b3480156104cd575f80fd5b506104186104dc366004612360565b610d0f565b3480156104ec575f80fd5b506104186104fb366004612415565b610daf565b34801561050b575f80fd5b5061038261051a36600461242c565b610e32565b34801561052a575f80fd5b506103eb60115481565b34801561053f575f80fd5b506040516012815260200161038e565b34801561055a575f80fd5b506103eb60155481565b34801561056f575f80fd5b5061041861057e36600461246a565b610e55565b34801561058e575f80fd5b5061038261059d366004612239565b610eb7565b3480156105ad575f80fd5b506103eb600c5481565b3480156105c2575f80fd5b506104186105d1366004612415565b610ed8565b3480156105e1575f80fd5b506103eb60125481565b3480156105f6575f80fd5b50600954610477906001600160a01b031681565b348015610615575f80fd5b506013546103829060ff1681565b34801561062e575f80fd5b506103eb600d5481565b348015610643575f80fd5b5061038261065236600461221e565b6001600160a01b03165f908152600f602052604090205460ff1690565b34801561067a575f80fd5b50610418610689366004612263565b610ee2565b348015610699575f80fd5b506103eb6106a836600461221e565b6001600160a01b03165f9081526020819052604090205490565b3480156106cd575f80fd5b50610418610f60565b3480156106e1575f80fd5b506103826106f036600461221e565b60176020525f908152604090205460ff1681565b34801561070f575f80fd5b50610418610f73565b348015610723575f80fd5b50600654610477906001600160a01b031681565b348015610742575f80fd5b5061041861075136600461246a565b610f8a565b348015610761575f80fd5b50610418610770366004612239565b611030565b348015610780575f80fd5b5061038261078f3660046124a4565b611045565b34801561079f575f80fd5b506104186107ae36600461221e565b6110b1565b3480156107be575f80fd5b506103eb60145481565b3480156107d3575f80fd5b506005546001600160a01b0316610477565b3480156107f0575f80fd5b506103ab61117c565b348015610804575f80fd5b506103eb7f000000000000000000000000000000000000000000000000000000000000000081565b348015610837575f80fd5b506104186108463660046124e8565b61118b565b348015610856575f80fd5b50610418610865366004612415565b611221565b348015610875575f80fd5b506103eb60075481565b34801561088a575f80fd5b506104186108993660046124e8565b61122e565b3480156108a9575f80fd5b506103826108b8366004612239565b611260565b3480156108c8575f80fd5b506103826108d7366004612239565b6112da565b3480156108e7575f80fd5b506103826108f636600461221e565b60166020525f908152604090205460ff1681565b348015610915575f80fd5b50610418610924366004612415565b6112e7565b348015610934575f80fd5b5061038261094336600461221e565b60106020525f908152604090205460ff1681565b348015610962575f80fd5b506104186112ff565b348015610976575f80fd5b506103eb6109853660046124a4565b611316565b348015610995575f80fd5b506103eb600a5481565b3480156109aa575f80fd5b506104186109b936600461221e565b611340565b3480156109c9575f80fd5b506018546103829060ff1681565b3480156109e2575f80fd5b506104186109f1366004612415565b6113df565b348015610a01575f80fd5b50610418610a1036600461221e565b6113ec565b348015610a20575f80fd5b506103eb600e5481565b348015610a35575f80fd5b50610418611462565b606060038054610a4d90612514565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7990612514565b8015610ac45780601f10610a9b57610100808354040283529160200191610ac4565b820191905f5260205f20905b815481529060010190602001808311610aa757829003601f168201915b5050505050905090565b610ad66114d0565b306001600160a01b03821603610b175760405162461bcd60e51b81526020600482015260016024820152603360f81b60448201526064015b60405180910390fd5b6001600160a01b038116610b525760405133904780156108fc02915f818181858888f19350505050158015610b4e573d5f803e3d5ffd5b5050565b6040516370a0823160e01b815230600482015281905f906001600160a01b038316906370a0823190602401602060405180830381865afa158015610b98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bbc919061254c565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610c09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c2d9190612563565b5050505b50565b5f33610c4181858561152a565b60019150505b92915050565b610c556114d0565b6011829055601281905560408051838152602081018390527f5c6323bf1c2d7aaea2c091a4751c1c87af7f2864650c336507a77d0557af37a1910160405180910390a15050565b610ca46114d0565b6001600160a01b0381165f908152600f602052604090205460ff16610cef5760405162461bcd60e51b81526020600482015260016024820152601960f91b6044820152606401610b0e565b6001600160a01b03165f908152600f60205260409020805460ff19169055565b610d176114d0565b8051825114610d5a5760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610b0e565b5f5b8251811015610daa57610da233848381518110610d7b57610d7b61257e565b6020026020010151848481518110610d9557610d9561257e565b602002602001015161164d565b600101610d5c565b505050565b610db76114d0565b60018111610df15760405162461bcd60e51b8152602060048201526007602482015266746f6f206c6f7760c81b6044820152606401610b0e565b600a811115610e2d5760405162461bcd60e51b81526020600482015260086024820152670e8dede40d0d2ced60c31b6044820152606401610b0e565b600755565b5f33610e3f858285611a3f565b610e4a85858561164d565b506001949350505050565b610e5d6114d0565b5f5b8151811015610b4e575f60175f848481518110610e7e57610e7e61257e565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610e5f565b5f33610c41818585610ec98383611316565b610ed391906125a6565b61152a565b610c313382611ab1565b610eea6114d0565b6008821115610f255760405162461bcd60e51b815260206004820152600760248201526608ccaca40dac2f60cb1b6044820152606401610b0e565b6008811115610c555760405162461bcd60e51b815260206004820152600760248201526608ccaca40dac2f60cb1b6044820152606401610b0e565b610f686114d0565b610f715f611be1565b565b610f7b6114d0565b6013805460ff19166001179055565b610f926114d0565b60185460ff1615610fd55760405162461bcd60e51b815260206004820152600d60248201526c189b081a5cc81cdd1bdc1c1959609a1b6044820152606401610b0e565b5f5b8151811015610b4e57600160175f848481518110610ff757610ff761257e565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610fd7565b61103b823383611a3f565b610b4e8282611ab1565b5f6110586005546001600160a01b031690565b6001600160a01b0316836001600160a01b0316148061108457506005546001600160a01b038381169116145b8061109757506001600160a01b03831630145b806110aa57506001600160a01b03821630145b9392505050565b6110b96114d0565b6006546001600160a01b03908116908216036111285760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b6064820152608401610b0e565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b9060200160405180910390a150565b606060048054610a4d90612514565b6111936114d0565b6009546001600160a01b03908116908316036112175760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b0e565b610b4e8282611c32565b6112296114d0565b601555565b6112366114d0565b6001600160a01b03919091165f908152601660205260409020805460ff1916911515919091179055565b5f338161126d8286611316565b9050838110156112cd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b0e565b610e4a828686840361152a565b5f33610c4181858561164d565b6112ef6114d0565b5f81116112fa575f80fd5b600a55565b6113076114d0565b6018805460ff19166001179055565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6113486114d0565b6001600160a01b0381165f908152600f602052604090205460ff16156113945760405162461bcd60e51b81526020600482015260016024820152603160f81b6044820152606401610b0e565b6001600160a01b0381165f818152600f6020526040808220805460ff19166001179055517f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d9369190a250565b6113e76114d0565b601455565b6113f46114d0565b6001600160a01b0381166114595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b0e565b610c3181611be1565b61146a6114d0565b600b5460ff16156114bd5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720697320616c7265616479206f70656e2100000000000000006044820152606401610b0e565b600b805460ff1916600117905543600c55565b6005546001600160a01b03163314610f715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0e565b6001600160a01b03831661158c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b0e565b6001600160a01b0382166115ed5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b0e565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116735760405162461bcd60e51b8152600401610b0e906125b9565b6001600160a01b0382166116995760405162461bcd60e51b8152600401610b0e906125fe565b600954600160a01b900460ff166116b5576116b5838383611d1a565b6001600160a01b0383165f9081526016602052604090205460ff161580156116f557506001600160a01b0382165f9081526016602052604090205460ff16155b156117b957600b5460ff166117405760405162461bcd60e51b81526020600482015260116024820152702a3930b2329034b9903737ba1037b832b760791b6044820152606401610b0e565b43600e54600c5461175191906125a6565b11156117b957326001600160a01b038316148061178557506001600160a01b0382165f9081526010602052604090205460ff165b6117b95760405162461bcd60e51b81526020600482015260056024820152646561726c7960d81b6044820152606401610b0e565b601254601154600d54600c5443916117d0916125a6565b111561181c57507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000005b825f0361182a575050505050565b6009546001600160a01b0386165f908152600f602052604090205460ff600160a01b90920482161591168061187657506001600160a01b0385165f908152600f602052604090205460ff165b1561187e57505f5b305f9081526020819052604081205490505f600a5482101580156118a157505f82115b80156118c557506001600160a01b0388165f9081526010602052604090205460ff16155b80156118ce5750825b90508080156118e75750600954600160a01b900460ff16155b1561196e576009805460ff60a01b198116600160a01b179091556001600160a01b03165f908152602081905260409020546007546064906119289083612641565b6119329190612658565b831115611956576064600754826119499190612641565b6119539190612658565b92505b61195f83611dde565b506009805460ff60a01b191690555b82801561198857506009546001600160a01b038881169116145b801561199357505f84115b156119ce575f60646119a58689612641565b6119af9190612658565b90506119bb8188612677565b96506119c8893083611f63565b50611a2a565b8280156119e857506009546001600160a01b038981169116145b80156119f357505f85115b15611a2a575f6064611a058789612641565b611a0f9190612658565b9050611a1b8188612677565b9650611a28893083611f63565b505b611a35888888611f63565b5050505050505050565b5f611a4a8484611316565b90505f198114610c2d5781811015611aa45760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b0e565b610c2d848484840361152a565b6001600160a01b038216611b115760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610b0e565b6001600160a01b0382165f9081526020819052604090205481811015611b845760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610b0e565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f9081526010602052604090205481151560ff909116151503611cc75760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610b0e565b6001600160a01b0382165f81815260106020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60135460ff16610daa576001600160a01b0383165f9081526017602052604090205460ff16158015611d6457506001600160a01b0382165f9081526017602052604090205460ff16155b611d965760405162461bcd60e51b8152602060048201526003602482015262189b1960ea1b6044820152606401610b0e565b611da08383611045565b158015611dc557506001600160a01b0382165f9081526016602052604090205460ff16155b15610daa57611dd4828261208b565b610daa82826120d2565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611e1157611e1161257e565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611e68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8c919061268a565b81600181518110611e9f57611e9f61257e565b6001600160a01b03928316602091820292909201015260085460405163791ac94760e01b815291169063791ac94790611ee49085905f908690309042906004016126a5565b5f604051808303815f87803b158015611efb575f80fd5b505af1925050508015611f0c575060015b506006544790611f25906001600160a01b031682612166565b60408051848152602081018390527f957ad1fc6d4d41da6d1a8d37303289ef3c4b78e0285ff5df1e12070ef0e62999910160405180910390a1505050565b6001600160a01b038316611f895760405162461bcd60e51b8152600401610b0e906125b9565b6001600160a01b038216611faf5760405162461bcd60e51b8152600401610b0e906125fe565b6001600160a01b0383165f90815260208190526040902054818110156120265760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610b0e565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610c2d565b601454811115610b4e5760405162461bcd60e51b8152602060048201526012602482015271082dadeeadce840caf0c6cacac8e640dac2f60731b6044820152606401610b0e565b6009546001600160a01b03908116908316036120ec575050565b6015548161210e846001600160a01b03165f9081526020819052604090205490565b61211891906125a6565b1115610b4e5760405162461bcd60e51b815260206004820152601860248201527f4d617820686f6c64696e67206578636565646564206d617800000000000000006044820152606401610b0e565b816001600160a01b03166108fc826040515f60405180830381858888f193505050503d805f81146121b2576040519150601f19603f3d011682016040523d82523d5f602084013e6121b7565b606091505b5050505050565b5f602080835283518060208501525f5b818110156121ea578581018301518582016040015282016121ce565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c31575f80fd5b5f6020828403121561222e575f80fd5b81356110aa8161220a565b5f806040838503121561224a575f80fd5b82356122558161220a565b946020939093013593505050565b5f8060408385031215612274575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156122c0576122c0612283565b604052919050565b5f67ffffffffffffffff8211156122e1576122e1612283565b5060051b60200190565b5f82601f8301126122fa575f80fd5b8135602061230f61230a836122c8565b612297565b8083825260208201915060208460051b870101935086841115612330575f80fd5b602086015b848110156123555780356123488161220a565b8352918301918301612335565b509695505050505050565b5f8060408385031215612371575f80fd5b823567ffffffffffffffff80821115612388575f80fd5b612394868387016122eb565b93506020915081850135818111156123aa575f80fd5b85019050601f810186136123bc575f80fd5b80356123ca61230a826122c8565b81815260059190911b820183019083810190888311156123e8575f80fd5b928401925b82841015612406578335825292840192908401906123ed565b80955050505050509250929050565b5f60208284031215612425575f80fd5b5035919050565b5f805f6060848603121561243e575f80fd5b83356124498161220a565b925060208401356124598161220a565b929592945050506040919091013590565b5f6020828403121561247a575f80fd5b813567ffffffffffffffff811115612490575f80fd5b61249c848285016122eb565b949350505050565b5f80604083850312156124b5575f80fd5b82356124c08161220a565b915060208301356124d08161220a565b809150509250929050565b8015158114610c31575f80fd5b5f80604083850312156124f9575f80fd5b82356125048161220a565b915060208301356124d0816124db565b600181811c9082168061252857607f821691505b60208210810361254657634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121561255c575f80fd5b5051919050565b5f60208284031215612573575f80fd5b81516110aa816124db565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c4757610c47612592565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8082028115828204841417610c4757610c47612592565b5f8261267257634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610c4757610c47612592565b5f6020828403121561269a575f80fd5b81516110aa8161220a565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156126f55784516001600160a01b0316835293830193918301916001016126d0565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212200205d6f99ecbdd8043ca456c9bbcd9ddf4e492f0d6b94b05501861c3e1dbb0bb64736f6c634300081800330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000461a955c8d891d7301c874d6de4297cc942ea1e

Deployed Bytecode

0x60806040526004361061035e575f3560e01c8063751039fc116101bd578063a457c2d7116100f2578063e2f4560511610092578063ec28438a1161006d578063ec28438a146109d7578063f2fde38b146109f6578063f60ae6ab14610a15578063fb201b1d14610a2a575f80fd5b8063e2f456051461098a578063e57f14e11461099f578063e7de382b146109be575f80fd5b8063afa4f3b2116100cd578063afa4f3b21461090a578063b62496f514610929578063c7214e2014610957578063dd62ed3e1461096b575f80fd5b8063a457c2d71461089e578063a9059cbb146108bd578063ad5dff73146108dc575f80fd5b80638da5cb5b1161015d5780639a7a23d6116101385780639a7a23d61461082c5780639bc7c8c01461084b5780639c7d15a21461086a5780639fde54f51461087f575f80fd5b80638da5cb5b146107c857806395d89b41146107e557806396483bc2146107f9575f80fd5b806379cc67901161019857806379cc6790146107565780638321e74014610775578063848b86e3146107945780638c0b5e22146107b3575f80fd5b8063751039fc1461070457806375f0a874146107185780637783252514610737575f80fd5b8063333e6f06116102935780634a30b386116102335780636db794371161020e5780636db794371461066f57806370a082311461068e578063715018a6146106c257806371d8a776146106d6575f80fd5b80634a30b3861461060a5780634dd0f946146106235780634fbee19314610638575f80fd5b80633d378b1c1161026e5780633d378b1c146105a257806342966c68146105b757806347062402146105d657806349bd5a5e146105eb575f80fd5b8063333e6f061461054f5780633381c64a146105645780633950935114610583575f80fd5b806316a2f82a116102fe57806320518758116102d957806320518758146104e157806323b872dd146105005780632b14ca561461051f578063313ce56714610534575f80fd5b806316a2f82a1461048f57806318160ddd146104ae5780631e89d545146104c2575f80fd5b806307ebd12f1161033957806307ebd12f146103f9578063095ea7b31461041a5780631006ee0c146104395780631694505e14610458575f80fd5b8063064a59d01461036957806306fdde0314610397578063071833a2146103b8575f80fd5b3661036557005b5f80fd5b348015610374575f80fd5b50600b546103829060ff1681565b60405190151581526020015b60405180910390f35b3480156103a2575f80fd5b506103ab610a3e565b60405161038e91906121be565b3480156103c3575f80fd5b506103eb7f000000000000000000000000000000000000000000000000000000000000005a81565b60405190815260200161038e565b348015610404575f80fd5b5061041861041336600461221e565b610ace565b005b348015610425575f80fd5b50610382610434366004612239565b610c34565b348015610444575f80fd5b50610418610453366004612263565b610c4d565b348015610463575f80fd5b50600854610477906001600160a01b031681565b6040516001600160a01b03909116815260200161038e565b34801561049a575f80fd5b506104186104a936600461221e565b610c9c565b3480156104b9575f80fd5b506002546103eb565b3480156104cd575f80fd5b506104186104dc366004612360565b610d0f565b3480156104ec575f80fd5b506104186104fb366004612415565b610daf565b34801561050b575f80fd5b5061038261051a36600461242c565b610e32565b34801561052a575f80fd5b506103eb60115481565b34801561053f575f80fd5b506040516012815260200161038e565b34801561055a575f80fd5b506103eb60155481565b34801561056f575f80fd5b5061041861057e36600461246a565b610e55565b34801561058e575f80fd5b5061038261059d366004612239565b610eb7565b3480156105ad575f80fd5b506103eb600c5481565b3480156105c2575f80fd5b506104186105d1366004612415565b610ed8565b3480156105e1575f80fd5b506103eb60125481565b3480156105f6575f80fd5b50600954610477906001600160a01b031681565b348015610615575f80fd5b506013546103829060ff1681565b34801561062e575f80fd5b506103eb600d5481565b348015610643575f80fd5b5061038261065236600461221e565b6001600160a01b03165f908152600f602052604090205460ff1690565b34801561067a575f80fd5b50610418610689366004612263565b610ee2565b348015610699575f80fd5b506103eb6106a836600461221e565b6001600160a01b03165f9081526020819052604090205490565b3480156106cd575f80fd5b50610418610f60565b3480156106e1575f80fd5b506103826106f036600461221e565b60176020525f908152604090205460ff1681565b34801561070f575f80fd5b50610418610f73565b348015610723575f80fd5b50600654610477906001600160a01b031681565b348015610742575f80fd5b5061041861075136600461246a565b610f8a565b348015610761575f80fd5b50610418610770366004612239565b611030565b348015610780575f80fd5b5061038261078f3660046124a4565b611045565b34801561079f575f80fd5b506104186107ae36600461221e565b6110b1565b3480156107be575f80fd5b506103eb60145481565b3480156107d3575f80fd5b506005546001600160a01b0316610477565b3480156107f0575f80fd5b506103ab61117c565b348015610804575f80fd5b506103eb7f000000000000000000000000000000000000000000000000000000000000005a81565b348015610837575f80fd5b506104186108463660046124e8565b61118b565b348015610856575f80fd5b50610418610865366004612415565b611221565b348015610875575f80fd5b506103eb60075481565b34801561088a575f80fd5b506104186108993660046124e8565b61122e565b3480156108a9575f80fd5b506103826108b8366004612239565b611260565b3480156108c8575f80fd5b506103826108d7366004612239565b6112da565b3480156108e7575f80fd5b506103826108f636600461221e565b60166020525f908152604090205460ff1681565b348015610915575f80fd5b50610418610924366004612415565b6112e7565b348015610934575f80fd5b5061038261094336600461221e565b60106020525f908152604090205460ff1681565b348015610962575f80fd5b506104186112ff565b348015610976575f80fd5b506103eb6109853660046124a4565b611316565b348015610995575f80fd5b506103eb600a5481565b3480156109aa575f80fd5b506104186109b936600461221e565b611340565b3480156109c9575f80fd5b506018546103829060ff1681565b3480156109e2575f80fd5b506104186109f1366004612415565b6113df565b348015610a01575f80fd5b50610418610a1036600461221e565b6113ec565b348015610a20575f80fd5b506103eb600e5481565b348015610a35575f80fd5b50610418611462565b606060038054610a4d90612514565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7990612514565b8015610ac45780601f10610a9b57610100808354040283529160200191610ac4565b820191905f5260205f20905b815481529060010190602001808311610aa757829003601f168201915b5050505050905090565b610ad66114d0565b306001600160a01b03821603610b175760405162461bcd60e51b81526020600482015260016024820152603360f81b60448201526064015b60405180910390fd5b6001600160a01b038116610b525760405133904780156108fc02915f818181858888f19350505050158015610b4e573d5f803e3d5ffd5b5050565b6040516370a0823160e01b815230600482015281905f906001600160a01b038316906370a0823190602401602060405180830381865afa158015610b98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bbc919061254c565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610c09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c2d9190612563565b5050505b50565b5f33610c4181858561152a565b60019150505b92915050565b610c556114d0565b6011829055601281905560408051838152602081018390527f5c6323bf1c2d7aaea2c091a4751c1c87af7f2864650c336507a77d0557af37a1910160405180910390a15050565b610ca46114d0565b6001600160a01b0381165f908152600f602052604090205460ff16610cef5760405162461bcd60e51b81526020600482015260016024820152601960f91b6044820152606401610b0e565b6001600160a01b03165f908152600f60205260409020805460ff19169055565b610d176114d0565b8051825114610d5a5760405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610b0e565b5f5b8251811015610daa57610da233848381518110610d7b57610d7b61257e565b6020026020010151848481518110610d9557610d9561257e565b602002602001015161164d565b600101610d5c565b505050565b610db76114d0565b60018111610df15760405162461bcd60e51b8152602060048201526007602482015266746f6f206c6f7760c81b6044820152606401610b0e565b600a811115610e2d5760405162461bcd60e51b81526020600482015260086024820152670e8dede40d0d2ced60c31b6044820152606401610b0e565b600755565b5f33610e3f858285611a3f565b610e4a85858561164d565b506001949350505050565b610e5d6114d0565b5f5b8151811015610b4e575f60175f848481518110610e7e57610e7e61257e565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610e5f565b5f33610c41818585610ec98383611316565b610ed391906125a6565b61152a565b610c313382611ab1565b610eea6114d0565b6008821115610f255760405162461bcd60e51b815260206004820152600760248201526608ccaca40dac2f60cb1b6044820152606401610b0e565b6008811115610c555760405162461bcd60e51b815260206004820152600760248201526608ccaca40dac2f60cb1b6044820152606401610b0e565b610f686114d0565b610f715f611be1565b565b610f7b6114d0565b6013805460ff19166001179055565b610f926114d0565b60185460ff1615610fd55760405162461bcd60e51b815260206004820152600d60248201526c189b081a5cc81cdd1bdc1c1959609a1b6044820152606401610b0e565b5f5b8151811015610b4e57600160175f848481518110610ff757610ff761257e565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610fd7565b61103b823383611a3f565b610b4e8282611ab1565b5f6110586005546001600160a01b031690565b6001600160a01b0316836001600160a01b0316148061108457506005546001600160a01b038381169116145b8061109757506001600160a01b03831630145b806110aa57506001600160a01b03821630145b9392505050565b6110b96114d0565b6006546001600160a01b03908116908216036111285760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b6064820152608401610b0e565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527fa964ba5c52d7e7bfcae4fb1ae4db9f211756d0e618e85fac5283b882a39e7a0b9060200160405180910390a150565b606060048054610a4d90612514565b6111936114d0565b6009546001600160a01b03908116908316036112175760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b0e565b610b4e8282611c32565b6112296114d0565b601555565b6112366114d0565b6001600160a01b03919091165f908152601660205260409020805460ff1916911515919091179055565b5f338161126d8286611316565b9050838110156112cd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b0e565b610e4a828686840361152a565b5f33610c4181858561164d565b6112ef6114d0565b5f81116112fa575f80fd5b600a55565b6113076114d0565b6018805460ff19166001179055565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6113486114d0565b6001600160a01b0381165f908152600f602052604090205460ff16156113945760405162461bcd60e51b81526020600482015260016024820152603160f81b6044820152606401610b0e565b6001600160a01b0381165f818152600f6020526040808220805460ff19166001179055517f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d9369190a250565b6113e76114d0565b601455565b6113f46114d0565b6001600160a01b0381166114595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b0e565b610c3181611be1565b61146a6114d0565b600b5460ff16156114bd5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720697320616c7265616479206f70656e2100000000000000006044820152606401610b0e565b600b805460ff1916600117905543600c55565b6005546001600160a01b03163314610f715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0e565b6001600160a01b03831661158c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b0e565b6001600160a01b0382166115ed5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b0e565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116735760405162461bcd60e51b8152600401610b0e906125b9565b6001600160a01b0382166116995760405162461bcd60e51b8152600401610b0e906125fe565b600954600160a01b900460ff166116b5576116b5838383611d1a565b6001600160a01b0383165f9081526016602052604090205460ff161580156116f557506001600160a01b0382165f9081526016602052604090205460ff16155b156117b957600b5460ff166117405760405162461bcd60e51b81526020600482015260116024820152702a3930b2329034b9903737ba1037b832b760791b6044820152606401610b0e565b43600e54600c5461175191906125a6565b11156117b957326001600160a01b038316148061178557506001600160a01b0382165f9081526010602052604090205460ff165b6117b95760405162461bcd60e51b81526020600482015260056024820152646561726c7960d81b6044820152606401610b0e565b601254601154600d54600c5443916117d0916125a6565b111561181c57507f000000000000000000000000000000000000000000000000000000000000005a90507f000000000000000000000000000000000000000000000000000000000000005a5b825f0361182a575050505050565b6009546001600160a01b0386165f908152600f602052604090205460ff600160a01b90920482161591168061187657506001600160a01b0385165f908152600f602052604090205460ff165b1561187e57505f5b305f9081526020819052604081205490505f600a5482101580156118a157505f82115b80156118c557506001600160a01b0388165f9081526010602052604090205460ff16155b80156118ce5750825b90508080156118e75750600954600160a01b900460ff16155b1561196e576009805460ff60a01b198116600160a01b179091556001600160a01b03165f908152602081905260409020546007546064906119289083612641565b6119329190612658565b831115611956576064600754826119499190612641565b6119539190612658565b92505b61195f83611dde565b506009805460ff60a01b191690555b82801561198857506009546001600160a01b038881169116145b801561199357505f84115b156119ce575f60646119a58689612641565b6119af9190612658565b90506119bb8188612677565b96506119c8893083611f63565b50611a2a565b8280156119e857506009546001600160a01b038981169116145b80156119f357505f85115b15611a2a575f6064611a058789612641565b611a0f9190612658565b9050611a1b8188612677565b9650611a28893083611f63565b505b611a35888888611f63565b5050505050505050565b5f611a4a8484611316565b90505f198114610c2d5781811015611aa45760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b0e565b610c2d848484840361152a565b6001600160a01b038216611b115760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610b0e565b6001600160a01b0382165f9081526020819052604090205481811015611b845760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610b0e565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f9081526010602052604090205481151560ff909116151503611cc75760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610b0e565b6001600160a01b0382165f81815260106020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60135460ff16610daa576001600160a01b0383165f9081526017602052604090205460ff16158015611d6457506001600160a01b0382165f9081526017602052604090205460ff16155b611d965760405162461bcd60e51b8152602060048201526003602482015262189b1960ea1b6044820152606401610b0e565b611da08383611045565b158015611dc557506001600160a01b0382165f9081526016602052604090205460ff16155b15610daa57611dd4828261208b565b610daa82826120d2565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611e1157611e1161257e565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611e68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8c919061268a565b81600181518110611e9f57611e9f61257e565b6001600160a01b03928316602091820292909201015260085460405163791ac94760e01b815291169063791ac94790611ee49085905f908690309042906004016126a5565b5f604051808303815f87803b158015611efb575f80fd5b505af1925050508015611f0c575060015b506006544790611f25906001600160a01b031682612166565b60408051848152602081018390527f957ad1fc6d4d41da6d1a8d37303289ef3c4b78e0285ff5df1e12070ef0e62999910160405180910390a1505050565b6001600160a01b038316611f895760405162461bcd60e51b8152600401610b0e906125b9565b6001600160a01b038216611faf5760405162461bcd60e51b8152600401610b0e906125fe565b6001600160a01b0383165f90815260208190526040902054818110156120265760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610b0e565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610c2d565b601454811115610b4e5760405162461bcd60e51b8152602060048201526012602482015271082dadeeadce840caf0c6cacac8e640dac2f60731b6044820152606401610b0e565b6009546001600160a01b03908116908316036120ec575050565b6015548161210e846001600160a01b03165f9081526020819052604090205490565b61211891906125a6565b1115610b4e5760405162461bcd60e51b815260206004820152601860248201527f4d617820686f6c64696e67206578636565646564206d617800000000000000006044820152606401610b0e565b816001600160a01b03166108fc826040515f60405180830381858888f193505050503d805f81146121b2576040519150601f19603f3d011682016040523d82523d5f602084013e6121b7565b606091505b5050505050565b5f602080835283518060208501525f5b818110156121ea578581018301518582016040015282016121ce565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c31575f80fd5b5f6020828403121561222e575f80fd5b81356110aa8161220a565b5f806040838503121561224a575f80fd5b82356122558161220a565b946020939093013593505050565b5f8060408385031215612274575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156122c0576122c0612283565b604052919050565b5f67ffffffffffffffff8211156122e1576122e1612283565b5060051b60200190565b5f82601f8301126122fa575f80fd5b8135602061230f61230a836122c8565b612297565b8083825260208201915060208460051b870101935086841115612330575f80fd5b602086015b848110156123555780356123488161220a565b8352918301918301612335565b509695505050505050565b5f8060408385031215612371575f80fd5b823567ffffffffffffffff80821115612388575f80fd5b612394868387016122eb565b93506020915081850135818111156123aa575f80fd5b85019050601f810186136123bc575f80fd5b80356123ca61230a826122c8565b81815260059190911b820183019083810190888311156123e8575f80fd5b928401925b82841015612406578335825292840192908401906123ed565b80955050505050509250929050565b5f60208284031215612425575f80fd5b5035919050565b5f805f6060848603121561243e575f80fd5b83356124498161220a565b925060208401356124598161220a565b929592945050506040919091013590565b5f6020828403121561247a575f80fd5b813567ffffffffffffffff811115612490575f80fd5b61249c848285016122eb565b949350505050565b5f80604083850312156124b5575f80fd5b82356124c08161220a565b915060208301356124d08161220a565b809150509250929050565b8015158114610c31575f80fd5b5f80604083850312156124f9575f80fd5b82356125048161220a565b915060208301356124d0816124db565b600181811c9082168061252857607f821691505b60208210810361254657634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121561255c575f80fd5b5051919050565b5f60208284031215612573575f80fd5b81516110aa816124db565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c4757610c47612592565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8082028115828204841417610c4757610c47612592565b5f8261267257634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610c4757610c47612592565b5f6020828403121561269a575f80fd5b81516110aa8161220a565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156126f55784516001600160a01b0316835293830193918301916001016126d0565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212200205d6f99ecbdd8043ca456c9bbcd9ddf4e492f0d6b94b05501861c3e1dbb0bb64736f6c63430008180033

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

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000461a955c8d891d7301c874d6de4297cc942ea1e

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

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


Deployed Bytecode Sourcemap

29886:10891:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30402:28;;;;;;;;;;-1:-1:-1;30402:28:0;;;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;30402:28:0;;;;;;;;8825:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31133:40::-;;;;;;;;;;;;;;;;;;905:25:1;;;893:2;878:18;31133:40:0;759:177:1;32960:407:0;;;;;;;;;;-1:-1:-1;32960:407:0;;;;;:::i;:::-;;:::i;:::-;;11192:201;;;;;;;;;;-1:-1:-1;11192:201:0;;;;;:::i;:::-;;:::i;35199:186::-;;;;;;;;;;-1:-1:-1;35199:186:0;;;;;:::i;:::-;;:::i;30082:41::-;;;;;;;;;;-1:-1:-1;30082:41:0;;;;-1:-1:-1;;;;;30082:41:0;;;;;;-1:-1:-1;;;;;2093:32:1;;;2075:51;;2063:2;2048:18;30082:41:0;1902:230:1;34326:167:0;;;;;;;;;;-1:-1:-1;34326:167:0;;;;;:::i;:::-;;:::i;9957:108::-;;;;;;;;;;-1:-1:-1;10045:12:0;;9957:108;;40494:280;;;;;;;;;;-1:-1:-1;40494:280:0;;;;;:::i;:::-;;:::i;38314:205::-;;;;;;;;;;-1:-1:-1;38314:205:0;;;;;:::i;:::-;;:::i;11974:261::-;;;;;;;;;;-1:-1:-1;11974:261:0;;;;;:::i;:::-;;:::i;31180:22::-;;;;;;;;;;;;;;;;9798:93;;;;;;;;;;-1:-1:-1;9798:93:0;;9881:2;5416:36:1;;5404:2;5389:18;9798:93:0;5274:184:1;31311:25:0;;;;;;;;;;;;;;;;39589:179;;;;;;;;;;-1:-1:-1;39589:179:0;;;;;:::i;:::-;;:::i;12645:238::-;;;;;;;;;;-1:-1:-1;12645:238:0;;;;;:::i;:::-;;:::i;30437:29::-;;;;;;;;;;;;;;;;19972:91;;;;;;;;;;-1:-1:-1;19972:91:0;;;;;:::i;:::-;;:::i;31209:21::-;;;;;;;;;;;;;;;;30130:29;;;;;;;;;;-1:-1:-1;30130:29:0;;;;-1:-1:-1;;;;;30130:29:0;;;31246:25;;;;;;;;;;-1:-1:-1;31246:25:0;;;;;;;;30473;;;;;;;;;;;;;;;;34502:126;;;;;;;;;;-1:-1:-1;34502:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;34592:28:0;34568:4;34592:28;;;:19;:28;;;;;;;;;34502:126;34637:272;;;;;;;;;;-1:-1:-1;34637:272:0;;;;;:::i;:::-;;:::i;10129:127::-;;;;;;;;;;-1:-1:-1;10129:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10230:18:0;10203:7;10230:18;;;;;;;;;;;;10129:127;2738:103;;;;;;;;;;;;;:::i;31393:35::-;;;;;;;;;;-1:-1:-1;31393:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40057:82;;;;;;;;;;;;;:::i;30003:30::-;;;;;;;;;;-1:-1:-1;30003:30:0;;;;-1:-1:-1;;;;;30003:30:0;;;39358:222;;;;;;;;;;-1:-1:-1;39358:222:0;;;;;:::i;:::-;;:::i;20383:164::-;;;;;;;;;;-1:-1:-1;20383:164:0;;;;;:::i;:::-;;:::i;39860:188::-;;;;;;;;;;-1:-1:-1;39860:188:0;;;;;:::i;:::-;;:::i;34918:274::-;;;;;;;;;;-1:-1:-1;34918:274:0;;;;;:::i;:::-;;:::i;31278:26::-;;;;;;;;;;;;;;;;2095:87;;;;;;;;;;-1:-1:-1;2168:6:0;;-1:-1:-1;;;;;2168:6:0;2095:87;;9045:104;;;;;;;;;;;;;:::i;31085:41::-;;;;;;;;;;;;;;;33527:245;;;;;;;;;;-1:-1:-1;33527:245:0;;;;;:::i;:::-;;:::i;40267:106::-;;;;;;;;;;-1:-1:-1;40267:106:0;;;;;:::i;:::-;;:::i;30040:35::-;;;;;;;;;;;;;;;;40382:103;;;;;;;;;;-1:-1:-1;40382:103:0;;;;;:::i;:::-;;:::i;13387:437::-;;;;;;;;;;-1:-1:-1;13387:437:0;;;;;:::i;:::-;;:::i;10463:193::-;;;;;;;;;;-1:-1:-1;10463:193:0;;;;;:::i;:::-;;:::i;31343:40::-;;;;;;;;;;-1:-1:-1;31343:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38154:151;;;;;;;;;;-1:-1:-1;38154:151:0;;;;;:::i;:::-;;:::i;30600:57::-;;;;;;;;;;-1:-1:-1;30600:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39777:74;;;;;;;;;;;;;:::i;10720:151::-;;;;;;;;;;-1:-1:-1;10720:151:0;;;;;:::i;:::-;;:::i;30362:33::-;;;;;;;;;;;;;;;;34105:212;;;;;;;;;;-1:-1:-1;34105:212:0;;;;;:::i;:::-;;:::i;31435:29::-;;;;;;;;;;-1:-1:-1;31435:29:0;;;;;;;;40148:110;;;;;;;;;;-1:-1:-1;40148:110:0;;;;;:::i;:::-;;:::i;2997:201::-;;;;;;;;;;-1:-1:-1;2997:201:0;;;;;:::i;:::-;;:::i;30505:26::-;;;;;;;;;;;;;;;;32758:193;;;;;;;;;;;;;:::i;8825:100::-;8879:13;8912:5;8905:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8825:100;:::o;32960:407::-;1980:13;:11;:13::i;:::-;33053:4:::1;-1:-1:-1::0;;;;;33036:22:0;::::1;::::0;33028:36:::1;;;::::0;-1:-1:-1;;;33028:36:0;;7514:2:1;33028:36:0::1;::::0;::::1;7496:21:1::0;7553:1;7533:18;;;7526:29;-1:-1:-1;;;7571:18:1;;;7564:31;7612:18;;33028:36:0::1;;;;;;;;;-1:-1:-1::0;;;;;33079:21:0;::::1;33075:126;;33117:51;::::0;33125:10:::1;::::0;33146:21:::1;33117:51:::0;::::1;;;::::0;::::1;::::0;;;33146:21;33125:10;33117:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;32960:407:::0;:::o;33075:126::-:1;33273:35;::::0;-1:-1:-1;;;33273:35:0;;33302:4:::1;33273:35;::::0;::::1;2075:51:1::0;33238:5:0;;33211:17:::1;::::0;-1:-1:-1;;;;;33273:20:0;::::1;::::0;::::1;::::0;2048:18:1;;33273:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33319:40;::::0;-1:-1:-1;;;33319:40:0;;33339:10:::1;33319:40;::::0;::::1;8004:51:1::0;8071:18;;;8064:34;;;33255:53:0;;-1:-1:-1;;;;;;33319:19:0;::::1;::::0;::::1;::::0;7977:18:1;;33319:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33017:350;;2004:1;32960:407:::0;:::o;11192:201::-;11275:4;835:10;11331:32;835:10;11347:7;11356:6;11331:8;:32::i;:::-;11381:4;11374:11;;;11192:201;;;;;:::o;35199:186::-;1980:13;:11;:13::i;:::-;35285:7:::1;:18:::0;;;35314:6:::1;:16:::0;;;35349:28:::1;::::0;;8533:25:1;;;8589:2;8574:18;;8567:34;;;35349:28:0::1;::::0;8506:18:1;35349:28:0::1;;;;;;;35199:186:::0;;:::o;34326:167::-;1980:13;:11;:13::i;:::-;-1:-1:-1;;;;;34404:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;34396:42;;;::::0;-1:-1:-1;;;34396:42:0;;8814:2:1;34396:42:0::1;::::0;::::1;8796:21:1::0;8853:1;8833:18;;;8826:29;-1:-1:-1;;;8871:18:1;;;8864:31;8912:18;;34396:42:0::1;8612:324:1::0;34396:42:0::1;-1:-1:-1::0;;;;;34449:28:0::1;34480:5;34449:28:::0;;;:19:::1;:28;::::0;;;;:36;;-1:-1:-1;;34449:36:0::1;::::0;;34326:167::o;40494:280::-;1980:13;:11;:13::i;:::-;40615:7:::1;:14;40602:2;:9;:27;40594:55;;;::::0;-1:-1:-1;;;40594:55:0;;9143:2:1;40594:55:0::1;::::0;::::1;9125:21:1::0;9182:2;9162:18;;;9155:30;-1:-1:-1;;;9201:18:1;;;9194:45;9256:18;;40594:55:0::1;8941:339:1::0;40594:55:0::1;40668:6;40663:104;40684:2;:9;40680:1;:13;40663:104;;;40715:40;40725:10;40737:2;40740:1;40737:5;;;;;;;;:::i;:::-;;;;;;;40744:7;40752:1;40744:10;;;;;;;;:::i;:::-;;;;;;;40715:9;:40::i;:::-;40695:3;;40663:104;;;;40494:280:::0;;:::o;38314:205::-;1980:13;:11;:13::i;:::-;38412:1:::1;38400:9;:13;38392:33;;;::::0;-1:-1:-1;;;38392:33:0;;9619:2:1;38392:33:0::1;::::0;::::1;9601:21:1::0;9658:1;9638:18;;;9631:29;-1:-1:-1;;;9676:18:1;;;9669:37;9723:18;;38392:33:0::1;9417:330:1::0;38392:33:0::1;38457:2;38444:9;:15;;38436:36;;;::::0;-1:-1:-1;;;38436:36:0;;9954:2:1;38436:36:0::1;::::0;::::1;9936:21:1::0;9993:1;9973:18;;;9966:29;-1:-1:-1;;;10011:18:1;;;10004:38;10059:18;;38436:36:0::1;9752:331:1::0;38436:36:0::1;38483:16;:28:::0;38314:205::o;11974:261::-;12071:4;835:10;12129:38;12145:4;835:10;12160:6;12129:15;:38::i;:::-;12178:27;12188:4;12194:2;12198:6;12178:9;:27::i;:::-;-1:-1:-1;12223:4:0;;11974:261;-1:-1:-1;;;;11974:261:0:o;39589:179::-;1980:13;:11;:13::i;:::-;39670:6:::1;39665:96;39686:9;:16;39682:1;:20;39665:96;;;39744:5;39724:3;:17;39728:9;39738:1;39728:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;39724:17:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;39724:17:0;:25;;-1:-1:-1;;39724:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;39704:3:0::1;39665:96;;12645:238:::0;12733:4;835:10;12789:64;835:10;12805:7;12842:10;12814:25;835:10;12805:7;12814:9;:25::i;:::-;:38;;;;:::i;:::-;12789:8;:64::i;19972:91::-;20028:27;835:10;20048:6;20028:5;:27::i;34637:272::-;1980:13;:11;:13::i;:::-;34742:1:::1;34730:8;:13;;34722:33;;;::::0;-1:-1:-1;;;34722:33:0;;10552:2:1;34722:33:0::1;::::0;::::1;10534:21:1::0;10591:1;10571:18;;;10564:29;-1:-1:-1;;;10609:18:1;;;10602:37;10656:18;;34722:33:0::1;10350:330:1::0;34722:33:0::1;34785:1;34774:7;:12;;34766:32;;;::::0;-1:-1:-1;;;34766:32:0;;10552:2:1;34766:32:0::1;::::0;::::1;10534:21:1::0;10591:1;10571:18;;;10564:29;-1:-1:-1;;;10609:18:1;;;10602:37;10656:18;;34766:32:0::1;10350:330:1::0;2738:103:0;1980:13;:11;:13::i;:::-;2803:30:::1;2830:1;2803:18;:30::i;:::-;2738:103::o:0;40057:82::-;1980:13;:11;:13::i;:::-;40111::::1;:20:::0;;-1:-1:-1;;40111:20:0::1;40127:4;40111:20;::::0;;40057:82::o;39358:222::-;1980:13;:11;:13::i;:::-;39440:9:::1;::::0;::::1;;39439:10;39431:36;;;::::0;-1:-1:-1;;;39431:36:0;;10887:2:1;39431:36:0::1;::::0;::::1;10869:21:1::0;10926:2;10906:18;;;10899:30;-1:-1:-1;;;10945:18:1;;;10938:43;10998:18;;39431:36:0::1;10685:337:1::0;39431:36:0::1;39483:6;39478:95;39499:9;:16;39495:1;:20;39478:95;;;39557:4;39537:3;:17;39541:9;39551:1;39541:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;39537:17:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;39537:17:0;:24;;-1:-1:-1;;39537:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;39517:3:0::1;39478:95;;20383:164:::0;20460:46;20476:7;835:10;20499:6;20460:15;:46::i;:::-;20517:22;20523:7;20532:6;20517:5;:22::i;39860:188::-;39925:4;39967:7;2168:6;;-1:-1:-1;;;;;2168:6:0;;2095:87;39967:7;-1:-1:-1;;;;;39959:15:0;:4;-1:-1:-1;;;;;39959:15:0;;:32;;;-1:-1:-1;2168:6:0;;-1:-1:-1;;;;;39978:13:0;;;2168:6;;39978:13;39959:32;:57;;;-1:-1:-1;;;;;;39995:21:0;;40011:4;39995:21;39959:57;:80;;;-1:-1:-1;;;;;;40020:19:0;;40034:4;40020:19;39959:80;39951:89;39860:188;-1:-1:-1;;;39860:188:0:o;34918:274::-;1980:13;:11;:13::i;:::-;35024:15:::1;::::0;-1:-1:-1;;;;;35024:15:0;;::::1;35004:35:::0;;::::1;::::0;34996:88:::1;;;::::0;-1:-1:-1;;;34996:88:0;;11229:2:1;34996:88:0::1;::::0;::::1;11211:21:1::0;11268:2;11248:18;;;11241:30;11307:34;11287:18;;;11280:62;-1:-1:-1;;;11358:18:1;;;11351:38;11406:19;;34996:88:0::1;11027:404:1::0;34996:88:0::1;35095:15;:34:::0;;-1:-1:-1;;;;;;35095:34:0::1;-1:-1:-1::0;;;;;35095:34:0;::::1;::::0;;::::1;::::0;;;35145:39:::1;::::0;2075:51:1;;;35145:39:0::1;::::0;2063:2:1;2048:18;35145:39:0::1;;;;;;;34918:274:::0;:::o;9045:104::-;9101:13;9134:7;9127:14;;;;;:::i;33527:245::-;1980:13;:11;:13::i;:::-;33634::::1;::::0;-1:-1:-1;;;;;33634:13:0;;::::1;33626:21:::0;;::::1;::::0;33618:91:::1;;;::::0;-1:-1:-1;;;33618:91:0;;11638:2:1;33618:91:0::1;::::0;::::1;11620:21:1::0;11677:2;11657:18;;;11650:30;11716:34;11696:18;;;11689:62;11787:27;11767:18;;;11760:55;11832:19;;33618:91:0::1;11436:421:1::0;33618:91:0::1;33723:41;33752:4;33758:5;33723:28;:41::i;40267:106::-:0;1980:13;:11;:13::i;:::-;40341:10:::1;:24:::0;40267:106::o;40382:103::-;1980:13;:11;:13::i;:::-;-1:-1:-1;;;;;40455:13:0;;;::::1;;::::0;;;:8:::1;:13;::::0;;;;:22;;-1:-1:-1;;40455:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40382:103::o;13387:437::-;13480:4;835:10;13480:4;13563:25;835:10;13580:7;13563:9;:25::i;:::-;13536:52;;13627:15;13607:16;:35;;13599:85;;;;-1:-1:-1;;;13599:85:0;;12064:2:1;13599:85:0;;;12046:21:1;12103:2;12083:18;;;12076:30;12142:34;12122:18;;;12115:62;-1:-1:-1;;;12193:18:1;;;12186:35;12238:19;;13599:85:0;11862:401:1;13599:85:0;13720:60;13729:5;13736:7;13764:15;13745:16;:34;13720:8;:60::i;10463:193::-;10542:4;835:10;10598:28;835:10;10615:2;10619:6;10598:9;:28::i;38154:151::-;1980:13;:11;:13::i;:::-;38254:1:::1;38242:9;:13;38234:22;;;::::0;::::1;;38267:18;:30:::0;38154:151::o;39777:74::-;1980:13;:11;:13::i;:::-;39827:9:::1;:16:::0;;-1:-1:-1;;39827:16:0::1;39839:4;39827:16;::::0;;39777:74::o;10720:151::-;-1:-1:-1;;;;;10836:18:0;;;10809:7;10836:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10720:151::o;34105:212::-;1980:13;:11;:13::i;:::-;-1:-1:-1;;;;;34186:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;34185:29;34177:43;;;::::0;-1:-1:-1;;;34177:43:0;;12470:2:1;34177:43:0::1;::::0;::::1;12452:21:1::0;12509:1;12489:18;;;12482:29;-1:-1:-1;;;12527:18:1;;;12520:31;12568:18;;34177:43:0::1;12268:324:1::0;34177:43:0::1;-1:-1:-1::0;;;;;34231:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:35;;-1:-1:-1;;34231:35:0::1;34262:4;34231:35;::::0;;34285:24;::::1;::::0;34231:28;34285:24:::1;34105:212:::0;:::o;40148:110::-;1980:13;:11;:13::i;:::-;40224:11:::1;:26:::0;40148:110::o;2997:201::-;1980:13;:11;:13::i;:::-;-1:-1:-1;;;;;3086:22:0;::::1;3078:73;;;::::0;-1:-1:-1;;;3078:73:0;;12799:2:1;3078:73:0::1;::::0;::::1;12781:21:1::0;12838:2;12818:18;;;12811:30;12877:34;12857:18;;;12850:62;-1:-1:-1;;;12928:18:1;;;12921:36;12974:19;;3078:73:0::1;12597:402:1::0;3078:73:0::1;3162:28;3181:8;3162:18;:28::i;32758:193::-:0;1980:13;:11;:13::i;:::-;32815:16:::1;::::0;::::1;;:25;32807:62;;;::::0;-1:-1:-1;;;32807:62:0;;13206:2:1;32807:62:0::1;::::0;::::1;13188:21:1::0;13245:2;13225:18;;;13218:30;13284:26;13264:18;;;13257:54;13328:18;;32807:62:0::1;13004:348:1::0;32807:62:0::1;32880:16;:23:::0;;-1:-1:-1;;32880:23:0::1;32899:4;32880:23;::::0;;32931:12:::1;32914:14;:29:::0;32758:193::o;2261:132::-;2168:6;;-1:-1:-1;;;;;2168:6:0;835:10;2325:23;2317:68;;;;-1:-1:-1;;;2317:68:0;;13559:2:1;2317:68:0;;;13541:21:1;;;13578:18;;;13571:30;13637:34;13617:18;;;13610:62;13689:18;;2317:68:0;13357:356:1;17094:347:0;-1:-1:-1;;;;;17196:19:0;;17188:68;;;;-1:-1:-1;;;17188:68:0;;13920:2:1;17188:68:0;;;13902:21:1;13959:2;13939:18;;;13932:30;13998:34;13978:18;;;13971:62;-1:-1:-1;;;14049:18:1;;;14042:34;14093:19;;17188:68:0;13718:400:1;17188:68:0;-1:-1:-1;;;;;17275:21:0;;17267:68;;;;-1:-1:-1;;;17267:68:0;;14325:2:1;17267:68:0;;;14307:21:1;14364:2;14344:18;;;14337:30;14403:34;14383:18;;;14376:62;-1:-1:-1;;;14454:18:1;;;14447:32;14496:19;;17267:68:0;14123:398:1;17267:68:0;-1:-1:-1;;;;;17349:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17401:32;;905:25:1;;;17401:32:0;;878:18:1;17401:32:0;;;;;;;17094:347;;;:::o;35393:2128::-;-1:-1:-1;;;;;35525:18:0;;35517:68;;;;-1:-1:-1;;;35517:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35604:16:0;;35596:64;;;;-1:-1:-1;;;35596:64:0;;;;;;;:::i;:::-;35679:8;;-1:-1:-1;;;35679:8:0;;;;35674:66;;35704:24;35711:4;35717:2;35721:6;35704;:24::i;:::-;-1:-1:-1;;;;;35758:14:0;;;;;;:8;:14;;;;;;;;35757:15;:32;;;;-1:-1:-1;;;;;;35777:12:0;;;;;;:8;:12;;;;;;;;35776:13;35757:32;35753:275;;;35814:16;;;;35806:46;;;;-1:-1:-1;;;35806:46:0;;15538:2:1;35806:46:0;;;15520:21:1;15577:2;15557:18;;;15550:30;-1:-1:-1;;;15596:18:1;;;15589:47;15653:18;;35806:46:0;15336:341:1;35806:46:0;35902:12;35888:11;;35871:14;;:28;;;;:::i;:::-;:43;35867:150;;;35943:9;-1:-1:-1;;;;;35943:15:0;;;;:48;;-1:-1:-1;;;;;;35962:29:0;;;;;;:25;:29;;;;;;;;35943:48;35935:66;;;;-1:-1:-1;;;35935:66:0;;15884:2:1;35935:66:0;;;15866:21:1;15923:1;15903:18;;;15896:29;-1:-1:-1;;;15941:18:1;;;15934:35;15986:18;;35935:66:0;15682:328:1;35935:66:0;36056:6;;36089:7;;36128:10;;36111:14;;36141:12;;36111:27;;;:::i;:::-;:42;36107:142;;;-1:-1:-1;36180:15:0;;-1:-1:-1;36221:16:0;36107:142;36266:6;36276:1;36266:11;36262:50;;36294:7;;35393:2128;;;:::o;36262:50::-;36341:8;;-1:-1:-1;;;;;36367:25:0;;36325:12;36367:25;;;:19;:25;;;;;;36341:8;-1:-1:-1;;;36341:8:0;;;;;36340:9;;36367:25;;:52;;-1:-1:-1;;;;;;36396:23:0;;;;;;:19;:23;;;;;;;;36367:52;36363:100;;;-1:-1:-1;36446:5:0;36363:100;36511:4;36476:14;10230:18;;;;;;;;;;;36476:41;;36531:12;36556:18;;36546:6;:28;;:42;;;;;36587:1;36578:6;:10;36546:42;:78;;;;-1:-1:-1;;;;;;36593:31:0;;;;;;:25;:31;;;;;;;;36592:32;36546:78;:89;;;;;36628:7;36546:89;36531:104;;36650:7;:33;;;;-1:-1:-1;36675:8:0;;-1:-1:-1;;;36675:8:0;;;;36674:9;36650:33;36646:361;;;36700:8;:15;;-1:-1:-1;;;;36700:15:0;;-1:-1:-1;;;36700:15:0;;;;-1:-1:-1;;;;;36762:13:0;-1:-1:-1;10230:18:0;;;;;;;;;;;36818:16;;36837:3;;36804:30;;10230:18;36804:30;:::i;:::-;:36;;;;:::i;:::-;36795:6;:45;36791:131;;;36903:3;36884:16;;36870:11;:30;;;;:::i;:::-;:36;;;;:::i;:::-;36861:45;;36791:131;36936:28;36957:6;36936:20;:28::i;:::-;-1:-1:-1;36979:8:0;:16;;-1:-1:-1;;;;36979:16:0;;;36646:361;37024:7;:30;;;;-1:-1:-1;37041:13:0;;-1:-1:-1;;;;;37035:19:0;;;37041:13;;37035:19;37024:30;:46;;;;;37069:1;37058:8;:12;37024:46;37020:447;;;37087:12;37124:3;37103:17;37112:8;37103:6;:17;:::i;:::-;37102:25;;;;:::i;:::-;37087:40;-1:-1:-1;37151:13:0;37087:40;37151:6;:13;:::i;:::-;37142:22;;37182:42;37198:4;37212;37219;37182:15;:42::i;:::-;37072:164;37020:447;;;37255:7;:32;;;;-1:-1:-1;37274:13:0;;-1:-1:-1;;;;;37266:21:0;;;37274:13;;37266:21;37255:32;:47;;;;;37301:1;37291:7;:11;37255:47;37251:216;;;37319:12;37355:3;37335:16;37344:7;37335:6;:16;:::i;:::-;37334:24;;;;:::i;:::-;37319:39;-1:-1:-1;37382:13:0;37319:39;37382:6;:13;:::i;:::-;37373:22;;37413:42;37429:4;37443;37450;37413:15;:42::i;:::-;37304:163;37251:216;37480:33;37496:4;37502:2;37506:6;37480:15;:33::i;:::-;35506:2015;;;;;35393:2128;;;:::o;17733:419::-;17834:24;17861:25;17871:5;17878:7;17861:9;:25::i;:::-;17834:52;;-1:-1:-1;;17901:16:0;:37;17897:248;;17983:6;17963:16;:26;;17955:68;;;;-1:-1:-1;;;17955:68:0;;16745:2:1;17955:68:0;;;16727:21:1;16784:2;16764:18;;;16757:30;16823:31;16803:18;;;16796:59;16872:18;;17955:68:0;16543:353:1;17955:68:0;18067:51;18076:5;18083:7;18111:6;18092:16;:25;18067:8;:51::i;16042:613::-;-1:-1:-1;;;;;16126:21:0;;16118:67;;;;-1:-1:-1;;;16118:67:0;;17103:2:1;16118:67:0;;;17085:21:1;17142:2;17122:18;;;17115:30;17181:34;17161:18;;;17154:62;-1:-1:-1;;;17232:18:1;;;17225:31;17273:19;;16118:67:0;16901:397:1;16118:67:0;-1:-1:-1;;;;;16287:18:0;;16262:22;16287:18;;;;;;;;;;;16324:24;;;;16316:71;;;;-1:-1:-1;;;16316:71:0;;17505:2:1;16316:71:0;;;17487:21:1;17544:2;17524:18;;;17517:30;17583:34;17563:18;;;17556:62;-1:-1:-1;;;17634:18:1;;;17627:32;17676:19;;16316:71:0;17303:398:1;16316:71:0;-1:-1:-1;;;;;16423:18:0;;:9;:18;;;;;;;;;;;16444:23;;;16423:44;;16496:12;:22;;;;;;;16548:37;905:25:1;;;16423:9:0;;:18;16548:37;;878:18:1;16548:37:0;;;;;;;40663:104:::1;40494:280:::0;;:::o;3359:191::-;3452:6;;;-1:-1:-1;;;;;3469:17:0;;;-1:-1:-1;;;;;;3469:17:0;;;;;;;3502:40;;3452:6;;;3469:17;3452:6;;3502:40;;3433:16;;3502:40;3422:128;3359:191;:::o;33781:309::-;-1:-1:-1;;;;;33872:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;33864:109;;;;-1:-1:-1;;;33864:109:0;;17908:2:1;33864:109:0;;;17890:21:1;17947:2;17927:18;;;17920:30;17986:34;17966:18;;;17959:62;18057:26;18037:18;;;18030:54;18101:19;;33864:109:0;17706:420:1;33864:109:0;-1:-1:-1;;;;;33984:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;33984:39:0;;;;;;;;;;34042:40;;33984:39;;:31;34042:40;;;33781:309;;:::o;38528:421::-;38655:13;;;;38650:292;;-1:-1:-1;;;;;38694:9:0;;;;;;:3;:9;;;;;;;;38693:10;:22;;;;-1:-1:-1;;;;;;38708:7:0;;;;;;:3;:7;;;;;;;;38707:8;38693:22;38685:38;;;;-1:-1:-1;;;38685:38:0;;18333:2:1;38685:38:0;;;18315:21:1;18372:1;18352:18;;;18345:29;-1:-1:-1;;;18390:18:1;;;18383:33;18433:18;;38685:38:0;18131:326:1;38685:38:0;38760:18;38769:4;38775:2;38760:8;:18::i;:::-;38759:19;:36;;;;-1:-1:-1;;;;;;38783:12:0;;;;;;:8;:12;;;;;;;;38782:13;38759:36;38755:176;;;38816:29;38834:2;38838:6;38816:17;:29::i;:::-;38882:33;38904:2;38908:6;38882:21;:33::i;37536:609::-;37633:16;;;37647:1;37633:16;;;;;;;;37609:21;;37633:16;;;;;;;;;;-1:-1:-1;37633:16:0;37609:40;;37678:4;37660;37665:1;37660:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37660:23:0;;;:7;;;;;;;;;;:23;;;;37704:15;;:22;;;-1:-1:-1;;;37704:22:0;;;;:15;;;;;:20;;:22;;;;;37660:7;;37704:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37694:4;37699:1;37694:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37694:32:0;;;:7;;;;;;;;;:32;37744:15;;:187;;-1:-1:-1;;;37744:187:0;;:15;;;:66;;:187;;37825:11;;37744:15;;37868:4;;37895;;37915:15;;37744:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37740:222;38044:15;;37996:21;;38028:45;;-1:-1:-1;;;;;38044:15:0;37996:21;38028:7;:45::i;:::-;38092;;;8533:25:1;;;8589:2;8574:18;;8567:34;;;38092:45:0;;8506:18:1;38092:45:0;;;;;;;37595:550;;37536:609;:::o;14295:673::-;-1:-1:-1;;;;;14392:18:0;;14384:68;;;;-1:-1:-1;;;14384:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14471:16:0;;14463:64;;;;-1:-1:-1;;;14463:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14615:15:0;;14593:19;14615:15;;;;;;;;;;;14649:21;;;;14641:72;;;;-1:-1:-1;;;14641:72:0;;19905:2:1;14641:72:0;;;19887:21:1;19944:2;19924:18;;;19917:30;19983:34;19963:18;;;19956:62;-1:-1:-1;;;20034:18:1;;;20027:36;20080:19;;14641:72:0;19703:402:1;14641:72:0;-1:-1:-1;;;;;14749:15:0;;;:9;:15;;;;;;;;;;;14767:20;;;14749:38;;14830:13;;;;;;;;;;:23;;;;;;14883:26;;905:25:1;;;14830:13:0;;14883:26;;878:18:1;14883:26:0;;;;;;;14923:37;40494:280;38958:143;39056:11;;39046:6;:21;;39038:52;;;;-1:-1:-1;;;39038:52:0;;20312:2:1;39038:52:0;;;20294:21:1;20351:2;20331:18;;;20324:30;-1:-1:-1;;;20370:18:1;;;20363:48;20428:18;;39038:52:0;20110:342:1;39110:239:0;39204:13;;-1:-1:-1;;;;;39204:13:0;;;39198:19;;;;39194:58;;39110:239;;:::o;39194:58::-;39299:10;;39289:6;39273:13;39283:2;-1:-1:-1;;;;;10230:18:0;10203:7;10230:18;;;;;;;;;;;;10129:127;39273:13;:22;;;;:::i;:::-;:36;;39265:73;;;;-1:-1:-1;;;39265:73:0;;20659:2:1;39265:73:0;;;20641:21:1;20698:2;20678:18;;;20671:30;20737:26;20717:18;;;20710:54;20781:18;;39265:73:0;20457:348:1;33376:142:0;33466:9;-1:-1:-1;;;;;33466:14:0;33486:4;33499:6;33466:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33376:142;;:::o;206:548:1:-;318:4;347:2;376;365:9;358:21;408:6;402:13;451:6;446:2;435:9;431:18;424:34;476:1;486:140;500:6;497:1;494:13;486:140;;;595:14;;;591:23;;585:30;561:17;;;580:2;557:26;550:66;515:10;;486:140;;;490:3;675:1;670:2;661:6;650:9;646:22;642:31;635:42;745:2;738;734:7;729:2;721:6;717:15;713:29;702:9;698:45;694:54;686:62;;;;206:548;;;;:::o;941:131::-;-1:-1:-1;;;;;1016:31:1;;1006:42;;996:70;;1062:1;1059;1052:12;1077:247;1136:6;1189:2;1177:9;1168:7;1164:23;1160:32;1157:52;;;1205:1;1202;1195:12;1157:52;1244:9;1231:23;1263:31;1288:5;1263:31;:::i;1329:315::-;1397:6;1405;1458:2;1446:9;1437:7;1433:23;1429:32;1426:52;;;1474:1;1471;1464:12;1426:52;1513:9;1500:23;1532:31;1557:5;1532:31;:::i;:::-;1582:5;1634:2;1619:18;;;;1606:32;;-1:-1:-1;;;1329:315:1:o;1649:248::-;1717:6;1725;1778:2;1766:9;1757:7;1753:23;1749:32;1746:52;;;1794:1;1791;1784:12;1746:52;-1:-1:-1;;1817:23:1;;;1887:2;1872:18;;;1859:32;;-1:-1:-1;1649:248:1:o;2137:127::-;2198:10;2193:3;2189:20;2186:1;2179:31;2229:4;2226:1;2219:15;2253:4;2250:1;2243:15;2269:275;2340:2;2334:9;2405:2;2386:13;;-1:-1:-1;;2382:27:1;2370:40;;2440:18;2425:34;;2461:22;;;2422:62;2419:88;;;2487:18;;:::i;:::-;2523:2;2516:22;2269:275;;-1:-1:-1;2269:275:1:o;2549:183::-;2609:4;2642:18;2634:6;2631:30;2628:56;;;2664:18;;:::i;:::-;-1:-1:-1;2709:1:1;2705:14;2721:4;2701:25;;2549:183::o;2737:743::-;2791:5;2844:3;2837:4;2829:6;2825:17;2821:27;2811:55;;2862:1;2859;2852:12;2811:55;2898:6;2885:20;2924:4;2948:60;2964:43;3004:2;2964:43;:::i;:::-;2948:60;:::i;:::-;3030:3;3054:2;3049:3;3042:15;3082:4;3077:3;3073:14;3066:21;;3139:4;3133:2;3130:1;3126:10;3118:6;3114:23;3110:34;3096:48;;3167:3;3159:6;3156:15;3153:35;;;3184:1;3181;3174:12;3153:35;3220:4;3212:6;3208:17;3234:217;3250:6;3245:3;3242:15;3234:217;;;3330:3;3317:17;3347:31;3372:5;3347:31;:::i;:::-;3391:18;;3429:12;;;;3267;;3234:217;;;-1:-1:-1;3469:5:1;2737:743;-1:-1:-1;;;;;;2737:743:1:o;3485:1138::-;3603:6;3611;3664:2;3652:9;3643:7;3639:23;3635:32;3632:52;;;3680:1;3677;3670:12;3632:52;3720:9;3707:23;3749:18;3790:2;3782:6;3779:14;3776:34;;;3806:1;3803;3796:12;3776:34;3829:61;3882:7;3873:6;3862:9;3858:22;3829:61;:::i;:::-;3819:71;;3909:2;3899:12;;3964:2;3953:9;3949:18;3936:32;3993:2;3983:8;3980:16;3977:36;;;4009:1;4006;3999:12;3977:36;4032:24;;;-1:-1:-1;4087:4:1;4079:13;;4075:27;-1:-1:-1;4065:55:1;;4116:1;4113;4106:12;4065:55;4152:2;4139:16;4175:60;4191:43;4231:2;4191:43;:::i;4175:60::-;4269:15;;;4351:1;4347:10;;;;4339:19;;4335:28;;;4300:12;;;;4375:19;;;4372:39;;;4407:1;4404;4397:12;4372:39;4431:11;;;;4451:142;4467:6;4462:3;4459:15;4451:142;;;4533:17;;4521:30;;4484:12;;;;4571;;;;4451:142;;;4612:5;4602:15;;;;;;;3485:1138;;;;;:::o;4628:180::-;4687:6;4740:2;4728:9;4719:7;4715:23;4711:32;4708:52;;;4756:1;4753;4746:12;4708:52;-1:-1:-1;4779:23:1;;4628:180;-1:-1:-1;4628:180:1:o;4813:456::-;4890:6;4898;4906;4959:2;4947:9;4938:7;4934:23;4930:32;4927:52;;;4975:1;4972;4965:12;4927:52;5014:9;5001:23;5033:31;5058:5;5033:31;:::i;:::-;5083:5;-1:-1:-1;5140:2:1;5125:18;;5112:32;5153:33;5112:32;5153:33;:::i;:::-;4813:456;;5205:7;;-1:-1:-1;;;5259:2:1;5244:18;;;;5231:32;;4813:456::o;5463:348::-;5547:6;5600:2;5588:9;5579:7;5575:23;5571:32;5568:52;;;5616:1;5613;5606:12;5568:52;5656:9;5643:23;5689:18;5681:6;5678:30;5675:50;;;5721:1;5718;5711:12;5675:50;5744:61;5797:7;5788:6;5777:9;5773:22;5744:61;:::i;:::-;5734:71;5463:348;-1:-1:-1;;;;5463:348:1:o;6024:388::-;6092:6;6100;6153:2;6141:9;6132:7;6128:23;6124:32;6121:52;;;6169:1;6166;6159:12;6121:52;6208:9;6195:23;6227:31;6252:5;6227:31;:::i;:::-;6277:5;-1:-1:-1;6334:2:1;6319:18;;6306:32;6347:33;6306:32;6347:33;:::i;:::-;6399:7;6389:17;;;6024:388;;;;;:::o;6417:118::-;6503:5;6496:13;6489:21;6482:5;6479:32;6469:60;;6525:1;6522;6515:12;6540:382;6605:6;6613;6666:2;6654:9;6645:7;6641:23;6637:32;6634:52;;;6682:1;6679;6672:12;6634:52;6721:9;6708:23;6740:31;6765:5;6740:31;:::i;:::-;6790:5;-1:-1:-1;6847:2:1;6832:18;;6819:32;6860:30;6819:32;6860:30;:::i;6927:380::-;7006:1;7002:12;;;;7049;;;7070:61;;7124:4;7116:6;7112:17;7102:27;;7070:61;7177:2;7169:6;7166:14;7146:18;7143:38;7140:161;;7223:10;7218:3;7214:20;7211:1;7204:31;7258:4;7255:1;7248:15;7286:4;7283:1;7276:15;7140:161;;6927:380;;;:::o;7641:184::-;7711:6;7764:2;7752:9;7743:7;7739:23;7735:32;7732:52;;;7780:1;7777;7770:12;7732:52;-1:-1:-1;7803:16:1;;7641:184;-1:-1:-1;7641:184:1:o;8109:245::-;8176:6;8229:2;8217:9;8208:7;8204:23;8200:32;8197:52;;;8245:1;8242;8235:12;8197:52;8277:9;8271:16;8296:28;8318:5;8296:28;:::i;9285:127::-;9346:10;9341:3;9337:20;9334:1;9327:31;9377:4;9374:1;9367:15;9401:4;9398:1;9391:15;10088:127;10149:10;10144:3;10140:20;10137:1;10130:31;10180:4;10177:1;10170:15;10204:4;10201:1;10194:15;10220:125;10285:9;;;10306:10;;;10303:36;;;10319:18;;:::i;14526:401::-;14728:2;14710:21;;;14767:2;14747:18;;;14740:30;14806:34;14801:2;14786:18;;14779:62;-1:-1:-1;;;14872:2:1;14857:18;;14850:35;14917:3;14902:19;;14526:401::o;14932:399::-;15134:2;15116:21;;;15173:2;15153:18;;;15146:30;15212:34;15207:2;15192:18;;15185:62;-1:-1:-1;;;15278:2:1;15263:18;;15256:33;15321:3;15306:19;;14932:399::o;16015:168::-;16088:9;;;16119;;16136:15;;;16130:22;;16116:37;16106:71;;16157:18;;:::i;16188:217::-;16228:1;16254;16244:132;;16298:10;16293:3;16289:20;16286:1;16279:31;16333:4;16330:1;16323:15;16361:4;16358:1;16351:15;16244:132;-1:-1:-1;16390:9:1;;16188:217::o;16410:128::-;16477:9;;;16498:11;;;16495:37;;;16512:18;;:::i;18462:251::-;18532:6;18585:2;18573:9;18564:7;18560:23;18556:32;18553:52;;;18601:1;18598;18591:12;18553:52;18633:9;18627:16;18652:31;18677:5;18652:31;:::i;18718:980::-;18980:4;19028:3;19017:9;19013:19;19059:6;19048:9;19041:25;19085:2;19123:6;19118:2;19107:9;19103:18;19096:34;19166:3;19161:2;19150:9;19146:18;19139:31;19190:6;19225;19219:13;19256:6;19248;19241:22;19294:3;19283:9;19279:19;19272:26;;19333:2;19325:6;19321:15;19307:29;;19354:1;19364:195;19378:6;19375:1;19372:13;19364:195;;;19443:13;;-1:-1:-1;;;;;19439:39:1;19427:52;;19534:15;;;;19499:12;;;;19475:1;19393:9;19364:195;;;-1:-1:-1;;;;;;;19615:32:1;;;;19610:2;19595:18;;19588:60;-1:-1:-1;;;19679:3:1;19664:19;19657:35;19576:3;18718:980;-1:-1:-1;;;18718:980:1:o

Swarm Source

ipfs://0205d6f99ecbdd8043ca456c9bbcd9ddf4e492f0d6b94b05501861c3e1dbb0bb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.