ETH Price: $3,631.83 (-2.07%)

Token

Moshi Mochi (MOSHI)
 

Overview

Max Total Supply

8,000 MOSHI

Holders

3,600

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MOSHI
0x614b4ad8e86f46c1b23b7bb927661eb3339022d3
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A collection of 8,000 squishy little Mochis wandering the Ethereum blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MoshiMochi

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-29
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.11;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.11;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.11;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.11;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.11;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev 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 {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.11;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.11;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.11;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.11;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.11;


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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.11;


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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.11;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: contracts/Mochi/ERC721P.sol


pragma solidity ^0.8.10;

abstract contract ERC721P is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    string private _name;
    string private _symbol;
    address[] internal _owners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;     
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }     
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        uint count = 0;
        uint length = _owners.length;
        for( uint i = 0; i < length; ++i ){
          if( owner == _owners[i] ){
            ++count;
          }
        }
        delete length;
        return count;
    }
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721P.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }     
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }
	function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }
	function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721P.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }
	function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }
	function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }
	function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);
        _owners.push(to);

        emit Transfer(address(0), to, tokenId);
    }
	function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721P.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }
	function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721P.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
	function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721P.ownerOf(tokenId), to, tokenId);
    }
	function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
	function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}
// File: contracts/Mochi/ERC721Enum.sol


pragma solidity ^0.8.10;


abstract contract ERC721Enum is ERC721P, IERC721Enumerable {
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721P) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) {
        require(index < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint count;
        for( uint i; i < _owners.length; ++i ){
            if( owner == _owners[i] ){
                if( count == index )
                    return i;
                else
                    ++count;
            }
        }
        require(false, "ERC721Enum: owner ioob");
    }
    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        require(0 < ERC721P.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }
    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enum.totalSupply(), "ERC721Enum: global ioob");
        return index;
    }
}
// File: contracts/moshimochi.sol


pragma solidity ^0.8.11;


