ETH Price: $2,270.83 (+2.43%)
Gas: 1.81 Gwei

Token

Papi Token (PAPI)
 

Overview

Max Total Supply

183,000 PAPI

Holders

54

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
10,000 PAPI

Value
$0.00
0x5d4535bf9faf3a27b0352bbe1649a24982d57cb6
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:
PapiToken

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-16
*/

/**
 *Submitted for verification at Etherscan.io on 2021-10-16
*/

// SPDX-License-Identifier: UNLICENSED

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

/**
 * @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() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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 {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IPUNK {
    function punkIndexToAddress(uint256 punkID) external view returns (address);
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @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 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);
}

/**
 * @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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][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)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, 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 Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

/// @title Papi Token for NNW holders!
/// @author Will Papper <https://twitter.com/WillPapper>
/// @notice This contract mints Papi Token for NNW holders and provides
/// administrative functions to the NNW DAO. It allows:
/// * NNW holders to claim Papi Token
/// * A DAO to set seasons for new opportunities to claim Papi Token
/// * A DAO to mint Papi Token for use within the NNW ecosystem
/// @custom:unaudited This contract has not been audited. Use at your own risk.
contract PapiToken is Context, Ownable, ERC20 {
    // NNW contract is available at https://etherscan.io/address/0xEDBaca315748B5a539cf7FB97447A62680b36575
    address public NNWContractAddress =
        0x602e3a0887cB381366653DF707d38DC3091870Db;
    IERC721Enumerable public NNWContract;

    address public cdbcontractAddress =
        0x42069ABFE407C60cf4ae4112bEDEaD391dBa1cdB;
    IERC721Enumerable public cdbcontract;

    address public toadzContractAddress =
        0x1CB1A5e65610AEFF2551A50f76a87a7d3fB649C6;
    IERC721Enumerable public toadContract;

    address public punksContractAddress =
        0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB;
    IPUNK public punksContract;

    function daoSetcdbContractAddress(address cdbContractAddress_)
        external
        onlyOwner
    {
        cdbcontractAddress = cdbContractAddress_;
        cdbcontract = IERC721Enumerable(cdbcontractAddress);
    }

    function daoSetToadzContractAddress(address toadzContractAddress_)
        external
        onlyOwner
    {
        toadzContractAddress = toadzContractAddress_;
        toadContract = IERC721Enumerable(toadzContractAddress);
    }

    function daoSetPunksContractAddress(address punksContractAddress_)
        external
        onlyOwner
    {
        punksContractAddress = punksContractAddress_;
        punksContract = IPUNK(punksContractAddress);
    }

    // Give out 10,000 Papi Token for every NNW Bag that a user holds
    uint256 public papiTokenPerTokenId = 1000 * (10**decimals());

    // tokenIdStart of 1 is based on the following lines in the NNW contract:
    /** 
    function claim(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 7778, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }
    */
    uint256 public cdbtokenIdStart = 160;
    uint256 public toadtokenIdStart = 1;
    uint256 public NNWtokenIdStart = 1;
    uint256 public punkstokenIdStart = 0;

    // tokenIdEnd of 8000 is based on the following lines in the NNW contract:
    /**
        function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 7777 && tokenId < 8001, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }
    */
    uint256 public cdbtokenIdEnd = 5359;
    uint256 public toadtokenIdEnd = 6969;
    uint256 public NNWtokenIdEnd = 8000;
    uint256 public punkstokenIdEnd = 9999;

    // Seasons are used to allow users to claim tokens regularly. Seasons are
    // decided by the DAO.
    uint256 public season = 0;

    // Track claimed tokens within a season
    // IMPORTANT: The format of the mapping is:
    // claimedForSeason[season][tokenId][claimed]
    mapping(uint256 => mapping(uint256 => bool))
        public seasonNNWClaimedByTokenId;
    mapping(uint256 => mapping(uint256 => bool))
        public seasonCdbClaimedByTokenId;
    mapping(uint256 => mapping(uint256 => bool))
        public seasonToadClaimedByTokenId;

    mapping(uint256 => mapping(uint256 => bool))
        public seasonOGpunksClaimedByTokenId;

    constructor() Ownable() ERC20("Papi Token", "PAPI") {
        // Transfer ownership to the NNW DAO
        // Ownable by OpenZeppelin automatically sets owner to msg.sender, but
        // we're going to be using a separate wallet for deployment
        transferOwnership(0xEA2b1D5d02A676f172093D28Cc7A0Cb088E04f75);
        NNWContract = IERC721Enumerable(NNWContractAddress);
        cdbcontract = IERC721Enumerable(cdbcontractAddress);
        toadContract = IERC721Enumerable(toadzContractAddress);
        punksContract = IPUNK(punksContractAddress);
    }

    /// @notice Claim Papi Token for a given NNW ID
    /// @param tokenId The tokenId of the NNW NFT
    function claimById(uint256 tokenId, uint256 contractID) external {
        // Follow the Checks-Effects-Interactions pattern to prevent reentrancy
        // attacks

        // Checks

        // Check that the msgSender owns the token that is being claimed
        require(contractID == 1 || contractID == 2 || contractID == 3);

        if (contractID == 1) {
            require(
                _msgSender() == NNWContract.ownerOf(tokenId),
                "MUST_OWN_TOKEN_ID"
            );
        }

        if (contractID == 2) {
            require(
                _msgSender() == cdbcontract.ownerOf(tokenId),
                "MUST_OWN_TOKEN_ID"
            );
        }

        if (contractID == 3) {
            require(
                _msgSender() == toadContract.ownerOf(tokenId),
                "MUST_OWN_TOKEN_ID"
            );
        }

        // Further Checks, Effects, and Interactions are contained within the
        // _claim() function
        _claim(tokenId, _msgSender(), contractID);
    }

    /// @notice Claim Papi Token for all tokens owned by the sender
    /// @notice This function will run out of gas if you have too much NNW! If
    /// this is a concern, you should use claimRangeForOwner and claim Papi
    /// Token in batches.
    function claimAllForOwner(uint256 contractID) external {
        require(contractID == 1 || contractID == 2 || contractID == 3);

        // Checks
        if (contractID == 1) {
            uint256 tokenBalanceOwner = NNWContract.balanceOf(_msgSender());
            require(tokenBalanceOwner > 0, "NO_TOKENS_OWNED");
            for (uint256 i = 0; i < tokenBalanceOwner; i++) {
                // Further Checks, Effects, and Interactions are contained within
                // the _claim() function
                _claim(
                    NNWContract.tokenOfOwnerByIndex(_msgSender(), i),
                    _msgSender(),
                    contractID
                );
            }
        }

        if (contractID == 2) {
            uint256 tokenBalanceOwner = cdbcontract.balanceOf(_msgSender());
            require(tokenBalanceOwner > 0, "NO_TOKENS_OWNED");
            for (uint256 i = 0; i < tokenBalanceOwner; i++) {
                // Further Checks, Effects, and Interactions are contained within
                // the _claim() function
                _claim(
                    cdbcontract.tokenOfOwnerByIndex(_msgSender(), i),
                    _msgSender(),
                    contractID
                );
            }
        }

        if (contractID == 3) {
            uint256 tokenBalanceOwner = toadContract.balanceOf(_msgSender());
            require(tokenBalanceOwner > 0, "NO_TOKENS_OWNED");
            for (uint256 i = 0; i < tokenBalanceOwner; i++) {
                // Further Checks, Effects, and Interactions are contained within
                // the _claim() function
                _claim(
                    toadContract.tokenOfOwnerByIndex(_msgSender(), i),
                    _msgSender(),
                    contractID
                );
            }
        }

        // i < tokenBalanceOwner because tokenBalanceOwner is 1-indexed
    }

    /// @notice Claim Papi Token for all tokens owned by the sender within a
    /// given range
    /// @notice This function is useful if you own too much NNW to claim all at
    /// once or if you want to leave some NNW unclaimed. If you leave NNW
    /// unclaimed, however, you cannot claim it once the next season starts.
    function claimRangeForOwner(
        uint256 ownerIndexStart,
        uint256 ownerIndexEnd,
        uint256 contractID
    ) external {
        require(contractID == 1 || contractID == 2 || contractID == 3);

        if (contractID == 1) {
            uint256 tokenBalanceOwner = NNWContract.balanceOf(_msgSender());
            require(tokenBalanceOwner > 0, "NO_TOKENS_OWNED");
            require(
                ownerIndexStart >= 0 && ownerIndexEnd < tokenBalanceOwner,
                "INDEX_OUT_OF_RANGE"
            );
            for (uint256 i = ownerIndexStart; i <= ownerIndexEnd; i++) {
                // Further Checks, Effects, and Interactions are contained within
                // the _claim() function
                _claim(
                    NNWContract.tokenOfOwnerByIndex(_msgSender(), i),
                    _msgSender(),
                    contractID
                );
            }
        }

        if (contractID == 2) {
            uint256 tokenBalanceOwner = cdbcontract.balanceOf(_msgSender());
            require(tokenBalanceOwner > 0, "NO_TOKENS_OWNED");
            require(
                ownerIndexStart >= 0 && ownerIndexEnd < tokenBalanceOwner,
                "INDEX_OUT_OF_RANGE"
            );
            for (uint256 i = ownerIndexStart; i <= ownerIndexEnd; i++) {
                // Further Checks, Effects, and Interactions are contained within
                // the _claim() function
                _claim(
                    cdbcontract.tokenOfOwnerByIndex(_msgSender(), i),
                    _msgSender(),
                    contractID
                );
            }
        }

        if (contractID == 3) {
            uint256 tokenBalanceOwner = toadContract.balanceOf(_msgSender());
            require(tokenBalanceOwner > 0, "NO_TOKENS_OWNED");
            require(
                ownerIndexStart >= 0 && ownerIndexEnd < tokenBalanceOwner,
                "INDEX_OUT_OF_RANGE"
            );
            for (uint256 i = ownerIndexStart; i <= ownerIndexEnd; i++) {
                // Further Checks, Effects, and Interactions are contained within
                // the _claim() function
                _claim(
                    toadContract.tokenOfOwnerByIndex(_msgSender(), i),
                    _msgSender(),
                    contractID
                );
            }
        }
    }

    // Claim Punks

    function claimFromPunkID(uint256 tokenId) external {
        require(
            _msgSender() == punksContract.punkIndexToAddress(tokenId),
            "MUST_OWN_TOKEN_ID"
        );
        _claim(tokenId, _msgSender(), 4);
    }

    function claimFromMultiplePunkIDs(uint256[] memory tokenId) external {
        for (uint256 i = 0; i < tokenId.length; i++) {
            require(
                _msgSender() == punksContract.punkIndexToAddress(tokenId[i]),
                "MUST_OWN_TOKEN_ID"
            );
            _claim(tokenId[i], _msgSender(), 4);
        }
    }

    /// @dev Internal function to mint NNW upon claiming
    function _claim(
        uint256 tokenId,
        address tokenOwner,
        uint256 contractID
    ) internal {
        // Checks
        // Check that the token ID is in range
        // We use >= and <= to here because all of the token IDs are 0-indexed
        if (contractID == 1) {
            require(
                tokenId >= NNWtokenIdStart && tokenId <= NNWtokenIdEnd,
                "TOKEN_ID_OUT_OF_RANGE"
            );
            require(
                !seasonNNWClaimedByTokenId[season][tokenId],
                "GOLD_CLAIMED_FOR_TOKEN_ID"
            );
            seasonNNWClaimedByTokenId[season][tokenId] = true;
            _mint(tokenOwner, papiTokenPerTokenId);
        }

        if (contractID == 2) {
            require(
                tokenId >= cdbtokenIdStart && tokenId <= cdbtokenIdEnd,
                "TOKEN_ID_OUT_OF_RANGE"
            );
            require(
                !seasonCdbClaimedByTokenId[season][tokenId],
                "GOLD_CLAIMED_FOR_TOKEN_ID"
            );
            seasonCdbClaimedByTokenId[season][tokenId] = true;
            _mint(tokenOwner, papiTokenPerTokenId);
        }

        if (contractID == 3) {
            require(
                tokenId >= toadtokenIdStart && tokenId <= toadtokenIdEnd,
                "TOKEN_ID_OUT_OF_RANGE"
            );
            require(
                !seasonToadClaimedByTokenId[season][tokenId],
                "GOLD_CLAIMED_FOR_TOKEN_ID"
            );
            seasonToadClaimedByTokenId[season][tokenId] = true;
            _mint(tokenOwner, papiTokenPerTokenId);
        }

        if (contractID == 4) {
            require(
                tokenId >= punkstokenIdStart && tokenId <= punkstokenIdEnd,
                "TOKEN_ID_OUT_OF_RANGE"
            );
            require(
                !seasonOGpunksClaimedByTokenId[season][tokenId],
                "GOLD_CLAIMED_FOR_TOKEN_ID"
            );
            seasonOGpunksClaimedByTokenId[season][tokenId] = true;
            _mint(tokenOwner, papiTokenPerTokenId);
        }
    }

    /// @notice Allows the DAO to mint new tokens for use within the NNW
    /// Ecosystem
    /// @param amountDisplayValue The amount of NNW to mint. This should be
    /// input as the display value, not in raw decimals. If you want to mint
    /// 100 NNW, you should enter "100" rather than the value of 100 * 10^18.
    function daoMint(uint256 amountDisplayValue) external onlyOwner {
        _mint(owner(), amountDisplayValue * (10**decimals()));
    }

    /// @notice Allows the DAO to set a new contract address for NNW. This is
    /// relevant in the event that NNW migrates to a new contract.
    /// @param NNWContractAddress_ The new contract address for NNW
    function daoSetNNWContractAddress(address NNWContractAddress_)
        external
        onlyOwner
    {
        NNWContractAddress = NNWContractAddress_;
        NNWContract = IERC721Enumerable(NNWContractAddress);
    }

    /// @notice Allows the DAO to set the token IDs that are eligible to claim
    /// NNW
    /// @param tokenIdStart_ The start of the eligible token range
    /// @param tokenIdEnd_ The end of the eligible token range
    /// @dev This is relevant in case a future NNW contract has a different
    /// total supply of NNW
    function daoSetTokenIdRange(
        uint256 tokenIdStart_,
        uint256 tokenIdEnd_,
        uint256 contractID
    ) external onlyOwner {
        require(
            contractID == 1 ||
                contractID == 2 ||
                contractID == 3 ||
                contractID == 4
        );

        if (contractID == 1) {
            NNWtokenIdStart = tokenIdStart_;
            NNWtokenIdEnd = tokenIdEnd_;
        }

        if (contractID == 2) {
            cdbtokenIdStart = tokenIdStart_;
            cdbtokenIdEnd = tokenIdEnd_;
        }

        if (contractID == 3) {
            toadtokenIdStart = tokenIdStart_;
            toadtokenIdEnd = tokenIdEnd_;
        }

        if (contractID == 4) {
            punkstokenIdStart = tokenIdStart_;
            punkstokenIdEnd = tokenIdEnd_;
        }
    }

    /// @notice Allows the DAO to set a season for new Papi Token claims
    /// @param season_ The season to use for claiming NNW
    function daoSetSeason(uint256 season_) public onlyOwner {
        season = season_;
    }

    /// @notice Allows the DAO to set the amount of Papi Token that is
    /// claimed per token ID
    /// @param papiTokenDisplayValue The amount of NNW a user can claim.
    /// This should be input as the display value, not in raw decimals. If you
    /// want to mint 100 NNW, you should enter "100" rather than the value of
    /// 100 * 10^18.
    function daoSetpapiTokenPerTokenId(uint256 papiTokenDisplayValue)
        public
        onlyOwner
    {
        papiTokenPerTokenId = papiTokenDisplayValue * (10**decimals());
    }

    /// @notice Allows the DAO to set the season and Papi Token per token ID
    /// in one transaction. This ensures that there is not a gap where a user
    /// can claim more Papi Token than others
    /// @param season_ The season to use for claiming NNW
    /// @param papiTokenDisplayValue The amount of NNW a user can claim.
    /// This should be input as the display value, not in raw decimals. If you
    /// want to mint 100 NNW, you should enter "100" rather than the value of
    /// 100 * 10^18.
    /// @dev We would save a tiny amount of gas by modifying the season and
    /// papiToken variables directly. It is better practice for security,
    /// however, to avoid repeating code. This function is so rarely used that
    /// it's not worth moving these values into their own internal function to
    /// skip the gas used on the modifier check.
    function daoSetSeasonAndpapiTokenPerTokenID(
        uint256 season_,
        uint256 papiTokenDisplayValue
    ) external onlyOwner {
        daoSetSeason(season_);
        daoSetpapiTokenPerTokenId(papiTokenDisplayValue);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"NNWContract","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NNWContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NNWtokenIdEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NNWtokenIdStart","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cdbcontract","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cdbcontractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cdbtokenIdEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cdbtokenIdStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"contractID","type":"uint256"}],"name":"claimAllForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"contractID","type":"uint256"}],"name":"claimById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"claimFromMultiplePunkIDs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimFromPunkID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ownerIndexStart","type":"uint256"},{"internalType":"uint256","name":"ownerIndexEnd","type":"uint256"},{"internalType":"uint256","name":"contractID","type":"uint256"}],"name":"claimRangeForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountDisplayValue","type":"uint256"}],"name":"daoMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NNWContractAddress_","type":"address"}],"name":"daoSetNNWContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"punksContractAddress_","type":"address"}],"name":"daoSetPunksContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"season_","type":"uint256"}],"name":"daoSetSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"season_","type":"uint256"},{"internalType":"uint256","name":"papiTokenDisplayValue","type":"uint256"}],"name":"daoSetSeasonAndpapiTokenPerTokenID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toadzContractAddress_","type":"address"}],"name":"daoSetToadzContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIdStart_","type":"uint256"},{"internalType":"uint256","name":"tokenIdEnd_","type":"uint256"},{"internalType":"uint256","name":"contractID","type":"uint256"}],"name":"daoSetTokenIdRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cdbContractAddress_","type":"address"}],"name":"daoSetcdbContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"papiTokenDisplayValue","type":"uint256"}],"name":"daoSetpapiTokenPerTokenId","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":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"papiTokenPerTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punksContract","outputs":[{"internalType":"contract IPUNK","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punksContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punkstokenIdEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punkstokenIdStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"season","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"seasonCdbClaimedByTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"seasonNNWClaimedByTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"seasonOGpunksClaimedByTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"seasonToadClaimedByTokenId","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":"toadContract","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toadtokenIdEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toadtokenIdStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toadzContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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"}]

