ETH Price: $2,245.01 (-1.31%)
 

Overview

Max Total Supply

500,000,000,000,000 Spoder

Holders

23

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
Spoderman

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2023-05-29
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

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://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * 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);
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

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);
}


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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;
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

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://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * 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}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * 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 value {ERC20} uses, unless this function is
     * 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;
        _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 {}
}


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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);
    }
}


// File @openzeppelin/contracts/security/[email protected]


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File contracts/Meme/Spoderman.sol



pragma solidity ^0.8.0;
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 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;
}

contract Spoderman is ERC20, Ownable, ReentrancyGuard {
    IUniswapV2Router02 private pcsV2Router;
    address public pcsV2Pair;
    bool public swapping;
    bool public isTradeOpen = false;

    uint256 public swapTokensAtAmount;
    uint256 public maxSellTransactionAmount;

    mapping (address => uint256) public lastTrade;
    uint256 public tradeCooldownTime;

    uint256 public liquidityFee;
    uint256 public burnFee;
    uint256 public treasuryFee;
    uint256 public totalFees;

    address public treasuryAddress = 0x02e1Ec119C2F17a44443b20aCa30386F75fB048C;
    address public marketingAddress = 0x5c8D48004250d0Dc688233aEd758a46230C77c16;
    address public devAddress = 0x6A48571a35C468A9dB906eE9A7D66AbBcfAe164B;
    address public tvlAddress = 0x6B6F672149A7F8cfB85263566aD4e38BFAb7Fd8F;

    uint256 public constant AIRDROP_PERCENT = 1;
    uint256 public constant CEX_PERCENT = 5;
    uint256 public constant TVL_PERCENT = 40;
    uint256 public constant LIQUIDITY_PERCENT = 45;
    uint256 public constant DEV_PERCENT = 4;
    uint256 public constant MARKETING_PERCENT = 5;

    address public router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address dead = 0x000000000000000000000000000000000000dEaD;

    mapping(address => bool) private _isExcludedFromFees;
    
    uint256 public totalAirdropAmount;
    mapping (address => uint256) public airdrops;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a ma   ximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;
    
    // Prevent processing while already processing!
    modifier lockTheSwap() {
        swapping = true;
        _;
        swapping = false;
    }

    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event TradeCooldownTimeUpdated(uint256 tradeCooldownTime);
    event AIRDROPED(address indexed account, uint256 amount);

    constructor() ERC20("Spoderman", "Spoder") {
        uint256 _totalSupply = 500_000_000_000_000;
        burnFee = 2;
        liquidityFee = 2;
        treasuryFee = 1;
        totalFees = liquidityFee + burnFee + treasuryFee;
        
        IUniswapV2Router02 _pcsV2Router = IUniswapV2Router02(router);
        pcsV2Pair = IUniswapV2Factory(_pcsV2Router.factory()).createPair(address(this), _pcsV2Router.WETH());
        pcsV2Router = _pcsV2Router;
        _setAutomatedMarketMakerPair(pcsV2Pair, true);

        excludeFromFee(msg.sender, true);
        excludeFromFee(address(this), true);
        excludeFromFee(treasuryAddress, true);
        excludeFromFee(marketingAddress, true);
        excludeFromFee(devAddress, true);
        excludeFromFee(tvlAddress, true);
        excludeFromFee(0x79D3610E8965AB21d1485656d39a575f197e3183, true);

        swapTokensAtAmount = _totalSupply / 1000 * (10 ** decimals());
        maxSellTransactionAmount = _totalSupply / 1000 * (10 ** decimals());

        updateTradeCooldownTime(30);

        _mint(address(this), _totalSupply * 10 ** decimals() * AIRDROP_PERCENT / 100);
        totalAirdropAmount = _totalSupply * 10 ** decimals() * AIRDROP_PERCENT / 100;
        _mint(tvlAddress, _totalSupply * 10 ** decimals() * TVL_PERCENT / 100);
        _mint(devAddress, _totalSupply * 10 ** decimals() * DEV_PERCENT / 100);
        _mint(marketingAddress, _totalSupply * 10 ** decimals() * MARKETING_PERCENT / 100);
        _mint(0x79D3610E8965AB21d1485656d39a575f197e3183, _totalSupply * 10 ** decimals() * (CEX_PERCENT + LIQUIDITY_PERCENT) / 100);

        transferOwnership(0x79D3610E8965AB21d1485656d39a575f197e3183);
    }

    // This function is required so that the contract can receive BNB from pancakeswap
    receive() external payable {}

    function enableTrade() external onlyOwner{
        require(isTradeOpen == false, "Trade is already open!");
        isTradeOpen = true;
    }

    function excludeFromFee(address user, bool value) public onlyOwner {
        // require(_isExcludedFromFees[user] != value, "Already Set");

        _isExcludedFromFees[user] = value;
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function updateTradeCooldownTime(uint256 _tradeCooldownTime) public onlyOwner {
        require(_tradeCooldownTime <= 1 days, "Antibot: Trade cooldown too long.");
            
        tradeCooldownTime = _tradeCooldownTime;
        
        emit TradeCooldownTimeUpdated(_tradeCooldownTime);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        override
    {
        if(!_isExcludedFromFees[from])
            require(lastTrade[from] + tradeCooldownTime <= block.timestamp, "Antibot: Transaction sender is in anti-bot cooldown");
        if(!_isExcludedFromFees[to])
            require(lastTrade[to] + tradeCooldownTime <= block.timestamp, "Antibot: Transaction recipient is in anti-bot cooldown");

        super._beforeTokenTransfer(from, to, amount);
    }

    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");

        bool isExcluded = _isExcludedFromFees[from] || _isExcludedFromFees[to];
        require(isTradeOpen || isExcluded, "Trading is not open!");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if( 
            !swapping &&
            automatedMarketMakerPairs[to] && // sells only by detecting transfer to automated market maker pair
            from != address(pcsV2Router) && //router -> pair is removing liquidity which shouldn't have max
            !_isExcludedFromFees[from] //no max for those excluded from fees
        ) {
            require(amount <= maxSellTransactionAmount, "Sell transfer amount exceeds the maxSellTransactionAmount.");
        }

        uint256 contractTokenBalance = balanceOf(address(this)) - totalAirdropAmount;

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            from != owner() &&
            to != owner()
        ) {
            swapping = true;

            uint256 burnTokens = contractTokenBalance * burnFee / totalFees;
            super._transfer(address(this), dead, burnTokens);

            uint256 treasuryTokens = contractTokenBalance * treasuryFee / totalFees;
            super._transfer(address(this), treasuryAddress, treasuryTokens);

            uint256 swapTokens = contractTokenBalance * liquidityFee / totalFees;
            swapAndLiquify(swapTokens);

            swapping = false;
        }

        if (!isExcluded) {
            uint256 fees = amount * totalFees / 100;
            amount = amount - fees;

            super._transfer(from, address(this), fees);
        }
        
        super._transfer(from, to, amount);
    }

    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal
        override
    {
        if (automatedMarketMakerPairs[from] && !_isExcludedFromFees[to]) lastTrade[to] = block.timestamp;
        else if (automatedMarketMakerPairs[to] && !_isExcludedFromFees[from]) lastTrade[from] = block.timestamp;

        super._afterTokenTransfer(from, to, amount);
    }

    function swapAndLiquify(uint256 tokens) private {
        // split the contract balance into halves
        uint256 half = tokens / 2;
        uint256 otherHalf = tokens - half;

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance - initialBalance;

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    // Swapping tokens for BNB using PancakeSwap
    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = pcsV2Router.WETH();
        _approve(address(this), address(pcsV2Router), tokenAmount);

        pcsV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(pcsV2Router), tokenAmount);

        // add the liquidity
        pcsV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(0xdead),
            block.timestamp
        );
    }
    
    function changeMaxSellAmount(uint256 newAmount) external onlyOwner {
        maxSellTransactionAmount = newAmount * (10 ** decimals());
    }

    function setTreasuryAddress(address payable _newtreasuryAddress) external {
        require(msg.sender == treasuryAddress, "Only team could change this address");
        treasuryAddress = _newtreasuryAddress;
    }

    function setSwapTokensAtAmount(uint256 _amount) external onlyOwner {
        swapTokensAtAmount = _amount;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require( pair != pcsV2Pair, "ERC20DividendToken: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "ERC20DividendToken: Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function multiAirdrop(address[] calldata _accounts, uint256 _amount) public onlyOwner {
        uint256 i;
        uint256 len = _accounts.length;

        for (i = 0; i < len; i++) {
            airdrops[_accounts[i]] += _amount;
        }
    }

    function claim() public nonReentrant {
        require(airdrops[msg.sender] > 0, "Sorry, You are not allowed to airdrop!");
        require(totalAirdropAmount > 0, "Insufficient funds for Airdrop!");

        uint256 amount = totalAirdropAmount > airdrops[msg.sender] ? airdrops[msg.sender] : totalAirdropAmount;
        airdrops[msg.sender] -= amount;
        _transfer(address(this), msg.sender, amount);

        totalAirdropAmount -= amount;

        emit AIRDROPED(msg.sender, amount);
    }

    function fundForAirdrop(uint256 _amount) public {
        _transfer(msg.sender, address(this), _amount);

        totalAirdropAmount += _amount;
    }

    function destributeAirdrop(address[] calldata _accounts, uint256 _amount) public onlyOwner {
        uint256 i;
        uint256 len = _accounts.length;
        require(balanceOf(address(this)) > len * _amount, "You have no enough amount for airdrop");
        totalAirdropAmount -= (len * _amount);

        for (i = 0; i < len; i++) {
            super._transfer(address(this), _accounts[i], _amount);
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AIRDROPED","type":"event"},{"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"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","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":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tradeCooldownTime","type":"uint256"}],"name":"TradeCooldownTimeUpdated","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"},{"inputs":[],"name":"AIRDROP_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CEX_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEV_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MARKETING_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TVL_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"airdrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"changeMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","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":"_accounts","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"destributeAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fundForAirdrop","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":[],"name":"isTradeOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastTrade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"multiAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pcsV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newtreasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapping","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAirdropAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeCooldownTime","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":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tvlAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tradeCooldownTime","type":"uint256"}],"name":"updateTradeCooldownTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526008805460ff60a81b19169055601180546001600160a01b03199081167302e1ec119c2f17a44443b20aca30386f75fb048c17909155601280548216735c8d48004250d0dc688233aed758a46230c77c16179055601380548216736a48571a35c468a9db906ee9a7d66abbcfae164b179055601480548216736b6f672149a7f8cfb85263566ad4e38bfab7fd8f179055601580548216737a250d5630b4cf539739df2c5dacb4c659f2488d1790556016805490911661dead179055348015620000cc57600080fd5b506040518060400160405280600981526020016829b837b232b936b0b760b91b8152506040518060400160405280600681526020016529b837b232b960d11b81525081600390816200011f919062000c85565b5060046200012e828262000c85565b5050506200014b620001456200054e60201b60201c565b62000552565b600160068190556002600e819055600d819055600f8290556601c6bf52634000919062000179908062000d67565b62000185919062000d67565b6010556015546040805163c45a015560e01b815290516001600160a01b0390921691829163c45a01559160048083019260209291908290030181865afa158015620001d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fa919062000d83565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000248573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026e919062000d83565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e2919062000d83565b600880546001600160a01b039283166001600160a01b0319918216811790925560078054938516939091169290921790915562000321906001620005a4565b6200032e336001620006a9565b6200033b306001620006a9565b60115462000354906001600160a01b03166001620006a9565b6012546200036d906001600160a01b03166001620006a9565b60135462000386906001600160a01b03166001620006a9565b6014546200039f906001600160a01b03166001620006a9565b620003c07379d3610e8965ab21d1485656d39a575f197e31836001620006a9565b620003ce6012600a62000eb2565b620003dc6103e88462000ec3565b620003e8919062000ee6565b600955620003f96012600a62000eb2565b620004076103e88462000ec3565b62000413919062000ee6565b600a5562000422601e620006de565b62000465306064600160125b6200043b90600a62000eb2565b62000447908762000ee6565b62000453919062000ee6565b6200045f919062000ec3565b62000782565b60646001620004776012600a62000eb2565b62000483908562000ee6565b6200048f919062000ee6565b6200049b919062000ec3565b601855601454620004bb906001600160a01b03166064602860126200042e565b601354620004d8906001600160a01b03166064600460126200042e565b601254620004f6906001600160a01b0316606460056200042e601290565b620005277379d3610e8965ab21d1485656d39a575f197e318360646200051f602d600562000d67565b60126200042e565b620005467379d3610e8965ab21d1485656d39a575f197e318362000883565b505062000f00565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601a602052604090205481151560ff909116151503620006555760405162461bcd60e51b815260206004820152604c60248201527f45524332304469766964656e64546f6b656e3a204175746f6d61746564206d6160448201527f726b6574206d616b6572207061697220697320616c726561647920736574207460648201526b6f20746861742076616c756560a01b608482015260a4015b60405180910390fd5b6001600160a01b0382166000818152601a6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b620006b362000902565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b620006e862000902565b62015180811115620007475760405162461bcd60e51b815260206004820152602160248201527f416e7469626f743a20547261646520636f6f6c646f776e20746f6f206c6f6e676044820152601760f91b60648201526084016200064c565b600c8190556040518181527f07583f92fee444c67f59bbc03e68bfda63fc2e087769ccc4f2b40360336a54679060200160405180910390a150565b6001600160a01b038216620007da5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200064c565b620007e86000838362000960565b8060026000828254620007fc919062000d67565b90915550506001600160a01b038216600090815260208190526040812080548392906200082b90849062000d67565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36200087f6000838362000afd565b5050565b6200088d62000902565b6001600160a01b038116620008f45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200064c565b620008ff8162000552565b50565b6005546001600160a01b031633146200095e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200064c565b565b6001600160a01b03831660009081526017602052604090205460ff1662000a2057600c546001600160a01b0384166000908152600b60205260409020544291620009aa9162000d67565b111562000a205760405162461bcd60e51b815260206004820152603360248201527f416e7469626f743a205472616e73616374696f6e2073656e646572206973206960448201527f6e20616e74692d626f7420636f6f6c646f776e0000000000000000000000000060648201526084016200064c565b6001600160a01b03821660009081526017602052604090205460ff1662000ae057600c546001600160a01b0383166000908152600b6020526040902054429162000a6a9162000d67565b111562000ae05760405162461bcd60e51b815260206004820152603660248201527f416e7469626f743a205472616e73616374696f6e20726563697069656e74206960448201527f7320696e20616e74692d626f7420636f6f6c646f776e0000000000000000000060648201526084016200064c565b62000af883838362000af860201b6200117d1760201c565b505050565b6001600160a01b0383166000908152601a602052604090205460ff16801562000b3f57506001600160a01b03821660009081526017602052604090205460ff16155b1562000b66576001600160a01b0382166000908152600b6020526040902042905562000ae0565b6001600160a01b0382166000908152601a602052604090205460ff16801562000ba857506001600160a01b03831660009081526017602052604090205460ff16155b1562000ae0576001600160a01b0383166000908152600b6020526040902042905562000af883838362000af860201b6200117d1760201c565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000c0c57607f821691505b60208210810362000c2d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000af857600081815260208120601f850160051c8101602086101562000c5c5750805b601f850160051c820191505b8181101562000c7d5782815560010162000c68565b505050505050565b81516001600160401b0381111562000ca15762000ca162000be1565b62000cb98162000cb2845462000bf7565b8462000c33565b602080601f83116001811462000cf1576000841562000cd85750858301515b600019600386901b1c1916600185901b17855562000c7d565b600085815260208120601f198616915b8281101562000d225788860151825594840194600190910190840162000d01565b508582101562000d415787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000d7d5762000d7d62000d51565b92915050565b60006020828403121562000d9657600080fd5b81516001600160a01b038116811462000dae57600080fd5b9392505050565b600181815b8085111562000df657816000190482111562000dda5762000dda62000d51565b8085161562000de857918102915b93841c939080029062000dba565b509250929050565b60008262000e0f5750600162000d7d565b8162000e1e5750600062000d7d565b816001811462000e37576002811462000e425762000e62565b600191505062000d7d565b60ff84111562000e565762000e5662000d51565b50506001821b62000d7d565b5060208310610133831016604e8410600b841016171562000e87575081810a62000d7d565b62000e93838362000db5565b806000190482111562000eaa5762000eaa62000d51565b029392505050565b600062000dae60ff84168362000dfe565b60008262000ee157634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141762000d7d5762000d7d62000d51565b6123b18062000f106000396000f3fe6080604052600436106102e75760003560e01c8063715018a611610190578063b62496f5116100dc578063e2f4560511610095578063f431878f1161006f578063f431878f14610888578063f887ea40146108bd578063fce589d8146108dd578063fd116019146108f357600080fd5b8063e2f4560514610872578063eb2e738314610888578063f2fde38b1461089d57600080fd5b8063b62496f51461079f578063c26d7be0146107cf578063c5f956af146107fc578063cc32d1761461081c578063dd62ed3e14610832578063df8408fe1461085257600080fd5b80639a7a23d611610149578063a9059cbb11610123578063a9059cbb14610729578063aa5c7f0714610749578063afa4f3b214610769578063b073f6871461078957600080fd5b80639a7a23d6146106c9578063a457c2d7146106e9578063a5ece9411461070957600080fd5b8063715018a61461061e578063829cb3d0146106335780638c86f0a7146106535780638da5cb5b1461068057806395d89b411461069e57806398118cb4146106b357600080fd5b8063395093511161024f5780634fbee1931161020857806360901444116101e257806360901444146105875780636605bfda146105a85780636a3e8f3d146105c857806370a08231146105e857600080fd5b80634fbee1931461050e57806352143290146105475780635b3222051461056757600080fd5b806339509351146104575780633ad10ef6146104775780633ccfbabf146104af5780634c6f455d146104c45780634d2dc760146104e45780634e71d92d146104f957600080fd5b806318160ddd116102a157806318160ddd146103bc57806323b872dd146103d157806327532d27146103f15780632fc6553014610406578063313ce5671461041b578063382389331461043757600080fd5b806299d386146102f357806302259e9e1461030a57806306fdde0314610333578063095ea7b31461035557806313114a9d146103855780631732cded1461039b57600080fd5b366102ee57005b600080fd5b3480156102ff57600080fd5b50610308610909565b005b34801561031657600080fd5b50610320600a5481565b6040519081526020015b60405180910390f35b34801561033f57600080fd5b5061034861097e565b60405161032a9190611e72565b34801561036157600080fd5b50610375610370366004611ed5565b610a10565b604051901515815260200161032a565b34801561039157600080fd5b5061032060105481565b3480156103a757600080fd5b5060085461037590600160a01b900460ff1681565b3480156103c857600080fd5b50600254610320565b3480156103dd57600080fd5b506103756103ec366004611f01565b610a2a565b3480156103fd57600080fd5b50610320600481565b34801561041257600080fd5b50610320600181565b34801561042757600080fd5b506040516012815260200161032a565b34801561044357600080fd5b50610308610452366004611f42565b610a4e565b34801561046357600080fd5b50610375610472366004611ed5565b610b45565b34801561048357600080fd5b50601354610497906001600160a01b031681565b6040516001600160a01b03909116815260200161032a565b3480156104bb57600080fd5b50610320602d81565b3480156104d057600080fd5b50601454610497906001600160a01b031681565b3480156104f057600080fd5b50610320602881565b34801561050557600080fd5b50610308610b67565b34801561051a57600080fd5b50610375610529366004611fbd565b6001600160a01b031660009081526017602052604090205460ff1690565b34801561055357600080fd5b50600854610497906001600160a01b031681565b34801561057357600080fd5b50610308610582366004611fe1565b610d35565b34801561059357600080fd5b5060085461037590600160a81b900460ff1681565b3480156105b457600080fd5b506103086105c3366004611fbd565b610d59565b3480156105d457600080fd5b506103086105e3366004611fe1565b610de1565b3480156105f457600080fd5b50610320610603366004611fbd565b6001600160a01b031660009081526020819052604090205490565b34801561062a57600080fd5b50610308610e81565b34801561063f57600080fd5b5061030861064e366004611f42565b610e95565b34801561065f57600080fd5b5061032061066e366004611fbd565b60196020526000908152604090205481565b34801561068c57600080fd5b506005546001600160a01b0316610497565b3480156106aa57600080fd5b50610348610f1c565b3480156106bf57600080fd5b50610320600d5481565b3480156106d557600080fd5b506103086106e4366004611ffa565b610f2b565b3480156106f557600080fd5b50610375610704366004611ed5565b610feb565b34801561071557600080fd5b50601254610497906001600160a01b031681565b34801561073557600080fd5b50610375610744366004611ed5565b611066565b34801561075557600080fd5b50610308610764366004611fe1565b611074565b34801561077557600080fd5b50610308610784366004611fe1565b611099565b34801561079557600080fd5b5061032060185481565b3480156107ab57600080fd5b506103756107ba366004611fbd565b601a6020526000908152604090205460ff1681565b3480156107db57600080fd5b506103206107ea366004611fbd565b600b6020526000908152604090205481565b34801561080857600080fd5b50601154610497906001600160a01b031681565b34801561082857600080fd5b50610320600f5481565b34801561083e57600080fd5b5061032061084d366004612038565b6110a6565b34801561085e57600080fd5b5061030861086d366004611ffa565b6110d1565b34801561087e57600080fd5b5061032060095481565b34801561089457600080fd5b50610320600581565b3480156108a957600080fd5b506103086108b8366004611fbd565b611104565b3480156108c957600080fd5b50601554610497906001600160a01b031681565b3480156108e957600080fd5b50610320600e5481565b3480156108ff57600080fd5b50610320600c5481565b610911611182565b600854600160a81b900460ff16156109695760405162461bcd60e51b8152602060048201526016602482015275547261646520697320616c7265616479206f70656e2160501b60448201526064015b60405180910390fd5b6008805460ff60a81b1916600160a81b179055565b60606003805461098d90612066565b80601f01602080910402602001604051908101604052809291908181526020018280546109b990612066565b8015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b5050505050905090565b600033610a1e8185856111dc565b60019150505b92915050565b600033610a38858285611300565b610a4385858561137a565b506001949350505050565b610a56611182565b600082610a6383826120b6565b3060009081526020819052604090205411610ace5760405162461bcd60e51b815260206004820152602560248201527f596f752068617665206e6f20656e6f75676820616d6f756e7420666f7220616960448201526407264726f760dc1b6064820152608401610960565b610ad883826120b6565b60186000828254610ae991906120cd565b9091555060009250505b80821015610b3e57610b2c30868685818110610b1157610b116120e0565b9050602002016020810190610b269190611fbd565b8561170b565b81610b36816120f6565b925050610af3565b5050505050565b600033610a1e818585610b5883836110a6565b610b62919061210f565b6111dc565b600260065403610bb95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610960565b600260065533600090815260196020526040902054610c295760405162461bcd60e51b815260206004820152602660248201527f536f7272792c20596f7520617265206e6f7420616c6c6f77656420746f2061696044820152657264726f702160d01b6064820152608401610960565b600060185411610c7b5760405162461bcd60e51b815260206004820152601f60248201527f496e73756666696369656e742066756e647320666f722041697264726f7021006044820152606401610960565b3360009081526019602052604081205460185411610c9b57601854610cac565b336000908152601960205260409020545b33600090815260196020526040812080549293508392909190610cd09084906120cd565b90915550610ce1905030338361137a565b8060186000828254610cf391906120cd565b909155505060405181815233907f92335d0fd5754aa2037a3cf991e2d462b6185c1200e2b7661d5e7760fe6528e89060200160405180910390a2506001600655565b610d3d611182565b610d496012600a612206565b610d5390826120b6565b600a5550565b6011546001600160a01b03163314610dbf5760405162461bcd60e51b815260206004820152602360248201527f4f6e6c79207465616d20636f756c64206368616e67652074686973206164647260448201526265737360e81b6064820152608401610960565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b610de9611182565b62015180811115610e465760405162461bcd60e51b815260206004820152602160248201527f416e7469626f743a20547261646520636f6f6c646f776e20746f6f206c6f6e676044820152601760f91b6064820152608401610960565b600c8190556040518181527f07583f92fee444c67f59bbc03e68bfda63fc2e087769ccc4f2b40360336a54679060200160405180910390a150565b610e89611182565b610e936000611870565b565b610e9d611182565b6000825b80821015610b3e578260196000878786818110610ec057610ec06120e0565b9050602002016020810190610ed59190611fbd565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610f04919061210f565b90915550829050610f14816120f6565b925050610ea1565b60606004805461098d90612066565b610f33611182565b6008546001600160a01b0390811690831603610fdd5760405162461bcd60e51b815260206004820152605960248201527f45524332304469766964656e64546f6b656e3a205468652050616e63616b655360448201527f77617020706169722063616e6e6f742062652072656d6f7665642066726f6d2060648201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000608482015260a401610960565b610fe782826118c2565b5050565b60003381610ff982866110a6565b9050838110156110595760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610960565b610a4382868684036111dc565b600033610a1e81858561137a565b61107f33308361137a565b8060186000828254611091919061210f565b909155505050565b6110a1611182565b600955565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6110d9611182565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b61110c611182565b6001600160a01b0381166111715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610960565b61117a81611870565b50565b505050565b6005546001600160a01b03163314610e935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610960565b6001600160a01b03831661123e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610960565b6001600160a01b03821661129f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610960565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061130c84846110a6565b9050600019811461137457818110156113675760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610960565b61137484848484036111dc565b50505050565b6001600160a01b0383166113a05760405162461bcd60e51b815260040161096090612215565b6001600160a01b0382166113c65760405162461bcd60e51b81526004016109609061225a565b6001600160a01b03831660009081526017602052604081205460ff168061140557506001600160a01b03831660009081526017602052604090205460ff165b600854909150600160a81b900460ff168061141d5750805b6114605760405162461bcd60e51b815260206004820152601460248201527354726164696e67206973206e6f74206f70656e2160601b6044820152606401610960565b81600003611474576113748484600061170b565b600854600160a01b900460ff161580156114a657506001600160a01b0383166000908152601a602052604090205460ff165b80156114c057506007546001600160a01b03858116911614155b80156114e557506001600160a01b03841660009081526017602052604090205460ff16155b1561156257600a548211156115625760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610960565b601854306000908152602081905260408120549091611580916120cd565b600954909150811080159081906115a15750600854600160a01b900460ff16155b80156115c657506001600160a01b0386166000908152601a602052604090205460ff16155b80156115e057506005546001600160a01b03878116911614155b80156115fa57506005546001600160a01b03868116911614155b156116bc576008805460ff60a01b1916600160a01b179055601054600e546000919061162690856120b6565b611630919061229d565b60165490915061164b9030906001600160a01b03168361170b565b6000601054600f548561165e91906120b6565b611668919061229d565b6011549091506116839030906001600160a01b03168361170b565b6000601054600d548661169691906120b6565b6116a0919061229d565b90506116ab816119c1565b50506008805460ff60a01b19169055505b826116f85760006064601054866116d391906120b6565b6116dd919061229d565b90506116e981866120cd565b94506116f687308361170b565b505b61170386868661170b565b505050505050565b6001600160a01b0383166117315760405162461bcd60e51b815260040161096090612215565b6001600160a01b0382166117575760405162461bcd60e51b81526004016109609061225a565b611762838383611a48565b6001600160a01b038316600090815260208190526040902054818110156117da5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610960565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061181190849061210f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161185d91815260200190565b60405180910390a3611374848484611bad565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601a602052604090205481151560ff90911615150361196d5760405162461bcd60e51b815260206004820152604c60248201527f45524332304469766964656e64546f6b656e3a204175746f6d61746564206d6160448201527f726b6574206d616b6572207061697220697320616c726561647920736574207460648201526b6f20746861742076616c756560a01b608482015260a401610960565b6001600160a01b0382166000818152601a6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60006119ce60028361229d565b905060006119dc82846120cd565b9050476119e883611c75565b60006119f482476120cd565b9050611a008382611dc7565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6001600160a01b03831660009081526017602052604090205460ff16611af957600c546001600160a01b0384166000908152600b60205260409020544291611a8f9161210f565b1115611af95760405162461bcd60e51b815260206004820152603360248201527f416e7469626f743a205472616e73616374696f6e2073656e6465722069732069604482015272371030b73a3496b137ba1031b7b7b63237bbb760691b6064820152608401610960565b6001600160a01b03821660009081526017602052604090205460ff1661117d57600c546001600160a01b0383166000908152600b60205260409020544291611b409161210f565b111561117d5760405162461bcd60e51b815260206004820152603660248201527f416e7469626f743a205472616e73616374696f6e20726563697069656e742069604482015275399034b71030b73a3496b137ba1031b7b7b63237bbb760511b6064820152608401610960565b6001600160a01b0383166000908152601a602052604090205460ff168015611bee57506001600160a01b03821660009081526017602052604090205460ff16155b15611c1157506001600160a01b03166000908152600b6020526040902042905550565b6001600160a01b0382166000908152601a602052604090205460ff168015611c5257506001600160a01b03831660009081526017602052604090205460ff16155b1561117d5750506001600160a01b03166000908152600b60205260409020429055565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611caa57611caa6120e0565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2791906122bf565b81600181518110611d3a57611d3a6120e0565b6001600160a01b039283166020918202929092010152600754611d6091309116846111dc565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790611d999085906000908690309042906004016122dc565b600060405180830381600087803b158015611db357600080fd5b505af1158015611703573d6000803e3d6000fd5b600754611ddf9030906001600160a01b0316846111dc565b60075460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015611e4d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610b3e919061234d565b600060208083528351808285015260005b81811015611e9f57858101830151858201604001528201611e83565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461117a57600080fd5b60008060408385031215611ee857600080fd5b8235611ef381611ec0565b946020939093013593505050565b600080600060608486031215611f1657600080fd5b8335611f2181611ec0565b92506020840135611f3181611ec0565b929592945050506040919091013590565b600080600060408486031215611f5757600080fd5b833567ffffffffffffffff80821115611f6f57600080fd5b818601915086601f830112611f8357600080fd5b813581811115611f9257600080fd5b8760208260051b8501011115611fa757600080fd5b6020928301989097509590910135949350505050565b600060208284031215611fcf57600080fd5b8135611fda81611ec0565b9392505050565b600060208284031215611ff357600080fd5b5035919050565b6000806040838503121561200d57600080fd5b823561201881611ec0565b91506020830135801515811461202d57600080fd5b809150509250929050565b6000806040838503121561204b57600080fd5b823561205681611ec0565b9150602083013561202d81611ec0565b600181811c9082168061207a57607f821691505b60208210810361209a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a2457610a246120a0565b81810381811115610a2457610a246120a0565b634e487b7160e01b600052603260045260246000fd5b600060018201612108576121086120a0565b5060010190565b80820180821115610a2457610a246120a0565b600181815b8085111561215d578160001904821115612143576121436120a0565b8085161561215057918102915b93841c9390800290612127565b509250929050565b60008261217457506001610a24565b8161218157506000610a24565b816001811461219757600281146121a1576121bd565b6001915050610a24565b60ff8411156121b2576121b26120a0565b50506001821b610a24565b5060208310610133831016604e8410600b84101617156121e0575081810a610a24565b6121ea8383612122565b80600019048211156121fe576121fe6120a0565b029392505050565b6000611fda60ff841683612165565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000826122ba57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156122d157600080fd5b8151611fda81611ec0565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561232c5784516001600160a01b031683529383019391830191600101612307565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561236257600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212202748a6bfecf5a1a40a9fa61c05597f487d82dd0beeb254402c625ba652cde36f64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102e75760003560e01c8063715018a611610190578063b62496f5116100dc578063e2f4560511610095578063f431878f1161006f578063f431878f14610888578063f887ea40146108bd578063fce589d8146108dd578063fd116019146108f357600080fd5b8063e2f4560514610872578063eb2e738314610888578063f2fde38b1461089d57600080fd5b8063b62496f51461079f578063c26d7be0146107cf578063c5f956af146107fc578063cc32d1761461081c578063dd62ed3e14610832578063df8408fe1461085257600080fd5b80639a7a23d611610149578063a9059cbb11610123578063a9059cbb14610729578063aa5c7f0714610749578063afa4f3b214610769578063b073f6871461078957600080fd5b80639a7a23d6146106c9578063a457c2d7146106e9578063a5ece9411461070957600080fd5b8063715018a61461061e578063829cb3d0146106335780638c86f0a7146106535780638da5cb5b1461068057806395d89b411461069e57806398118cb4146106b357600080fd5b8063395093511161024f5780634fbee1931161020857806360901444116101e257806360901444146105875780636605bfda146105a85780636a3e8f3d146105c857806370a08231146105e857600080fd5b80634fbee1931461050e57806352143290146105475780635b3222051461056757600080fd5b806339509351146104575780633ad10ef6146104775780633ccfbabf146104af5780634c6f455d146104c45780634d2dc760146104e45780634e71d92d146104f957600080fd5b806318160ddd116102a157806318160ddd146103bc57806323b872dd146103d157806327532d27146103f15780632fc6553014610406578063313ce5671461041b578063382389331461043757600080fd5b806299d386146102f357806302259e9e1461030a57806306fdde0314610333578063095ea7b31461035557806313114a9d146103855780631732cded1461039b57600080fd5b366102ee57005b600080fd5b3480156102ff57600080fd5b50610308610909565b005b34801561031657600080fd5b50610320600a5481565b6040519081526020015b60405180910390f35b34801561033f57600080fd5b5061034861097e565b60405161032a9190611e72565b34801561036157600080fd5b50610375610370366004611ed5565b610a10565b604051901515815260200161032a565b34801561039157600080fd5b5061032060105481565b3480156103a757600080fd5b5060085461037590600160a01b900460ff1681565b3480156103c857600080fd5b50600254610320565b3480156103dd57600080fd5b506103756103ec366004611f01565b610a2a565b3480156103fd57600080fd5b50610320600481565b34801561041257600080fd5b50610320600181565b34801561042757600080fd5b506040516012815260200161032a565b34801561044357600080fd5b50610308610452366004611f42565b610a4e565b34801561046357600080fd5b50610375610472366004611ed5565b610b45565b34801561048357600080fd5b50601354610497906001600160a01b031681565b6040516001600160a01b03909116815260200161032a565b3480156104bb57600080fd5b50610320602d81565b3480156104d057600080fd5b50601454610497906001600160a01b031681565b3480156104f057600080fd5b50610320602881565b34801561050557600080fd5b50610308610b67565b34801561051a57600080fd5b50610375610529366004611fbd565b6001600160a01b031660009081526017602052604090205460ff1690565b34801561055357600080fd5b50600854610497906001600160a01b031681565b34801561057357600080fd5b50610308610582366004611fe1565b610d35565b34801561059357600080fd5b5060085461037590600160a81b900460ff1681565b3480156105b457600080fd5b506103086105c3366004611fbd565b610d59565b3480156105d457600080fd5b506103086105e3366004611fe1565b610de1565b3480156105f457600080fd5b50610320610603366004611fbd565b6001600160a01b031660009081526020819052604090205490565b34801561062a57600080fd5b50610308610e81565b34801561063f57600080fd5b5061030861064e366004611f42565b610e95565b34801561065f57600080fd5b5061032061066e366004611fbd565b60196020526000908152604090205481565b34801561068c57600080fd5b506005546001600160a01b0316610497565b3480156106aa57600080fd5b50610348610f1c565b3480156106bf57600080fd5b50610320600d5481565b3480156106d557600080fd5b506103086106e4366004611ffa565b610f2b565b3480156106f557600080fd5b50610375610704366004611ed5565b610feb565b34801561071557600080fd5b50601254610497906001600160a01b031681565b34801561073557600080fd5b50610375610744366004611ed5565b611066565b34801561075557600080fd5b50610308610764366004611fe1565b611074565b34801561077557600080fd5b50610308610784366004611fe1565b611099565b34801561079557600080fd5b5061032060185481565b3480156107ab57600080fd5b506103756107ba366004611fbd565b601a6020526000908152604090205460ff1681565b3480156107db57600080fd5b506103206107ea366004611fbd565b600b6020526000908152604090205481565b34801561080857600080fd5b50601154610497906001600160a01b031681565b34801561082857600080fd5b50610320600f5481565b34801561083e57600080fd5b5061032061084d366004612038565b6110a6565b34801561085e57600080fd5b5061030861086d366004611ffa565b6110d1565b34801561087e57600080fd5b5061032060095481565b34801561089457600080fd5b50610320600581565b3480156108a957600080fd5b506103086108b8366004611fbd565b611104565b3480156108c957600080fd5b50601554610497906001600160a01b031681565b3480156108e957600080fd5b50610320600e5481565b3480156108ff57600080fd5b50610320600c5481565b610911611182565b600854600160a81b900460ff16156109695760405162461bcd60e51b8152602060048201526016602482015275547261646520697320616c7265616479206f70656e2160501b60448201526064015b60405180910390fd5b6008805460ff60a81b1916600160a81b179055565b60606003805461098d90612066565b80601f01602080910402602001604051908101604052809291908181526020018280546109b990612066565b8015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b5050505050905090565b600033610a1e8185856111dc565b60019150505b92915050565b600033610a38858285611300565b610a4385858561137a565b506001949350505050565b610a56611182565b600082610a6383826120b6565b3060009081526020819052604090205411610ace5760405162461bcd60e51b815260206004820152602560248201527f596f752068617665206e6f20656e6f75676820616d6f756e7420666f7220616960448201526407264726f760dc1b6064820152608401610960565b610ad883826120b6565b60186000828254610ae991906120cd565b9091555060009250505b80821015610b3e57610b2c30868685818110610b1157610b116120e0565b9050602002016020810190610b269190611fbd565b8561170b565b81610b36816120f6565b925050610af3565b5050505050565b600033610a1e818585610b5883836110a6565b610b62919061210f565b6111dc565b600260065403610bb95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610960565b600260065533600090815260196020526040902054610c295760405162461bcd60e51b815260206004820152602660248201527f536f7272792c20596f7520617265206e6f7420616c6c6f77656420746f2061696044820152657264726f702160d01b6064820152608401610960565b600060185411610c7b5760405162461bcd60e51b815260206004820152601f60248201527f496e73756666696369656e742066756e647320666f722041697264726f7021006044820152606401610960565b3360009081526019602052604081205460185411610c9b57601854610cac565b336000908152601960205260409020545b33600090815260196020526040812080549293508392909190610cd09084906120cd565b90915550610ce1905030338361137a565b8060186000828254610cf391906120cd565b909155505060405181815233907f92335d0fd5754aa2037a3cf991e2d462b6185c1200e2b7661d5e7760fe6528e89060200160405180910390a2506001600655565b610d3d611182565b610d496012600a612206565b610d5390826120b6565b600a5550565b6011546001600160a01b03163314610dbf5760405162461bcd60e51b815260206004820152602360248201527f4f6e6c79207465616d20636f756c64206368616e67652074686973206164647260448201526265737360e81b6064820152608401610960565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b610de9611182565b62015180811115610e465760405162461bcd60e51b815260206004820152602160248201527f416e7469626f743a20547261646520636f6f6c646f776e20746f6f206c6f6e676044820152601760f91b6064820152608401610960565b600c8190556040518181527f07583f92fee444c67f59bbc03e68bfda63fc2e087769ccc4f2b40360336a54679060200160405180910390a150565b610e89611182565b610e936000611870565b565b610e9d611182565b6000825b80821015610b3e578260196000878786818110610ec057610ec06120e0565b9050602002016020810190610ed59190611fbd565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610f04919061210f565b90915550829050610f14816120f6565b925050610ea1565b60606004805461098d90612066565b610f33611182565b6008546001600160a01b0390811690831603610fdd5760405162461bcd60e51b815260206004820152605960248201527f45524332304469766964656e64546f6b656e3a205468652050616e63616b655360448201527f77617020706169722063616e6e6f742062652072656d6f7665642066726f6d2060648201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000608482015260a401610960565b610fe782826118c2565b5050565b60003381610ff982866110a6565b9050838110156110595760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610960565b610a4382868684036111dc565b600033610a1e81858561137a565b61107f33308361137a565b8060186000828254611091919061210f565b909155505050565b6110a1611182565b600955565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6110d9611182565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b61110c611182565b6001600160a01b0381166111715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610960565b61117a81611870565b50565b505050565b6005546001600160a01b03163314610e935760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610960565b6001600160a01b03831661123e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610960565b6001600160a01b03821661129f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610960565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061130c84846110a6565b9050600019811461137457818110156113675760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610960565b61137484848484036111dc565b50505050565b6001600160a01b0383166113a05760405162461bcd60e51b815260040161096090612215565b6001600160a01b0382166113c65760405162461bcd60e51b81526004016109609061225a565b6001600160a01b03831660009081526017602052604081205460ff168061140557506001600160a01b03831660009081526017602052604090205460ff165b600854909150600160a81b900460ff168061141d5750805b6114605760405162461bcd60e51b815260206004820152601460248201527354726164696e67206973206e6f74206f70656e2160601b6044820152606401610960565b81600003611474576113748484600061170b565b600854600160a01b900460ff161580156114a657506001600160a01b0383166000908152601a602052604090205460ff165b80156114c057506007546001600160a01b03858116911614155b80156114e557506001600160a01b03841660009081526017602052604090205460ff16155b1561156257600a548211156115625760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610960565b601854306000908152602081905260408120549091611580916120cd565b600954909150811080159081906115a15750600854600160a01b900460ff16155b80156115c657506001600160a01b0386166000908152601a602052604090205460ff16155b80156115e057506005546001600160a01b03878116911614155b80156115fa57506005546001600160a01b03868116911614155b156116bc576008805460ff60a01b1916600160a01b179055601054600e546000919061162690856120b6565b611630919061229d565b60165490915061164b9030906001600160a01b03168361170b565b6000601054600f548561165e91906120b6565b611668919061229d565b6011549091506116839030906001600160a01b03168361170b565b6000601054600d548661169691906120b6565b6116a0919061229d565b90506116ab816119c1565b50506008805460ff60a01b19169055505b826116f85760006064601054866116d391906120b6565b6116dd919061229d565b90506116e981866120cd565b94506116f687308361170b565b505b61170386868661170b565b505050505050565b6001600160a01b0383166117315760405162461bcd60e51b815260040161096090612215565b6001600160a01b0382166117575760405162461bcd60e51b81526004016109609061225a565b611762838383611a48565b6001600160a01b038316600090815260208190526040902054818110156117da5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610960565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061181190849061210f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161185d91815260200190565b60405180910390a3611374848484611bad565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601a602052604090205481151560ff90911615150361196d5760405162461bcd60e51b815260206004820152604c60248201527f45524332304469766964656e64546f6b656e3a204175746f6d61746564206d6160448201527f726b6574206d616b6572207061697220697320616c726561647920736574207460648201526b6f20746861742076616c756560a01b608482015260a401610960565b6001600160a01b0382166000818152601a6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60006119ce60028361229d565b905060006119dc82846120cd565b9050476119e883611c75565b60006119f482476120cd565b9050611a008382611dc7565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6001600160a01b03831660009081526017602052604090205460ff16611af957600c546001600160a01b0384166000908152600b60205260409020544291611a8f9161210f565b1115611af95760405162461bcd60e51b815260206004820152603360248201527f416e7469626f743a205472616e73616374696f6e2073656e6465722069732069604482015272371030b73a3496b137ba1031b7b7b63237bbb760691b6064820152608401610960565b6001600160a01b03821660009081526017602052604090205460ff1661117d57600c546001600160a01b0383166000908152600b60205260409020544291611b409161210f565b111561117d5760405162461bcd60e51b815260206004820152603660248201527f416e7469626f743a205472616e73616374696f6e20726563697069656e742069604482015275399034b71030b73a3496b137ba1031b7b7b63237bbb760511b6064820152608401610960565b6001600160a01b0383166000908152601a602052604090205460ff168015611bee57506001600160a01b03821660009081526017602052604090205460ff16155b15611c1157506001600160a01b03166000908152600b6020526040902042905550565b6001600160a01b0382166000908152601a602052604090205460ff168015611c5257506001600160a01b03831660009081526017602052604090205460ff16155b1561117d5750506001600160a01b03166000908152600b60205260409020429055565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611caa57611caa6120e0565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2791906122bf565b81600181518110611d3a57611d3a6120e0565b6001600160a01b039283166020918202929092010152600754611d6091309116846111dc565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790611d999085906000908690309042906004016122dc565b600060405180830381600087803b158015611db357600080fd5b505af1158015611703573d6000803e3d6000fd5b600754611ddf9030906001600160a01b0316846111dc565b60075460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015611e4d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610b3e919061234d565b600060208083528351808285015260005b81811015611e9f57858101830151858201604001528201611e83565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461117a57600080fd5b60008060408385031215611ee857600080fd5b8235611ef381611ec0565b946020939093013593505050565b600080600060608486031215611f1657600080fd5b8335611f2181611ec0565b92506020840135611f3181611ec0565b929592945050506040919091013590565b600080600060408486031215611f5757600080fd5b833567ffffffffffffffff80821115611f6f57600080fd5b818601915086601f830112611f8357600080fd5b813581811115611f9257600080fd5b8760208260051b8501011115611fa757600080fd5b6020928301989097509590910135949350505050565b600060208284031215611fcf57600080fd5b8135611fda81611ec0565b9392505050565b600060208284031215611ff357600080fd5b5035919050565b6000806040838503121561200d57600080fd5b823561201881611ec0565b91506020830135801515811461202d57600080fd5b809150509250929050565b6000806040838503121561204b57600080fd5b823561205681611ec0565b9150602083013561202d81611ec0565b600181811c9082168061207a57607f821691505b60208210810361209a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610a2457610a246120a0565b81810381811115610a2457610a246120a0565b634e487b7160e01b600052603260045260246000fd5b600060018201612108576121086120a0565b5060010190565b80820180821115610a2457610a246120a0565b600181815b8085111561215d578160001904821115612143576121436120a0565b8085161561215057918102915b93841c9390800290612127565b509250929050565b60008261217457506001610a24565b8161218157506000610a24565b816001811461219757600281146121a1576121bd565b6001915050610a24565b60ff8411156121b2576121b26120a0565b50506001821b610a24565b5060208310610133831016604e8410600b84101617156121e0575081810a610a24565b6121ea8383612122565b80600019048211156121fe576121fe6120a0565b029392505050565b6000611fda60ff841683612165565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000826122ba57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156122d157600080fd5b8151611fda81611ec0565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561232c5784516001600160a01b031683529383019391830191600101612307565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561236257600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212202748a6bfecf5a1a40a9fa61c05597f487d82dd0beeb254402c625ba652cde36f64736f6c63430008120033

Deployed Bytecode Sourcemap

28486:12339:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32511:144;;;;;;;;;;;;;:::i;:::-;;28730:39;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;28730:39:0;;;;;;;;6643:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8994:201::-;;;;;;;;;;-1:-1:-1;8994:201:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;8994:201:0;1205:187:1;28967:24:0;;;;;;;;;;;;;;;;28623:20;;;;;;;;;;-1:-1:-1;28623:20:0;;;;-1:-1:-1;;;28623:20:0;;;;;;7763:108;;;;;;;;;;-1:-1:-1;7851:12:0;;7763:108;;9775:295;;;;;;;;;;-1:-1:-1;9775:295:0;;;;;:::i;:::-;;:::i;29517:39::-;;;;;;;;;;;;29555:1;29517:39;;29321:43;;;;;;;;;;;;29363:1;29321:43;;7605:93;;;;;;;;;;-1:-1:-1;7605:93:0;;7688:2;2000:36:1;;1988:2;1973:18;7605:93:0;1858:184:1;40395:427:0;;;;;;;;;;-1:-1:-1;40395:427:0;;;;;:::i;:::-;;:::i;10479:238::-;;;;;;;;;;-1:-1:-1;10479:238:0;;;;;:::i;:::-;;:::i;29165:70::-;;;;;;;;;;-1:-1:-1;29165:70:0;;;;-1:-1:-1;;;;;29165:70:0;;;;;;-1:-1:-1;;;;;2905:32:1;;;2887:51;;2875:2;2860:18;29165:70:0;2741:203:1;29464:46:0;;;;;;;;;;;;29508:2;29464:46;;29242:70;;;;;;;;;;-1:-1:-1;29242:70:0;;;;-1:-1:-1;;;;;29242:70:0;;;29417:40;;;;;;;;;;;;29455:2;29417:40;;39718:507;;;;;;;;;;;;;:::i;32864:126::-;;;;;;;;;;-1:-1:-1;32864:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;32954:28:0;32930:4;32954:28;;;:19;:28;;;;;;;;;32864:126;28592:24;;;;;;;;;;-1:-1:-1;28592:24:0;;;;-1:-1:-1;;;;;28592:24:0;;;38304:143;;;;;;;;;;-1:-1:-1;38304:143:0;;;;;:::i;:::-;;:::i;28650:31::-;;;;;;;;;;-1:-1:-1;28650:31:0;;;;-1:-1:-1;;;28650:31:0;;;;;;38455:218;;;;;;;;;;-1:-1:-1;38455:218:0;;;;;:::i;:::-;;:::i;32998:304::-;;;;;;;;;;-1:-1:-1;32998:304:0;;;;;:::i;:::-;;:::i;7934:127::-;;;;;;;;;;-1:-1:-1;7934:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;8035:18:0;8008:7;8035:18;;;;;;;;;;;;7934:127;19318:103;;;;;;;;;;;;;:::i;39457:253::-;;;;;;;;;;-1:-1:-1;39457:253:0;;;;;:::i;:::-;;:::i;29861:44::-;;;;;;;;;;-1:-1:-1;29861:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;18670:87;;;;;;;;;;-1:-1:-1;18743:6:0;;-1:-1:-1;;;;;18743:6:0;18670:87;;6862:104;;;;;;;;;;;;;:::i;28871:27::-;;;;;;;;;;;;;;;;38803:273;;;;;;;;;;-1:-1:-1;38803:273:0;;;;;:::i;:::-;;:::i;11220:436::-;;;;;;;;;;-1:-1:-1;11220:436:0;;;;;:::i;:::-;;:::i;29082:76::-;;;;;;;;;;-1:-1:-1;29082:76:0;;;;-1:-1:-1;;;;;29082:76:0;;;8267:193;;;;;;;;;;-1:-1:-1;8267:193:0;;;;;:::i;:::-;;:::i;40233:154::-;;;;;;;;;;-1:-1:-1;40233:154:0;;;;;:::i;:::-;;:::i;38681:114::-;;;;;;;;;;-1:-1:-1;38681:114:0;;;;;:::i;:::-;;:::i;29821:33::-;;;;;;;;;;;;;;;;30066:57;;;;;;;;;;-1:-1:-1;30066:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28778:45;;;;;;;;;;-1:-1:-1;28778:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;29000:75;;;;;;;;;;-1:-1:-1;29000:75:0;;;;-1:-1:-1;;;;;29000:75:0;;;28934:26;;;;;;;;;;;;;;;;8523:151;;;;;;;;;;-1:-1:-1;8523:151:0;;;;;:::i;:::-;;:::i;32663:193::-;;;;;;;;;;-1:-1:-1;32663:193:0;;;;;:::i;:::-;;:::i;28690:33::-;;;;;;;;;;;;;;;;29563:45;;;;;;;;;;;;29607:1;29563:45;;19576:201;;;;;;;;;;-1:-1:-1;19576:201:0;;;;;:::i;:::-;;:::i;29617:66::-;;;;;;;;;;-1:-1:-1;29617:66:0;;;;-1:-1:-1;;;;;29617:66:0;;;28905:22;;;;;;;;;;;;;;;;28830:32;;;;;;;;;;;;;;;;32511:144;18556:13;:11;:13::i;:::-;32571:11:::1;::::0;-1:-1:-1;;;32571:11:0;::::1;;;:20;32563:55;;;::::0;-1:-1:-1;;;32563:55:0;;4662:2:1;32563:55:0::1;::::0;::::1;4644:21:1::0;4701:2;4681:18;;;4674:30;-1:-1:-1;;;4720:18:1;;;4713:52;4782:18;;32563:55:0::1;;;;;;;;;32629:11;:18:::0;;-1:-1:-1;;;;32629:18:0::1;-1:-1:-1::0;;;32629:18:0::1;::::0;;32511:144::o;6643:100::-;6697:13;6730:5;6723:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6643:100;:::o;8994:201::-;9077:4;4357:10;9133:32;4357:10;9149:7;9158:6;9133:8;:32::i;:::-;9183:4;9176:11;;;8994:201;;;;;:::o;9775:295::-;9906:4;4357:10;9964:38;9980:4;4357:10;9995:6;9964:15;:38::i;:::-;10013:27;10023:4;10029:2;10033:6;10013:9;:27::i;:::-;-1:-1:-1;10058:4:0;;9775:295;-1:-1:-1;;;;9775:295:0:o;40395:427::-;18556:13;:11;:13::i;:::-;40497:9:::1;40531::::0;40593:13:::1;40599:7:::0;40531:9;40593:13:::1;:::i;:::-;40584:4;8008:7:::0;8035:18;;;;;;;;;;;40566:40:::1;40558:90;;;::::0;-1:-1:-1;;;40558:90:0;;5703:2:1;40558:90:0::1;::::0;::::1;5685:21:1::0;5742:2;5722:18;;;5715:30;5781:34;5761:18;;;5754:62;-1:-1:-1;;;5832:18:1;;;5825:35;5877:19;;40558:90:0::1;5501:401:1::0;40558:90:0::1;40682:13;40688:7:::0;40682:3;:13:::1;:::i;:::-;40659:18;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;40718:1:0::1;::::0;-1:-1:-1;;40709:106:0::1;40725:3;40721:1;:7;40709:106;;;40750:53;40774:4;40781:9;;40791:1;40781:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;40795:7;40750:15;:53::i;:::-;40730:3:::0;::::1;::::0;::::1;:::i;:::-;;;;40709:106;;;40486:336;;40395:427:::0;;;:::o;10479:238::-;10567:4;4357:10;10623:64;4357:10;10639:7;10676:10;10648:25;4357:10;10639:7;10648:9;:25::i;:::-;:38;;;;:::i;:::-;10623:8;:64::i;39718:507::-;21955:1;22553:7;;:19;22545:63;;;;-1:-1:-1;;;22545:63:0;;6644:2:1;22545:63:0;;;6626:21:1;6683:2;6663:18;;;6656:30;6722:33;6702:18;;;6695:61;6773:18;;22545:63:0;6442:355:1;22545:63:0;21955:1;22686:7;:18;39783:10:::1;39797:1;39774:20:::0;;;:8:::1;:20;::::0;;;;;39766:75:::1;;;::::0;-1:-1:-1;;;39766:75:0;;7004:2:1;39766:75:0::1;::::0;::::1;6986:21:1::0;7043:2;7023:18;;;7016:30;7082:34;7062:18;;;7055:62;-1:-1:-1;;;7133:18:1;;;7126:36;7179:19;;39766:75:0::1;6802:402:1::0;39766:75:0::1;39881:1;39860:18;;:22;39852:66;;;::::0;-1:-1:-1;;;39852:66:0;;7411:2:1;39852:66:0::1;::::0;::::1;7393:21:1::0;7450:2;7430:18;;;7423:30;7489:33;7469:18;;;7462:61;7540:18;;39852:66:0::1;7209:355:1::0;39852:66:0::1;39978:10;39931:14;39969:20:::0;;;:8:::1;:20;::::0;;;;;39948:18:::1;::::0;:41:::1;:85;;40015:18;;39948:85;;;40001:10;39992:20;::::0;;;:8:::1;:20;::::0;;;;;39948:85:::1;40053:10;40044:20;::::0;;;:8:::1;:20;::::0;;;;:30;;39931:102;;-1:-1:-1;39931:102:0;;40044:20;;;:30:::1;::::0;39931:102;;40044:30:::1;:::i;:::-;::::0;;;-1:-1:-1;40085:44:0::1;::::0;-1:-1:-1;40103:4:0::1;40110:10;40122:6:::0;40085:9:::1;:44::i;:::-;40164:6;40142:18;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40188:29:0::1;::::0;160:25:1;;;40198:10:0::1;::::0;40188:29:::1;::::0;148:2:1;133:18;40188:29:0::1;;;;;;;-1:-1:-1::0;21911:1:0;22865:7;:22;39718:507::o;38304:143::-;18556:13;:11;:13::i;:::-;38422:16:::1;7688:2:::0;38422::::1;:16;:::i;:::-;38409:30;::::0;:9;:30:::1;:::i;:::-;38382:24;:57:::0;-1:-1:-1;38304:143:0:o;38455:218::-;38562:15;;-1:-1:-1;;;;;38562:15:0;38548:10;:29;38540:77;;;;-1:-1:-1;;;38540:77:0;;9154:2:1;38540:77:0;;;9136:21:1;9193:2;9173:18;;;9166:30;9232:34;9212:18;;;9205:62;-1:-1:-1;;;9283:18:1;;;9276:33;9326:19;;38540:77:0;8952:399:1;38540:77:0;38628:15;:37;;-1:-1:-1;;;;;;38628:37:0;-1:-1:-1;;;;;38628:37:0;;;;;;;;;;38455:218::o;32998:304::-;18556:13;:11;:13::i;:::-;33117:6:::1;33095:18;:28;;33087:74;;;::::0;-1:-1:-1;;;33087:74:0;;9558:2:1;33087:74:0::1;::::0;::::1;9540:21:1::0;9597:2;9577:18;;;9570:30;9636:34;9616:18;;;9609:62;-1:-1:-1;;;9687:18:1;;;9680:31;9728:19;;33087:74:0::1;9356:397:1::0;33087:74:0::1;33186:17;:38:::0;;;33250:44:::1;::::0;160:25:1;;;33250:44:0::1;::::0;148:2:1;133:18;33250:44:0::1;;;;;;;32998:304:::0;:::o;19318:103::-;18556:13;:11;:13::i;:::-;19383:30:::1;19410:1;19383:18;:30::i;:::-;19318:103::o:0;39457:253::-;18556:13;:11;:13::i;:::-;39554:9:::1;39588::::0;39617:86:::1;39633:3;39629:1;:7;39617:86;;;39684:7;39658:8;:22;39667:9;;39677:1;39667:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39658:22:0::1;-1:-1:-1::0;;;;;39658:22:0::1;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;39638:3:0;;-1:-1:-1;39638:3:0::1;::::0;::::1;:::i;:::-;;;;39617:86;;6862:104:::0;6918:13;6951:7;6944:14;;;;;:::i;38803:273::-;18556:13;:11;:13::i;:::-;38911:9:::1;::::0;-1:-1:-1;;;;;38911:9:0;;::::1;38903:17:::0;;::::1;::::0;38894:120:::1;;;::::0;-1:-1:-1;;;38894:120:0;;9960:2:1;38894:120:0::1;::::0;::::1;9942:21:1::0;9999:2;9979:18;;;9972:30;10038:34;10018:18;;;10011:62;10109:34;10089:18;;;10082:62;10181:27;10160:19;;;10153:56;10226:19;;38894:120:0::1;9758:493:1::0;38894:120:0::1;39027:41;39056:4;39062:5;39027:28;:41::i;:::-;38803:273:::0;;:::o;11220:436::-;11313:4;4357:10;11313:4;11396:25;4357:10;11413:7;11396:9;:25::i;:::-;11369:52;;11460:15;11440:16;:35;;11432:85;;;;-1:-1:-1;;;11432:85:0;;10458:2:1;11432:85:0;;;10440:21:1;10497:2;10477:18;;;10470:30;10536:34;10516:18;;;10509:62;-1:-1:-1;;;10587:18:1;;;10580:35;10632:19;;11432:85:0;10256:401:1;11432:85:0;11553:60;11562:5;11569:7;11597:15;11578:16;:34;11553:8;:60::i;8267:193::-;8346:4;4357:10;8402:28;4357:10;8419:2;8423:6;8402:9;:28::i;40233:154::-;40292:45;40302:10;40322:4;40329:7;40292:9;:45::i;:::-;40372:7;40350:18;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;;40233:154:0:o;38681:114::-;18556:13;:11;:13::i;:::-;38759:18:::1;:28:::0;38681:114::o;8523:151::-;-1:-1:-1;;;;;8639:18:0;;;8612:7;8639:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8523:151::o;32663:193::-;18556:13;:11;:13::i;:::-;-1:-1:-1;;;;;32815:25:0;;;::::1;;::::0;;;:19:::1;:25;::::0;;;;:33;;-1:-1:-1;;32815:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32663:193::o;19576:201::-;18556:13;:11;:13::i;:::-;-1:-1:-1;;;;;19665:22:0;::::1;19657:73;;;::::0;-1:-1:-1;;;19657:73:0;;10864:2:1;19657:73:0::1;::::0;::::1;10846:21:1::0;10903:2;10883:18;;;10876:30;10942:34;10922:18;;;10915:62;-1:-1:-1;;;10993:18:1;;;10986:36;11039:19;;19657:73:0::1;10662:402:1::0;19657:73:0::1;19741:28;19760:8;19741:18;:28::i;:::-;19576:201:::0;:::o;16569:125::-;;;;:::o;18835:132::-;18743:6;;-1:-1:-1;;;;;18743:6:0;4357:10;18899:23;18891:68;;;;-1:-1:-1;;;18891:68:0;;11271:2:1;18891:68:0;;;11253:21:1;;;11290:18;;;11283:30;11349:34;11329:18;;;11322:62;11401:18;;18891:68:0;11069:356:1;14845:380:0;-1:-1:-1;;;;;14981:19:0;;14973:68;;;;-1:-1:-1;;;14973:68:0;;11632:2:1;14973:68:0;;;11614:21:1;11671:2;11651:18;;;11644:30;11710:34;11690:18;;;11683:62;-1:-1:-1;;;11761:18:1;;;11754:34;11805:19;;14973:68:0;11430:400:1;14973:68:0;-1:-1:-1;;;;;15060:21:0;;15052:68;;;;-1:-1:-1;;;15052:68:0;;12037:2:1;15052:68:0;;;12019:21:1;12076:2;12056:18;;;12049:30;12115:34;12095:18;;;12088:62;-1:-1:-1;;;12166:18:1;;;12159:32;12208:19;;15052:68:0;11835:398:1;15052:68:0;-1:-1:-1;;;;;15133:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15185:32;;160:25:1;;;15185:32:0;;133:18:1;15185:32:0;;;;;;;14845:380;;;:::o;15516:453::-;15651:24;15678:25;15688:5;15695:7;15678:9;:25::i;:::-;15651:52;;-1:-1:-1;;15718:16:0;:37;15714:248;;15800:6;15780:16;:26;;15772:68;;;;-1:-1:-1;;;15772:68:0;;12440:2:1;15772:68:0;;;12422:21:1;12479:2;12459:18;;;12452:30;12518:31;12498:18;;;12491:59;12567:18;;15772:68:0;12238:353:1;15772:68:0;15884:51;15893:5;15900:7;15928:6;15909:16;:25;15884:8;:51::i;:::-;15640:329;15516:453;;;:::o;33841:2084::-;-1:-1:-1;;;;;33939:18:0;;33931:68;;;;-1:-1:-1;;;33931:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34018:16:0;;34010:64;;;;-1:-1:-1;;;34010:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34105:25:0;;34087:15;34105:25;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;34134:23:0;;;;;;:19;:23;;;;;;;;34105:52;34176:11;;34087:70;;-1:-1:-1;;;;34176:11:0;;;;;:25;;;34191:10;34176:25;34168:58;;;;-1:-1:-1;;;34168:58:0;;13608:2:1;34168:58:0;;;13590:21:1;13647:2;13627:18;;;13620:30;-1:-1:-1;;;13666:18:1;;;13659:50;13726:18;;34168:58:0;13406:344:1;34168:58:0;34243:6;34253:1;34243:11;34239:93;;34271:28;34287:4;34293:2;34297:1;34271:15;:28::i;34239:93::-;34363:8;;-1:-1:-1;;;34363:8:0;;;;34362:9;:55;;;;-1:-1:-1;;;;;;34388:29:0;;;;;;:25;:29;;;;;;;;34362:55;:167;;;;-1:-1:-1;34517:11:0;;-1:-1:-1;;;;;34501:28:0;;;34517:11;;34501:28;;34362:167;:274;;;;-1:-1:-1;;;;;;34611:25:0;;;;;;:19;:25;;;;;;;;34610:26;34362:274;34344:474;;;34719:24;;34709:6;:34;;34701:105;;;;-1:-1:-1;;;34701:105:0;;13957:2:1;34701:105:0;;;13939:21:1;13996:2;13976:18;;;13969:30;14035:34;14015:18;;;14008:62;14106:28;14086:18;;;14079:56;14152:19;;34701:105:0;13755:422:1;34701:105:0;34888:18;;34879:4;34830:28;8035:18;;;;;;;;;;;34830:28;;34861:45;;;:::i;:::-;34958:18;;34830:76;;-1:-1:-1;34934:42:0;;;;;;;35007:33;;-1:-1:-1;35032:8:0;;-1:-1:-1;;;35032:8:0;;;;35031:9;35007:33;:82;;;;-1:-1:-1;;;;;;35058:31:0;;;;;;:25;:31;;;;;;;;35057:32;35007:82;:114;;;;-1:-1:-1;18743:6:0;;-1:-1:-1;;;;;35106:15:0;;;18743:6;;35106:15;;35007:114;:144;;;;-1:-1:-1;18743:6:0;;-1:-1:-1;;;;;35138:13:0;;;18743:6;;35138:13;;35007:144;34989:684;;;35178:8;:15;;-1:-1:-1;;;;35178:15:0;-1:-1:-1;;;35178:15:0;;;35264:9;;35254:7;;35178:15;;35264:9;35231:30;;:20;:30;:::i;:::-;:42;;;;:::i;:::-;35319:4;;35210:63;;-1:-1:-1;35288:48:0;;35312:4;;-1:-1:-1;;;;;35319:4:0;35210:63;35288:15;:48::i;:::-;35353:22;35415:9;;35401:11;;35378:20;:34;;;;:::i;:::-;:46;;;;:::i;:::-;35470:15;;35353:71;;-1:-1:-1;35439:63:0;;35463:4;;-1:-1:-1;;;;;35470:15:0;35353:71;35439:15;:63::i;:::-;35519:18;35578:9;;35563:12;;35540:20;:35;;;;:::i;:::-;:47;;;;:::i;:::-;35519:68;;35602:26;35617:10;35602:14;:26::i;:::-;-1:-1:-1;;35645:8:0;:16;;-1:-1:-1;;;;35645:16:0;;;-1:-1:-1;34989:684:0;35690:10;35685:179;;35717:12;35753:3;35741:9;;35732:6;:18;;;;:::i;:::-;:24;;;;:::i;:::-;35717:39;-1:-1:-1;35780:13:0;35717:39;35780:6;:13;:::i;:::-;35771:22;;35810:42;35826:4;35840;35847;35810:15;:42::i;:::-;35702:162;35685:179;35884:33;35900:4;35906:2;35910:6;35884:15;:33::i;:::-;33920:2005;;;33841:2084;;;:::o;12126:671::-;-1:-1:-1;;;;;12257:18:0;;12249:68;;;;-1:-1:-1;;;12249:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12336:16:0;;12328:64;;;;-1:-1:-1;;;12328:64:0;;;;;;;:::i;:::-;12405:38;12426:4;12432:2;12436:6;12405:20;:38::i;:::-;-1:-1:-1;;;;;12478:15:0;;12456:19;12478:15;;;;;;;;;;;12512:21;;;;12504:72;;;;-1:-1:-1;;;12504:72:0;;14606:2:1;12504:72:0;;;14588:21:1;14645:2;14625:18;;;14618:30;14684:34;14664:18;;;14657:62;-1:-1:-1;;;14735:18:1;;;14728:36;14781:19;;12504:72:0;14404:402:1;12504:72:0;-1:-1:-1;;;;;12612:15:0;;;:9;:15;;;;;;;;;;;12630:20;;;12612:38;;12672:13;;;;;;;;:23;;12644:6;;12612:9;12672:23;;12644:6;;12672:23;:::i;:::-;;;;;;;;12728:2;-1:-1:-1;;;;;12713:26:0;12722:4;-1:-1:-1;;;;;12713:26:0;;12732:6;12713:26;;;;160:25:1;;148:2;133:18;;14:177;12713:26:0;;;;;;;;12752:37;12772:4;12778:2;12782:6;12752:19;:37::i;19937:191::-;20030:6;;;-1:-1:-1;;;;;20047:17:0;;;-1:-1:-1;;;;;;20047:17:0;;;;;;;20080:40;;20030:6;;;20047:17;20030:6;;20080:40;;20011:16;;20080:40;20000:128;19937:191;:::o;39084:365::-;-1:-1:-1;;;;;39189:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;39167:166;;;;-1:-1:-1;;;39167:166:0;;15013:2:1;39167:166:0;;;14995:21:1;15052:2;15032:18;;;15025:30;15091:34;15071:18;;;15064:62;15162:34;15142:18;;;15135:62;-1:-1:-1;;;15213:19:1;;;15206:43;15266:19;;39167:166:0;14811:480:1;39167:166:0;-1:-1:-1;;;;;39344:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;39344:39:0;;;;;;;;;;39401:40;;39344:39;;:31;39401:40;;;39084:365;;:::o;36338:914::-;36448:12;36463:10;36472:1;36463:6;:10;:::i;:::-;36448:25;-1:-1:-1;36484:17:0;36504:13;36448:25;36504:6;:13;:::i;:::-;36484:33;-1:-1:-1;36820:21:0;36886:22;36903:4;36886:16;:22::i;:::-;37039:18;37060:38;37084:14;37060:21;:38;:::i;:::-;37039:59;;37148:35;37161:9;37172:10;37148:12;:35::i;:::-;37201:43;;;15498:25:1;;;15554:2;15539:18;;15532:34;;;15582:18;;;15575:34;;;37201:43:0;;15486:2:1;15471:18;37201:43:0;;;;;;;36386:866;;;;36338:914;:::o;33310:523::-;-1:-1:-1;;;;;33438:25:0;;;;;;:19;:25;;;;;;;;33434:162;;33504:17;;-1:-1:-1;;;;;33486:15:0;;;;;;:9;:15;;;;;;33525;;33486:35;;;:::i;:::-;:54;;33478:118;;;;-1:-1:-1;;;33478:118:0;;15822:2:1;33478:118:0;;;15804:21:1;15861:2;15841:18;;;15834:30;15900:34;15880:18;;;15873:62;-1:-1:-1;;;15951:18:1;;;15944:49;16010:19;;33478:118:0;15620:415:1;33478:118:0;-1:-1:-1;;;;;33611:23:0;;;;;;:19;:23;;;;;;;;33607:161;;33673:17;;-1:-1:-1;;;;;33657:13:0;;;;;;:9;:13;;;;;;33694:15;;33657:33;;;:::i;:::-;:52;;33649:119;;;;-1:-1:-1;;;33649:119:0;;16242:2:1;33649:119:0;;;16224:21:1;16281:2;16261:18;;;16254:30;16320:34;16300:18;;;16293:62;-1:-1:-1;;;16371:18:1;;;16364:52;16433:19;;33649:119:0;16040:418:1;35933:397:0;-1:-1:-1;;;;;36060:31:0;;;;;;:25;:31;;;;;;;;:59;;;;-1:-1:-1;;;;;;36096:23:0;;;;;;:19;:23;;;;;;;;36095:24;36060:59;36056:210;;;-1:-1:-1;;;;;;36121:13:0;;;;;:9;:13;;;;;36137:15;36121:31;;-1:-1:-1;16569:125:0:o;36056:210::-;-1:-1:-1;;;;;36172:29:0;;;;;;:25;:29;;;;;;;;:59;;;;-1:-1:-1;;;;;;36206:25:0;;;;;;:19;:25;;;;;;;;36205:26;36172:59;36168:98;;;-1:-1:-1;;;;;;;36233:15:0;;;;;:9;:15;;;;;36251;36233:33;;16569:125::o;37310:461::-;37400:16;;;37414:1;37400:16;;;;;;;;37376:21;;37400:16;;;;;;;;;;-1:-1:-1;37400:16:0;37376:40;;37445:4;37427;37432:1;37427:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37427:23:0;;;:7;;;;;;;;;;:23;;;;37471:11;;:18;;;-1:-1:-1;;;37471:18:0;;;;:11;;;;;:16;;:18;;;;;37427:7;;37471:18;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37461:4;37466:1;37461:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37461:28:0;;;:7;;;;;;;;;:28;37532:11;;37500:58;;37517:4;;37532:11;37546;37500:8;:58::i;:::-;37571:11;;:192;;-1:-1:-1;;;37571:192:0;;-1:-1:-1;;;;;37571:11:0;;;;:62;;:192;;37648:11;;37571;;37690:4;;37717;;37737:15;;37571:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37779:513;37959:11;;37927:58;;37944:4;;-1:-1:-1;;;;;37959:11:0;37973;37927:8;:58::i;:::-;38028:11;;:256;;-1:-1:-1;;;38028:256:0;;38096:4;38028:256;;;18177:34:1;18227:18;;;18220:34;;;38028:11:0;18270:18:1;;;18263:34;;;18313:18;;;18306:34;38236:6:0;18356:19:1;;;18349:44;38258:15:0;18409:19:1;;;18402:35;-1:-1:-1;;;;;38028:11:0;;;;:27;;38063:9;;18111:19:1;;38028:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:456::-;1474:6;1482;1490;1543:2;1531:9;1522:7;1518:23;1514:32;1511:52;;;1559:1;1556;1549:12;1511:52;1598:9;1585:23;1617:31;1642:5;1617:31;:::i;:::-;1667:5;-1:-1:-1;1724:2:1;1709:18;;1696:32;1737:33;1696:32;1737:33;:::i;:::-;1397:456;;1789:7;;-1:-1:-1;;;1843:2:1;1828:18;;;;1815:32;;1397:456::o;2047:689::-;2142:6;2150;2158;2211:2;2199:9;2190:7;2186:23;2182:32;2179:52;;;2227:1;2224;2217:12;2179:52;2267:9;2254:23;2296:18;2337:2;2329:6;2326:14;2323:34;;;2353:1;2350;2343:12;2323:34;2391:6;2380:9;2376:22;2366:32;;2436:7;2429:4;2425:2;2421:13;2417:27;2407:55;;2458:1;2455;2448:12;2407:55;2498:2;2485:16;2524:2;2516:6;2513:14;2510:34;;;2540:1;2537;2530:12;2510:34;2595:7;2588:4;2578:6;2575:1;2571:14;2567:2;2563:23;2559:34;2556:47;2553:67;;;2616:1;2613;2606:12;2553:67;2647:4;2639:13;;;;2671:6;;-1:-1:-1;2709:20:1;;;;2696:34;;2047:689;-1:-1:-1;;;;2047:689:1:o;2949:247::-;3008:6;3061:2;3049:9;3040:7;3036:23;3032:32;3029:52;;;3077:1;3074;3067:12;3029:52;3116:9;3103:23;3135:31;3160:5;3135:31;:::i;:::-;3185:5;2949:247;-1:-1:-1;;;2949:247:1:o;3201:180::-;3260:6;3313:2;3301:9;3292:7;3288:23;3284:32;3281:52;;;3329:1;3326;3319:12;3281:52;-1:-1:-1;3352:23:1;;3201:180;-1:-1:-1;3201:180:1:o;3646:416::-;3711:6;3719;3772:2;3760:9;3751:7;3747:23;3743:32;3740:52;;;3788:1;3785;3778:12;3740:52;3827:9;3814:23;3846:31;3871:5;3846:31;:::i;:::-;3896:5;-1:-1:-1;3953:2:1;3938:18;;3925:32;3995:15;;3988:23;3976:36;;3966:64;;4026:1;4023;4016:12;3966:64;4049:7;4039:17;;;3646:416;;;;;:::o;4067:388::-;4135:6;4143;4196:2;4184:9;4175:7;4171:23;4167:32;4164:52;;;4212:1;4209;4202:12;4164:52;4251:9;4238:23;4270:31;4295:5;4270:31;:::i;:::-;4320:5;-1:-1:-1;4377:2:1;4362:18;;4349:32;4390:33;4349:32;4390:33;:::i;4811:380::-;4890:1;4886:12;;;;4933;;;4954:61;;5008:4;5000:6;4996:17;4986:27;;4954:61;5061:2;5053:6;5050:14;5030:18;5027:38;5024:161;;5107:10;5102:3;5098:20;5095:1;5088:31;5142:4;5139:1;5132:15;5170:4;5167:1;5160:15;5024:161;;4811:380;;;:::o;5196:127::-;5257:10;5252:3;5248:20;5245:1;5238:31;5288:4;5285:1;5278:15;5312:4;5309:1;5302:15;5328:168;5401:9;;;5432;;5449:15;;;5443:22;;5429:37;5419:71;;5470:18;;:::i;5907:128::-;5974:9;;;5995:11;;;5992:37;;;6009:18;;:::i;6040:127::-;6101:10;6096:3;6092:20;6089:1;6082:31;6132:4;6129:1;6122:15;6156:4;6153:1;6146:15;6172:135;6211:3;6232:17;;;6229:43;;6252:18;;:::i;:::-;-1:-1:-1;6299:1:1;6288:13;;6172:135::o;6312:125::-;6377:9;;;6398:10;;;6395:36;;;6411:18;;:::i;7569:422::-;7658:1;7701:5;7658:1;7715:270;7736:7;7726:8;7723:21;7715:270;;;7795:4;7791:1;7787:6;7783:17;7777:4;7774:27;7771:53;;;7804:18;;:::i;:::-;7854:7;7844:8;7840:22;7837:55;;;7874:16;;;;7837:55;7953:22;;;;7913:15;;;;7715:270;;;7719:3;7569:422;;;;;:::o;7996:806::-;8045:5;8075:8;8065:80;;-1:-1:-1;8116:1:1;8130:5;;8065:80;8164:4;8154:76;;-1:-1:-1;8201:1:1;8215:5;;8154:76;8246:4;8264:1;8259:59;;;;8332:1;8327:130;;;;8239:218;;8259:59;8289:1;8280:10;;8303:5;;;8327:130;8364:3;8354:8;8351:17;8348:43;;;8371:18;;:::i;:::-;-1:-1:-1;;8427:1:1;8413:16;;8442:5;;8239:218;;8541:2;8531:8;8528:16;8522:3;8516:4;8513:13;8509:36;8503:2;8493:8;8490:16;8485:2;8479:4;8476:12;8472:35;8469:77;8466:159;;;-1:-1:-1;8578:19:1;;;8610:5;;8466:159;8657:34;8682:8;8676:4;8657:34;:::i;:::-;8727:6;8723:1;8719:6;8715:19;8706:7;8703:32;8700:58;;;8738:18;;:::i;:::-;8776:20;;7996:806;-1:-1:-1;;;7996:806:1:o;8807:140::-;8865:5;8894:47;8935:4;8925:8;8921:19;8915:4;8894:47;:::i;12596:401::-;12798:2;12780:21;;;12837:2;12817:18;;;12810:30;12876:34;12871:2;12856:18;;12849:62;-1:-1:-1;;;12942:2:1;12927:18;;12920:35;12987:3;12972:19;;12596:401::o;13002:399::-;13204:2;13186:21;;;13243:2;13223:18;;;13216:30;13282:34;13277:2;13262:18;;13255:62;-1:-1:-1;;;13348:2:1;13333:18;;13326:33;13391:3;13376:19;;13002:399::o;14182:217::-;14222:1;14248;14238:132;;14292:10;14287:3;14283:20;14280:1;14273:31;14327:4;14324:1;14317:15;14355:4;14352:1;14345:15;14238:132;-1:-1:-1;14384:9:1;;14182:217::o;16595:251::-;16665:6;16718:2;16706:9;16697:7;16693:23;16689:32;16686:52;;;16734:1;16731;16724:12;16686:52;16766:9;16760:16;16785:31;16810:5;16785:31;:::i;16851:980::-;17113:4;17161:3;17150:9;17146:19;17192:6;17181:9;17174:25;17218:2;17256:6;17251:2;17240:9;17236:18;17229:34;17299:3;17294:2;17283:9;17279:18;17272:31;17323:6;17358;17352:13;17389:6;17381;17374:22;17427:3;17416:9;17412:19;17405:26;;17466:2;17458:6;17454:15;17440:29;;17487:1;17497:195;17511:6;17508:1;17505:13;17497:195;;;17576:13;;-1:-1:-1;;;;;17572:39:1;17560:52;;17667:15;;;;17632:12;;;;17608:1;17526:9;17497:195;;;-1:-1:-1;;;;;;;17748:32:1;;;;17743:2;17728:18;;17721:60;-1:-1:-1;;;17812:3:1;17797:19;17790:35;17709:3;16851:980;-1:-1:-1;;;16851:980:1:o;18448:306::-;18536:6;18544;18552;18605:2;18593:9;18584:7;18580:23;18576:32;18573:52;;;18621:1;18618;18611:12;18573:52;18650:9;18644:16;18634:26;;18700:2;18689:9;18685:18;18679:25;18669:35;;18744:2;18733:9;18729:18;18723:25;18713:35;;18448:306;;;;;:::o

Swarm Source

ipfs://2748a6bfecf5a1a40a9fa61c05597f487d82dd0beeb254402c625ba652cde36f
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.