contract MoshiMochi is ERC721Enum, Ownable, ReentrancyGuard {
	using Strings for uint256;
	string private baseURI;
	bool public revealed = false;
	string public baseExtension =".json";
    string public notRevealedUri;
	uint256 public reserved = 80;
	
	//Sale Settings
	uint256 public cost = 0.035 ether;
	uint256 public maxSupply = 8000;
	uint256 public maxMint = 10;
	bool public publicSaleOpen = false; // Sale is not active
    bool public preSaleIsActive = false; // Presale is not active

	// Whitelist Sale Settings
	bytes32 public merkleRoot = ""; // Construct this from (address, amount) tuple elements
	mapping(address => uint) public whitelistRemaining; // // Maps user address to their remaining mints if they have minted some but not all of their allocation
	mapping(address => bool) public whitelistClaimed; // Maps user address to bool, true if user has minted
	uint256 public constant maxMintAmount = 5; //Reserved for WLs 5 Per TX
	

	event Mint(address indexed owner, uint indexed tokenId);

	constructor(
	string memory _initBaseURI,
    string memory _initNotRevealedUri) 
    ERC721P("Moshi Mochi", "MOSHI") {
        setBaseURI(_initBaseURI);
        setNotRevealedURI(_initNotRevealedUri);
    }

	function _baseURI() internal view virtual returns (string memory) {
	return baseURI;
	}

    // Sale active/inactive

	function setPublicSale(bool val) public onlyOwner {
        publicSaleOpen = val;
    }

    function setPreSale(bool val) public onlyOwner {
        preSaleIsActive = val;
    }

	// Minting Functionalities -- Public Sale & Sale Reservations for the Project

	function mint(uint256 amount) public payable nonReentrant{
	require(publicSaleOpen, "Sale is not Active" );
	uint256 s = totalSupply();
	require(amount > 0, "need to mint at least 1" );
	require(amount <= maxMint, "max mint amount per session exceeded");
	require(s + amount <= maxSupply, "max NFT limit exceeded" );
	require(msg.value >= cost * amount, "Value is over or under price.");
	for (uint256 i = 0; i < amount; ++i) {
	_safeMint(msg.sender, s + i, "");
	}
	}

	function mintReserved(uint256 _amount) public onlyOwner {
        // Limited to a publicly set amount
        require( _amount <= reserved, "Can't reserve more than set amount" );
        reserved -= _amount;
        uint256 s = totalSupply();
        for(uint256 i; i < _amount; i++){
            _safeMint( msg.sender, s + i );
        }
        delete s;
	}
    

    function whitelistMint(uint amount, bytes32 leaf, bytes32[] memory proof) external payable {
        require(preSaleIsActive, "Sale is not Active" );
    // Verify that (msg.sender, amount) correspond to Merkle leaf
    require(keccak256(abi.encodePacked(msg.sender)) == leaf, "Sender and amount don't match Merkle leaf");

     // Verify that (leaf, proof) matches the Merkle root
     require(verify(merkleRoot, leaf, proof), "Not a valid leaf in the Merkle tree");


    uint256 s = totalSupply();
    require(s + amount <= maxSupply, "Sold out");
    require(amount <= maxMintAmount, "Surpasses maxMintAmount");

    // Require nonzero amount
    require(amount > 0, "Can't mint zero");

    // Check proper amount sent
    require(msg.value == amount * cost, "Send proper ETH amount");

    require(whitelistRemaining[msg.sender] + amount <= maxMintAmount, "Can't mint more than remaining allocation");

    whitelistRemaining[msg.sender] += amount;

    for (uint256 i = 0; i < amount; ++i) {
    _safeMint(msg.sender, s + i, "");
    }
	}

	function verify(bytes32 _merkleRoot, bytes32 leaf, bytes32[] memory proof) public pure returns (bool) {
        return MerkleProof.verify(proof, _merkleRoot, leaf);
    }

    // baseURIs

	function reveal() public onlyOwner() {
      revealed = true;
	  }
	  
	  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }

	function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
	baseURI = _newBaseURI;
	}

	//General

	function setCost(uint256 _newCost) public onlyOwner {
	cost = _newCost;
	}

	function setMaxMintAmount(uint256 _newMaxMintAmount) public onlyOwner {
	maxMint = _newMaxMintAmount;
	}

	function setmaxSupply(uint256 _newMaxSupply) public onlyOwner {
	maxSupply = _newMaxSupply;
	}

	function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

	function withdraw() public payable onlyOwner {
    (bool mm, ) = payable(owner()).call{value: address(this).balance}("");
    require(mm);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setmaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6008805460ff1916905560c06040526005608081905264173539b7b760d91b60a09081526200003291600991906200024d565b506050600b55667c585087238000600c55611f40600d55600a600e55600f805461ffff1916905560006010553480156200006b57600080fd5b5060405162003bc338038062003bc38339810160408190526200008e91620003c0565b604080518082018252600b81526a4d6f736869204d6f63686960a81b6020808301918252835180850190945260058452644d4f53484960d81b908401528151919291620000de916000916200024d565b508051620000f49060019060208401906200024d565b505050620001116200010b6200013460201b60201c565b62000138565b600160065562000121826200018a565b6200012c81620001f2565b505062000467565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620001d95760405162461bcd60e51b8152602060048201819052602482015260008051602062003ba383398151915260448201526064015b60405180910390fd5b8051620001ee9060079060208401906200024d565b5050565b6005546001600160a01b031633146200023d5760405162461bcd60e51b8152602060048201819052602482015260008051602062003ba38339815191526044820152606401620001d0565b8051620001ee90600a9060208401905b8280546200025b906200042a565b90600052602060002090601f0160209004810192826200027f5760008555620002ca565b82601f106200029a57805160ff1916838001178555620002ca565b82800160010185558215620002ca579182015b82811115620002ca578251825591602001919060010190620002ad565b50620002d8929150620002dc565b5090565b5b80821115620002d85760008155600101620002dd565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200031b57600080fd5b81516001600160401b0380821115620003385762000338620002f3565b604051601f8301601f19908116603f01168101908282118183101715620003635762000363620002f3565b816040528381526020925086838588010111156200038057600080fd5b600091505b83821015620003a4578582018301518183018401529082019062000385565b83821115620003b65760008385830101525b9695505050505050565b60008060408385031215620003d457600080fd5b82516001600160401b0380821115620003ec57600080fd5b620003fa8683870162000309565b935060208501519150808211156200041157600080fd5b50620004208582860162000309565b9150509250929050565b600181811c908216806200043f57607f821691505b602082108114156200046157634e487b7160e01b600052602260045260246000fd5b50919050565b61372c80620004776000396000f3fe6080604052600436106103085760003560e01c80636352211e1161019a578063b88d4fde116100e1578063e63ec9471161008a578063f2fde38b11610064578063f2fde38b14610896578063f9e23799146108b6578063fe60d12c146108d057600080fd5b8063e63ec947146107f3578063e985e9c514610820578063f2c4ce1e1461087657600080fd5b8063cebbaf55116100bb578063cebbaf551461079a578063d5abeb01146107ad578063db4bec44146107c357600080fd5b8063b88d4fde14610745578063c668286214610765578063c87b56dd1461077a57600080fd5b80638da5cb5b11610143578063a0712d681161011d578063a0712d68146106fd578063a22cb46514610710578063a475b5dd1461073057600080fd5b80638da5cb5b1461069d57806395d89b41146106c85780639a5d140b146106dd57600080fd5b80637501f741116101745780637501f7411461063a5780637cb64759146106505780638462151c1461067057600080fd5b80636352211e146105e557806370a0823114610605578063715018a61461062557600080fd5b8063239c70ae1161025e57806342842e0e1161020757806351830227116101e1578063518302271461058b57806355f804b3146105a55780635aca1bb6146105c557600080fd5b806342842e0e1461052b57806344a0d68a1461054b5780634f6ccce71461056b57600080fd5b80632f745c59116102385780632f745c59146104e35780633423e548146105035780633ccfd60b1461052357600080fd5b8063239c70ae1461049857806323b872dd146104ad5780632eb4a7ab146104cd57600080fd5b8063095ea7b3116102c057806318160ddd1161029a57806318160ddd146104445780631f0234d814610459578063228025e81461047857600080fd5b8063095ea7b3146103e05780630d95ccc91461040057806313faede61461042057600080fd5b8063081812fc116102f1578063081812fc14610364578063081c8c44146103a9578063088a4ed0146103be57600080fd5b806301ffc9a71461030d57806306fdde0314610342575b600080fd5b34801561031957600080fd5b5061032d610328366004612f29565b6108e6565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b50610357610942565b6040516103399190612fbc565b34801561037057600080fd5b5061038461037f366004612fcf565b6109d4565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610339565b3480156103b557600080fd5b50610357610a7f565b3480156103ca57600080fd5b506103de6103d9366004612fcf565b610b0d565b005b3480156103ec57600080fd5b506103de6103fb366004613011565b610b79565b34801561040c57600080fd5b506103de61041b36600461304b565b610cd2565b34801561042c57600080fd5b50610436600c5481565b604051908152602001610339565b34801561045057600080fd5b50600254610436565b34801561046557600080fd5b50600f5461032d90610100900460ff1681565b34801561048457600080fd5b506103de610493366004612fcf565b610d70565b3480156104a457600080fd5b50610436600581565b3480156104b957600080fd5b506103de6104c8366004613066565b610ddc565b3480156104d957600080fd5b5061043660105481565b3480156104ef57600080fd5b506104366104fe366004613011565b610e63565b34801561050f57600080fd5b5061032d61051e3660046131a0565b610f7f565b6103de610f94565b34801561053757600080fd5b506103de610546366004613066565b611089565b34801561055757600080fd5b506103de610566366004612fcf565b6110a4565b34801561057757600080fd5b50610436610586366004612fcf565b611110565b34801561059757600080fd5b5060085461032d9060ff1681565b3480156105b157600080fd5b506103de6105c0366004613266565b61116d565b3480156105d157600080fd5b506103de6105e036600461304b565b6111eb565b3480156105f157600080fd5b50610384610600366004612fcf565b611283565b34801561061157600080fd5b506104366106203660046132af565b611330565b34801561063157600080fd5b506103de61142f565b34801561064657600080fd5b50610436600e5481565b34801561065c57600080fd5b506103de61066b366004612fcf565b6114a2565b34801561067c57600080fd5b5061069061068b3660046132af565b61150e565b60405161033991906132ca565b3480156106a957600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff16610384565b3480156106d457600080fd5b50610357611608565b3480156106e957600080fd5b506103de6106f8366004612fcf565b611617565b6103de61070b366004612fcf565b611740565b34801561071c57600080fd5b506103de61072b36600461330e565b6119be565b34801561073c57600080fd5b506103de611abb565b34801561075157600080fd5b506103de610760366004613341565b611b4f565b34801561077157600080fd5b50610357611bdd565b34801561078657600080fd5b50610357610795366004612fcf565b611bea565b6103de6107a83660046131a0565b611d62565b3480156107b957600080fd5b50610436600d5481565b3480156107cf57600080fd5b5061032d6107de3660046132af565b60126020526000908152604090205460ff1681565b3480156107ff57600080fd5b5061043661080e3660046132af565b60116020526000908152604090205481565b34801561082c57600080fd5b5061032d61083b3660046133bd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561088257600080fd5b506103de610891366004613266565b612140565b3480156108a257600080fd5b506103de6108b13660046132af565b6121ba565b3480156108c257600080fd5b50600f5461032d9060ff1681565b3480156108dc57600080fd5b50610436600b5481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061093c575061093c826122b3565b92915050565b606060008054610951906133e7565b80601f016020809104026020016040519081016040528092919081815260200182805461097d906133e7565b80156109ca5780601f1061099f576101008083540402835291602001916109ca565b820191906000526020600020905b8154815290600101906020018083116109ad57829003601f168201915b5050505050905090565b60006109df82612396565b610a565760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600a8054610a8c906133e7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab8906133e7565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b60055473ffffffffffffffffffffffffffffffffffffffff163314610b745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600e55565b6000610b8482611283565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c285760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b3373ffffffffffffffffffffffffffffffffffffffff82161480610c515750610c51813361083b565b610cc35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a4d565b610ccd83836123fa565b505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610d395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600f8054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314610dd75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600d55565b610de6338261249a565b610e585760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a4d565b610ccd8383836125d2565b6000610e6e83611330565b8210610ebc5760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a4d565b6000805b600254811015610f365760028181548110610edd57610edd61343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff86811691161415610f265783821415610f1a57915061093c9050565b610f2382613499565b91505b610f2f81613499565b9050610ec0565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a4d565b6000610f8c8285856127a1565b949350505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610ffb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600061101c60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff164760405160006040518083038185875af1925050503d8060008114611073576040519150601f19603f3d011682016040523d82523d6000602084013e611078565b606091505b505090508061108657600080fd5b50565b610ccd83838360405180602001604052806000815250611b4f565b60055473ffffffffffffffffffffffffffffffffffffffff16331461110b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600c55565b600061111b60025490565b82106111695760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f620000000000000000006044820152606401610a4d565b5090565b60055473ffffffffffffffffffffffffffffffffffffffff1633146111d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b80516111e7906007906020840190612e6b565b5050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146112525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600080600283815481106112995761129961343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508061093c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a4d565b600073ffffffffffffffffffffffffffffffffffffffff82166113bb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a4d565b600254600090815b8181101561142657600281815481106113de576113de61343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff868116911614156114165761141383613499565b92505b61141f81613499565b90506113c3565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146114965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b6114a060006127b7565b565b60055473ffffffffffffffffffffffffffffffffffffffff1633146115095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b601055565b606061151982611330565b6000106115685760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a4d565b600061157383611330565b905060008167ffffffffffffffff811115611590576115906130a2565b6040519080825280602002602001820160405280156115b9578160200160208202803683370190505b50905060005b82811015611600576115d18582610e63565b8282815181106115e3576115e361343b565b6020908102919091010152806115f881613499565b9150506115bf565b509392505050565b606060018054610951906133e7565b60055473ffffffffffffffffffffffffffffffffffffffff16331461167e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600b548111156116f65760405162461bcd60e51b815260206004820152602260248201527f43616e27742072657365727665206d6f7265207468616e2073657420616d6f7560448201527f6e740000000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b80600b600082825461170891906134d2565b909155505060025460005b82811015610ccd5761172e3361172983856134e9565b61282e565b8061173881613499565b915050611713565b600260065414156117935760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a4d565b6002600655600f5460ff166117ea5760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f742041637469766500000000000000000000000000006044820152606401610a4d565b60006117f560025490565b9050600082116118475760405162461bcd60e51b815260206004820152601760248201527f6e65656420746f206d696e74206174206c6561737420310000000000000000006044820152606401610a4d565b600e548211156118be5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560448201527f65646564000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b600d546118cb83836134e9565b11156119195760405162461bcd60e51b815260206004820152601660248201527f6d6178204e4654206c696d6974206578636565646564000000000000000000006044820152606401610a4d565b81600c546119279190613501565b3410156119765760405162461bcd60e51b815260206004820152601d60248201527f56616c7565206973206f766572206f7220756e6465722070726963652e0000006044820152606401610a4d565b60005b828110156119b4576119a43361198f83856134e9565b60405180602001604052806000815250612844565b6119ad81613499565b9050611979565b5050600160065550565b73ffffffffffffffffffffffffffffffffffffffff8216331415611a245760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a4d565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611b225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b611b59338361249a565b611bcb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a4d565b611bd7848484846128cd565b50505050565b60098054610a8c906133e7565b6060611bf582612396565b611c675760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a4d565b60085460ff16611d0357600a8054611c7e906133e7565b80601f0160208091040260200160405190810160405280929190818152602001828054611caa906133e7565b8015611cf75780601f10611ccc57610100808354040283529160200191611cf7565b820191906000526020600020905b815481529060010190602001808311611cda57829003601f168201915b50505050509050919050565b6000611d0d612956565b90506000815111611d2d5760405180602001604052806000815250611d5b565b80611d3784612965565b6009604051602001611d4b9392919061353e565b6040516020818303038152906040525b9392505050565b600f54610100900460ff16611db95760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f742041637469766500000000000000000000000000006044820152606401610a4d565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015282906034016040516020818303038152906040528051906020012014611e755760405162461bcd60e51b815260206004820152602960248201527f53656e64657220616e6420616d6f756e7420646f6e2774206d61746368204d6560448201527f726b6c65206c65616600000000000000000000000000000000000000000000006064820152608401610a4d565b611e826010548383610f7f565b611ef45760405162461bcd60e51b815260206004820152602360248201527f4e6f7420612076616c6964206c65616620696e20746865204d65726b6c65207460448201527f72656500000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b6000611eff60025490565b600d54909150611f0f85836134e9565b1115611f5d5760405162461bcd60e51b815260206004820152600860248201527f536f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610a4d565b6005841115611fae5760405162461bcd60e51b815260206004820152601760248201527f537572706173736573206d61784d696e74416d6f756e740000000000000000006044820152606401610a4d565b60008411611ffe5760405162461bcd60e51b815260206004820152600f60248201527f43616e2774206d696e74207a65726f00000000000000000000000000000000006044820152606401610a4d565b600c5461200b9085613501565b34146120595760405162461bcd60e51b815260206004820152601660248201527f53656e642070726f7065722045544820616d6f756e74000000000000000000006044820152606401610a4d565b336000908152601160205260409020546005906120779086906134e9565b11156120eb5760405162461bcd60e51b815260206004820152602960248201527f43616e2774206d696e74206d6f7265207468616e2072656d61696e696e67206160448201527f6c6c6f636174696f6e00000000000000000000000000000000000000000000006064820152608401610a4d565b336000908152601160205260408120805486929061210a9084906134e9565b90915550600090505b84811015612139576121293361198f83856134e9565b61213281613499565b9050612113565b5050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146121a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b80516111e790600a906020840190612e6b565b60055473ffffffffffffffffffffffffffffffffffffffff1633146122215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b73ffffffffffffffffffffffffffffffffffffffff81166122aa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a4d565b611086816127b7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061234657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061093c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461093c565b6002546000908210801561093c5750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106123d0576123d061343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416908117909155819061245482611283565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124a582612396565b6125175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a4d565b600061252283611283565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061259157508373ffffffffffffffffffffffffffffffffffffffff16612579846109d4565b73ffffffffffffffffffffffffffffffffffffffff16145b80610f8c575073ffffffffffffffffffffffffffffffffffffffff80821660009081526004602090815260408083209388168352929052205460ff16610f8c565b8273ffffffffffffffffffffffffffffffffffffffff166125f282611283565b73ffffffffffffffffffffffffffffffffffffffff161461267b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a4d565b73ffffffffffffffffffffffffffffffffffffffff82166127035760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b61270e6000826123fa565b81600282815481106127225761272261343b565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6000826127ae8584612a97565b14949350505050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6111e78282604051806020016040528060008152505b61284e8383612b3b565b61285b6000848484612c95565b610ccd5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a4d565b6128d88484846125d2565b6128e484848484612c95565b611bd75760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a4d565b606060078054610951906133e7565b6060816129a557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156129cf57806129b981613499565b91506129c89050600a83613668565b91506129a9565b60008167ffffffffffffffff8111156129ea576129ea6130a2565b6040519080825280601f01601f191660200182016040528015612a14576020820181803683370190505b5090505b8415610f8c57612a296001836134d2565b9150612a36600a8661367c565b612a419060306134e9565b60f81b818381518110612a5657612a5661343b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a90600a86613668565b9450612a18565b600081815b8451811015611600576000858281518110612ab957612ab961343b565b60200260200101519050808311612afb576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612b28565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612b3381613499565b915050612a9c565b73ffffffffffffffffffffffffffffffffffffffff8216612b9e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a4d565b612ba781612396565b15612bf45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a4d565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15612e60576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612d0c903390899088908890600401613690565b6020604051808303816000875af1925050508015612d65575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612d62918101906136d9565b60015b612e15573d808015612d93576040519150601f19603f3d011682016040523d82523d6000602084013e612d98565b606091505b508051612e0d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a4d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610f8c565b506001949350505050565b828054612e77906133e7565b90600052602060002090601f016020900481019282612e995760008555612edf565b82601f10612eb257805160ff1916838001178555612edf565b82800160010185558215612edf579182015b82811115612edf578251825591602001919060010190612ec4565b506111699291505b808211156111695760008155600101612ee7565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461108657600080fd5b600060208284031215612f3b57600080fd5b8135611d5b81612efb565b60005b83811015612f61578181015183820152602001612f49565b83811115611bd75750506000910152565b60008151808452612f8a816020860160208601612f46565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d5b6020830184612f72565b600060208284031215612fe157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461300c57600080fd5b919050565b6000806040838503121561302457600080fd5b61302d83612fe8565b946020939093013593505050565b8035801515811461300c57600080fd5b60006020828403121561305d57600080fd5b611d5b8261303b565b60008060006060848603121561307b57600080fd5b61308484612fe8565b925061309260208501612fe8565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613118576131186130a2565b604052919050565b600082601f83011261313157600080fd5b8135602067ffffffffffffffff82111561314d5761314d6130a2565b8160051b61315c8282016130d1565b928352848101820192828101908785111561317657600080fd5b83870192505b848310156131955782358252918301919083019061317c565b979650505050505050565b6000806000606084860312156131b557600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156131da57600080fd5b6131e686828701613120565b9150509250925092565b600067ffffffffffffffff83111561320a5761320a6130a2565b61323b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016130d1565b905082815283838301111561324f57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561327857600080fd5b813567ffffffffffffffff81111561328f57600080fd5b8201601f810184136132a057600080fd5b610f8c848235602084016131f0565b6000602082840312156132c157600080fd5b611d5b82612fe8565b6020808252825182820181905260009190848201906040850190845b81811015613302578351835292840192918401916001016132e6565b50909695505050505050565b6000806040838503121561332157600080fd5b61332a83612fe8565b91506133386020840161303b565b90509250929050565b6000806000806080858703121561335757600080fd5b61336085612fe8565b935061336e60208601612fe8565b925060408501359150606085013567ffffffffffffffff81111561339157600080fd5b8501601f810187136133a257600080fd5b6133b1878235602084016131f0565b91505092959194509250565b600080604083850312156133d057600080fd5b6133d983612fe8565b915061333860208401612fe8565b600181811c908216806133fb57607f821691505b60208210811415613435577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134cb576134cb61346a565b5060010190565b6000828210156134e4576134e461346a565b500390565b600082198211156134fc576134fc61346a565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135395761353961346a565b500290565b6000845160206135518285838a01612f46565b8551918401916135648184848a01612f46565b8554920191600090600181811c908083168061358157607f831692505b8583108114156135b8577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8080156135cc57600181146135fb57613628565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00851688528388019550613628565b60008b81526020902060005b858110156136205781548a820152908401908801613607565b505083880195505b50939b9a5050505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261367757613677613639565b500490565b60008261368b5761368b613639565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526136cf6080830184612f72565b9695505050505050565b6000602082840312156136eb57600080fd5b8151611d5b81612efb56fea2646970667358221220ec724f23c2f48d396d6a726d0df5986e607aef62bb71d93b38f5ba3ef7945ffe64736f6c634300080b00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d50747857516b6b766235314561535971647870414366706932524d56684b7163676d38645a3859484c6b76512f00000000000000000000000000000000000000000000000000000000000000000000000000000000004d697066733a2f2f516d5453597376324d36376a696b6f326b5548587354696877476e6e344a38374a3431366762525953684b6a4d6a2f556e72657665616c65644d657461646174612e6a736f6e00000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103085760003560e01c80636352211e1161019a578063b88d4fde116100e1578063e63ec9471161008a578063f2fde38b11610064578063f2fde38b14610896578063f9e23799146108b6578063fe60d12c146108d057600080fd5b8063e63ec947146107f3578063e985e9c514610820578063f2c4ce1e1461087657600080fd5b8063cebbaf55116100bb578063cebbaf551461079a578063d5abeb01146107ad578063db4bec44146107c357600080fd5b8063b88d4fde14610745578063c668286214610765578063c87b56dd1461077a57600080fd5b80638da5cb5b11610143578063a0712d681161011d578063a0712d68146106fd578063a22cb46514610710578063a475b5dd1461073057600080fd5b80638da5cb5b1461069d57806395d89b41146106c85780639a5d140b146106dd57600080fd5b80637501f741116101745780637501f7411461063a5780637cb64759146106505780638462151c1461067057600080fd5b80636352211e146105e557806370a0823114610605578063715018a61461062557600080fd5b8063239c70ae1161025e57806342842e0e1161020757806351830227116101e1578063518302271461058b57806355f804b3146105a55780635aca1bb6146105c557600080fd5b806342842e0e1461052b57806344a0d68a1461054b5780634f6ccce71461056b57600080fd5b80632f745c59116102385780632f745c59146104e35780633423e548146105035780633ccfd60b1461052357600080fd5b8063239c70ae1461049857806323b872dd146104ad5780632eb4a7ab146104cd57600080fd5b8063095ea7b3116102c057806318160ddd1161029a57806318160ddd146104445780631f0234d814610459578063228025e81461047857600080fd5b8063095ea7b3146103e05780630d95ccc91461040057806313faede61461042057600080fd5b8063081812fc116102f1578063081812fc14610364578063081c8c44146103a9578063088a4ed0146103be57600080fd5b806301ffc9a71461030d57806306fdde0314610342575b600080fd5b34801561031957600080fd5b5061032d610328366004612f29565b6108e6565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b50610357610942565b6040516103399190612fbc565b34801561037057600080fd5b5061038461037f366004612fcf565b6109d4565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610339565b3480156103b557600080fd5b50610357610a7f565b3480156103ca57600080fd5b506103de6103d9366004612fcf565b610b0d565b005b3480156103ec57600080fd5b506103de6103fb366004613011565b610b79565b34801561040c57600080fd5b506103de61041b36600461304b565b610cd2565b34801561042c57600080fd5b50610436600c5481565b604051908152602001610339565b34801561045057600080fd5b50600254610436565b34801561046557600080fd5b50600f5461032d90610100900460ff1681565b34801561048457600080fd5b506103de610493366004612fcf565b610d70565b3480156104a457600080fd5b50610436600581565b3480156104b957600080fd5b506103de6104c8366004613066565b610ddc565b3480156104d957600080fd5b5061043660105481565b3480156104ef57600080fd5b506104366104fe366004613011565b610e63565b34801561050f57600080fd5b5061032d61051e3660046131a0565b610f7f565b6103de610f94565b34801561053757600080fd5b506103de610546366004613066565b611089565b34801561055757600080fd5b506103de610566366004612fcf565b6110a4565b34801561057757600080fd5b50610436610586366004612fcf565b611110565b34801561059757600080fd5b5060085461032d9060ff1681565b3480156105b157600080fd5b506103de6105c0366004613266565b61116d565b3480156105d157600080fd5b506103de6105e036600461304b565b6111eb565b3480156105f157600080fd5b50610384610600366004612fcf565b611283565b34801561061157600080fd5b506104366106203660046132af565b611330565b34801561063157600080fd5b506103de61142f565b34801561064657600080fd5b50610436600e5481565b34801561065c57600080fd5b506103de61066b366004612fcf565b6114a2565b34801561067c57600080fd5b5061069061068b3660046132af565b61150e565b60405161033991906132ca565b3480156106a957600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff16610384565b3480156106d457600080fd5b50610357611608565b3480156106e957600080fd5b506103de6106f8366004612fcf565b611617565b6103de61070b366004612fcf565b611740565b34801561071c57600080fd5b506103de61072b36600461330e565b6119be565b34801561073c57600080fd5b506103de611abb565b34801561075157600080fd5b506103de610760366004613341565b611b4f565b34801561077157600080fd5b50610357611bdd565b34801561078657600080fd5b50610357610795366004612fcf565b611bea565b6103de6107a83660046131a0565b611d62565b3480156107b957600080fd5b50610436600d5481565b3480156107cf57600080fd5b5061032d6107de3660046132af565b60126020526000908152604090205460ff1681565b3480156107ff57600080fd5b5061043661080e3660046132af565b60116020526000908152604090205481565b34801561082c57600080fd5b5061032d61083b3660046133bd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561088257600080fd5b506103de610891366004613266565b612140565b3480156108a257600080fd5b506103de6108b13660046132af565b6121ba565b3480156108c257600080fd5b50600f5461032d9060ff1681565b3480156108dc57600080fd5b50610436600b5481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061093c575061093c826122b3565b92915050565b606060008054610951906133e7565b80601f016020809104026020016040519081016040528092919081815260200182805461097d906133e7565b80156109ca5780601f1061099f576101008083540402835291602001916109ca565b820191906000526020600020905b8154815290600101906020018083116109ad57829003601f168201915b5050505050905090565b60006109df82612396565b610a565760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600a8054610a8c906133e7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab8906133e7565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b60055473ffffffffffffffffffffffffffffffffffffffff163314610b745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600e55565b6000610b8482611283565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c285760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b3373ffffffffffffffffffffffffffffffffffffffff82161480610c515750610c51813361083b565b610cc35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a4d565b610ccd83836123fa565b505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610d395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600f8054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314610dd75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600d55565b610de6338261249a565b610e585760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a4d565b610ccd8383836125d2565b6000610e6e83611330565b8210610ebc5760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a4d565b6000805b600254811015610f365760028181548110610edd57610edd61343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff86811691161415610f265783821415610f1a57915061093c9050565b610f2382613499565b91505b610f2f81613499565b9050610ec0565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a4d565b6000610f8c8285856127a1565b949350505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610ffb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600061101c60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff164760405160006040518083038185875af1925050503d8060008114611073576040519150601f19603f3d011682016040523d82523d6000602084013e611078565b606091505b505090508061108657600080fd5b50565b610ccd83838360405180602001604052806000815250611b4f565b60055473ffffffffffffffffffffffffffffffffffffffff16331461110b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600c55565b600061111b60025490565b82106111695760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f620000000000000000006044820152606401610a4d565b5090565b60055473ffffffffffffffffffffffffffffffffffffffff1633146111d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b80516111e7906007906020840190612e6b565b5050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146112525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600080600283815481106112995761129961343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508061093c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a4d565b600073ffffffffffffffffffffffffffffffffffffffff82166113bb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a4d565b600254600090815b8181101561142657600281815481106113de576113de61343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff868116911614156114165761141383613499565b92505b61141f81613499565b90506113c3565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146114965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b6114a060006127b7565b565b60055473ffffffffffffffffffffffffffffffffffffffff1633146115095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b601055565b606061151982611330565b6000106115685760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a4d565b600061157383611330565b905060008167ffffffffffffffff811115611590576115906130a2565b6040519080825280602002602001820160405280156115b9578160200160208202803683370190505b50905060005b82811015611600576115d18582610e63565b8282815181106115e3576115e361343b565b6020908102919091010152806115f881613499565b9150506115bf565b509392505050565b606060018054610951906133e7565b60055473ffffffffffffffffffffffffffffffffffffffff16331461167e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600b548111156116f65760405162461bcd60e51b815260206004820152602260248201527f43616e27742072657365727665206d6f7265207468616e2073657420616d6f7560448201527f6e740000000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b80600b600082825461170891906134d2565b909155505060025460005b82811015610ccd5761172e3361172983856134e9565b61282e565b8061173881613499565b915050611713565b600260065414156117935760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a4d565b6002600655600f5460ff166117ea5760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f742041637469766500000000000000000000000000006044820152606401610a4d565b60006117f560025490565b9050600082116118475760405162461bcd60e51b815260206004820152601760248201527f6e65656420746f206d696e74206174206c6561737420310000000000000000006044820152606401610a4d565b600e548211156118be5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560448201527f65646564000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b600d546118cb83836134e9565b11156119195760405162461bcd60e51b815260206004820152601660248201527f6d6178204e4654206c696d6974206578636565646564000000000000000000006044820152606401610a4d565b81600c546119279190613501565b3410156119765760405162461bcd60e51b815260206004820152601d60248201527f56616c7565206973206f766572206f7220756e6465722070726963652e0000006044820152606401610a4d565b60005b828110156119b4576119a43361198f83856134e9565b60405180602001604052806000815250612844565b6119ad81613499565b9050611979565b5050600160065550565b73ffffffffffffffffffffffffffffffffffffffff8216331415611a245760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a4d565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611b225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b611b59338361249a565b611bcb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a4d565b611bd7848484846128cd565b50505050565b60098054610a8c906133e7565b6060611bf582612396565b611c675760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a4d565b60085460ff16611d0357600a8054611c7e906133e7565b80601f0160208091040260200160405190810160405280929190818152602001828054611caa906133e7565b8015611cf75780601f10611ccc57610100808354040283529160200191611cf7565b820191906000526020600020905b815481529060010190602001808311611cda57829003601f168201915b50505050509050919050565b6000611d0d612956565b90506000815111611d2d5760405180602001604052806000815250611d5b565b80611d3784612965565b6009604051602001611d4b9392919061353e565b6040516020818303038152906040525b9392505050565b600f54610100900460ff16611db95760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f742041637469766500000000000000000000000000006044820152606401610a4d565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015282906034016040516020818303038152906040528051906020012014611e755760405162461bcd60e51b815260206004820152602960248201527f53656e64657220616e6420616d6f756e7420646f6e2774206d61746368204d6560448201527f726b6c65206c65616600000000000000000000000000000000000000000000006064820152608401610a4d565b611e826010548383610f7f565b611ef45760405162461bcd60e51b815260206004820152602360248201527f4e6f7420612076616c6964206c65616620696e20746865204d65726b6c65207460448201527f72656500000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b6000611eff60025490565b600d54909150611f0f85836134e9565b1115611f5d5760405162461bcd60e51b815260206004820152600860248201527f536f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610a4d565b6005841115611fae5760405162461bcd60e51b815260206004820152601760248201527f537572706173736573206d61784d696e74416d6f756e740000000000000000006044820152606401610a4d565b60008411611ffe5760405162461bcd60e51b815260206004820152600f60248201527f43616e2774206d696e74207a65726f00000000000000000000000000000000006044820152606401610a4d565b600c5461200b9085613501565b34146120595760405162461bcd60e51b815260206004820152601660248201527f53656e642070726f7065722045544820616d6f756e74000000000000000000006044820152606401610a4d565b336000908152601160205260409020546005906120779086906134e9565b11156120eb5760405162461bcd60e51b815260206004820152602960248201527f43616e2774206d696e74206d6f7265207468616e2072656d61696e696e67206160448201527f6c6c6f636174696f6e00000000000000000000000000000000000000000000006064820152608401610a4d565b336000908152601160205260408120805486929061210a9084906134e9565b90915550600090505b84811015612139576121293361198f83856134e9565b61213281613499565b9050612113565b5050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146121a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b80516111e790600a906020840190612e6b565b60055473ffffffffffffffffffffffffffffffffffffffff1633146122215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b73ffffffffffffffffffffffffffffffffffffffff81166122aa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a4d565b611086816127b7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061234657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061093c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461093c565b6002546000908210801561093c5750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106123d0576123d061343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416908117909155819061245482611283565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124a582612396565b6125175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a4d565b600061252283611283565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061259157508373ffffffffffffffffffffffffffffffffffffffff16612579846109d4565b73ffffffffffffffffffffffffffffffffffffffff16145b80610f8c575073ffffffffffffffffffffffffffffffffffffffff80821660009081526004602090815260408083209388168352929052205460ff16610f8c565b8273ffffffffffffffffffffffffffffffffffffffff166125f282611283565b73ffffffffffffffffffffffffffffffffffffffff161461267b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a4d565b73ffffffffffffffffffffffffffffffffffffffff82166127035760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b61270e6000826123fa565b81600282815481106127225761272261343b565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6000826127ae8584612a97565b14949350505050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6111e78282604051806020016040528060008152505b61284e8383612b3b565b61285b6000848484612c95565b610ccd5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a4d565b6128d88484846125d2565b6128e484848484612c95565b611bd75760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a4d565b606060078054610951906133e7565b6060816129a557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156129cf57806129b981613499565b91506129c89050600a83613668565b91506129a9565b60008167ffffffffffffffff8111156129ea576129ea6130a2565b6040519080825280601f01601f191660200182016040528015612a14576020820181803683370190505b5090505b8415610f8c57612a296001836134d2565b9150612a36600a8661367c565b612a419060306134e9565b60f81b818381518110612a5657612a5661343b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a90600a86613668565b9450612a18565b600081815b8451811015611600576000858281518110612ab957612ab961343b565b60200260200101519050808311612afb576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612b28565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612b3381613499565b915050612a9c565b73ffffffffffffffffffffffffffffffffffffffff8216612b9e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a4d565b612ba781612396565b15612bf45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a4d565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15612e60576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612d0c903390899088908890600401613690565b6020604051808303816000875af1925050508015612d65575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612d62918101906136d9565b60015b612e15573d808015612d93576040519150601f19603f3d011682016040523d82523d6000602084013e612d98565b606091505b508051612e0d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a4d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610f8c565b506001949350505050565b828054612e77906133e7565b90600052602060002090601f016020900481019282612e995760008555612edf565b82601f10612eb257805160ff1916838001178555612edf565b82800160010185558215612edf579182015b82811115612edf578251825591602001919060010190612ec4565b506111699291505b808211156111695760008155600101612ee7565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461108657600080fd5b600060208284031215612f3b57600080fd5b8135611d5b81612efb565b60005b83811015612f61578181015183820152602001612f49565b83811115611bd75750506000910152565b60008151808452612f8a816020860160208601612f46565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d5b6020830184612f72565b600060208284031215612fe157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461300c57600080fd5b919050565b6000806040838503121561302457600080fd5b61302d83612fe8565b946020939093013593505050565b8035801515811461300c57600080fd5b60006020828403121561305d57600080fd5b611d5b8261303b565b60008060006060848603121561307b57600080fd5b61308484612fe8565b925061309260208501612fe8565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613118576131186130a2565b604052919050565b600082601f83011261313157600080fd5b8135602067ffffffffffffffff82111561314d5761314d6130a2565b8160051b61315c8282016130d1565b928352848101820192828101908785111561317657600080fd5b83870192505b848310156131955782358252918301919083019061317c565b979650505050505050565b6000806000606084860312156131b557600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156131da57600080fd5b6131e686828701613120565b9150509250925092565b600067ffffffffffffffff83111561320a5761320a6130a2565b61323b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016130d1565b905082815283838301111561324f57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561327857600080fd5b813567ffffffffffffffff81111561328f57600080fd5b8201601f810184136132a057600080fd5b610f8c848235602084016131f0565b6000602082840312156132c157600080fd5b611d5b82612fe8565b6020808252825182820181905260009190848201906040850190845b81811015613302578351835292840192918401916001016132e6565b50909695505050505050565b6000806040838503121561332157600080fd5b61332a83612fe8565b91506133386020840161303b565b90509250929050565b6000806000806080858703121561335757600080fd5b61336085612fe8565b935061336e60208601612fe8565b925060408501359150606085013567ffffffffffffffff81111561339157600080fd5b8501601f810187136133a257600080fd5b6133b1878235602084016131f0565b91505092959194509250565b600080604083850312156133d057600080fd5b6133d983612fe8565b915061333860208401612fe8565b600181811c908216806133fb57607f821691505b60208210811415613435577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134cb576134cb61346a565b5060010190565b6000828210156134e4576134e461346a565b500390565b600082198211156134fc576134fc61346a565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135395761353961346a565b500290565b6000845160206135518285838a01612f46565b8551918401916135648184848a01612f46565b8554920191600090600181811c908083168061358157607f831692505b8583108114156135b8577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8080156135cc57600181146135fb57613628565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00851688528388019550613628565b60008b81526020902060005b858110156136205781548a820152908401908801613607565b505083880195505b50939b9a5050505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261367757613677613639565b500490565b60008261368b5761368b613639565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526136cf6080830184612f72565b9695505050505050565b6000602082840312156136eb57600080fd5b8151611d5b81612efb56fea2646970667358221220ec724f23c2f48d396d6a726d0df5986e607aef62bb71d93b38f5ba3ef7945ffe64736f6c634300080b0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d50747857516b6b766235314561535971647870414366706932524d56684b7163676d38645a3859484c6b76512f00000000000000000000000000000000000000000000000000000000000000000000000000000000004d697066733a2f2f516d5453597376324d36376a696b6f326b5548587354696877476e6e344a38374a3431366762525953684b6a4d6a2f556e72657665616c65644d657461646174612e6a736f6e00000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmPtxWQkkvb51EaSYqdxpACfpi2RMVhKqcgm8dZ8YHLkvQ/
Arg [1] : _initNotRevealedUri (string): ipfs://QmTSYsv2M67jiko2kUHXsTihwGnn4J87J416gbRYShKjMj/UnrevealedMetadata.json

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d50747857516b6b76623531456153597164787041436670
Arg [4] : 6932524d56684b7163676d38645a3859484c6b76512f00000000000000000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000004d
Arg [6] : 697066733a2f2f516d5453597376324d36376a696b6f326b5548587354696877
Arg [7] : 476e6e344a38374a3431366762525953684b6a4d6a2f556e72657665616c6564
Arg [8] : 4d657461646174612e6a736f6e00000000000000000000000000000000000000


Deployed Bytecode Sourcemap

37382:5158:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35837:225;;;;;;;;;;-1:-1:-1;35837:225:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;35837:225:0;;;;;;;;29908:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30542:221::-;;;;;;;;;;-1:-1:-1;30542:221:0;;;;;:::i;:::-;;:::i;:::-;;;1809:42:1;1797:55;;;1779:74;;1767:2;1752:18;30542:221:0;1633:226:1;37576:28:0;;;;;;;;;;;;;:::i;42071:106::-;;;;;;;;;;-1:-1:-1;42071:106:0;;;;;:::i;:::-;;:::i;:::-;;30124:412;;;;;;;;;;-1:-1:-1;30124:412:0;;;;;:::i;:::-;;:::i;38857:87::-;;;;;;;;;;-1:-1:-1;38857:87:0;;;;;:::i;:::-;;:::i;37661:33::-;;;;;;;;;;;;;;;;;;;2820:25:1;;;2808:2;2793:18;37661:33:0;2674:177:1;36998:110:0;;;;;;;;;;-1:-1:-1;37086:7:0;:14;36998:110;;37827:35;;;;;;;;;;-1:-1:-1;37827:35:0;;;;;;;;;;;42182:96;;;;;;;;;;-1:-1:-1;42182:96:0;;;;;:::i;:::-;;:::i;38278:41::-;;;;;;;;;;;;38318:1;38278:41;;31240:339;;;;;;;;;;-1:-1:-1;31240:339:0;;;;;:::i;:::-;;:::i;37922:30::-;;;;;;;;;;;;;;;;36068:500;;;;;;;;;;-1:-1:-1;36068:500:0;;;;;:::i;:::-;;:::i;40973:172::-;;;;;;;;;;-1:-1:-1;40973:172:0;;;;;:::i;:::-;;:::i;42392:145::-;;;:::i;31585:185::-;;;;;;;;;;-1:-1:-1;31585:185:0;;;;;:::i;:::-;;:::i;41990:76::-;;;;;;;;;;-1:-1:-1;41990:76:0;;;;;:::i;:::-;;:::i;37114:194::-;;;;;;;;;;-1:-1:-1;37114:194:0;;;;;:::i;:::-;;:::i;37501:28::-;;;;;;;;;;-1:-1:-1;37501:28:0;;;;;;;;41877:94;;;;;;;;;;-1:-1:-1;41877:94:0;;;;;:::i;:::-;;:::i;38760:89::-;;;;;;;;;;-1:-1:-1;38760:89:0;;;;;:::i;:::-;;:::i;29663:239::-;;;;;;;;;;-1:-1:-1;29663:239:0;;;;;:::i;:::-;;:::i;29243:414::-;;;;;;;;;;-1:-1:-1;29243:414:0;;;;;:::i;:::-;;:::i;9695:103::-;;;;;;;;;;;;;:::i;37733:27::-;;;;;;;;;;;;;;;;42283:104;;;;;;;;;;-1:-1:-1;42283:104:0;;;;;:::i;:::-;;:::i;36574:418::-;;;;;;;;;;-1:-1:-1;36574:418:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9044:87::-;;;;;;;;;;-1:-1:-1;9117:6:0;;;;9044:87;;30014:104;;;;;;;;;;;;;:::i;39514:369::-;;;;;;;;;;-1:-1:-1;39514:369:0;;;;;:::i;:::-;;:::i;39031:478::-;;;;;;:::i;:::-;;:::i;30769:295::-;;;;;;;;;;-1:-1:-1;30769:295:0;;;;;:::i;:::-;;:::i;41169:68::-;;;;;;;;;;;;;:::i;31776:328::-;;;;;;;;;;-1:-1:-1;31776:328:0;;;;;:::i;:::-;;:::i;37533:36::-;;;;;;;;;;;;;:::i;41247:497::-;;;;;;;;;;-1:-1:-1;41247:497:0;;;;;:::i;:::-;;:::i;39897:1071::-;;;;;;:::i;:::-;;:::i;37698:31::-;;;;;;;;;;;;;;;;38172:48;;;;;;;;;;-1:-1:-1;38172:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38012:50;;;;;;;;;;-1:-1:-1;38012:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;31070:164;;;;;;;;;;-1:-1:-1;31070:164:0;;;;;:::i;:::-;31191:25;;;;31167:4;31191:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31070:164;41749:120;;;;;;;;;;-1:-1:-1;41749:120:0;;;;;:::i;:::-;;:::i;9953:201::-;;;;;;;;;;-1:-1:-1;9953:201:0;;;;;:::i;:::-;;:::i;37764:34::-;;;;;;;;;;-1:-1:-1;37764:34:0;;;;;;;;37608:28;;;;;;;;;;;;;;;;35837:225;35940:4;35964:50;;;35979:35;35964:50;;:90;;;36018:36;36042:11;36018:23;:36::i;:::-;35957:97;35837:225;-1:-1:-1;;35837:225:0:o;29908:100::-;29962:13;29995:5;29988:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29908:100;:::o;30542:221::-;30618:7;30646:16;30654:7;30646;:16::i;:::-;30638:73;;;;-1:-1:-1;;;30638:73:0;;9374:2:1;30638:73:0;;;9356:21:1;9413:2;9393:18;;;9386:30;9452:34;9432:18;;;9425:62;9523:14;9503:18;;;9496:42;9555:19;;30638:73:0;;;;;;;;;-1:-1:-1;30731:24:0;;;;:15;:24;;;;;;;;;30542:221::o;37576:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42071:106::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;42145:7:::1;:27:::0;42071:106::o;30124:412::-;30205:13;30221:24;30237:7;30221:15;:24::i;:::-;30205:40;;30270:5;30264:11;;:2;:11;;;;30256:57;;;;-1:-1:-1;;;30256:57:0;;10148:2:1;30256:57:0;;;10130:21:1;10187:2;10167:18;;;10160:30;10226:34;10206:18;;;10199:62;10297:3;10277:18;;;10270:31;10318:19;;30256:57:0;9946:397:1;30256:57:0;7847:10;30348:21;;;;;:62;;-1:-1:-1;30373:37:0;30390:5;7847:10;31070:164;:::i;30373:37::-;30326:168;;;;-1:-1:-1;;;30326:168:0;;10550:2:1;30326:168:0;;;10532:21:1;10589:2;10569:18;;;10562:30;10628:34;10608:18;;;10601:62;10699:26;10679:18;;;10672:54;10743:19;;30326:168:0;10348:420:1;30326:168:0;30507:21;30516:2;30520:7;30507:8;:21::i;:::-;30194:342;30124:412;;:::o;38857:87::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;38915:15:::1;:21:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;38857:87::o;42182:96::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;42248:9:::1;:25:::0;42182:96::o;31240:339::-;31435:41;7847:10;31468:7;31435:18;:41::i;:::-;31427:103;;;;-1:-1:-1;;;31427:103:0;;10975:2:1;31427:103:0;;;10957:21:1;11014:2;10994:18;;;10987:30;11053:34;11033:18;;;11026:62;11124:19;11104:18;;;11097:47;11161:19;;31427:103:0;10773:413:1;31427:103:0;31543:28;31553:4;31559:2;31563:7;31543:9;:28::i;36068:500::-;36157:15;36201:24;36219:5;36201:17;:24::i;:::-;36193:5;:32;36185:67;;;;-1:-1:-1;;;36185:67:0;;11393:2:1;36185:67:0;;;11375:21:1;11432:2;11412:18;;;11405:30;11471:24;11451:18;;;11444:52;11513:18;;36185:67:0;11191:346:1;36185:67:0;36263:10;36289:6;36284:226;36301:7;:14;36297:18;;36284:226;;;36350:7;36358:1;36350:10;;;;;;;;:::i;:::-;;;;;;;;;;;;36341:19;;;36350:10;;36341:19;36337:162;;;36394:5;36385;:14;36381:102;;;36430:1;-1:-1:-1;36423:8:0;;-1:-1:-1;36423:8:0;36381:102;36476:7;;;:::i;:::-;;;36381:102;36317:3;;;:::i;:::-;;;36284:226;;;-1:-1:-1;36520:40:0;;-1:-1:-1;;;36520:40:0;;11393:2:1;36520:40:0;;;11375:21:1;11432:2;11412:18;;;11405:30;11471:24;11451:18;;;11444:52;11513:18;;36520:40:0;11191:346:1;40973:172:0;41069:4;41093:44;41112:5;41119:11;41132:4;41093:18;:44::i;:::-;41086:51;40973:172;-1:-1:-1;;;;40973:172:0:o;42392:145::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;42445:7:::1;42466;9117:6:::0;;;;;9044:87;42466:7:::1;42458:21;;42487;42458:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42444:69;;;42528:2;42520:11;;;::::0;::::1;;42437:100;42392:145::o:0;31585:185::-;31723:39;31740:4;31746:2;31750:7;31723:39;;;;;;;;;;;;:16;:39::i;41990:76::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;42046:4:::1;:15:::0;41990:76::o;37114:194::-;37189:7;37225:24;37086:7;:14;;36998:110;37225:24;37217:5;:32;37209:68;;;;-1:-1:-1;;;37209:68:0;;12532:2:1;37209:68:0;;;12514:21:1;12571:2;12551:18;;;12544:30;12610:25;12590:18;;;12583:53;12653:18;;37209:68:0;12330:347:1;37209:68:0;-1:-1:-1;37295:5:0;37114:194::o;41877:94::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;41945:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;41877:94:::0;:::o;38760:89::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;38821:14:::1;:20:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;38760:89::o;29663:239::-;29735:7;29755:13;29771:7;29779;29771:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;29806:19:0;29798:73;;;;-1:-1:-1;;;29798:73:0;;12884:2:1;29798:73:0;;;12866:21:1;12923:2;12903:18;;;12896:30;12962:34;12942:18;;;12935:62;13033:11;13013:18;;;13006:39;13062:19;;29798:73:0;12682:405:1;29243:414:0;29315:7;29343:19;;;29335:74;;;;-1:-1:-1;;;29335:74:0;;13294:2:1;29335:74:0;;;13276:21:1;13333:2;13313:18;;;13306:30;13372:34;13352:18;;;13345:62;13443:12;13423:18;;;13416:40;13473:19;;29335:74:0;13092:406:1;29335:74:0;29459:7;:14;29420:10;;;29484:119;29505:6;29501:1;:10;29484:119;;;29544:7;29552:1;29544:10;;;;;;;;:::i;:::-;;;;;;;;;;;;29535:19;;;29544:10;;29535:19;29531:61;;;29571:7;;;:::i;:::-;;;29531:61;29513:3;;;:::i;:::-;;;29484:119;;;-1:-1:-1;29644:5:0;;29243:414;-1:-1:-1;;;29243:414:0:o;9695:103::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;9760:30:::1;9787:1;9760:18;:30::i;:::-;9695:103::o:0;42283:104::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;42355:10:::1;:24:::0;42283:104::o;36574:418::-;36633:16;36674:24;36692:5;36674:17;:24::i;:::-;36670:1;:28;36662:63;;;;-1:-1:-1;;;36662:63:0;;11393:2:1;36662:63:0;;;11375:21:1;11432:2;11412:18;;;11405:30;11471:24;11451:18;;;11444:52;11513:18;;36662:63:0;11191:346:1;36662:63:0;36736:18;36757:16;36767:5;36757:9;:16::i;:::-;36736:37;;36784:25;36826:10;36812:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36812:25:0;;36784:53;;36853:9;36848:111;36872:10;36868:1;:14;36848:111;;;36918:29;36938:5;36945:1;36918:19;:29::i;:::-;36904:8;36913:1;36904:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;36884:3;;;;:::i;:::-;;;;36848:111;;;-1:-1:-1;36976:8:0;36574:418;-1:-1:-1;;;36574:418:0:o;30014:104::-;30070:13;30103:7;30096:14;;;;;:::i;39514:369::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;39646:8:::1;;39635:7;:19;;39626:68;;;::::0;-1:-1:-1;;;39626:68:0;;13705:2:1;39626:68:0::1;::::0;::::1;13687:21:1::0;13744:2;13724:18;;;13717:30;13783:34;13763:18;;;13756:62;13854:4;13834:18;;;13827:32;13876:19;;39626:68:0::1;13503:398:1::0;39626:68:0::1;39717:7;39705:8;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;37086:7:0;:14;39775:9:::1;39771:89;39790:7;39786:1;:11;39771:89;;;39818:30;39829:10;39841:5;39845:1:::0;39841;:5:::1;:::i;:::-;39818:9;:30::i;:::-;39799:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39771:89;;39031:478:::0;4015:1;4613:7;;:19;;4605:63;;;;-1:-1:-1;;;4605:63:0;;14371:2:1;4605:63:0;;;14353:21:1;14410:2;14390:18;;;14383:30;14449:33;14429:18;;;14422:61;14500:18;;4605:63:0;14169:355:1;4605:63:0;4015:1;4746:7;:18;39100:14:::1;::::0;::::1;;39092:46;;;::::0;-1:-1:-1;;;39092:46:0;;14731:2:1;39092:46:0::1;::::0;::::1;14713:21:1::0;14770:2;14750:18;;;14743:30;14809:20;14789:18;;;14782:48;14847:18;;39092:46:0::1;14529:342:1::0;39092:46:0::1;39142:9;39154:13;37086:7:::0;:14;;36998:110;39154:13:::1;39142:25;;39188:1;39179:6;:10;39171:47;;;::::0;-1:-1:-1;;;39171:47:0;;15078:2:1;39171:47:0::1;::::0;::::1;15060:21:1::0;15117:2;15097:18;;;15090:30;15156:25;15136:18;;;15129:53;15199:18;;39171:47:0::1;14876:347:1::0;39171:47:0::1;39240:7;;39230:6;:17;;39222:66;;;::::0;-1:-1:-1;;;39222:66:0;;15430:2:1;39222:66:0::1;::::0;::::1;15412:21:1::0;15469:2;15449:18;;;15442:30;15508:34;15488:18;;;15481:62;15579:6;15559:18;;;15552:34;15603:19;;39222:66:0::1;15228:400:1::0;39222:66:0::1;39314:9;::::0;39300:10:::1;39304:6:::0;39300:1;:10:::1;:::i;:::-;:23;;39292:59;;;::::0;-1:-1:-1;;;39292:59:0;;15835:2:1;39292:59:0::1;::::0;::::1;15817:21:1::0;15874:2;15854:18;;;15847:30;15913:24;15893:18;;;15886:52;15955:18;;39292:59:0::1;15633:346:1::0;39292:59:0::1;39383:6;39376:4;;:13;;;;:::i;:::-;39363:9;:26;;39355:68;;;::::0;-1:-1:-1;;;39355:68:0;;16419:2:1;39355:68:0::1;::::0;::::1;16401:21:1::0;16458:2;16438:18;;;16431:30;16497:31;16477:18;;;16470:59;16546:18;;39355:68:0::1;16217:353:1::0;39355:68:0::1;39432:9;39427:78;39451:6;39447:1;:10;39427:78;;;39468:32;39478:10;39490:5;39494:1:::0;39490;:5:::1;:::i;:::-;39468:32;;;;;;;;;;;::::0;:9:::1;:32::i;:::-;39459:3;::::0;::::1;:::i;:::-;;;39427:78;;;-1:-1:-1::0;;3971:1:0;4925:7;:22;-1:-1:-1;39031:478:0:o;30769:295::-;30872:24;;;7847:10;30872:24;;30864:62;;;;-1:-1:-1;;;30864:62:0;;16777:2:1;30864:62:0;;;16759:21:1;16816:2;16796:18;;;16789:30;16855:27;16835:18;;;16828:55;16900:18;;30864:62:0;16575:349:1;30864:62:0;7847:10;30939:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;31008:48;;586:41:1;;;30939:42:0;;7847:10;31008:48;;559:18:1;31008:48:0;;;;;;;30769:295;;:::o;41169:68::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;41215:8:::1;:15:::0;;;::::1;41226:4;41215:15;::::0;;41169:68::o;31776:328::-;31951:41;7847:10;31984:7;31951:18;:41::i;:::-;31943:103;;;;-1:-1:-1;;;31943:103:0;;10975:2:1;31943:103:0;;;10957:21:1;11014:2;10994:18;;;10987:30;11053:34;11033:18;;;11026:62;11124:19;11104:18;;;11097:47;11161:19;;31943:103:0;10773:413:1;31943:103:0;32057:39;32071:4;32077:2;32081:7;32090:5;32057:13;:39::i;:::-;31776:328;;;;:::o;37533:36::-;;;;;;;:::i;41247:497::-;41345:13;41386:16;41394:7;41386;:16::i;:::-;41370:97;;;;-1:-1:-1;;;41370:97:0;;17131:2:1;41370:97:0;;;17113:21:1;17170:2;17150:18;;;17143:30;17209:34;17189:18;;;17182:62;17280:17;17260:18;;;17253:45;17315:19;;41370:97:0;16929:411:1;41370:97:0;41483:8;;;;41480:62;;41520:14;41513:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41247:497;;;:::o;41480:62::-;41550:28;41581:10;:8;:10::i;:::-;41550:41;;41636:1;41611:14;41605:28;:32;:133;;;;;;;;;;;;;;;;;41673:14;41689:18;:7;:16;:18::i;:::-;41709:13;41656:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41605:133;41598:140;41247:497;-1:-1:-1;;;41247:497:0:o;39897:1071::-;40007:15;;;;;;;39999:47;;;;-1:-1:-1;;;39999:47:0;;14731:2:1;39999:47:0;;;14713:21:1;14770:2;14750:18;;;14743:30;14809:20;14789:18;;;14782:48;14847:18;;39999:47:0;14529:342:1;39999:47:0;40138:28;;19280:66:1;40155:10:0;19267:2:1;19263:15;19259:88;40138:28:0;;;19247:101:1;40171:4:0;;19364:12:1;;40138:28:0;;;;;;;;;;;;40128:39;;;;;;:47;40120:101;;;;-1:-1:-1;;;40120:101:0;;19589:2:1;40120:101:0;;;19571:21:1;19628:2;19608:18;;;19601:30;19667:34;19647:18;;;19640:62;19738:11;19718:18;;;19711:39;19767:19;;40120:101:0;19387:405:1;40120:101:0;40298:31;40305:10;;40317:4;40323:5;40298:6;:31::i;:::-;40290:79;;;;-1:-1:-1;;;40290:79:0;;19999:2:1;40290:79:0;;;19981:21:1;20038:2;20018:18;;;20011:30;20077:34;20057:18;;;20050:62;20148:5;20128:18;;;20121:33;20171:19;;40290:79:0;19797:399:1;40290:79:0;40380:9;40392:13;37086:7;:14;;36998:110;40392:13;40434:9;;40380:25;;-1:-1:-1;40420:10:0;40424:6;40380:25;40420:10;:::i;:::-;:23;;40412:44;;;;-1:-1:-1;;;40412:44:0;;20403:2:1;40412:44:0;;;20385:21:1;20442:1;20422:18;;;20415:29;20480:10;20460:18;;;20453:38;20508:18;;40412:44:0;20201:331:1;40412:44:0;38318:1;40471:6;:23;;40463:59;;;;-1:-1:-1;;;40463:59:0;;20739:2:1;40463:59:0;;;20721:21:1;20778:2;20758:18;;;20751:30;20817:25;20797:18;;;20790:53;20860:18;;40463:59:0;20537:347:1;40463:59:0;40579:1;40570:6;:10;40562:38;;;;-1:-1:-1;;;40562:38:0;;21091:2:1;40562:38:0;;;21073:21:1;21130:2;21110:18;;;21103:30;21169:17;21149:18;;;21142:45;21204:18;;40562:38:0;20889:339:1;40562:38:0;40672:4;;40663:13;;:6;:13;:::i;:::-;40650:9;:26;40642:61;;;;-1:-1:-1;;;40642:61:0;;21435:2:1;40642:61:0;;;21417:21:1;21474:2;21454:18;;;21447:30;21513:24;21493:18;;;21486:52;21555:18;;40642:61:0;21233:346:1;40642:61:0;40739:10;40720:30;;;;:18;:30;;;;;;38318:1;;40720:39;;40753:6;;40720:39;:::i;:::-;:56;;40712:110;;;;-1:-1:-1;;;40712:110:0;;21786:2:1;40712:110:0;;;21768:21:1;21825:2;21805:18;;;21798:30;21864:34;21844:18;;;21837:62;21935:11;21915:18;;;21908:39;21964:19;;40712:110:0;21584:405:1;40712:110:0;40850:10;40831:30;;;;:18;:30;;;;;:40;;40865:6;;40831:30;:40;;40865:6;;40831:40;:::i;:::-;;;;-1:-1:-1;40885:9:0;;-1:-1:-1;40880:84:0;40904:6;40900:1;:10;40880:84;;;40924:32;40934:10;40946:5;40950:1;40946;:5;:::i;40924:32::-;40912:3;;;:::i;:::-;;;40880:84;;;;39988:980;39897:1071;;;:::o;41749:120::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;41831:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;9953:201::-:0;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;10042:22:::1;::::0;::::1;10034:73;;;::::0;-1:-1:-1;;;10034:73:0;;22196:2:1;10034:73:0::1;::::0;::::1;22178:21:1::0;22235:2;22215:18;;;22208:30;22274:34;22254:18;;;22247:62;22345:8;22325:18;;;22318:36;22371:19;;10034:73:0::1;21994:402:1::0;10034:73:0::1;10118:28;10137:8;10118:18;:28::i;28932:305::-:0;29034:4;29071:40;;;29086:25;29071:40;;:105;;-1:-1:-1;29128:48:0;;;29143:33;29128:48;29071:105;:158;;;-1:-1:-1;21604:25:0;21589:40;;;;29193:36;21480:157;32433:155;32532:7;:14;32498:4;;32522:24;;:58;;;;;32578:1;32550:30;;:7;32558;32550:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;:30;;32515:65;32433:155;-1:-1:-1;;32433:155:0:o;34585:175::-;34660:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;34714;34660;34714:15;:24::i;:::-;34705:47;;;;;;;;;;;;34585:175;;:::o;32591:349::-;32684:4;32709:16;32717:7;32709;:16::i;:::-;32701:73;;;;-1:-1:-1;;;32701:73:0;;22603:2:1;32701:73:0;;;22585:21:1;22642:2;22622:18;;;22615:30;22681:34;22661:18;;;22654:62;22752:14;22732:18;;;22725:42;22784:19;;32701:73:0;22401:408:1;32701:73:0;32785:13;32801:24;32817:7;32801:15;:24::i;:::-;32785:40;;32855:5;32844:16;;:7;:16;;;:51;;;;32888:7;32864:31;;:20;32876:7;32864:11;:20::i;:::-;:31;;;32844:51;:87;;;-1:-1:-1;31191:25:0;;;;31167:4;31191:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32899:32;31070:164;34065:517;34225:4;34197:32;;:24;34213:7;34197:15;:24::i;:::-;:32;;;34189:86;;;;-1:-1:-1;;;34189:86:0;;23016:2:1;34189:86:0;;;22998:21:1;23055:2;23035:18;;;23028:30;23094:34;23074:18;;;23067:62;23165:11;23145:18;;;23138:39;23194:19;;34189:86:0;22814:405:1;34189:86:0;34294:16;;;34286:65;;;;-1:-1:-1;;;34286:65:0;;23426:2:1;34286:65:0;;;23408:21:1;23465:2;23445:18;;;23438:30;23504:34;23484:18;;;23477:62;23575:6;23555:18;;;23548:34;23599:19;;34286:65:0;23224:400:1;34286:65:0;34468:29;34485:1;34489:7;34468:8;:29::i;:::-;34527:2;34508:7;34516;34508:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;;;;;;;;34547:27;;34566:7;;34547:27;;;;;;;;;;34508:16;34547:27;34065:517;;;:::o;942:190::-;1067:4;1120;1091:25;1104:5;1111:4;1091:12;:25::i;:::-;:33;;942:190;-1:-1:-1;;;;942:190:0:o;10314:191::-;10407:6;;;;10424:17;;;;;;;;;;;10457:40;;10407:6;;;10424:17;10407:6;;10457:40;;10388:16;;10457:40;10377:128;10314:191;:::o;32943:110::-;33019:26;33029:2;33033:7;33019:26;;;;;;;;;;;;33056:321;33186:18;33192:2;33196:7;33186:5;:18::i;:::-;33237:54;33268:1;33272:2;33276:7;33285:5;33237:22;:54::i;:::-;33215:154;;;;-1:-1:-1;;;33215:154:0;;23831:2:1;33215:154:0;;;23813:21:1;23870:2;23850:18;;;23843:30;23909:34;23889:18;;;23882:62;23980:20;23960:18;;;23953:48;24018:19;;33215:154:0;23629:414:1;32115:315:0;32272:28;32282:4;32288:2;32292:7;32272:9;:28::i;:::-;32319:48;32342:4;32348:2;32352:7;32361:5;32319:22;:48::i;:::-;32311:111;;;;-1:-1:-1;;;32311:111:0;;23831:2:1;32311:111:0;;;23813:21:1;23870:2;23850:18;;;23843:30;23909:34;23889:18;;;23882:62;23980:20;23960:18;;;23953:48;24018:19;;32311:111:0;23629:414:1;38635:89:0;38686:13;38712:7;38705:14;;;;;:::i;5328:723::-;5384:13;5605:10;5601:53;;-1:-1:-1;;5632:10:0;;;;;;;;;;;;;;;;;;5328:723::o;5601:53::-;5679:5;5664:12;5720:78;5727:9;;5720:78;;5753:8;;;;:::i;:::-;;-1:-1:-1;5776:10:0;;-1:-1:-1;5784:2:0;5776:10;;:::i;:::-;;;5720:78;;;5808:19;5840:6;5830:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5830:17:0;;5808:39;;5858:154;5865:10;;5858:154;;5892:11;5902:1;5892:11;;:::i;:::-;;-1:-1:-1;5961:10:0;5969:2;5961:5;:10;:::i;:::-;5948:24;;:2;:24;:::i;:::-;5935:39;;5918:6;5925;5918:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;5989:11:0;5998:2;5989:11;;:::i;:::-;;;5858:154;;1494:701;1577:7;1620:4;1577:7;1635:523;1659:5;:12;1655:1;:16;1635:523;;;1693:20;1716:5;1722:1;1716:8;;;;;;;;:::i;:::-;;;;;;;1693:31;;1759:12;1743;:28;1739:408;;1896:44;;;;;;24636:19:1;;;24671:12;;;24664:28;;;24708:12;;1896:44:0;;;;;;;;;;;;1886:55;;;;;;1871:70;;1739:408;;;2086:44;;;;;;24636:19:1;;;24671:12;;;24664:28;;;24708:12;;2086:44:0;;;;;;;;;;;;2076:55;;;;;;2061:70;;1739:408;-1:-1:-1;1673:3:0;;;;:::i;:::-;;;;1635:523;;33380:346;33460:16;;;33452:61;;;;-1:-1:-1;;;33452:61:0;;24933:2:1;33452:61:0;;;24915:21:1;;;24952:18;;;24945:30;25011:34;24991:18;;;24984:62;25063:18;;33452:61:0;24731:356:1;33452:61:0;33533:16;33541:7;33533;:16::i;:::-;33532:17;33524:58;;;;-1:-1:-1;;;33524:58:0;;25294:2:1;33524:58:0;;;25276:21:1;25333:2;25313:18;;;25306:30;25372;25352:18;;;25345:58;25420:18;;33524:58:0;25092:352:1;33524:58:0;33651:7;:16;;;;;;;-1:-1:-1;33651:16:0;;;;;;;;;;;;;;;;;;33685:33;;33710:7;;-1:-1:-1;33685:33:0;;-1:-1:-1;;33685:33:0;33380:346;;:::o;34763:799::-;34918:4;34939:13;;;11656:20;11704:8;34935:620;;34975:72;;;;;:36;;;;;;:72;;7847:10;;35026:4;;35032:7;;35041:5;;34975:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34975:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34971:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35217:13:0;;35213:272;;35260:60;;-1:-1:-1;;;35260:60:0;;23831:2:1;35260:60:0;;;23813:21:1;23870:2;23850:18;;;23843:30;23909:34;23889:18;;;23882:62;23980:20;23960:18;;;23953:48;24018:19;;35260:60:0;23629:414:1;35213:272:0;35435:6;35429:13;35420:6;35416:2;35412:15;35405:38;34971:529;35098:51;;35108:41;35098:51;;-1:-1:-1;35091:58:0;;34935:620;-1:-1:-1;35539:4:0;34763:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;1137:66;1116:88;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:1:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:1;;1448:180;-1:-1:-1;1448:180:1:o;1864:196::-;1932:20;;1992:42;1981:54;;1971:65;;1961:93;;2050:1;2047;2040:12;1961:93;1864:196;;;:::o;2065:254::-;2133:6;2141;2194:2;2182:9;2173:7;2169:23;2165:32;2162:52;;;2210:1;2207;2200:12;2162:52;2233:29;2252:9;2233:29;:::i;:::-;2223:39;2309:2;2294:18;;;;2281:32;;-1:-1:-1;;;2065:254:1:o;2324:160::-;2389:20;;2445:13;;2438:21;2428:32;;2418:60;;2474:1;2471;2464:12;2489:180;2545:6;2598:2;2586:9;2577:7;2573:23;2569:32;2566:52;;;2614:1;2611;2604:12;2566:52;2637:26;2653:9;2637:26;:::i;2856:328::-;2933:6;2941;2949;3002:2;2990:9;2981:7;2977:23;2973:32;2970:52;;;3018:1;3015;3008:12;2970:52;3041:29;3060:9;3041:29;:::i;:::-;3031:39;;3089:38;3123:2;3112:9;3108:18;3089:38;:::i;:::-;3079:48;;3174:2;3163:9;3159:18;3146:32;3136:42;;2856:328;;;;;:::o;3371:184::-;3423:77;3420:1;3413:88;3520:4;3517:1;3510:15;3544:4;3541:1;3534:15;3560:334;3631:2;3625:9;3687:2;3677:13;;3692:66;3673:86;3661:99;;3790:18;3775:34;;3811:22;;;3772:62;3769:88;;;3837:18;;:::i;:::-;3873:2;3866:22;3560:334;;-1:-1:-1;3560:334:1:o;3899:712::-;3953:5;4006:3;3999:4;3991:6;3987:17;3983:27;3973:55;;4024:1;4021;4014:12;3973:55;4060:6;4047:20;4086:4;4109:18;4105:2;4102:26;4099:52;;;4131:18;;:::i;:::-;4177:2;4174:1;4170:10;4200:28;4224:2;4220;4216:11;4200:28;:::i;:::-;4262:15;;;4332;;;4328:24;;;4293:12;;;;4364:15;;;4361:35;;;4392:1;4389;4382:12;4361:35;4428:2;4420:6;4416:15;4405:26;;4440:142;4456:6;4451:3;4448:15;4440:142;;;4522:17;;4510:30;;4473:12;;;;4560;;;;4440:142;;;4600:5;3899:712;-1:-1:-1;;;;;;;3899:712:1:o;4616:484::-;4718:6;4726;4734;4787:2;4775:9;4766:7;4762:23;4758:32;4755:52;;;4803:1;4800;4793:12;4755:52;4839:9;4826:23;4816:33;;4896:2;4885:9;4881:18;4868:32;4858:42;;4951:2;4940:9;4936:18;4923:32;4978:18;4970:6;4967:30;4964:50;;;5010:1;5007;5000:12;4964:50;5033:61;5086:7;5077:6;5066:9;5062:22;5033:61;:::i;:::-;5023:71;;;4616:484;;;;;:::o;5105:466::-;5170:5;5204:18;5196:6;5193:30;5190:56;;;5226:18;;:::i;:::-;5264:116;5374:4;5305:66;5300:2;5292:6;5288:15;5284:88;5280:99;5264:116;:::i;:::-;5255:125;;5403:6;5396:5;5389:21;5443:3;5434:6;5429:3;5425:16;5422:25;5419:45;;;5460:1;5457;5450:12;5419:45;5509:6;5504:3;5497:4;5490:5;5486:16;5473:43;5563:1;5556:4;5547:6;5540:5;5536:18;5532:29;5525:40;5105:466;;;;;:::o;5576:451::-;5645:6;5698:2;5686:9;5677:7;5673:23;5669:32;5666:52;;;5714:1;5711;5704:12;5666:52;5754:9;5741:23;5787:18;5779:6;5776:30;5773:50;;;5819:1;5816;5809:12;5773:50;5842:22;;5895:4;5887:13;;5883:27;-1:-1:-1;5873:55:1;;5924:1;5921;5914:12;5873:55;5947:74;6013:7;6008:2;5995:16;5990:2;5986;5982:11;5947:74;:::i;6032:186::-;6091:6;6144:2;6132:9;6123:7;6119:23;6115:32;6112:52;;;6160:1;6157;6150:12;6112:52;6183:29;6202:9;6183:29;:::i;6408:632::-;6579:2;6631:21;;;6701:13;;6604:18;;;6723:22;;;6550:4;;6579:2;6802:15;;;;6776:2;6761:18;;;6550:4;6845:169;6859:6;6856:1;6853:13;6845:169;;;6920:13;;6908:26;;6989:15;;;;6954:12;;;;6881:1;6874:9;6845:169;;;-1:-1:-1;7031:3:1;;6408:632;-1:-1:-1;;;;;;6408:632:1:o;7045:254::-;7110:6;7118;7171:2;7159:9;7150:7;7146:23;7142:32;7139:52;;;7187:1;7184;7177:12;7139:52;7210:29;7229:9;7210:29;:::i;:::-;7200:39;;7258:35;7289:2;7278:9;7274:18;7258:35;:::i;:::-;7248:45;;7045:254;;;;;:::o;7304:667::-;7399:6;7407;7415;7423;7476:3;7464:9;7455:7;7451:23;7447:33;7444:53;;;7493:1;7490;7483:12;7444:53;7516:29;7535:9;7516:29;:::i;:::-;7506:39;;7564:38;7598:2;7587:9;7583:18;7564:38;:::i;:::-;7554:48;;7649:2;7638:9;7634:18;7621:32;7611:42;;7704:2;7693:9;7689:18;7676:32;7731:18;7723:6;7720:30;7717:50;;;7763:1;7760;7753:12;7717:50;7786:22;;7839:4;7831:13;;7827:27;-1:-1:-1;7817:55:1;;7868:1;7865;7858:12;7817:55;7891:74;7957:7;7952:2;7939:16;7934:2;7930;7926:11;7891:74;:::i;:::-;7881:84;;;7304:667;;;;;;;:::o;8465:260::-;8533:6;8541;8594:2;8582:9;8573:7;8569:23;8565:32;8562:52;;;8610:1;8607;8600:12;8562:52;8633:29;8652:9;8633:29;:::i;:::-;8623:39;;8681:38;8715:2;8704:9;8700:18;8681:38;:::i;8730:437::-;8809:1;8805:12;;;;8852;;;8873:61;;8927:4;8919:6;8915:17;8905:27;;8873:61;8980:2;8972:6;8969:14;8949:18;8946:38;8943:218;;;9017:77;9014:1;9007:88;9118:4;9115:1;9108:15;9146:4;9143:1;9136:15;8943:218;;8730:437;;;:::o;11542:184::-;11594:77;11591:1;11584:88;11691:4;11688:1;11681:15;11715:4;11712:1;11705:15;11731:184;11783:77;11780:1;11773:88;11880:4;11877:1;11870:15;11904:4;11901:1;11894:15;11920:195;11959:3;11990:66;11983:5;11980:77;11977:103;;;12060:18;;:::i;:::-;-1:-1:-1;12107:1:1;12096:13;;11920:195::o;13906:125::-;13946:4;13974:1;13971;13968:8;13965:34;;;13979:18;;:::i;:::-;-1:-1:-1;14016:9:1;;13906:125::o;14036:128::-;14076:3;14107:1;14103:6;14100:1;14097:13;14094:39;;;14113:18;;:::i;:::-;-1:-1:-1;14149:9:1;;14036:128::o;15984:228::-;16024:7;16150:1;16082:66;16078:74;16075:1;16072:81;16067:1;16060:9;16053:17;16049:105;16046:131;;;16157:18;;:::i;:::-;-1:-1:-1;16197:9:1;;15984:228::o;17471:1642::-;17695:3;17733:6;17727:13;17759:4;17772:51;17816:6;17811:3;17806:2;17798:6;17794:15;17772:51;:::i;:::-;17886:13;;17845:16;;;;17908:55;17886:13;17845:16;17930:15;;;17908:55;:::i;:::-;18052:13;;17985:20;;;18025:1;;18112;18134:18;;;;18187;;;;18214:93;;18292:4;18282:8;18278:19;18266:31;;18214:93;18355:2;18345:8;18342:16;18322:18;18319:40;18316:224;;;18394:77;18389:3;18382:90;18495:4;18492:1;18485:15;18525:4;18520:3;18513:17;18316:224;18556:18;18583:168;;;;18765:1;18760:328;;;;18549:539;;18583:168;18633:66;18622:9;18618:82;18611:5;18604:97;18732:8;18725:5;18721:20;18714:27;;18583:168;;18760:328;17418:1;17411:14;;;17455:4;17442:18;;18855:1;18869:169;18883:8;18880:1;18877:15;18869:169;;;18965:14;;18950:13;;;18943:37;19008:16;;;;18900:10;;18869:169;;;18873:3;;19069:8;19062:5;19058:20;19051:27;;18549:539;-1:-1:-1;19104:3:1;;17471:1642;-1:-1:-1;;;;;;;;;;;17471:1642:1:o;24048:184::-;24100:77;24097:1;24090:88;24197:4;24194:1;24187:15;24221:4;24218:1;24211:15;24237:120;24277:1;24303;24293:35;;24308:18;;:::i;:::-;-1:-1:-1;24342:9:1;;24237:120::o;24362:112::-;24394:1;24420;24410:35;;24425:18;;:::i;:::-;-1:-1:-1;24459:9:1;;24362:112::o;25449:512::-;25643:4;25672:42;25753:2;25745:6;25741:15;25730:9;25723:34;25805:2;25797:6;25793:15;25788:2;25777:9;25773:18;25766:43;;25845:6;25840:2;25829:9;25825:18;25818:34;25888:3;25883:2;25872:9;25868:18;25861:31;25909:46;25950:3;25939:9;25935:19;25927:6;25909:46;:::i;:::-;25901:54;25449:512;-1:-1:-1;;;;;;25449:512:1:o;25966:249::-;26035:6;26088:2;26076:9;26067:7;26063:23;26059:32;26056:52;;;26104:1;26101;26094:12;26056:52;26136:9;26130:16;26155:30;26179:5;26155:30;:::i

Swarm Source

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