608060405273602e3a0887cb381366653df707d38dc3091870db600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507342069abfe407c60cf4ae4112bedead391dba1cdb600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731cb1a5e65610aeff2551a50f76a87a7d3fb649c6600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b47e3cd837ddf8e4c57f05d70ab865de6e193bbb600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001686200043e60201b60201c565b600a62000176919062000800565b6103e86200018591906200093d565b600e5560a0600f556001601055600160115560006012556114ef601355611b39601455611f4060155561270f6016556000601755348015620001c657600080fd5b506040518060400160405280600a81526020017f5061706920546f6b656e000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f504150490000000000000000000000000000000000000000000000000000000081525062000253620002476200044760201b60201c565b6200044f60201b60201c565b81600490805190602001906200026b92919062000652565b5080600590805190602001906200028492919062000652565b505050620002ac73ea2b1d5d02a676f172093d28cc7a0cb088e04f756200051360201b60201c565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000ace565b60006012905090565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620005236200044760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005496200062960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620005a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005999062000772565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000615576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200060c9062000750565b60405180910390fd5b62000626816200044f60201b60201c565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200066090620009b5565b90600052602060002090601f016020900481019282620006845760008555620006d0565b82601f106200069f57805160ff1916838001178555620006d0565b82800160010185558215620006d0579182015b82811115620006cf578251825591602001919060010190620006b2565b5b509050620006df9190620006e3565b5090565b5b80821115620006fe576000816000905550600101620006e4565b5090565b60006200071160268362000794565b91506200071e8262000a56565b604082019050919050565b60006200073860208362000794565b9150620007458262000aa5565b602082019050919050565b600060208201905081810360008301526200076b8162000702565b9050919050565b600060208201905081810360008301526200078d8162000729565b9050919050565b600082825260208201905092915050565b6000808291508390505b6001851115620007f757808604811115620007cf57620007ce620009eb565b5b6001851615620007df5780820291505b8081029050620007ef8562000a49565b9450620007af565b94509492505050565b60006200080d826200099e565b91506200081a83620009a8565b9250620008497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000851565b905092915050565b60008262000863576001905062000936565b8162000873576000905062000936565b81600181146200088c57600281146200089757620008cd565b600191505062000936565b60ff841115620008ac57620008ab620009eb565b5b8360020a915084821115620008c657620008c5620009eb565b5b5062000936565b5060208310610133831016604e8410600b8410161715620009075782820a905083811115620009015762000900620009eb565b5b62000936565b620009168484846001620007a5565b9250905081840481111562000930576200092f620009eb565b5b81810290505b9392505050565b60006200094a826200099e565b915062000957836200099e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620009935762000992620009eb565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b60006002820490506001821680620009ce57607f821691505b60208210811415620009e557620009e462000a1a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6149c68062000ade6000396000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c806370a0823111610182578063aa13bd76116100e9578063e36009c2116100a2578063ee43c79b1161007c578063ee43c79b146108c5578063f2fde38b146108e3578063f9fa3e5b146108ff578063ff25ad481461091b576102d6565b8063e36009c21461086f578063e46317b51461088b578063ecfaed86146108a9576102d6565b8063aa13bd7614610797578063aed18d31146107b5578063c4632fb8146107e5578063c50b0fb014610803578063d835103314610821578063dd62ed3e1461083f576102d6565b806391b26daa1161013b57806391b26daa146106c157806395d89b41146106dd57806399452b78146106fb578063a35acb9214610719578063a457c2d714610737578063a9059cbb14610767576102d6565b806370a0823114610611578063715018a61461064157806389cf00c51461064b5780638c1876a5146106675780638da5cb5b146106855780638f6600de146106a3576102d6565b8063395093511161024157806362227aea116101fa5780636469d858116101d45780636469d8581461059f57806366030df7146105bd57806369239d09146105d95780636bd82e1f146105f5576102d6565b806362227aea1461054957806362759f6c1461056757806363e851bc14610583576102d6565b806339509351146104855780633a7c6340146104b557806342e47315146104d357806356413f14146104ef578063587fff341461050d5780635e82c8f21461052b576102d6565b80631beff9b6116102935780631beff9b61461039d57806323b872dd146103cd5780632558d0ef146103fd578063313ce567146104195780633171b1d114610437578063382b735814610455576102d6565b806306fdde03146102db578063094988d3146102f9578063095ea7b3146103155780630aeb2ee214610345578063115aba691461036157806318160ddd1461037f575b600080fd5b6102e361094b565b6040516102f09190613e9b565b60405180910390f35b610313600480360381019061030e9190613ad3565b6109dd565b005b61032f600480360381019061032a91906139f0565b610a6f565b60405161033c9190613e4a565b60405180910390f35b61035f600480360381019061035a9190613a79565b610a8d565b005b61036961106b565b6040516103769190613e65565b60405180910390f35b610387611091565b604051610394919061409d565b60405180910390f35b6103b760048036038101906103b29190613ad3565b61109b565b6040516103c49190613e4a565b60405180910390f35b6103e760048036038101906103e2919061399d565b6110ca565b6040516103f49190613e4a565b60405180910390f35b61041760048036038101906104129190613a30565b6111c2565b005b61042161134b565b60405161042e91906140b8565b60405180910390f35b61043f611354565b60405161044c919061409d565b60405180910390f35b61046f600480360381019061046a9190613ad3565b61135a565b60405161047c9190613e4a565b60405180910390f35b61049f600480360381019061049a91906139f0565b611389565b6040516104ac9190613e4a565b60405180910390f35b6104bd611435565b6040516104ca919061409d565b60405180910390f35b6104ed60048036038101906104e89190613a79565b61143b565b005b6104f76114c1565b604051610504919061409d565b60405180910390f35b6105156114c7565b604051610522919061409d565b60405180910390f35b6105336114cd565b604051610540919061409d565b60405180910390f35b6105516114d3565b60405161055e9190613e06565b60405180910390f35b610581600480360381019061057c9190613a79565b6114f9565b005b61059d60048036038101906105989190613b13565b6115a7565b005b6105a7611c7a565b6040516105b49190613e06565b60405180910390f35b6105d760048036038101906105d29190613b13565b611ca0565b005b6105f360048036038101906105ee9190613903565b611daf565b005b61060f600480360381019061060a9190613a79565b611ed2565b005b61062b60048036038101906106269190613903565b611f76565b604051610638919061409d565b60405180910390f35b610649611fbf565b005b61066560048036038101906106609190613903565b612047565b005b61066f61216a565b60405161067c9190613e06565b60405180910390f35b61068d612190565b60405161069a9190613e06565b60405180910390f35b6106ab6121b9565b6040516106b8919061409d565b60405180910390f35b6106db60048036038101906106d69190613903565b6121bf565b005b6106e56122e2565b6040516106f29190613e9b565b60405180910390f35b610703612374565b6040516107109190613e06565b60405180910390f35b61072161239a565b60405161072e9190613e65565b60405180910390f35b610751600480360381019061074c91906139f0565b6123c0565b60405161075e9190613e4a565b60405180910390f35b610781600480360381019061077c91906139f0565b6124ab565b60405161078e9190613e4a565b60405180910390f35b61079f6124c9565b6040516107ac919061409d565b60405180910390f35b6107cf60048036038101906107ca9190613ad3565b6124cf565b6040516107dc9190613e4a565b60405180910390f35b6107ed6124fe565b6040516107fa9190613e65565b60405180910390f35b61080b612524565b604051610818919061409d565b60405180910390f35b61082961252a565b604051610836919061409d565b60405180910390f35b6108596004803603810190610854919061395d565b612530565b604051610866919061409d565b60405180910390f35b61088960048036038101906108849190613903565b6125b7565b005b6108936126da565b6040516108a09190613e80565b60405180910390f35b6108c360048036038101906108be9190613a79565b612700565b005b6108cd612835565b6040516108da919061409d565b60405180910390f35b6108fd60048036038101906108f89190613903565b61283b565b005b61091960048036038101906109149190613ad3565b612933565b005b61093560048036038101906109309190613ad3565b612ce7565b6040516109429190613e4a565b60405180910390f35b60606004805461095a90614431565b80601f016020809104026020016040519081016040528092919081815260200182805461098690614431565b80156109d35780601f106109a8576101008083540402835291602001916109d3565b820191906000526020600020905b8154815290600101906020018083116109b657829003601f168201915b5050505050905090565b6109e5612d16565b73ffffffffffffffffffffffffffffffffffffffff16610a03612190565b73ffffffffffffffffffffffffffffffffffffffff1614610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5090613f9d565b60405180910390fd5b610a628261143b565b610a6b81611ed2565b5050565b6000610a83610a7c612d16565b8484612d1e565b6001905092915050565b6001811480610a9c5750600281145b80610aa75750600381145b610ab057600080fd5b6001811415610c98576000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610b01612d16565b6040518263ffffffff1660e01b8152600401610b1d9190613e06565b60206040518083038186803b158015610b3557600080fd5b505afa158015610b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6d9190613aa6565b905060008111610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba99061403d565b60405180910390fd5b60005b81811015610c9557610c82600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59610c06612d16565b846040518363ffffffff1660e01b8152600401610c24929190613e21565b60206040518083038186803b158015610c3c57600080fd5b505afa158015610c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c749190613aa6565b610c7c612d16565b85612ee9565b8080610c8d90614494565b915050610bb5565b50505b6002811415610e80576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610ce9612d16565b6040518263ffffffff1660e01b8152600401610d059190613e06565b60206040518083038186803b158015610d1d57600080fd5b505afa158015610d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d559190613aa6565b905060008111610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d919061403d565b60405180910390fd5b60005b81811015610e7d57610e6a600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59610dee612d16565b846040518363ffffffff1660e01b8152600401610e0c929190613e21565b60206040518083038186803b158015610e2457600080fd5b505afa158015610e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5c9190613aa6565b610e64612d16565b85612ee9565b8080610e7590614494565b915050610d9d565b50505b6003811415611068576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610ed1612d16565b6040518263ffffffff1660e01b8152600401610eed9190613e06565b60206040518083038186803b158015610f0557600080fd5b505afa158015610f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3d9190613aa6565b905060008111610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f799061403d565b60405180910390fd5b60005b8181101561106557611052600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59610fd6612d16565b846040518363ffffffff1660e01b8152600401610ff4929190613e21565b60206040518083038186803b15801561100c57600080fd5b505afa158015611020573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110449190613aa6565b61104c612d16565b85612ee9565b808061105d90614494565b915050610f85565b50505b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600354905090565b60196020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60006110d784848461335e565b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611122612d16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156111a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119990613f7d565b60405180910390fd5b6111b6856111ae612d16565b858403612d1e565b60019150509392505050565b60005b815181101561134757600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635817816883838151811061121f5761121e61453b565b5b60200260200101516040518263ffffffff1660e01b8152600401611243919061409d565b60206040518083038186803b15801561125b57600080fd5b505afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112939190613930565b73ffffffffffffffffffffffffffffffffffffffff166112b1612d16565b73ffffffffffffffffffffffffffffffffffffffff1614611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90613f5d565b60405180910390fd5b61133482828151811061131d5761131c61453b565b5b602002602001015161132d612d16565b6004612ee9565b808061133f90614494565b9150506111c5565b5050565b60006012905090565b60125481565b601b6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600061142b611396612d16565b8484600260006113a4612d16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114269190614140565b612d1e565b6001905092915050565b60105481565b611443612d16565b73ffffffffffffffffffffffffffffffffffffffff16611461612190565b73ffffffffffffffffffffffffffffffffffffffff16146114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90613f9d565b60405180910390fd5b8060178190555050565b60165481565b60135481565b60145481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611501612d16565b73ffffffffffffffffffffffffffffffffffffffff1661151f612190565b73ffffffffffffffffffffffffffffffffffffffff1614611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c90613f9d565b60405180910390fd5b6115a4611580612190565b61158861134b565b600a61159491906141e9565b8361159f9190614307565b6135e2565b50565b60018114806115b65750600281145b806115c15750600381145b6115ca57600080fd5b6001811415611803576000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823161161b612d16565b6040518263ffffffff1660e01b81526004016116379190613e06565b60206040518083038186803b15801561164f57600080fd5b505afa158015611663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116879190613aa6565b9050600081116116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c39061403d565b60405180910390fd5b600084101580156116dc57508083105b61171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290613edd565b60405180910390fd5b60008490505b838111611800576117ed600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59611771612d16565b846040518363ffffffff1660e01b815260040161178f929190613e21565b60206040518083038186803b1580156117a757600080fd5b505afa1580156117bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117df9190613aa6565b6117e7612d16565b85612ee9565b80806117f890614494565b915050611721565b50505b6002811415611a3c576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231611854612d16565b6040518263ffffffff1660e01b81526004016118709190613e06565b60206040518083038186803b15801561188857600080fd5b505afa15801561189c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c09190613aa6565b905060008111611905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fc9061403d565b60405180910390fd5b6000841015801561191557508083105b611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b90613edd565b60405180910390fd5b60008490505b838111611a3957611a26600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c596119aa612d16565b846040518363ffffffff1660e01b81526004016119c8929190613e21565b60206040518083038186803b1580156119e057600080fd5b505afa1580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190613aa6565b611a20612d16565b85612ee9565b8080611a3190614494565b91505061195a565b50505b6003811415611c75576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231611a8d612d16565b6040518263ffffffff1660e01b8152600401611aa99190613e06565b60206040518083038186803b158015611ac157600080fd5b505afa158015611ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af99190613aa6565b905060008111611b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b359061403d565b60405180910390fd5b60008410158015611b4e57508083105b611b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8490613edd565b60405180910390fd5b60008490505b838111611c7257611c5f600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59611be3612d16565b846040518363ffffffff1660e01b8152600401611c01929190613e21565b60206040518083038186803b158015611c1957600080fd5b505afa158015611c2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c519190613aa6565b611c59612d16565b85612ee9565b8080611c6a90614494565b915050611b93565b50505b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ca8612d16565b73ffffffffffffffffffffffffffffffffffffffff16611cc6612190565b73ffffffffffffffffffffffffffffffffffffffff1614611d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1390613f9d565b60405180910390fd5b6001811480611d2b5750600281145b80611d365750600381145b80611d415750600481145b611d4a57600080fd5b6001811415611d625782601181905550816015819055505b6002811415611d7a5782600f81905550816013819055505b6003811415611d925782601081905550816014819055505b6004811415611daa5782601281905550816016819055505b505050565b611db7612d16565b73ffffffffffffffffffffffffffffffffffffffff16611dd5612190565b73ffffffffffffffffffffffffffffffffffffffff1614611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2290613f9d565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611eda612d16565b73ffffffffffffffffffffffffffffffffffffffff16611ef8612190565b73ffffffffffffffffffffffffffffffffffffffff1614611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4590613f9d565b60405180910390fd5b611f5661134b565b600a611f6291906141e9565b81611f6d9190614307565b600e8190555050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611fc7612d16565b73ffffffffffffffffffffffffffffffffffffffff16611fe5612190565b73ffffffffffffffffffffffffffffffffffffffff161461203b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203290613f9d565b60405180910390fd5b6120456000613743565b565b61204f612d16565b73ffffffffffffffffffffffffffffffffffffffff1661206d612190565b73ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90613f9d565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f5481565b6121c7612d16565b73ffffffffffffffffffffffffffffffffffffffff166121e5612190565b73ffffffffffffffffffffffffffffffffffffffff161461223b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223290613f9d565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600580546122f190614431565b80601f016020809104026020016040519081016040528092919081815260200182805461231d90614431565b801561236a5780601f1061233f5761010080835404028352916020019161236a565b820191906000526020600020905b81548152906001019060200180831161234d57829003601f168201915b5050505050905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260006123cf612d16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561248c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124839061405d565b60405180910390fd5b6124a0612497612d16565b85858403612d1e565b600191505092915050565b60006124bf6124b8612d16565b848461335e565b6001905092915050565b60115481565b601a6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60175481565b60155481565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6125bf612d16565b73ffffffffffffffffffffffffffffffffffffffff166125dd612190565b73ffffffffffffffffffffffffffffffffffffffff1614612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a90613f9d565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166358178168826040518263ffffffff1660e01b815260040161275b919061409d565b60206040518083038186803b15801561277357600080fd5b505afa158015612787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ab9190613930565b73ffffffffffffffffffffffffffffffffffffffff166127c9612d16565b73ffffffffffffffffffffffffffffffffffffffff161461281f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281690613f5d565b60405180910390fd5b6128328161282b612d16565b6004612ee9565b50565b600e5481565b612843612d16565b73ffffffffffffffffffffffffffffffffffffffff16612861612190565b73ffffffffffffffffffffffffffffffffffffffff16146128b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae90613f9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e90613efd565b60405180910390fd5b61293081613743565b50565b60018114806129425750600281145b8061294d5750600381145b61295657600080fd5b6001811415612a7f57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016129ba919061409d565b60206040518083038186803b1580156129d257600080fd5b505afa1580156129e6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0a9190613930565b73ffffffffffffffffffffffffffffffffffffffff16612a28612d16565b73ffffffffffffffffffffffffffffffffffffffff1614612a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7590613f5d565b60405180910390fd5b5b6002811415612ba857600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401612ae3919061409d565b60206040518083038186803b158015612afb57600080fd5b505afa158015612b0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b339190613930565b73ffffffffffffffffffffffffffffffffffffffff16612b51612d16565b73ffffffffffffffffffffffffffffffffffffffff1614612ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9e90613f5d565b60405180910390fd5b5b6003811415612cd157600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401612c0c919061409d565b60206040518083038186803b158015612c2457600080fd5b505afa158015612c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5c9190613930565b73ffffffffffffffffffffffffffffffffffffffff16612c7a612d16565b73ffffffffffffffffffffffffffffffffffffffff1614612cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc790613f5d565b60405180910390fd5b5b612ce382612cdd612d16565b83612ee9565b5050565b60186020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8590613ffd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df590613f1d565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612edc919061409d565b60405180910390a3505050565b6001811415613005576011548310158015612f0657506015548311155b612f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3c9061401d565b60405180910390fd5b601860006017548152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff1615612fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb090613fdd565b60405180910390fd5b6001601860006017548152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff02191690831515021790555061300482600e546135e2565b5b600281141561312157600f54831015801561302257506013548311155b613061576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130589061401d565b60405180910390fd5b601960006017548152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16156130d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cc90613fdd565b60405180910390fd5b6001601960006017548152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff02191690831515021790555061312082600e546135e2565b5b600381141561323d57601054831015801561313e57506014548311155b61317d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131749061401d565b60405180910390fd5b601a60006017548152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16156131f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e890613fdd565b60405180910390fd5b6001601a60006017548152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff02191690831515021790555061323c82600e546135e2565b5b600481141561335957601254831015801561325a57506016548311155b613299576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132909061401d565b60405180910390fd5b601b60006017548152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff161561330d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330490613fdd565b60405180910390fd5b6001601b60006017548152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff02191690831515021790555061335882600e546135e2565b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c590613fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561343e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343590613ebd565b60405180910390fd5b613449838383613807565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156134d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c790613f3d565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135659190614140565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516135c9919061409d565b60405180910390a36135dc84848461380c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136499061407d565b60405180910390fd5b61365e60008383613807565b80600360008282546136709190614140565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136c69190614140565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161372b919061409d565b60405180910390a361373f6000838361380c565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600061382461381f846140f8565b6140d3565b905080838252602082019050828560208602820111156138475761384661459e565b5b60005b85811015613877578161385d88826138d9565b84526020840193506020830192505060018101905061384a565b5050509392505050565b60008135905061389081614962565b92915050565b6000815190506138a581614962565b92915050565b600082601f8301126138c0576138bf614599565b5b81356138d0848260208601613811565b91505092915050565b6000813590506138e881614979565b92915050565b6000815190506138fd81614979565b92915050565b600060208284031215613919576139186145a8565b5b600061392784828501613881565b91505092915050565b600060208284031215613946576139456145a8565b5b600061395484828501613896565b91505092915050565b60008060408385031215613974576139736145a8565b5b600061398285828601613881565b925050602061399385828601613881565b9150509250929050565b6000806000606084860312156139b6576139b56145a8565b5b60006139c486828701613881565b93505060206139d586828701613881565b92505060406139e6868287016138d9565b9150509250925092565b60008060408385031215613a0757613a066145a8565b5b6000613a1585828601613881565b9250506020613a26858286016138d9565b9150509250929050565b600060208284031215613a4657613a456145a8565b5b600082013567ffffffffffffffff811115613a6457613a636145a3565b5b613a70848285016138ab565b91505092915050565b600060208284031215613a8f57613a8e6145a8565b5b6000613a9d848285016138d9565b91505092915050565b600060208284031215613abc57613abb6145a8565b5b6000613aca848285016138ee565b91505092915050565b60008060408385031215613aea57613ae96145a8565b5b6000613af8858286016138d9565b9250506020613b09858286016138d9565b9150509250929050565b600080600060608486031215613b2c57613b2b6145a8565b5b6000613b3a868287016138d9565b9350506020613b4b868287016138d9565b9250506040613b5c868287016138d9565b9150509250925092565b613b6f81614361565b82525050565b613b7e81614373565b82525050565b613b8d816143b6565b82525050565b613b9c816143c8565b82525050565b6000613bad82614124565b613bb7818561412f565b9350613bc78185602086016143fe565b613bd0816145ad565b840191505092915050565b6000613be860238361412f565b9150613bf3826145cb565b604082019050919050565b6000613c0b60128361412f565b9150613c168261461a565b602082019050919050565b6000613c2e60268361412f565b9150613c3982614643565b604082019050919050565b6000613c5160228361412f565b9150613c5c82614692565b604082019050919050565b6000613c7460268361412f565b9150613c7f826146e1565b604082019050919050565b6000613c9760118361412f565b9150613ca282614730565b602082019050919050565b6000613cba60288361412f565b9150613cc582614759565b604082019050919050565b6000613cdd60208361412f565b9150613ce8826147a8565b602082019050919050565b6000613d0060258361412f565b9150613d0b826147d1565b604082019050919050565b6000613d2360198361412f565b9150613d2e82614820565b602082019050919050565b6000613d4660248361412f565b9150613d5182614849565b604082019050919050565b6000613d6960158361412f565b9150613d7482614898565b602082019050919050565b6000613d8c600f8361412f565b9150613d97826148c1565b602082019050919050565b6000613daf60258361412f565b9150613dba826148ea565b604082019050919050565b6000613dd2601f8361412f565b9150613ddd82614939565b602082019050919050565b613df18161439f565b82525050565b613e00816143a9565b82525050565b6000602082019050613e1b6000830184613b66565b92915050565b6000604082019050613e366000830185613b66565b613e436020830184613de8565b9392505050565b6000602082019050613e5f6000830184613b75565b92915050565b6000602082019050613e7a6000830184613b84565b92915050565b6000602082019050613e956000830184613b93565b92915050565b60006020820190508181036000830152613eb58184613ba2565b905092915050565b60006020820190508181036000830152613ed681613bdb565b9050919050565b60006020820190508181036000830152613ef681613bfe565b9050919050565b60006020820190508181036000830152613f1681613c21565b9050919050565b60006020820190508181036000830152613f3681613c44565b9050919050565b60006020820190508181036000830152613f5681613c67565b9050919050565b60006020820190508181036000830152613f7681613c8a565b9050919050565b60006020820190508181036000830152613f9681613cad565b9050919050565b60006020820190508181036000830152613fb681613cd0565b9050919050565b60006020820190508181036000830152613fd681613cf3565b9050919050565b60006020820190508181036000830152613ff681613d16565b9050919050565b6000602082019050818103600083015261401681613d39565b9050919050565b6000602082019050818103600083015261403681613d5c565b9050919050565b6000602082019050818103600083015261405681613d7f565b9050919050565b6000602082019050818103600083015261407681613da2565b9050919050565b6000602082019050818103600083015261409681613dc5565b9050919050565b60006020820190506140b26000830184613de8565b92915050565b60006020820190506140cd6000830184613df7565b92915050565b60006140dd6140ee565b90506140e98282614463565b919050565b6000604051905090565b600067ffffffffffffffff8211156141135761411261456a565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600061414b8261439f565b91506141568361439f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561418b5761418a6144dd565b5b828201905092915050565b6000808291508390505b60018511156141e0578086048111156141bc576141bb6144dd565b5b60018516156141cb5780820291505b80810290506141d9856145be565b94506141a0565b94509492505050565b60006141f48261439f565b91506141ff836143a9565b925061422c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614234565b905092915050565b6000826142445760019050614300565b816142525760009050614300565b81600181146142685760028114614272576142a1565b6001915050614300565b60ff841115614284576142836144dd565b5b8360020a91508482111561429b5761429a6144dd565b5b50614300565b5060208310610133831016604e8410600b84101617156142d65782820a9050838111156142d1576142d06144dd565b5b614300565b6142e38484846001614196565b925090508184048111156142fa576142f96144dd565b5b81810290505b9392505050565b60006143128261439f565b915061431d8361439f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614356576143556144dd565b5b828202905092915050565b600061436c8261437f565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006143c1826143da565b9050919050565b60006143d3826143da565b9050919050565b60006143e5826143ec565b9050919050565b60006143f78261437f565b9050919050565b60005b8381101561441c578082015181840152602081019050614401565b8381111561442b576000848401525b50505050565b6000600282049050600182168061444957607f821691505b6020821081141561445d5761445c61450c565b5b50919050565b61446c826145ad565b810181811067ffffffffffffffff8211171561448b5761448a61456a565b5b80604052505050565b600061449f8261439f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144d2576144d16144dd565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f494e4445585f4f55545f4f465f52414e47450000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4d5553545f4f574e5f544f4b454e5f4944000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f474f4c445f434c41494d45445f464f525f544f4b454e5f494400000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f544f4b454e5f49445f4f55545f4f465f52414e47450000000000000000000000600082015250565b7f4e4f5f544f4b454e535f4f574e45440000000000000000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61496b81614361565b811461497657600080fd5b50565b6149828161439f565b811461498d57600080fd5b5056fea2646970667358221220ca6458263caeb74c58b050027b87affbee95f28ff7df85caaf7dc61b2aced62e64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102d65760003560e01c806370a0823111610182578063aa13bd76116100e9578063e36009c2116100a2578063ee43c79b1161007c578063ee43c79b146108c5578063f2fde38b146108e3578063f9fa3e5b146108ff578063ff25ad481461091b576102d6565b8063e36009c21461086f578063e46317b51461088b578063ecfaed86146108a9576102d6565b8063aa13bd7614610797578063aed18d31146107b5578063c4632fb8146107e5578063c50b0fb014610803578063d835103314610821578063dd62ed3e1461083f576102d6565b806391b26daa1161013b57806391b26daa146106c157806395d89b41146106dd57806399452b78146106fb578063a35acb9214610719578063a457c2d714610737578063a9059cbb14610767576102d6565b806370a0823114610611578063715018a61461064157806389cf00c51461064b5780638c1876a5146106675780638da5cb5b146106855780638f6600de146106a3576102d6565b8063395093511161024157806362227aea116101fa5780636469d858116101d45780636469d8581461059f57806366030df7146105bd57806369239d09146105d95780636bd82e1f146105f5576102d6565b806362227aea1461054957806362759f6c1461056757806363e851bc14610583576102d6565b806339509351146104855780633a7c6340146104b557806342e47315146104d357806356413f14146104ef578063587fff341461050d5780635e82c8f21461052b576102d6565b80631beff9b6116102935780631beff9b61461039d57806323b872dd146103cd5780632558d0ef146103fd578063313ce567146104195780633171b1d114610437578063382b735814610455576102d6565b806306fdde03146102db578063094988d3146102f9578063095ea7b3146103155780630aeb2ee214610345578063115aba691461036157806318160ddd1461037f575b600080fd5b6102e361094b565b6040516102f09190613e9b565b60405180910390f35b610313600480360381019061030e9190613ad3565b6109dd565b005b61032f600480360381019061032a91906139f0565b610a6f565b60405161033c9190613e4a565b60405180910390f35b61035f600480360381019061035a9190613a79565b610a8d565b005b61036961106b565b6040516103769190613e65565b60405180910390f35b610387611091565b604051610394919061409d565b60405180910390f35b6103b760048036038101906103b29190613ad3565b61109b565b6040516103c49190613e4a565b60405180910390f35b6103e760048036038101906103e2919061399d565b6110ca565b6040516103f49190613e4a565b60405180910390f35b61041760048036038101906104129190613a30565b6111c2565b005b61042161134b565b60405161042e91906140b8565b60405180910390f35b61043f611354565b60405161044c919061409d565b60405180910390f35b61046f600480360381019061046a9190613ad3565b61135a565b60405161047c9190613e4a565b60405180910390f35b61049f600480360381019061049a91906139f0565b611389565b6040516104ac9190613e4a565b60405180910390f35b6104bd611435565b6040516104ca919061409d565b60405180910390f35b6104ed60048036038101906104e89190613a79565b61143b565b005b6104f76114c1565b604051610504919061409d565b60405180910390f35b6105156114c7565b604051610522919061409d565b60405180910390f35b6105336114cd565b604051610540919061409d565b60405180910390f35b6105516114d3565b60405161055e9190613e06565b60405180910390f35b610581600480360381019061057c9190613a79565b6114f9565b005b61059d60048036038101906105989190613b13565b6115a7565b005b6105a7611c7a565b6040516105b49190613e06565b60405180910390f35b6105d760048036038101906105d29190613b13565b611ca0565b005b6105f360048036038101906105ee9190613903565b611daf565b005b61060f600480360381019061060a9190613a79565b611ed2565b005b61062b60048036038101906106269190613903565b611f76565b604051610638919061409d565b60405180910390f35b610649611fbf565b005b61066560048036038101906106609190613903565b612047565b005b61066f61216a565b60405161067c9190613e06565b60405180910390f35b61068d612190565b60405161069a9190613e06565b60405180910390f35b6106ab6121b9565b6040516106b8919061409d565b60405180910390f35b6106db60048036038101906106d69190613903565b6121bf565b005b6106e56122e2565b6040516106f29190613e9b565b60405180910390f35b610703612374565b6040516107109190613e06565b60405180910390f35b61072161239a565b60405161072e9190613e65565b60405180910390f35b610751600480360381019061074c91906139f0565b6123c0565b60405161075e9190613e4a565b60405180910390f35b610781600480360381019061077c91906139f0565b6124ab565b60405161078e9190613e4a565b60405180910390f35b61079f6124c9565b6040516107ac919061409d565b60405180910390f35b6107cf60048036038101906107ca9190613ad3565b6124cf565b6040516107dc9190613e4a565b60405180910390f35b6107ed6124fe565b6040516107fa9190613e65565b60405180910390f35b61080b612524565b604051610818919061409d565b60405180910390f35b61082961252a565b604051610836919061409d565b60405180910390f35b6108596004803603810190610854919061395d565b612530565b604051610866919061409d565b60405180910390f35b61088960048036038101906108849190613903565b6125b7565b005b6108936126da565b6040516108a09190613e80565b60405180910390f35b6108c360048036038101906108be9190613a79565b612700565b005b6108cd612835565b6040516108da919061409d565b60405180910390f35b6108fd60048036038101906108f89190613903565b61283b565b005b61091960048036038101906109149190613ad3565b612933565b005b61093560048036038101906109309190613ad3565b612ce7565b6040516109429190613e4a565b60405180910390f35b60606004805461095a90614431565b80601f016020809104026020016040519081016040528092919081815260200182805461098690614431565b80156109d35780601f106109a8576101008083540402835291602001916109d3565b820191906000526020600020905b8154815290600101906020018083116109b657829003601f168201915b5050505050905090565b6109e5612d16565b73ffffffffffffffffffffffffffffffffffffffff16610a03612190565b73ffffffffffffffffffffffffffffffffffffffff1614610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5090613f9d565b60405180910390fd5b610a628261143b565b610a6b81611ed2565b5050565b6000610a83610a7c612d16565b8484612d1e565b6001905092915050565b6001811480610a9c5750600281145b80610aa75750600381145b610ab057600080fd5b6001811415610c98576000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610b01612d16565b6040518263ffffffff1660e01b8152600401610b1d9190613e06565b60206040518083038186803b158015610b3557600080fd5b505afa158015610b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6d9190613aa6565b905060008111610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba99061403d565b60405180910390fd5b60005b81811015610c9557610c82600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59610c06612d16565b846040518363ffffffff1660e01b8152600401610c24929190613e21565b60206040518083038186803b158015610c3c57600080fd5b505afa158015610c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c749190613aa6565b610c7c612d16565b85612ee9565b8080610c8d90614494565b915050610bb5565b50505b6002811415610e80576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610ce9612d16565b6040518263ffffffff1660e01b8152600401610d059190613e06565b60206040518083038186803b158015610d1d57600080fd5b505afa158015610d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d559190613aa6565b905060008111610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d919061403d565b60405180910390fd5b60005b81811015610e7d57610e6a600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59610dee612d16565b846040518363ffffffff1660e01b8152600401610e0c929190613e21565b60206040518083038186803b158015610e2457600080fd5b505afa158015610e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5c9190613aa6565b610e64612d16565b85612ee9565b8080610e7590614494565b915050610d9d565b50505b6003811415611068576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610ed1612d16565b6040518263ffffffff1660e01b8152600401610eed9190613e06565b60206040518083038186803b158015610f0557600080fd5b505afa158015610f19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3d9190613aa6565b905060008111610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f799061403d565b60405180910390fd5b60005b8181101561106557611052600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59610fd6612d16565b846040518363ffffffff1660e01b8152600401610ff4929190613e21565b60206040518083038186803b15801561100c57600080fd5b505afa158015611020573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110449190613aa6565b61104c612d16565b85612ee9565b808061105d90614494565b915050610f85565b50505b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600354905090565b60196020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60006110d784848461335e565b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611122612d16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156111a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119990613f7d565b60405180910390fd5b6111b6856111ae612d16565b858403612d1e565b60019150509392505050565b60005b815181101561134757600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635817816883838151811061121f5761121e61453b565b5b60200260200101516040518263ffffffff1660e01b8152600401611243919061409d565b60206040518083038186803b15801561125b57600080fd5b505afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112939190613930565b73ffffffffffffffffffffffffffffffffffffffff166112b1612d16565b73ffffffffffffffffffffffffffffffffffffffff1614611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90613f5d565b60405180910390fd5b61133482828151811061131d5761131c61453b565b5b602002602001015161132d612d16565b6004612ee9565b808061133f90614494565b9150506111c5565b5050565b60006012905090565b60125481565b601b6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600061142b611396612d16565b8484600260006113a4612d16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114269190614140565b612d1e565b6001905092915050565b60105481565b611443612d16565b73ffffffffffffffffffffffffffffffffffffffff16611461612190565b73ffffffffffffffffffffffffffffffffffffffff16146114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90613f9d565b60405180910390fd5b8060178190555050565b60165481565b60135481565b60145481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611501612d16565b73ffffffffffffffffffffffffffffffffffffffff1661151f612190565b73ffffffffffffffffffffffffffffffffffffffff1614611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c90613f9d565b60405180910390fd5b6115a4611580612190565b61158861134b565b600a61159491906141e9565b8361159f9190614307565b6135e2565b50565b60018114806115b65750600281145b806115c15750600381145b6115ca57600080fd5b6001811415611803576000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823161161b612d16565b6040518263ffffffff1660e01b81526004016116379190613e06565b60206040518083038186803b15801561164f57600080fd5b505afa158015611663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116879190613aa6565b9050600081116116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c39061403d565b60405180910390fd5b600084101580156116dc57508083105b61171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290613edd565b60405180910390fd5b60008490505b838111611800576117ed600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59611771612d16565b846040518363ffffffff1660e01b815260040161178f929190613e21565b60206040518083038186803b1580156117a757600080fd5b505afa1580156117bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117df9190613aa6565b6117e7612d16565b85612ee9565b80806117f890614494565b915050611721565b50505b6002811415611a3c576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231611854612d16565b6040518263ffffffff1660e01b81526004016118709190613e06565b60206040518083038186803b15801561188857600080fd5b505afa15801561189c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c09190613aa6565b905060008111611905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fc9061403d565b60405180910390fd5b6000841015801561191557508083105b611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b90613edd565b60405180910390fd5b60008490505b838111611a3957611a26600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c596119aa612d16565b846040518363ffffffff1660e01b81526004016119c8929190613e21565b60206040518083038186803b1580156119e057600080fd5b505afa1580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190613aa6565b611a20612d16565b85612ee9565b8080611a3190614494565b91505061195a565b50505b6003811415611c75576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231611a8d612d16565b6040518263ffffffff1660e01b8152600401611aa99190613e06565b60206040518083038186803b158015611ac157600080fd5b505afa158015611ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af99190613aa6565b905060008111611b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b359061403d565b60405180910390fd5b60008410158015611b4e57508083105b611b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8490613edd565b60405180910390fd5b60008490505b838111611c7257611c5f600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59611be3612d16565b846040518363ffffffff1660e01b8152600401611c01929190613e21565b60206040518083038186803b158015611c1957600080fd5b505afa158015611c2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c519190613aa6565b611c59612d16565b85612ee9565b8080611c6a90614494565b915050611b93565b50505b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ca8612d16565b73ffffffffffffffffffffffffffffffffffffffff16611cc6612190565b73ffffffffffffffffffffffffffffffffffffffff1614611d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1390613f9d565b60405180910390fd5b6001811480611d2b5750600281145b80611d365750600381145b80611d415750600481145b611d4a57600080fd5b6001811415611d625782601181905550816015819055505b6002811415611d7a5782600f81905550816013819055505b6003811415611d925782601081905550816014819055505b6004811415611daa5782601281905550816016819055505b505050565b611db7612d16565b73ffffffffffffffffffffffffffffffffffffffff16611dd5612190565b73ffffffffffffffffffffffffffffffffffffffff1614611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2290613f9d565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611eda612d16565b73ffffffffffffffffffffffffffffffffffffffff16611ef8612190565b73ffffffffffffffffffffffffffffffffffffffff1614611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4590613f9d565b60405180910390fd5b611f5661134b565b600a611f6291906141e9565b81611f6d9190614307565b600e8190555050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611fc7612d16565b73ffffffffffffffffffffffffffffffffffffffff16611fe5612190565b73ffffffffffffffffffffffffffffffffffffffff161461203b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203290613f9d565b60405180910390fd5b6120456000613743565b565b61204f612d16565b73ffffffffffffffffffffffffffffffffffffffff1661206d612190565b73ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90613f9d565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f5481565b6121c7612d16565b73ffffffffffffffffffffffffffffffffffffffff166121e5612190565b73ffffffffffffffffffffffffffffffffffffffff161461223b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223290613f9d565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600580546122f190614431565b80601f016020809104026020016040519081016040528092919081815260200182805461231d90614431565b801561236a5780601f1061233f5761010080835404028352916020019161236a565b820191906000526020600020905b81548152906001019060200180831161234d57829003601f168201915b5050505050905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260006123cf612d16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561248c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124839061405d565b60405180910390fd5b6124a0612497612d16565b85858403612d1e565b600191505092915050565b60006124bf6124b8612d16565b848461335e565b6001905092915050565b60115481565b601a6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60175481565b60155481565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6125bf612d16565b73ffffffffffffffffffffffffffffffffffffffff166125dd612190565b73ffffffffffffffffffffffffffffffffffffffff1614612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a90613f9d565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166358178168826040518263ffffffff1660e01b815260040161275b919061409d565b60206040518083038186803b15801561277357600080fd5b505afa158015612787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ab9190613930565b73ffffffffffffffffffffffffffffffffffffffff166127c9612d16565b73ffffffffffffffffffffffffffffffffffffffff161461281f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281690613f5d565b60405180910390fd5b6128328161282b612d16565b6004612ee9565b50565b600e5481565b612843612d16565b73ffffffffffffffffffffffffffffffffffffffff16612861612190565b73ffffffffffffffffffffffffffffffffffffffff16146128b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ae90613f9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e90613efd565b60405180910390fd5b61293081613743565b50565b60018114806129425750600281145b8061294d5750600381145b61295657600080fd5b6001811415612a7f57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016129ba919061409d565b60206040518083038186803b1580156129d257600080fd5b505afa1580156129e6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0a9190613930565b73ffffffffffffffffffffffffffffffffffffffff16612a28612d16565b73ffffffffffffffffffffffffffffffffffffffff1614612a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7590613f5d565b60405180910390fd5b5b6002811415612ba857600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401612ae3919061409d565b60206040518083038186803b158015612afb57600080fd5b505afa158015612b0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b339190613930565b73ffffffffffffffffffffffffffffffffffffffff16612b51612d16565b73ffffffffffffffffffffffffffffffffffffffff1614612ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9e90613f5d565b60405180910390fd5b5b6003811415612cd157600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401612c0c919061409d565b60206040518083038186803b158015612c2457600080fd5b505afa158015612c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5c9190613930565b73ffffffffffffffffffffffffffffffffffffffff16612c7a612d16565b73ffffffffffffffffffffffffffffffffffffffff1614612cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc790613f5d565b60405180910390fd5b5b612ce382612cdd612d16565b83612ee9565b5050565b60186020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8590613ffd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df590613f1d565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612edc919061409d565b60405180910390a3505050565b6001811415613005576011548310158015612f0657506015548311155b612f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3c9061401d565b60405180910390fd5b601860006017548152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff1615612fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb090613fdd565b60405180910390fd5b6001601860006017548152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff02191690831515021790555061300482600e546135e2565b5b600281141561312157600f54831015801561302257506013548311155b613061576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130589061401d565b60405180910390fd5b601960006017548152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16156130d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cc90613fdd565b60405180910390fd5b6001601960006017548152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff02191690831515021790555061312082600e546135e2565b5b600381141561323d57601054831015801561313e57506014548311155b61317d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131749061401d565b60405180910390fd5b601a60006017548152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16156131f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e890613fdd565b60405180910390fd5b6001601a60006017548152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff02191690831515021790555061323c82600e546135e2565b5b600481141561335957601254831015801561325a57506016548311155b613299576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132909061401d565b60405180910390fd5b601b60006017548152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff161561330d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330490613fdd565b60405180910390fd5b6001601b60006017548152602001908152602001600020600085815260200190815260200160002060006101000a81548160ff02191690831515021790555061335882600e546135e2565b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c590613fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561343e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343590613ebd565b60405180910390fd5b613449838383613807565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156134d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c790613f3d565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135659190614140565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516135c9919061409d565b60405180910390a36135dc84848461380c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136499061407d565b60405180910390fd5b61365e60008383613807565b80600360008282546136709190614140565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136c69190614140565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161372b919061409d565b60405180910390a361373f6000838361380c565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600061382461381f846140f8565b6140d3565b905080838252602082019050828560208602820111156138475761384661459e565b5b60005b85811015613877578161385d88826138d9565b84526020840193506020830192505060018101905061384a565b5050509392505050565b60008135905061389081614962565b92915050565b6000815190506138a581614962565b92915050565b600082601f8301126138c0576138bf614599565b5b81356138d0848260208601613811565b91505092915050565b6000813590506138e881614979565b92915050565b6000815190506138fd81614979565b92915050565b600060208284031215613919576139186145a8565b5b600061392784828501613881565b91505092915050565b600060208284031215613946576139456145a8565b5b600061395484828501613896565b91505092915050565b60008060408385031215613974576139736145a8565b5b600061398285828601613881565b925050602061399385828601613881565b9150509250929050565b6000806000606084860312156139b6576139b56145a8565b5b60006139c486828701613881565b93505060206139d586828701613881565b92505060406139e6868287016138d9565b9150509250925092565b60008060408385031215613a0757613a066145a8565b5b6000613a1585828601613881565b9250506020613a26858286016138d9565b9150509250929050565b600060208284031215613a4657613a456145a8565b5b600082013567ffffffffffffffff811115613a6457613a636145a3565b5b613a70848285016138ab565b91505092915050565b600060208284031215613a8f57613a8e6145a8565b5b6000613a9d848285016138d9565b91505092915050565b600060208284031215613abc57613abb6145a8565b5b6000613aca848285016138ee565b91505092915050565b60008060408385031215613aea57613ae96145a8565b5b6000613af8858286016138d9565b9250506020613b09858286016138d9565b9150509250929050565b600080600060608486031215613b2c57613b2b6145a8565b5b6000613b3a868287016138d9565b9350506020613b4b868287016138d9565b9250506040613b5c868287016138d9565b9150509250925092565b613b6f81614361565b82525050565b613b7e81614373565b82525050565b613b8d816143b6565b82525050565b613b9c816143c8565b82525050565b6000613bad82614124565b613bb7818561412f565b9350613bc78185602086016143fe565b613bd0816145ad565b840191505092915050565b6000613be860238361412f565b9150613bf3826145cb565b604082019050919050565b6000613c0b60128361412f565b9150613c168261461a565b602082019050919050565b6000613c2e60268361412f565b9150613c3982614643565b604082019050919050565b6000613c5160228361412f565b9150613c5c82614692565b604082019050919050565b6000613c7460268361412f565b9150613c7f826146e1565b604082019050919050565b6000613c9760118361412f565b9150613ca282614730565b602082019050919050565b6000613cba60288361412f565b9150613cc582614759565b604082019050919050565b6000613cdd60208361412f565b9150613ce8826147a8565b602082019050919050565b6000613d0060258361412f565b9150613d0b826147d1565b604082019050919050565b6000613d2360198361412f565b9150613d2e82614820565b602082019050919050565b6000613d4660248361412f565b9150613d5182614849565b604082019050919050565b6000613d6960158361412f565b9150613d7482614898565b602082019050919050565b6000613d8c600f8361412f565b9150613d97826148c1565b602082019050919050565b6000613daf60258361412f565b9150613dba826148ea565b604082019050919050565b6000613dd2601f8361412f565b9150613ddd82614939565b602082019050919050565b613df18161439f565b82525050565b613e00816143a9565b82525050565b6000602082019050613e1b6000830184613b66565b92915050565b6000604082019050613e366000830185613b66565b613e436020830184613de8565b9392505050565b6000602082019050613e5f6000830184613b75565b92915050565b6000602082019050613e7a6000830184613b84565b92915050565b6000602082019050613e956000830184613b93565b92915050565b60006020820190508181036000830152613eb58184613ba2565b905092915050565b60006020820190508181036000830152613ed681613bdb565b9050919050565b60006020820190508181036000830152613ef681613bfe565b9050919050565b60006020820190508181036000830152613f1681613c21565b9050919050565b60006020820190508181036000830152613f3681613c44565b9050919050565b60006020820190508181036000830152613f5681613c67565b9050919050565b60006020820190508181036000830152613f7681613c8a565b9050919050565b60006020820190508181036000830152613f9681613cad565b9050919050565b60006020820190508181036000830152613fb681613cd0565b9050919050565b60006020820190508181036000830152613fd681613cf3565b9050919050565b60006020820190508181036000830152613ff681613d16565b9050919050565b6000602082019050818103600083015261401681613d39565b9050919050565b6000602082019050818103600083015261403681613d5c565b9050919050565b6000602082019050818103600083015261405681613d7f565b9050919050565b6000602082019050818103600083015261407681613da2565b9050919050565b6000602082019050818103600083015261409681613dc5565b9050919050565b60006020820190506140b26000830184613de8565b92915050565b60006020820190506140cd6000830184613df7565b92915050565b60006140dd6140ee565b90506140e98282614463565b919050565b6000604051905090565b600067ffffffffffffffff8211156141135761411261456a565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600061414b8261439f565b91506141568361439f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561418b5761418a6144dd565b5b828201905092915050565b6000808291508390505b60018511156141e0578086048111156141bc576141bb6144dd565b5b60018516156141cb5780820291505b80810290506141d9856145be565b94506141a0565b94509492505050565b60006141f48261439f565b91506141ff836143a9565b925061422c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614234565b905092915050565b6000826142445760019050614300565b816142525760009050614300565b81600181146142685760028114614272576142a1565b6001915050614300565b60ff841115614284576142836144dd565b5b8360020a91508482111561429b5761429a6144dd565b5b50614300565b5060208310610133831016604e8410600b84101617156142d65782820a9050838111156142d1576142d06144dd565b5b614300565b6142e38484846001614196565b925090508184048111156142fa576142f96144dd565b5b81810290505b9392505050565b60006143128261439f565b915061431d8361439f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614356576143556144dd565b5b828202905092915050565b600061436c8261437f565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006143c1826143da565b9050919050565b60006143d3826143da565b9050919050565b60006143e5826143ec565b9050919050565b60006143f78261437f565b9050919050565b60005b8381101561441c578082015181840152602081019050614401565b8381111561442b576000848401525b50505050565b6000600282049050600182168061444957607f821691505b6020821081141561445d5761445c61450c565b5b50919050565b61446c826145ad565b810181811067ffffffffffffffff8211171561448b5761448a61456a565b5b80604052505050565b600061449f8261439f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144d2576144d16144dd565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f494e4445585f4f55545f4f465f52414e47450000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4d5553545f4f574e5f544f4b454e5f4944000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f474f4c445f434c41494d45445f464f525f544f4b454e5f494400000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f544f4b454e5f49445f4f55545f4f465f52414e47450000000000000000000000600082015250565b7f4e4f5f544f4b454e535f4f574e45440000000000000000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61496b81614361565b811461497657600080fd5b50565b6149828161439f565b811461498d57600080fd5b5056fea2646970667358221220ca6458263caeb74c58b050027b87affbee95f28ff7df85caaf7dc61b2aced62e64736f6c63430008070033

Deployed Bytecode Sourcemap

26908:16704:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8602:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43374:235;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10910:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32052:1951;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27303:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9722:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29764:86;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11602:529;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37049:348;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9564:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28875:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29953:90;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12540:297;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28792:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41843:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29339:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29212:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29254:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27209:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39919:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34344:2430;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27348:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40844:858;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27621:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42299:187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9893:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2480:94;;;:::i;:::-;;28100:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27070:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1829;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28749:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40279:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8821:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27490:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27164:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13340:482;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10283:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28834:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29857:87;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27444:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29492:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29297:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10562:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27855:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27586:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36804:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28405:60;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2729:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30734:1057;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29671:86;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8602:100;8656:13;8689:5;8682:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8602:100;:::o;43374:235::-;2060:12;:10;:12::i;:::-;2049:23;;:7;:5;:7::i;:::-;:23;;;2041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43521:21:::1;43534:7;43521:12;:21::i;:::-;43553:48;43579:21;43553:25;:48::i;:::-;43374:235:::0;;:::o;10910:210::-;11029:4;11051:39;11060:12;:10;:12::i;:::-;11074:7;11083:6;11051:8;:39::i;:::-;11108:4;11101:11;;10910:210;;;;:::o;32052:1951::-;32140:1;32126:10;:15;:34;;;;32159:1;32145:10;:15;32126:34;:53;;;;32178:1;32164:10;:15;32126:53;32118:62;;;;;;32230:1;32216:10;:15;32212:561;;;32248:25;32276:11;;;;;;;;;;;:21;;;32298:12;:10;:12::i;:::-;32276:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32248:63;;32354:1;32334:17;:21;32326:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;32395:9;32390:372;32414:17;32410:1;:21;32390:372;;;32582:164;32611:11;;;;;;;;;;;:31;;;32643:12;:10;:12::i;:::-;32657:1;32611:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32682:12;:10;:12::i;:::-;32717:10;32582:6;:164::i;:::-;32433:3;;;;;:::i;:::-;;;;32390:372;;;;32233:540;32212:561;32803:1;32789:10;:15;32785:561;;;32821:25;32849:11;;;;;;;;;;;:21;;;32871:12;:10;:12::i;:::-;32849:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32821:63;;32927:1;32907:17;:21;32899:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;32968:9;32963:372;32987:17;32983:1;:21;32963:372;;;33155:164;33184:11;;;;;;;;;;;:31;;;33216:12;:10;:12::i;:::-;33230:1;33184:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33255:12;:10;:12::i;:::-;33290:10;33155:6;:164::i;:::-;33006:3;;;;;:::i;:::-;;;;32963:372;;;;32806:540;32785:561;33376:1;33362:10;:15;33358:563;;;33394:25;33422:12;;;;;;;;;;;:22;;;33445:12;:10;:12::i;:::-;33422:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33394:64;;33501:1;33481:17;:21;33473:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;33542:9;33537:373;33561:17;33557:1;:21;33537:373;;;33729:165;33758:12;;;;;;;;;;;:32;;;33791:12;:10;:12::i;:::-;33805:1;33758:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33830:12;:10;:12::i;:::-;33865:10;33729:6;:165::i;:::-;33580:3;;;;;:::i;:::-;;;;33537:373;;;;33379:542;33358:563;32052:1951;:::o;27303:36::-;;;;;;;;;;;;;:::o;9722:108::-;9783:7;9810:12;;9803:19;;9722:108;:::o;29764:86::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11602:529::-;11742:4;11759:36;11769:6;11777:9;11788:6;11759:9;:36::i;:::-;11808:24;11835:11;:19;11847:6;11835:19;;;;;;;;;;;;;;;:33;11855:12;:10;:12::i;:::-;11835:33;;;;;;;;;;;;;;;;11808:60;;11921:6;11901:16;:26;;11879:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;12031:57;12040:6;12048:12;:10;:12::i;:::-;12081:6;12062:16;:25;12031:8;:57::i;:::-;12119:4;12112:11;;;11602:529;;;;;:::o;37049:348::-;37134:9;37129:261;37153:7;:14;37149:1;:18;37129:261;;;37231:13;;;;;;;;;;;:32;;;37264:7;37272:1;37264:10;;;;;;;;:::i;:::-;;;;;;;;37231:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37215:60;;:12;:10;:12::i;:::-;:60;;;37189:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;37343:35;37350:7;37358:1;37350:10;;;;;;;;:::i;:::-;;;;;;;;37362:12;:10;:12::i;:::-;37376:1;37343:6;:35::i;:::-;37169:3;;;;;:::i;:::-;;;;37129:261;;;;37049:348;:::o;9564:93::-;9622:5;9647:2;9640:9;;9564:93;:::o;28875:36::-;;;;:::o;29953:90::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12540:297::-;12655:4;12677:130;12700:12;:10;:12::i;:::-;12727:7;12786:10;12749:11;:25;12761:12;:10;:12::i;:::-;12749:25;;;;;;;;;;;;;;;:34;12775:7;12749:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;12677:8;:130::i;:::-;12825:4;12818:11;;12540:297;;;;:::o;28792:35::-;;;;:::o;41843:91::-;2060:12;:10;:12::i;:::-;2049:23;;:7;:5;:7::i;:::-;:23;;;2041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41919:7:::1;41910:6;:16;;;;41843:91:::0;:::o;29339:37::-;;;;:::o;29212:35::-;;;;:::o;29254:36::-;;;;:::o;27209:87::-;;;;;;;;;;;;;:::o;39919:136::-;2060:12;:10;:12::i;:::-;2049:23;;:7;:5;:7::i;:::-;:23;;;2041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39994:53:::1;40000:7;:5;:7::i;:::-;40035:10;:8;:10::i;:::-;40031:2;:14;;;;:::i;:::-;40009:18;:37;;;;:::i;:::-;39994:5;:53::i;:::-;39919:136:::0;:::o;34344:2430::-;34516:1;34502:10;:15;:34;;;;34535:1;34521:10;:15;34502:34;:53;;;;34554:1;34540:10;:15;34502:53;34494:62;;;;;;34587:1;34573:10;:15;34569:724;;;34605:25;34633:11;;;;;;;;;;;:21;;;34655:12;:10;:12::i;:::-;34633:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34605:63;;34711:1;34691:17;:21;34683:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;34792:1;34773:15;:20;;:57;;;;;34813:17;34797:13;:33;34773:57;34747:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;34904:9;34916:15;34904:27;;34899:383;34938:13;34933:1;:18;34899:383;;35102:164;35131:11;;;;;;;;;;;:31;;;35163:12;:10;:12::i;:::-;35177:1;35131:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35202:12;:10;:12::i;:::-;35237:10;35102:6;:164::i;:::-;34953:3;;;;;:::i;:::-;;;;34899:383;;;;34590:703;34569:724;35323:1;35309:10;:15;35305:724;;;35341:25;35369:11;;;;;;;;;;;:21;;;35391:12;:10;:12::i;:::-;35369:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35341:63;;35447:1;35427:17;:21;35419:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;35528:1;35509:15;:20;;:57;;;;;35549:17;35533:13;:33;35509:57;35483:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;35640:9;35652:15;35640:27;;35635:383;35674:13;35669:1;:18;35635:383;;35838:164;35867:11;;;;;;;;;;;:31;;;35899:12;:10;:12::i;:::-;35913:1;35867:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35938:12;:10;:12::i;:::-;35973:10;35838:6;:164::i;:::-;35689:3;;;;;:::i;:::-;;;;35635:383;;;;35326:703;35305:724;36059:1;36045:10;:15;36041:726;;;36077:25;36105:12;;;;;;;;;;;:22;;;36128:12;:10;:12::i;:::-;36105:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36077:64;;36184:1;36164:17;:21;36156:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;36265:1;36246:15;:20;;:57;;;;;36286:17;36270:13;:33;36246:57;36220:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;36377:9;36389:15;36377:27;;36372:384;36411:13;36406:1;:18;36372:384;;36575:165;36604:12;;;;;;;;;;;:32;;;36637:12;:10;:12::i;:::-;36651:1;36604:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36676:12;:10;:12::i;:::-;36711:10;36575:6;:165::i;:::-;36426:3;;;;;:::i;:::-;;;;36372:384;;;;36062:705;36041:726;34344:2430;;;:::o;27348:89::-;;;;;;;;;;;;;:::o;40844:858::-;2060:12;:10;:12::i;:::-;2049:23;;:7;:5;:7::i;:::-;:23;;;2041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41036:1:::1;41022:10;:15;:51;;;;41072:1;41058:10;:15;41022:51;:87;;;;41108:1;41094:10;:15;41022:87;:123;;;;41144:1;41130:10;:15;41022:123;41000:156;;;::::0;::::1;;41187:1;41173:10;:15;41169:121;;;41223:13;41205:15;:31;;;;41267:11;41251:13;:27;;;;41169:121;41320:1;41306:10;:15;41302:121;;;41356:13;41338:15;:31;;;;41400:11;41384:13;:27;;;;41302:121;41453:1;41439:10;:15;41435:123;;;41490:13;41471:16;:32;;;;41535:11;41518:14;:28;;;;41435:123;41588:1;41574:10;:15;41570:125;;;41626:13;41606:17;:33;;;;41672:11;41654:15;:29;;;;41570:125;40844:858:::0;;;:::o;27621:226::-;2060:12;:10;:12::i;:::-;2049:23;;:7;:5;:7::i;:::-;:23;;;2041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27758:19:::1;27737:18;;:40;;;;;;;;;;;;;;;;;;27820:18;;;;;;;;;;;27788:11;;:51;;;;;;;;;;;;;;;;;;27621:226:::0;:::o;42299:187::-;2060:12;:10;:12::i;:::-;2049:23;;:7;:5;:7::i;:::-;:23;;;2041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42467:10:::1;:8;:10::i;:::-;42463:2;:14;;;;:::i;:::-;42438:21;:40;;;;:::i;:::-;42416:19;:62;;;;42299:187:::0;:::o;9893:177::-;10012:7;10044:9;:18;10054:7;10044:18;;;;;;;;;;;;;;;;10037:25;;9893:177;;;:::o;2480:94::-;2060:12;:10;:12::i;:::-;2049:23;;:7;:5;:7::i;:::-;:23;;;2041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2545:21:::1;2563:1;2545:9;:21::i;:::-;2480:94::o:0;28100:226::-;2060:12;:10;:12::i;:::-;2049:23;;:7;:5;:7::i;:::-;:23;;;2041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28243:21:::1;28220:20;;:44;;;;;;;;;;;;;;;;;;28297:20;;;;;;;;;;;28275:13;;:43;;;;;;;;;;;;;;;;;;28100:226:::0;:::o;27070:87::-;;;;;;;;;;;;;:::o;1829:::-;1875:7;1902:6;;;;;;;;;;;1895:13;;1829:87;:::o;28749:36::-;;;;:::o;40279:226::-;2060:12;:10;:12::i;:::-;2049:23;;:7;:5;:7::i;:::-;:23;;;2041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40416:19:::1;40395:18;;:40;;;;;;;;;;;;;;;;;;40478:18;;;;;;;;;;;40446:11;;:51;;;;;;;;;;;;;;;;;;40279:226:::0;:::o;8821:104::-;8877:13;8910:7;8903:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8821:104;:::o;27490:89::-;;;;;;;;;;;;;:::o;27164:36::-;;;;;;;;;;;;;:::o;13340:482::-;13460:4;13482:24;13509:11;:25;13521:12;:10;:12::i;:::-;13509:25;;;;;;;;;;;;;;;:34;13535:7;13509:34;;;;;;;;;;;;;;;;13482:61;;13596:15;13576:16;:35;;13554:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;13712:67;13721:12;:10;:12::i;:::-;13735:7;13763:15;13744:16;:34;13712:8;:67::i;:::-;13810:4;13803:11;;;13340:482;;;;:::o;10283:216::-;10405:4;10427:42;10437:12;:10;:12::i;:::-;10451:9;10462:6;10427:9;:42::i;:::-;10487:4;10480:11;;10283:216;;;;:::o;28834:34::-;;;;:::o;29857:87::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27444:37::-;;;;;;;;;;;;;:::o;29492:25::-;;;;:::o;29297:35::-;;;;:::o;10562:201::-;10696:7;10728:11;:18;10740:5;10728:18;;;;;;;;;;;;;;;:27;10747:7;10728:27;;;;;;;;;;;;;;;;10721:34;;10562:201;;;;:::o;27855:237::-;2060:12;:10;:12::i;:::-;2049:23;;:7;:5;:7::i;:::-;:23;;;2041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27998:21:::1;27975:20;;:44;;;;;;;;;;;;;;;;;;28063:20;;;;;;;;;;;28030:12;;:54;;;;;;;;;;;;;;;;;;27855:237:::0;:::o;27586:26::-;;;;;;;;;;;;;:::o;36804:237::-;36904:13;;;;;;;;;;;:32;;;36937:7;36904:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36888:57;;:12;:10;:12::i;:::-;:57;;;36866:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37001:32;37008:7;37017:12;:10;:12::i;:::-;37031:1;37001:6;:32::i;:::-;36804:237;:::o;28405:60::-;;;;:::o;2729:229::-;2060:12;:10;:12::i;:::-;2049:23;;:7;:5;:7::i;:::-;:23;;;2041:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2852:1:::1;2832:22;;:8;:22;;;;2810:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2931:19;2941:8;2931:9;:19::i;:::-;2729:229:::0;:::o;30734:1057::-;31030:1;31016:10;:15;:34;;;;31049:1;31035:10;:15;31016:34;:53;;;;31068:1;31054:10;:15;31016:53;31008:62;;;;;;31101:1;31087:10;:15;31083:171;;;31161:11;;;;;;;;;;;:19;;;31181:7;31161:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31145:44;;:12;:10;:12::i;:::-;:44;;;31119:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;31083:171;31284:1;31270:10;:15;31266:171;;;31344:11;;;;;;;;;;;:19;;;31364:7;31344:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31328:44;;:12;:10;:12::i;:::-;:44;;;31302:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;31266:171;31467:1;31453:10;:15;31449:172;;;31527:12;;;;;;;;;;;:20;;;31548:7;31527:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31511:45;;:12;:10;:12::i;:::-;:45;;;31485:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;31449:172;31742:41;31749:7;31758:12;:10;:12::i;:::-;31772:10;31742:6;:41::i;:::-;30734:1057;;:::o;29671:86::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;680:98::-;733:7;760:10;753:17;;680:98;:::o;17130:380::-;17283:1;17266:19;;:5;:19;;;;17258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17364:1;17345:21;;:7;:21;;;;17337:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17448:6;17418:11;:18;17430:5;17418:18;;;;;;;;;;;;;;;:27;17437:7;17418:27;;;;;;;;;;;;;;;:36;;;;17486:7;17470:32;;17479:5;17470:32;;;17495:6;17470:32;;;;;;:::i;:::-;;;;;;;;17130:380;;;:::o;37463:2121::-;37755:1;37741:10;:15;37737:447;;;37810:15;;37799:7;:26;;:54;;;;;37840:13;;37829:7;:24;;37799:54;37773:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;37952:25;:33;37978:6;;37952:33;;;;;;;;;;;:42;37986:7;37952:42;;;;;;;;;;;;;;;;;;;;;37951:43;37925:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;38115:4;38070:25;:33;38096:6;;38070:33;;;;;;;;;;;:42;38104:7;38070:42;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;38134:38;38140:10;38152:19;;38134:5;:38::i;:::-;37737:447;38214:1;38200:10;:15;38196:447;;;38269:15;;38258:7;:26;;:54;;;;;38299:13;;38288:7;:24;;38258:54;38232:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;38411:25;:33;38437:6;;38411:33;;;;;;;;;;;:42;38445:7;38411:42;;;;;;;;;;;;;;;;;;;;;38410:43;38384:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;38574:4;38529:25;:33;38555:6;;38529:33;;;;;;;;;;;:42;38563:7;38529:42;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;38593:38;38599:10;38611:19;;38593:5;:38::i;:::-;38196:447;38673:1;38659:10;:15;38655:451;;;38728:16;;38717:7;:27;;:56;;;;;38759:14;;38748:7;:25;;38717:56;38691:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;38872:26;:34;38899:6;;38872:34;;;;;;;;;;;:43;38907:7;38872:43;;;;;;;;;;;;;;;;;;;;;38871:44;38845:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;39037:4;38991:26;:34;39018:6;;38991:34;;;;;;;;;;;:43;39026:7;38991:43;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;39056:38;39062:10;39074:19;;39056:5;:38::i;:::-;38655:451;39136:1;39122:10;:15;39118:459;;;39191:17;;39180:7;:28;;:58;;;;;39223:15;;39212:7;:26;;39180:58;39154:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;39337:29;:37;39367:6;;39337:37;;;;;;;;;;;:46;39375:7;39337:46;;;;;;;;;;;;;;;;;;;;;39336:47;39310:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;39508:4;39459:29;:37;39489:6;;39459:37;;;;;;;;;;;:46;39497:7;39459:46;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;39527:38;39533:10;39545:19;;39527:5;:38::i;:::-;39118:459;37463:2121;;;:::o;14312:770::-;14470:1;14452:20;;:6;:20;;;;14444:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;14554:1;14533:23;;:9;:23;;;;14525:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14609:47;14630:6;14638:9;14649:6;14609:20;:47::i;:::-;14669:21;14693:9;:17;14703:6;14693:17;;;;;;;;;;;;;;;;14669:41;;14760:6;14743:13;:23;;14721:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;14904:6;14888:13;:22;14868:9;:17;14878:6;14868:17;;;;;;;;;;;;;;;:42;;;;14956:6;14932:9;:20;14942:9;14932:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;14997:9;14980:35;;14989:6;14980:35;;;15008:6;14980:35;;;;;;:::i;:::-;;;;;;;;15028:46;15048:6;15056:9;15067:6;15028:19;:46::i;:::-;14433:649;14312:770;;;:::o;15369:399::-;15472:1;15453:21;;:7;:21;;;;15445:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15523:49;15552:1;15556:7;15565:6;15523:20;:49::i;:::-;15601:6;15585:12;;:22;;;;;;;:::i;:::-;;;;;;;;15640:6;15618:9;:18;15628:7;15618:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;15683:7;15662:37;;15679:1;15662:37;;;15692:6;15662:37;;;;;;:::i;:::-;;;;;;;;15712:48;15740:1;15744:7;15753:6;15712:19;:48::i;:::-;15369:399;;:::o;2966:173::-;3022:16;3041:6;;;;;;;;;;;3022:25;;3067:8;3058:6;;:17;;;;;;;;;;;;;;;;;;3122:8;3091:40;;3112:8;3091:40;;;;;;;;;;;;3011:128;2966:173;:::o;18110:125::-;;;;:::o;18839:124::-;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:139::-;798:5;836:6;823:20;814:29;;852:33;879:5;852:33;:::i;:::-;752:139;;;;:::o;897:143::-;954:5;985:6;979:13;970:22;;1001:33;1028:5;1001:33;:::i;:::-;897:143;;;;:::o;1063:370::-;1134:5;1183:3;1176:4;1168:6;1164:17;1160:27;1150:122;;1191:79;;:::i;:::-;1150:122;1308:6;1295:20;1333:94;1423:3;1415:6;1408:4;1400:6;1396:17;1333:94;:::i;:::-;1324:103;;1140:293;1063:370;;;;:::o;1439:139::-;1485:5;1523:6;1510:20;1501:29;;1539:33;1566:5;1539:33;:::i;:::-;1439:139;;;;:::o;1584:143::-;1641:5;1672:6;1666:13;1657:22;;1688:33;1715:5;1688:33;:::i;:::-;1584:143;;;;:::o;1733:329::-;1792:6;1841:2;1829:9;1820:7;1816:23;1812:32;1809:119;;;1847:79;;:::i;:::-;1809:119;1967:1;1992:53;2037:7;2028:6;2017:9;2013:22;1992:53;:::i;:::-;1982:63;;1938:117;1733:329;;;;:::o;2068:351::-;2138:6;2187:2;2175:9;2166:7;2162:23;2158:32;2155:119;;;2193:79;;:::i;:::-;2155:119;2313:1;2338:64;2394:7;2385:6;2374:9;2370:22;2338:64;:::i;:::-;2328:74;;2284:128;2068:351;;;;:::o;2425:474::-;2493:6;2501;2550:2;2538:9;2529:7;2525:23;2521:32;2518:119;;;2556:79;;:::i;:::-;2518:119;2676:1;2701:53;2746:7;2737:6;2726:9;2722:22;2701:53;:::i;:::-;2691:63;;2647:117;2803:2;2829:53;2874:7;2865:6;2854:9;2850:22;2829:53;:::i;:::-;2819:63;;2774:118;2425:474;;;;;:::o;2905:619::-;2982:6;2990;2998;3047:2;3035:9;3026:7;3022:23;3018:32;3015:119;;;3053:79;;:::i;:::-;3015:119;3173:1;3198:53;3243:7;3234:6;3223:9;3219:22;3198:53;:::i;:::-;3188:63;;3144:117;3300:2;3326:53;3371:7;3362:6;3351:9;3347:22;3326:53;:::i;:::-;3316:63;;3271:118;3428:2;3454:53;3499:7;3490:6;3479:9;3475:22;3454:53;:::i;:::-;3444:63;;3399:118;2905:619;;;;;:::o;3530:474::-;3598:6;3606;3655:2;3643:9;3634:7;3630:23;3626:32;3623:119;;;3661:79;;:::i;:::-;3623:119;3781:1;3806:53;3851:7;3842:6;3831:9;3827:22;3806:53;:::i;:::-;3796:63;;3752:117;3908:2;3934:53;3979:7;3970:6;3959:9;3955:22;3934:53;:::i;:::-;3924:63;;3879:118;3530:474;;;;;:::o;4010:539::-;4094:6;4143:2;4131:9;4122:7;4118:23;4114:32;4111:119;;;4149:79;;:::i;:::-;4111:119;4297:1;4286:9;4282:17;4269:31;4327:18;4319:6;4316:30;4313:117;;;4349:79;;:::i;:::-;4313:117;4454:78;4524:7;4515:6;4504:9;4500:22;4454:78;:::i;:::-;4444:88;;4240:302;4010:539;;;;:::o;4555:329::-;4614:6;4663:2;4651:9;4642:7;4638:23;4634:32;4631:119;;;4669:79;;:::i;:::-;4631:119;4789:1;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4760:117;4555:329;;;;:::o;4890:351::-;4960:6;5009:2;4997:9;4988:7;4984:23;4980:32;4977:119;;;5015:79;;:::i;:::-;4977:119;5135:1;5160:64;5216:7;5207:6;5196:9;5192:22;5160:64;:::i;:::-;5150:74;;5106:128;4890:351;;;;:::o;5247:474::-;5315:6;5323;5372:2;5360:9;5351:7;5347:23;5343:32;5340:119;;;5378:79;;:::i;:::-;5340:119;5498:1;5523:53;5568:7;5559:6;5548:9;5544:22;5523:53;:::i;:::-;5513:63;;5469:117;5625:2;5651:53;5696:7;5687:6;5676:9;5672:22;5651:53;:::i;:::-;5641:63;;5596:118;5247:474;;;;;:::o;5727:619::-;5804:6;5812;5820;5869:2;5857:9;5848:7;5844:23;5840:32;5837:119;;;5875:79;;:::i;:::-;5837:119;5995:1;6020:53;6065:7;6056:6;6045:9;6041:22;6020:53;:::i;:::-;6010:63;;5966:117;6122:2;6148:53;6193:7;6184:6;6173:9;6169:22;6148:53;:::i;:::-;6138:63;;6093:118;6250:2;6276:53;6321:7;6312:6;6301:9;6297:22;6276:53;:::i;:::-;6266:63;;6221:118;5727:619;;;;;:::o;6352:118::-;6439:24;6457:5;6439:24;:::i;:::-;6434:3;6427:37;6352:118;;:::o;6476:109::-;6557:21;6572:5;6557:21;:::i;:::-;6552:3;6545:34;6476:109;;:::o;6591:181::-;6703:62;6759:5;6703:62;:::i;:::-;6698:3;6691:75;6591:181;;:::o;6778:157::-;6878:50;6922:5;6878:50;:::i;:::-;6873:3;6866:63;6778:157;;:::o;6941:364::-;7029:3;7057:39;7090:5;7057:39;:::i;:::-;7112:71;7176:6;7171:3;7112:71;:::i;:::-;7105:78;;7192:52;7237:6;7232:3;7225:4;7218:5;7214:16;7192:52;:::i;:::-;7269:29;7291:6;7269:29;:::i;:::-;7264:3;7260:39;7253:46;;7033:272;6941:364;;;;:::o;7311:366::-;7453:3;7474:67;7538:2;7533:3;7474:67;:::i;:::-;7467:74;;7550:93;7639:3;7550:93;:::i;:::-;7668:2;7663:3;7659:12;7652:19;;7311:366;;;:::o;7683:::-;7825:3;7846:67;7910:2;7905:3;7846:67;:::i;:::-;7839:74;;7922:93;8011:3;7922:93;:::i;:::-;8040:2;8035:3;8031:12;8024:19;;7683:366;;;:::o;8055:::-;8197:3;8218:67;8282:2;8277:3;8218:67;:::i;:::-;8211:74;;8294:93;8383:3;8294:93;:::i;:::-;8412:2;8407:3;8403:12;8396:19;;8055:366;;;:::o;8427:::-;8569:3;8590:67;8654:2;8649:3;8590:67;:::i;:::-;8583:74;;8666:93;8755:3;8666:93;:::i;:::-;8784:2;8779:3;8775:12;8768:19;;8427:366;;;:::o;8799:::-;8941:3;8962:67;9026:2;9021:3;8962:67;:::i;:::-;8955:74;;9038:93;9127:3;9038:93;:::i;:::-;9156:2;9151:3;9147:12;9140:19;;8799:366;;;:::o;9171:::-;9313:3;9334:67;9398:2;9393:3;9334:67;:::i;:::-;9327:74;;9410:93;9499:3;9410:93;:::i;:::-;9528:2;9523:3;9519:12;9512:19;;9171:366;;;:::o;9543:::-;9685:3;9706:67;9770:2;9765:3;9706:67;:::i;:::-;9699:74;;9782:93;9871:3;9782:93;:::i;:::-;9900:2;9895:3;9891:12;9884:19;;9543:366;;;:::o;9915:::-;10057:3;10078:67;10142:2;10137:3;10078:67;:::i;:::-;10071:74;;10154:93;10243:3;10154:93;:::i;:::-;10272:2;10267:3;10263:12;10256:19;;9915:366;;;:::o;10287:::-;10429:3;10450:67;10514:2;10509:3;10450:67;:::i;:::-;10443:74;;10526:93;10615:3;10526:93;:::i;:::-;10644:2;10639:3;10635:12;10628:19;;10287:366;;;:::o;10659:::-;10801:3;10822:67;10886:2;10881:3;10822:67;:::i;:::-;10815:74;;10898:93;10987:3;10898:93;:::i;:::-;11016:2;11011:3;11007:12;11000:19;;10659:366;;;:::o;11031:::-;11173:3;11194:67;11258:2;11253:3;11194:67;:::i;:::-;11187:74;;11270:93;11359:3;11270:93;:::i;:::-;11388:2;11383:3;11379:12;11372:19;;11031:366;;;:::o;11403:::-;11545:3;11566:67;11630:2;11625:3;11566:67;:::i;:::-;11559:74;;11642:93;11731:3;11642:93;:::i;:::-;11760:2;11755:3;11751:12;11744:19;;11403:366;;;:::o;11775:::-;11917:3;11938:67;12002:2;11997:3;11938:67;:::i;:::-;11931:74;;12014:93;12103:3;12014:93;:::i;:::-;12132:2;12127:3;12123:12;12116:19;;11775:366;;;:::o;12147:::-;12289:3;12310:67;12374:2;12369:3;12310:67;:::i;:::-;12303:74;;12386:93;12475:3;12386:93;:::i;:::-;12504:2;12499:3;12495:12;12488:19;;12147:366;;;:::o;12519:::-;12661:3;12682:67;12746:2;12741:3;12682:67;:::i;:::-;12675:74;;12758:93;12847:3;12758:93;:::i;:::-;12876:2;12871:3;12867:12;12860:19;;12519:366;;;:::o;12891:118::-;12978:24;12996:5;12978:24;:::i;:::-;12973:3;12966:37;12891:118;;:::o;13015:112::-;13098:22;13114:5;13098:22;:::i;:::-;13093:3;13086:35;13015:112;;:::o;13133:222::-;13226:4;13264:2;13253:9;13249:18;13241:26;;13277:71;13345:1;13334:9;13330:17;13321:6;13277:71;:::i;:::-;13133:222;;;;:::o;13361:332::-;13482:4;13520:2;13509:9;13505:18;13497:26;;13533:71;13601:1;13590:9;13586:17;13577:6;13533:71;:::i;:::-;13614:72;13682:2;13671:9;13667:18;13658:6;13614:72;:::i;:::-;13361:332;;;;;:::o;13699:210::-;13786:4;13824:2;13813:9;13809:18;13801:26;;13837:65;13899:1;13888:9;13884:17;13875:6;13837:65;:::i;:::-;13699:210;;;;:::o;13915:272::-;14033:4;14071:2;14060:9;14056:18;14048:26;;14084:96;14177:1;14166:9;14162:17;14153:6;14084:96;:::i;:::-;13915:272;;;;:::o;14193:248::-;14299:4;14337:2;14326:9;14322:18;14314:26;;14350:84;14431:1;14420:9;14416:17;14407:6;14350:84;:::i;:::-;14193:248;;;;:::o;14447:313::-;14560:4;14598:2;14587:9;14583:18;14575:26;;14647:9;14641:4;14637:20;14633:1;14622:9;14618:17;14611:47;14675:78;14748:4;14739:6;14675:78;:::i;:::-;14667:86;;14447:313;;;;:::o;14766:419::-;14932:4;14970:2;14959:9;14955:18;14947:26;;15019:9;15013:4;15009:20;15005:1;14994:9;14990:17;14983:47;15047:131;15173:4;15047:131;:::i;:::-;15039:139;;14766:419;;;:::o;15191:::-;15357:4;15395:2;15384:9;15380:18;15372:26;;15444:9;15438:4;15434:20;15430:1;15419:9;15415:17;15408:47;15472:131;15598:4;15472:131;:::i;:::-;15464:139;;15191:419;;;:::o;15616:::-;15782:4;15820:2;15809:9;15805:18;15797:26;;15869:9;15863:4;15859:20;15855:1;15844:9;15840:17;15833:47;15897:131;16023:4;15897:131;:::i;:::-;15889:139;;15616:419;;;:::o;16041:::-;16207:4;16245:2;16234:9;16230:18;16222:26;;16294:9;16288:4;16284:20;16280:1;16269:9;16265:17;16258:47;16322:131;16448:4;16322:131;:::i;:::-;16314:139;;16041:419;;;:::o;16466:::-;16632:4;16670:2;16659:9;16655:18;16647:26;;16719:9;16713:4;16709:20;16705:1;16694:9;16690:17;16683:47;16747:131;16873:4;16747:131;:::i;:::-;16739:139;;16466:419;;;:::o;16891:::-;17057:4;17095:2;17084:9;17080:18;17072:26;;17144:9;17138:4;17134:20;17130:1;17119:9;17115:17;17108:47;17172:131;17298:4;17172:131;:::i;:::-;17164:139;;16891:419;;;:::o;17316:::-;17482:4;17520:2;17509:9;17505:18;17497:26;;17569:9;17563:4;17559:20;17555:1;17544:9;17540:17;17533:47;17597:131;17723:4;17597:131;:::i;:::-;17589:139;;17316:419;;;:::o;17741:::-;17907:4;17945:2;17934:9;17930:18;17922:26;;17994:9;17988:4;17984:20;17980:1;17969:9;17965:17;17958:47;18022:131;18148:4;18022:131;:::i;:::-;18014:139;;17741:419;;;:::o;18166:::-;18332:4;18370:2;18359:9;18355:18;18347:26;;18419:9;18413:4;18409:20;18405:1;18394:9;18390:17;18383:47;18447:131;18573:4;18447:131;:::i;:::-;18439:139;;18166:419;;;:::o;18591:::-;18757:4;18795:2;18784:9;18780:18;18772:26;;18844:9;18838:4;18834:20;18830:1;18819:9;18815:17;18808:47;18872:131;18998:4;18872:131;:::i;:::-;18864:139;;18591:419;;;:::o;19016:::-;19182:4;19220:2;19209:9;19205:18;19197:26;;19269:9;19263:4;19259:20;19255:1;19244:9;19240:17;19233:47;19297:131;19423:4;19297:131;:::i;:::-;19289:139;;19016:419;;;:::o;19441:::-;19607:4;19645:2;19634:9;19630:18;19622:26;;19694:9;19688:4;19684:20;19680:1;19669:9;19665:17;19658:47;19722:131;19848:4;19722:131;:::i;:::-;19714:139;;19441:419;;;:::o;19866:::-;20032:4;20070:2;20059:9;20055:18;20047:26;;20119:9;20113:4;20109:20;20105:1;20094:9;20090:17;20083:47;20147:131;20273:4;20147:131;:::i;:::-;20139:139;;19866:419;;;:::o;20291:::-;20457:4;20495:2;20484:9;20480:18;20472:26;;20544:9;20538:4;20534:20;20530:1;20519:9;20515:17;20508:47;20572:131;20698:4;20572:131;:::i;:::-;20564:139;;20291:419;;;:::o;20716:::-;20882:4;20920:2;20909:9;20905:18;20897:26;;20969:9;20963:4;20959:20;20955:1;20944:9;20940:17;20933:47;20997:131;21123:4;20997:131;:::i;:::-;20989:139;;20716:419;;;:::o;21141:222::-;21234:4;21272:2;21261:9;21257:18;21249:26;;21285:71;21353:1;21342:9;21338:17;21329:6;21285:71;:::i;:::-;21141:222;;;;:::o;21369:214::-;21458:4;21496:2;21485:9;21481:18;21473:26;;21509:67;21573:1;21562:9;21558:17;21549:6;21509:67;:::i;:::-;21369:214;;;;:::o;21589:129::-;21623:6;21650:20;;:::i;:::-;21640:30;;21679:33;21707:4;21699:6;21679:33;:::i;:::-;21589:129;;;:::o;21724:75::-;21757:6;21790:2;21784:9;21774:19;;21724:75;:::o;21805:311::-;21882:4;21972:18;21964:6;21961:30;21958:56;;;21994:18;;:::i;:::-;21958:56;22044:4;22036:6;22032:17;22024:25;;22104:4;22098;22094:15;22086:23;;21805:311;;;:::o;22122:99::-;22174:6;22208:5;22202:12;22192:22;;22122:99;;;:::o;22227:169::-;22311:11;22345:6;22340:3;22333:19;22385:4;22380:3;22376:14;22361:29;;22227:169;;;;:::o;22402:305::-;22442:3;22461:20;22479:1;22461:20;:::i;:::-;22456:25;;22495:20;22513:1;22495:20;:::i;:::-;22490:25;;22649:1;22581:66;22577:74;22574:1;22571:81;22568:107;;;22655:18;;:::i;:::-;22568:107;22699:1;22696;22692:9;22685:16;;22402:305;;;;:::o;22713:848::-;22774:5;22781:4;22805:6;22796:15;;22829:5;22820:14;;22843:712;22864:1;22854:8;22851:15;22843:712;;;22959:4;22954:3;22950:14;22944:4;22941:24;22938:50;;;22968:18;;:::i;:::-;22938:50;23018:1;23008:8;23004:16;23001:451;;;23433:4;23426:5;23422:16;23413:25;;23001:451;23483:4;23477;23473:15;23465:23;;23513:32;23536:8;23513:32;:::i;:::-;23501:44;;22843:712;;;22713:848;;;;;;;:::o;23567:281::-;23625:5;23649:23;23667:4;23649:23;:::i;:::-;23641:31;;23693:25;23709:8;23693:25;:::i;:::-;23681:37;;23737:104;23774:66;23764:8;23758:4;23737:104;:::i;:::-;23728:113;;23567:281;;;;:::o;23854:1073::-;23908:5;24099:8;24089:40;;24120:1;24111:10;;24122:5;;24089:40;24148:4;24138:36;;24165:1;24156:10;;24167:5;;24138:36;24234:4;24282:1;24277:27;;;;24318:1;24313:191;;;;24227:277;;24277:27;24295:1;24286:10;;24297:5;;;24313:191;24358:3;24348:8;24345:17;24342:43;;;24365:18;;:::i;:::-;24342:43;24414:8;24411:1;24407:16;24398:25;;24449:3;24442:5;24439:14;24436:40;;;24456:18;;:::i;:::-;24436:40;24489:5;;;24227:277;;24613:2;24603:8;24600:16;24594:3;24588:4;24585:13;24581:36;24563:2;24553:8;24550:16;24545:2;24539:4;24536:12;24532:35;24516:111;24513:246;;;24669:8;24663:4;24659:19;24650:28;;24704:3;24697:5;24694:14;24691:40;;;24711:18;;:::i;:::-;24691:40;24744:5;;24513:246;24784:42;24822:3;24812:8;24806:4;24803:1;24784:42;:::i;:::-;24769:57;;;;24858:4;24853:3;24849:14;24842:5;24839:25;24836:51;;;24867:18;;:::i;:::-;24836:51;24916:4;24909:5;24905:16;24896:25;;23854:1073;;;;;;:::o;24933:348::-;24973:7;24996:20;25014:1;24996:20;:::i;:::-;24991:25;;25030:20;25048:1;25030:20;:::i;:::-;25025:25;;25218:1;25150:66;25146:74;25143:1;25140:81;25135:1;25128:9;25121:17;25117:105;25114:131;;;25225:18;;:::i;:::-;25114:131;25273:1;25270;25266:9;25255:20;;24933:348;;;;:::o;25287:96::-;25324:7;25353:24;25371:5;25353:24;:::i;:::-;25342:35;;25287:96;;;:::o;25389:90::-;25423:7;25466:5;25459:13;25452:21;25441:32;;25389:90;;;:::o;25485:126::-;25522:7;25562:42;25555:5;25551:54;25540:65;;25485:126;;;:::o;25617:77::-;25654:7;25683:5;25672:16;;25617:77;;;:::o;25700:86::-;25735:7;25775:4;25768:5;25764:16;25753:27;;25700:86;;;:::o;25792:151::-;25867:9;25900:37;25931:5;25900:37;:::i;:::-;25887:50;;25792:151;;;:::o;25949:139::-;26012:9;26045:37;26076:5;26045:37;:::i;:::-;26032:50;;25949:139;;;:::o;26094:126::-;26144:9;26177:37;26208:5;26177:37;:::i;:::-;26164:50;;26094:126;;;:::o;26226:113::-;26276:9;26309:24;26327:5;26309:24;:::i;:::-;26296:37;;26226:113;;;:::o;26345:307::-;26413:1;26423:113;26437:6;26434:1;26431:13;26423:113;;;26522:1;26517:3;26513:11;26507:18;26503:1;26498:3;26494:11;26487:39;26459:2;26456:1;26452:10;26447:15;;26423:113;;;26554:6;26551:1;26548:13;26545:101;;;26634:1;26625:6;26620:3;26616:16;26609:27;26545:101;26394:258;26345:307;;;:::o;26658:320::-;26702:6;26739:1;26733:4;26729:12;26719:22;;26786:1;26780:4;26776:12;26807:18;26797:81;;26863:4;26855:6;26851:17;26841:27;;26797:81;26925:2;26917:6;26914:14;26894:18;26891:38;26888:84;;;26944:18;;:::i;:::-;26888:84;26709:269;26658:320;;;:::o;26984:281::-;27067:27;27089:4;27067:27;:::i;:::-;27059:6;27055:40;27197:6;27185:10;27182:22;27161:18;27149:10;27146:34;27143:62;27140:88;;;27208:18;;:::i;:::-;27140:88;27248:10;27244:2;27237:22;27027:238;26984:281;;:::o;27271:233::-;27310:3;27333:24;27351:5;27333:24;:::i;:::-;27324:33;;27379:66;27372:5;27369:77;27366:103;;;27449:18;;:::i;:::-;27366:103;27496:1;27489:5;27485:13;27478:20;;27271:233;;;:::o;27510:180::-;27558:77;27555:1;27548:88;27655:4;27652:1;27645:15;27679:4;27676:1;27669:15;27696:180;27744:77;27741:1;27734:88;27841:4;27838:1;27831:15;27865:4;27862:1;27855:15;27882:180;27930:77;27927:1;27920:88;28027:4;28024:1;28017:15;28051:4;28048:1;28041:15;28068:180;28116:77;28113:1;28106:88;28213:4;28210:1;28203:15;28237:4;28234:1;28227:15;28254:117;28363:1;28360;28353:12;28377:117;28486:1;28483;28476:12;28500:117;28609:1;28606;28599:12;28623:117;28732:1;28729;28722:12;28746:102;28787:6;28838:2;28834:7;28829:2;28822:5;28818:14;28814:28;28804:38;;28746:102;;;:::o;28854:::-;28896:8;28943:5;28940:1;28936:13;28915:34;;28854:102;;;:::o;28962:222::-;29102:34;29098:1;29090:6;29086:14;29079:58;29171:5;29166:2;29158:6;29154:15;29147:30;28962:222;:::o;29190:168::-;29330:20;29326:1;29318:6;29314:14;29307:44;29190:168;:::o;29364:225::-;29504:34;29500:1;29492:6;29488:14;29481:58;29573:8;29568:2;29560:6;29556:15;29549:33;29364:225;:::o;29595:221::-;29735:34;29731:1;29723:6;29719:14;29712:58;29804:4;29799:2;29791:6;29787:15;29780:29;29595:221;:::o;29822:225::-;29962:34;29958:1;29950:6;29946:14;29939:58;30031:8;30026:2;30018:6;30014:15;30007:33;29822:225;:::o;30053:167::-;30193:19;30189:1;30181:6;30177:14;30170:43;30053:167;:::o;30226:227::-;30366:34;30362:1;30354:6;30350:14;30343:58;30435:10;30430:2;30422:6;30418:15;30411:35;30226:227;:::o;30459:182::-;30599:34;30595:1;30587:6;30583:14;30576:58;30459:182;:::o;30647:224::-;30787:34;30783:1;30775:6;30771:14;30764:58;30856:7;30851:2;30843:6;30839:15;30832:32;30647:224;:::o;30877:175::-;31017:27;31013:1;31005:6;31001:14;30994:51;30877:175;:::o;31058:223::-;31198:34;31194:1;31186:6;31182:14;31175:58;31267:6;31262:2;31254:6;31250:15;31243:31;31058:223;:::o;31287:171::-;31427:23;31423:1;31415:6;31411:14;31404:47;31287:171;:::o;31464:165::-;31604:17;31600:1;31592:6;31588:14;31581:41;31464:165;:::o;31635:224::-;31775:34;31771:1;31763:6;31759:14;31752:58;31844:7;31839:2;31831:6;31827:15;31820:32;31635:224;:::o;31865:181::-;32005:33;32001:1;31993:6;31989:14;31982:57;31865:181;:::o;32052:122::-;32125:24;32143:5;32125:24;:::i;:::-;32118:5;32115:35;32105:63;;32164:1;32161;32154:12;32105:63;32052:122;:::o;32180:::-;32253:24;32271:5;32253:24;:::i;:::-;32246:5;32243:35;32233:63;;32292:1;32289;32282:12;32233:63;32180:122;:::o

Swarm Source

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