ETH Price: $3,352.61 (-3.66%)

Token

Stoned Puppies (SP)
 

Overview

Max Total Supply

220 SP

Holders

105

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 SP
0x4431210ecfb49521c19d3a58836747d3f0aa28af
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
StonedPuppies

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-27
*/

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


pragma solidity ^0.8.0;

/**
 * @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 = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: contracts/utils/Strings.sol

pragma solidity ^0.8.0;

/**
 * @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: contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

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

// File: contracts/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

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

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

// File: contracts/utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @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: contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

/**
 * @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: contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


/**
 * @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: contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


/**
 * @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: contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @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: contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @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/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    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;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.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);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    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);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    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);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    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);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    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"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    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"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    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);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.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);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    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;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(IERC165, ERC721)
        returns (bool)
    {
        return
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721.balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721Enumerable.totalSupply(),
            "ERC721Enumerable: global index out of bounds"
        );
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
        private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

contract StonedPuppies is ERC721Enumerable, Ownable {
    using Strings for uint256;

    string public baseURI = "ipfs://QmaLELTy8WP2wjB7jhWtmaiZTjEHXm4VwWbdn54feHASLr/";
    string public baseExtension = ".json";
    string public notRevealedUrl = "ipfs://QmcEp3wnNMMJSmDEw95ayty5uSkESm1TaRoERoJvnDizxW/StonedPupunrev.json";
    uint256 public cost = 50000000000000000;
    uint256 public preCost = 30000000000000000;
    uint256 public maxSupply = 7777;
    bool public public_paused = true;
    bool public pre_paused = false;
    bool public revealed = false;
    mapping(address => uint256) public minted;
    bytes32 public root = 0x6b85893830beee02999cb814c04d33ddac502547eb7152b4c7b3d6ebd53ab54f;



    constructor()
        ERC721("Stoned Puppies", "SP")
        {}

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

    // public
    function mint() public payable {
        uint256 supply = totalSupply();

        require(minted[msg.sender] < 5, "You cannot mint more than 4");
        require(!public_paused, "Public Sale has not started yet");
        require(supply < maxSupply, "Amount exceeds Max Supply");
	    require(msg.value >= cost, "Send appropriate ether value");

        _safeMint(msg.sender, supply+1);
	    minted[msg.sender] += 1;
    }

    function preMint(bytes32[] memory _proof) public payable {
        uint256 supply = totalSupply();

        require(minted[msg.sender] < 5, "You cannot mint more than 4");
        require(!pre_paused, "Public Sale has not started yet");
        require(supply < maxSupply, "Amount exceeds Max Supply");
	    require(msg.value >= preCost, "Send appropriate ether value");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); 
        require (MerkleProof.verify(_proof, root, leaf));

        _safeMint(msg.sender, supply+1);
	    minted[msg.sender] += 1;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        if (!revealed) {
            return notRevealedUrl;
        }

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

    //only owner

    function revealNFT() public onlyOwner {
        revealed = true;
    }

    function setNotRevealedUrl(string memory _newNotRevealedUrl) public onlyOwner {
        notRevealedUrl = _newNotRevealedUrl;
    }

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

    function setPreCost(uint256 _newPreCost) public onlyOwner {
        preCost = _newPreCost;
    }

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

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function startPublicSale() public onlyOwner {
        public_paused = false;
    }

    function stopPublicSale() public onlyOwner {
        public_paused = true;
    }
    
    function startPreSale() public onlyOwner {
        pre_paused = false;
    }

    function stopPreSale() public onlyOwner {
        pre_paused = true;
    }

    function setRoot(bytes32 _newRoot) public onlyOwner {
        root = _newRoot;
    }

    function withdraw() public payable onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":"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":"baseURI","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUrl","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":"preCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pre_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","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":"string","name":"_newNotRevealedUrl","type":"string"}],"name":"setNotRevealedUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPreCost","type":"uint256"}],"name":"setPreCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopPublicSale","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":"","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":[],"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":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60e0604052603660808181529062002b6960a03980516200002991600b91602090910190620001c6565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200005891600c91620001c6565b5060405180608001604052806049815260200162002b9f6049913980516200008991600d91602090910190620001c6565b5066b1a2bc2ec50000600e55666a94d74f430000600f55611e616010556011805462ffffff191660011790557f6b85893830beee02999cb814c04d33ddac502547eb7152b4c7b3d6ebd53ab54f601355348015620000e657600080fd5b50604080518082018252600e81526d53746f6e6564205075707069657360901b602080830191825283518085019094526002845261053560f41b9084015281519192916200013791600091620001c6565b5080516200014d906001906020840190620001c6565b5050506200016a620001646200017060201b60201c565b62000174565b620002a9565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001d4906200026c565b90600052602060002090601f016020900481019282620001f8576000855562000243565b82601f106200021357805160ff191683800117855562000243565b8280016001018555821562000243579182015b828111156200024357825182559160200191906001019062000226565b506200025192915062000255565b5090565b5b8082111562000251576000815560010162000256565b600181811c908216806200028157607f821691505b60208210811415620002a357634e487b7160e01b600052602260045260246000fd5b50919050565b6128b080620002b96000396000f3fe6080604052600436106102675760003560e01c80635c6331bd11610144578063c6682862116100b6578063da3ef23f1161007a578063da3ef23f146106a6578063dab5f340146106c6578063e985e9c5146106e6578063ebf0c7171461072f578063f2fde38b14610745578063f8fb33661461076557600080fd5b8063c668286214610627578063c87b56dd1461063c578063ccde53051461065c578063d5abeb011461067b578063da1b91c31461069157600080fd5b80638da5cb5b116101085780638da5cb5b1461057e57806395d89b411461059c5780639c12e1bc146105b1578063a22cb465146105d1578063b6374e35146105f1578063b88d4fde1461060757600080fd5b80635c6331bd146104fa5780636352211e146105145780636c0360eb1461053457806370a0823114610549578063715018a61461056957600080fd5b806323b872dd116101dd57806344a0d68a116101a157806344a0d68a146104505780634d157211146104705780634f6ccce71461048557806351830227146104a557806355dd574c146104c557806355f804b3146104da57600080fd5b806323b872dd146103c85780632f745c59146103e85780633018f54f146104085780633ccfd60b1461042857806342842e0e1461043057600080fd5b80630c1c972a1161022f5780630c1c972a146103325780631249c58b1461034757806313faede61461034f57806314412dab1461037357806318160ddd146103865780631e7269c51461039b57600080fd5b806301ffc9a71461026c57806304b4bba9146102a157806306fdde03146102b8578063081812fc146102da578063095ea7b314610312575b600080fd5b34801561027857600080fd5b5061028c610287366004612451565b61077a565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b66107a5565b005b3480156102c457600080fd5b506102cd6107eb565b6040516102989190612601565b3480156102e657600080fd5b506102fa6102f5366004612438565b61087d565b6040516001600160a01b039091168152602001610298565b34801561031e57600080fd5b506102b661032d366004612361565b610912565b34801561033e57600080fd5b506102b6610a28565b6102b6610a5e565b34801561035b57600080fd5b50610365600e5481565b604051908152602001610298565b6102b661038136600461238b565b610bf9565b34801561039257600080fd5b50600854610365565b3480156103a757600080fd5b506103656103b636600461221f565b60126020526000908152604090205481565b3480156103d457600080fd5b506102b66103e336600461226d565b610de5565b3480156103f457600080fd5b50610365610403366004612361565b610e16565b34801561041457600080fd5b506102b6610423366004612438565b610eac565b6102b6610edb565b34801561043c57600080fd5b506102b661044b36600461226d565b610f34565b34801561045c57600080fd5b506102b661046b366004612438565b610f4f565b34801561047c57600080fd5b506102cd610f7e565b34801561049157600080fd5b506103656104a0366004612438565b61100c565b3480156104b157600080fd5b5060115461028c9062010000900460ff1681565b3480156104d157600080fd5b506102b661109f565b3480156104e657600080fd5b506102b66104f536600461248b565b6110d6565b34801561050657600080fd5b5060115461028c9060ff1681565b34801561052057600080fd5b506102fa61052f366004612438565b611117565b34801561054057600080fd5b506102cd61118e565b34801561055557600080fd5b5061036561056436600461221f565b61119b565b34801561057557600080fd5b506102b6611222565b34801561058a57600080fd5b50600a546001600160a01b03166102fa565b3480156105a857600080fd5b506102cd611258565b3480156105bd57600080fd5b506102b66105cc36600461248b565b611267565b3480156105dd57600080fd5b506102b66105ec366004612325565b6112a4565b3480156105fd57600080fd5b50610365600f5481565b34801561061357600080fd5b506102b66106223660046122a9565b611369565b34801561063357600080fd5b506102cd6113a1565b34801561064857600080fd5b506102cd610657366004612438565b6113ae565b34801561066857600080fd5b5060115461028c90610100900460ff1681565b34801561068757600080fd5b5061036560105481565b34801561069d57600080fd5b506102b661152e565b3480156106b257600080fd5b506102b66106c136600461248b565b611567565b3480156106d257600080fd5b506102b66106e1366004612438565b6115a4565b3480156106f257600080fd5b5061028c61070136600461223a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561073b57600080fd5b5061036560135481565b34801561075157600080fd5b506102b661076036600461221f565b6115d3565b34801561077157600080fd5b506102b661166b565b60006001600160e01b0319821663780e9d6360e01b148061079f575061079f826116a6565b92915050565b600a546001600160a01b031633146107d85760405162461bcd60e51b81526004016107cf90612666565b60405180910390fd5b6011805462ff0000191662010000179055565b6060600080546107fa9061278c565b80601f01602080910402602001604051908101604052809291908181526020018280546108269061278c565b80156108735780601f1061084857610100808354040283529160200191610873565b820191906000526020600020905b81548152906001019060200180831161085657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108f65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107cf565b506000908152600460205260409020546001600160a01b031690565b600061091d82611117565b9050806001600160a01b0316836001600160a01b0316141561098b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107cf565b336001600160a01b03821614806109a757506109a78133610701565b610a195760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107cf565b610a2383836116f6565b505050565b600a546001600160a01b03163314610a525760405162461bcd60e51b81526004016107cf90612666565b6011805460ff19169055565b6000610a6960085490565b33600090815260126020526040902054909150600511610acb5760405162461bcd60e51b815260206004820152601b60248201527f596f752063616e6e6f74206d696e74206d6f7265207468616e2034000000000060448201526064016107cf565b60115460ff1615610b1e5760405162461bcd60e51b815260206004820152601f60248201527f5075626c69632053616c6520686173206e6f742073746172746564207965740060448201526064016107cf565b6010548110610b6b5760405162461bcd60e51b8152602060048201526019602482015278416d6f756e742065786365656473204d617820537570706c7960381b60448201526064016107cf565b600e54341015610bbd5760405162461bcd60e51b815260206004820152601c60248201527f53656e6420617070726f7072696174652065746865722076616c75650000000060448201526064016107cf565b610bd133610bcc83600161271d565b611764565b336000908152601260205260408120805460019290610bf190849061271d565b909155505050565b6000610c0460085490565b33600090815260126020526040902054909150600511610c665760405162461bcd60e51b815260206004820152601b60248201527f596f752063616e6e6f74206d696e74206d6f7265207468616e2034000000000060448201526064016107cf565b601154610100900460ff1615610cbe5760405162461bcd60e51b815260206004820152601f60248201527f5075626c69632053616c6520686173206e6f742073746172746564207965740060448201526064016107cf565b6010548110610d0b5760405162461bcd60e51b8152602060048201526019602482015278416d6f756e742065786365656473204d617820537570706c7960381b60448201526064016107cf565b600f54341015610d5d5760405162461bcd60e51b815260206004820152601c60248201527f53656e6420617070726f7072696174652065746865722076616c75650000000060448201526064016107cf565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610da3836013548361177e565b610dac57600080fd5b610dbb33610bcc84600161271d565b336000908152601260205260408120805460019290610ddb90849061271d565b9091555050505050565b610def3382611794565b610e0b5760405162461bcd60e51b81526004016107cf9061269b565b610a2383838361188b565b6000610e218361119b565b8210610e835760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107cf565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610ed65760405162461bcd60e51b81526004016107cf90612666565b600f55565b600a546001600160a01b03163314610f055760405162461bcd60e51b81526004016107cf90612666565b60405133904780156108fc02916000818181858888f19350505050158015610f31573d6000803e3d6000fd5b50565b610a2383838360405180602001604052806000815250611369565b600a546001600160a01b03163314610f795760405162461bcd60e51b81526004016107cf90612666565b600e55565b600d8054610f8b9061278c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb79061278c565b80156110045780601f10610fd957610100808354040283529160200191611004565b820191906000526020600020905b815481529060010190602001808311610fe757829003601f168201915b505050505081565b600061101760085490565b821061107a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107cf565b6008828154811061108d5761108d612838565b90600052602060002001549050919050565b600a546001600160a01b031633146110c95760405162461bcd60e51b81526004016107cf90612666565b6011805461ff0019169055565b600a546001600160a01b031633146111005760405162461bcd60e51b81526004016107cf90612666565b805161111390600b906020840190612112565b5050565b6000818152600260205260408120546001600160a01b03168061079f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107cf565b600b8054610f8b9061278c565b60006001600160a01b0382166112065760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107cf565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461124c5760405162461bcd60e51b81526004016107cf90612666565b6112566000611a36565b565b6060600180546107fa9061278c565b600a546001600160a01b031633146112915760405162461bcd60e51b81526004016107cf90612666565b805161111390600d906020840190612112565b6001600160a01b0382163314156112fd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107cf565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113733383611794565b61138f5760405162461bcd60e51b81526004016107cf9061269b565b61139b84848484611a88565b50505050565b600c8054610f8b9061278c565b6000818152600260205260409020546060906001600160a01b031661142d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107cf565b60115462010000900460ff166114cf57600d805461144a9061278c565b80601f01602080910402602001604051908101604052809291908181526020018280546114769061278c565b80156114c35780601f10611498576101008083540402835291602001916114c3565b820191906000526020600020905b8154815290600101906020018083116114a657829003601f168201915b50505050509050919050565b60006114d9611abb565b905060008151116114f95760405180602001604052806000815250611527565b8061150384611aca565b600c60405160200161151793929190612500565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146115585760405162461bcd60e51b81526004016107cf90612666565b6011805460ff19166001179055565b600a546001600160a01b031633146115915760405162461bcd60e51b81526004016107cf90612666565b805161111390600c906020840190612112565b600a546001600160a01b031633146115ce5760405162461bcd60e51b81526004016107cf90612666565b601355565b600a546001600160a01b031633146115fd5760405162461bcd60e51b81526004016107cf90612666565b6001600160a01b0381166116625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107cf565b610f3181611a36565b600a546001600160a01b031633146116955760405162461bcd60e51b81526004016107cf90612666565b6011805461ff001916610100179055565b60006001600160e01b031982166380ac58cd60e01b14806116d757506001600160e01b03198216635b5e139f60e01b145b8061079f57506301ffc9a760e01b6001600160e01b031983161461079f565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061172b82611117565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611113828260405180602001604052806000815250611bc8565b60008261178b8584611bfb565b14949350505050565b6000818152600260205260408120546001600160a01b031661180d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107cf565b600061181883611117565b9050806001600160a01b0316846001600160a01b031614806118535750836001600160a01b03166118488461087d565b6001600160a01b0316145b8061188357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661189e82611117565b6001600160a01b0316146119065760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107cf565b6001600160a01b0382166119685760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107cf565b611973838383611c6f565b61197e6000826116f6565b6001600160a01b03831660009081526003602052604081208054600192906119a7908490612749565b90915550506001600160a01b03821660009081526003602052604081208054600192906119d590849061271d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a9384848461188b565b611a9f84848484611d27565b61139b5760405162461bcd60e51b81526004016107cf90612614565b6060600b80546107fa9061278c565b606081611aee5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b185780611b02816127c7565b9150611b119050600a83612735565b9150611af2565b60008167ffffffffffffffff811115611b3357611b3361284e565b6040519080825280601f01601f191660200182016040528015611b5d576020820181803683370190505b5090505b841561188357611b72600183612749565b9150611b7f600a866127e2565b611b8a90603061271d565b60f81b818381518110611b9f57611b9f612838565b60200101906001600160f81b031916908160001a905350611bc1600a86612735565b9450611b61565b611bd28383611e34565b611bdf6000848484611d27565b610a235760405162461bcd60e51b81526004016107cf90612614565b600081815b8451811015611c67576000858281518110611c1d57611c1d612838565b60200260200101519050808311611c435760008381526020829052604090209250611c54565b600081815260208490526040902092505b5080611c5f816127c7565b915050611c00565b509392505050565b6001600160a01b038316611cca57611cc581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611ced565b816001600160a01b0316836001600160a01b031614611ced57611ced8382611f82565b6001600160a01b038216611d0457610a238161201f565b826001600160a01b0316826001600160a01b031614610a2357610a2382826120ce565b60006001600160a01b0384163b15611e2957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d6b9033908990889088906004016125c4565b602060405180830381600087803b158015611d8557600080fd5b505af1925050508015611db5575060408051601f3d908101601f19168201909252611db29181019061246e565b60015b611e0f573d808015611de3576040519150601f19603f3d011682016040523d82523d6000602084013e611de8565b606091505b508051611e075760405162461bcd60e51b81526004016107cf90612614565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611883565b506001949350505050565b6001600160a01b038216611e8a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107cf565b6000818152600260205260409020546001600160a01b031615611eef5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107cf565b611efb60008383611c6f565b6001600160a01b0382166000908152600360205260408120805460019290611f2490849061271d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001611f8f8461119b565b611f999190612749565b600083815260076020526040902054909150808214611fec576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061203190600190612749565b6000838152600960205260408120546008805493945090928490811061205957612059612838565b90600052602060002001549050806008838154811061207a5761207a612838565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806120b2576120b2612822565b6001900381819060005260206000200160009055905550505050565b60006120d98361119b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461211e9061278c565b90600052602060002090601f0160209004810192826121405760008555612186565b82601f1061215957805160ff1916838001178555612186565b82800160010185558215612186579182015b8281111561218657825182559160200191906001019061216b565b50612192929150612196565b5090565b5b808211156121925760008155600101612197565b600067ffffffffffffffff8311156121c5576121c561284e565b6121d8601f8401601f19166020016126ec565b90508281528383830111156121ec57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461221a57600080fd5b919050565b60006020828403121561223157600080fd5b61152782612203565b6000806040838503121561224d57600080fd5b61225683612203565b915061226460208401612203565b90509250929050565b60008060006060848603121561228257600080fd5b61228b84612203565b925061229960208501612203565b9150604084013590509250925092565b600080600080608085870312156122bf57600080fd5b6122c885612203565b93506122d660208601612203565b925060408501359150606085013567ffffffffffffffff8111156122f957600080fd5b8501601f8101871361230a57600080fd5b612319878235602084016121ab565b91505092959194509250565b6000806040838503121561233857600080fd5b61234183612203565b91506020830135801515811461235657600080fd5b809150509250929050565b6000806040838503121561237457600080fd5b61237d83612203565b946020939093013593505050565b6000602080838503121561239e57600080fd5b823567ffffffffffffffff808211156123b657600080fd5b818501915085601f8301126123ca57600080fd5b8135818111156123dc576123dc61284e565b8060051b91506123ed8483016126ec565b8181528481019084860184860187018a101561240857600080fd5b600095505b8386101561242b57803583526001959095019491860191860161240d565b5098975050505050505050565b60006020828403121561244a57600080fd5b5035919050565b60006020828403121561246357600080fd5b813561152781612864565b60006020828403121561248057600080fd5b815161152781612864565b60006020828403121561249d57600080fd5b813567ffffffffffffffff8111156124b457600080fd5b8201601f810184136124c557600080fd5b611883848235602084016121ab565b600081518084526124ec816020860160208601612760565b601f01601f19169290920160200192915050565b6000845160206125138285838a01612760565b8551918401916125268184848a01612760565b8554920191600090600181811c908083168061254357607f831692505b85831081141561256157634e487b7160e01b85526022600452602485fd5b8080156125755760018114612586576125b3565b60ff198516885283880195506125b3565b60008b81526020902060005b858110156125ab5781548a820152908401908801612592565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906125f7908301846124d4565b9695505050505050565b60208152600061152760208301846124d4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156127155761271561284e565b604052919050565b60008219821115612730576127306127f6565b500190565b6000826127445761274461280c565b500490565b60008282101561275b5761275b6127f6565b500390565b60005b8381101561277b578181015183820152602001612763565b8381111561139b5750506000910152565b600181811c908216806127a057607f821691505b602082108114156127c157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127db576127db6127f6565b5060010190565b6000826127f1576127f161280c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f3157600080fdfea2646970667358221220941acd877ce224ecf8132064aa472cfbe02bddcd90504d4cd2ecd2e16e691ef564736f6c63430008070033697066733a2f2f516d614c454c547938575032776a42376a6857746d61695a546a4548586d3456775762646e353466654841534c722f697066733a2f2f516d63457033776e4e4d4d4a536d4445773935617974793575536b45536d315461526f45526f4a766e44697a78572f53746f6e6564507570756e7265762e6a736f6e

Deployed Bytecode

0x6080604052600436106102675760003560e01c80635c6331bd11610144578063c6682862116100b6578063da3ef23f1161007a578063da3ef23f146106a6578063dab5f340146106c6578063e985e9c5146106e6578063ebf0c7171461072f578063f2fde38b14610745578063f8fb33661461076557600080fd5b8063c668286214610627578063c87b56dd1461063c578063ccde53051461065c578063d5abeb011461067b578063da1b91c31461069157600080fd5b80638da5cb5b116101085780638da5cb5b1461057e57806395d89b411461059c5780639c12e1bc146105b1578063a22cb465146105d1578063b6374e35146105f1578063b88d4fde1461060757600080fd5b80635c6331bd146104fa5780636352211e146105145780636c0360eb1461053457806370a0823114610549578063715018a61461056957600080fd5b806323b872dd116101dd57806344a0d68a116101a157806344a0d68a146104505780634d157211146104705780634f6ccce71461048557806351830227146104a557806355dd574c146104c557806355f804b3146104da57600080fd5b806323b872dd146103c85780632f745c59146103e85780633018f54f146104085780633ccfd60b1461042857806342842e0e1461043057600080fd5b80630c1c972a1161022f5780630c1c972a146103325780631249c58b1461034757806313faede61461034f57806314412dab1461037357806318160ddd146103865780631e7269c51461039b57600080fd5b806301ffc9a71461026c57806304b4bba9146102a157806306fdde03146102b8578063081812fc146102da578063095ea7b314610312575b600080fd5b34801561027857600080fd5b5061028c610287366004612451565b61077a565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b66107a5565b005b3480156102c457600080fd5b506102cd6107eb565b6040516102989190612601565b3480156102e657600080fd5b506102fa6102f5366004612438565b61087d565b6040516001600160a01b039091168152602001610298565b34801561031e57600080fd5b506102b661032d366004612361565b610912565b34801561033e57600080fd5b506102b6610a28565b6102b6610a5e565b34801561035b57600080fd5b50610365600e5481565b604051908152602001610298565b6102b661038136600461238b565b610bf9565b34801561039257600080fd5b50600854610365565b3480156103a757600080fd5b506103656103b636600461221f565b60126020526000908152604090205481565b3480156103d457600080fd5b506102b66103e336600461226d565b610de5565b3480156103f457600080fd5b50610365610403366004612361565b610e16565b34801561041457600080fd5b506102b6610423366004612438565b610eac565b6102b6610edb565b34801561043c57600080fd5b506102b661044b36600461226d565b610f34565b34801561045c57600080fd5b506102b661046b366004612438565b610f4f565b34801561047c57600080fd5b506102cd610f7e565b34801561049157600080fd5b506103656104a0366004612438565b61100c565b3480156104b157600080fd5b5060115461028c9062010000900460ff1681565b3480156104d157600080fd5b506102b661109f565b3480156104e657600080fd5b506102b66104f536600461248b565b6110d6565b34801561050657600080fd5b5060115461028c9060ff1681565b34801561052057600080fd5b506102fa61052f366004612438565b611117565b34801561054057600080fd5b506102cd61118e565b34801561055557600080fd5b5061036561056436600461221f565b61119b565b34801561057557600080fd5b506102b6611222565b34801561058a57600080fd5b50600a546001600160a01b03166102fa565b3480156105a857600080fd5b506102cd611258565b3480156105bd57600080fd5b506102b66105cc36600461248b565b611267565b3480156105dd57600080fd5b506102b66105ec366004612325565b6112a4565b3480156105fd57600080fd5b50610365600f5481565b34801561061357600080fd5b506102b66106223660046122a9565b611369565b34801561063357600080fd5b506102cd6113a1565b34801561064857600080fd5b506102cd610657366004612438565b6113ae565b34801561066857600080fd5b5060115461028c90610100900460ff1681565b34801561068757600080fd5b5061036560105481565b34801561069d57600080fd5b506102b661152e565b3480156106b257600080fd5b506102b66106c136600461248b565b611567565b3480156106d257600080fd5b506102b66106e1366004612438565b6115a4565b3480156106f257600080fd5b5061028c61070136600461223a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561073b57600080fd5b5061036560135481565b34801561075157600080fd5b506102b661076036600461221f565b6115d3565b34801561077157600080fd5b506102b661166b565b60006001600160e01b0319821663780e9d6360e01b148061079f575061079f826116a6565b92915050565b600a546001600160a01b031633146107d85760405162461bcd60e51b81526004016107cf90612666565b60405180910390fd5b6011805462ff0000191662010000179055565b6060600080546107fa9061278c565b80601f01602080910402602001604051908101604052809291908181526020018280546108269061278c565b80156108735780601f1061084857610100808354040283529160200191610873565b820191906000526020600020905b81548152906001019060200180831161085657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108f65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107cf565b506000908152600460205260409020546001600160a01b031690565b600061091d82611117565b9050806001600160a01b0316836001600160a01b0316141561098b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107cf565b336001600160a01b03821614806109a757506109a78133610701565b610a195760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107cf565b610a2383836116f6565b505050565b600a546001600160a01b03163314610a525760405162461bcd60e51b81526004016107cf90612666565b6011805460ff19169055565b6000610a6960085490565b33600090815260126020526040902054909150600511610acb5760405162461bcd60e51b815260206004820152601b60248201527f596f752063616e6e6f74206d696e74206d6f7265207468616e2034000000000060448201526064016107cf565b60115460ff1615610b1e5760405162461bcd60e51b815260206004820152601f60248201527f5075626c69632053616c6520686173206e6f742073746172746564207965740060448201526064016107cf565b6010548110610b6b5760405162461bcd60e51b8152602060048201526019602482015278416d6f756e742065786365656473204d617820537570706c7960381b60448201526064016107cf565b600e54341015610bbd5760405162461bcd60e51b815260206004820152601c60248201527f53656e6420617070726f7072696174652065746865722076616c75650000000060448201526064016107cf565b610bd133610bcc83600161271d565b611764565b336000908152601260205260408120805460019290610bf190849061271d565b909155505050565b6000610c0460085490565b33600090815260126020526040902054909150600511610c665760405162461bcd60e51b815260206004820152601b60248201527f596f752063616e6e6f74206d696e74206d6f7265207468616e2034000000000060448201526064016107cf565b601154610100900460ff1615610cbe5760405162461bcd60e51b815260206004820152601f60248201527f5075626c69632053616c6520686173206e6f742073746172746564207965740060448201526064016107cf565b6010548110610d0b5760405162461bcd60e51b8152602060048201526019602482015278416d6f756e742065786365656473204d617820537570706c7960381b60448201526064016107cf565b600f54341015610d5d5760405162461bcd60e51b815260206004820152601c60248201527f53656e6420617070726f7072696174652065746865722076616c75650000000060448201526064016107cf565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610da3836013548361177e565b610dac57600080fd5b610dbb33610bcc84600161271d565b336000908152601260205260408120805460019290610ddb90849061271d565b9091555050505050565b610def3382611794565b610e0b5760405162461bcd60e51b81526004016107cf9061269b565b610a2383838361188b565b6000610e218361119b565b8210610e835760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107cf565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610ed65760405162461bcd60e51b81526004016107cf90612666565b600f55565b600a546001600160a01b03163314610f055760405162461bcd60e51b81526004016107cf90612666565b60405133904780156108fc02916000818181858888f19350505050158015610f31573d6000803e3d6000fd5b50565b610a2383838360405180602001604052806000815250611369565b600a546001600160a01b03163314610f795760405162461bcd60e51b81526004016107cf90612666565b600e55565b600d8054610f8b9061278c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb79061278c565b80156110045780601f10610fd957610100808354040283529160200191611004565b820191906000526020600020905b815481529060010190602001808311610fe757829003601f168201915b505050505081565b600061101760085490565b821061107a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107cf565b6008828154811061108d5761108d612838565b90600052602060002001549050919050565b600a546001600160a01b031633146110c95760405162461bcd60e51b81526004016107cf90612666565b6011805461ff0019169055565b600a546001600160a01b031633146111005760405162461bcd60e51b81526004016107cf90612666565b805161111390600b906020840190612112565b5050565b6000818152600260205260408120546001600160a01b03168061079f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107cf565b600b8054610f8b9061278c565b60006001600160a01b0382166112065760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107cf565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461124c5760405162461bcd60e51b81526004016107cf90612666565b6112566000611a36565b565b6060600180546107fa9061278c565b600a546001600160a01b031633146112915760405162461bcd60e51b81526004016107cf90612666565b805161111390600d906020840190612112565b6001600160a01b0382163314156112fd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107cf565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113733383611794565b61138f5760405162461bcd60e51b81526004016107cf9061269b565b61139b84848484611a88565b50505050565b600c8054610f8b9061278c565b6000818152600260205260409020546060906001600160a01b031661142d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107cf565b60115462010000900460ff166114cf57600d805461144a9061278c565b80601f01602080910402602001604051908101604052809291908181526020018280546114769061278c565b80156114c35780601f10611498576101008083540402835291602001916114c3565b820191906000526020600020905b8154815290600101906020018083116114a657829003601f168201915b50505050509050919050565b60006114d9611abb565b905060008151116114f95760405180602001604052806000815250611527565b8061150384611aca565b600c60405160200161151793929190612500565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146115585760405162461bcd60e51b81526004016107cf90612666565b6011805460ff19166001179055565b600a546001600160a01b031633146115915760405162461bcd60e51b81526004016107cf90612666565b805161111390600c906020840190612112565b600a546001600160a01b031633146115ce5760405162461bcd60e51b81526004016107cf90612666565b601355565b600a546001600160a01b031633146115fd5760405162461bcd60e51b81526004016107cf90612666565b6001600160a01b0381166116625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107cf565b610f3181611a36565b600a546001600160a01b031633146116955760405162461bcd60e51b81526004016107cf90612666565b6011805461ff001916610100179055565b60006001600160e01b031982166380ac58cd60e01b14806116d757506001600160e01b03198216635b5e139f60e01b145b8061079f57506301ffc9a760e01b6001600160e01b031983161461079f565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061172b82611117565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611113828260405180602001604052806000815250611bc8565b60008261178b8584611bfb565b14949350505050565b6000818152600260205260408120546001600160a01b031661180d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107cf565b600061181883611117565b9050806001600160a01b0316846001600160a01b031614806118535750836001600160a01b03166118488461087d565b6001600160a01b0316145b8061188357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661189e82611117565b6001600160a01b0316146119065760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107cf565b6001600160a01b0382166119685760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107cf565b611973838383611c6f565b61197e6000826116f6565b6001600160a01b03831660009081526003602052604081208054600192906119a7908490612749565b90915550506001600160a01b03821660009081526003602052604081208054600192906119d590849061271d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a9384848461188b565b611a9f84848484611d27565b61139b5760405162461bcd60e51b81526004016107cf90612614565b6060600b80546107fa9061278c565b606081611aee5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b185780611b02816127c7565b9150611b119050600a83612735565b9150611af2565b60008167ffffffffffffffff811115611b3357611b3361284e565b6040519080825280601f01601f191660200182016040528015611b5d576020820181803683370190505b5090505b841561188357611b72600183612749565b9150611b7f600a866127e2565b611b8a90603061271d565b60f81b818381518110611b9f57611b9f612838565b60200101906001600160f81b031916908160001a905350611bc1600a86612735565b9450611b61565b611bd28383611e34565b611bdf6000848484611d27565b610a235760405162461bcd60e51b81526004016107cf90612614565b600081815b8451811015611c67576000858281518110611c1d57611c1d612838565b60200260200101519050808311611c435760008381526020829052604090209250611c54565b600081815260208490526040902092505b5080611c5f816127c7565b915050611c00565b509392505050565b6001600160a01b038316611cca57611cc581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611ced565b816001600160a01b0316836001600160a01b031614611ced57611ced8382611f82565b6001600160a01b038216611d0457610a238161201f565b826001600160a01b0316826001600160a01b031614610a2357610a2382826120ce565b60006001600160a01b0384163b15611e2957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d6b9033908990889088906004016125c4565b602060405180830381600087803b158015611d8557600080fd5b505af1925050508015611db5575060408051601f3d908101601f19168201909252611db29181019061246e565b60015b611e0f573d808015611de3576040519150601f19603f3d011682016040523d82523d6000602084013e611de8565b606091505b508051611e075760405162461bcd60e51b81526004016107cf90612614565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611883565b506001949350505050565b6001600160a01b038216611e8a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107cf565b6000818152600260205260409020546001600160a01b031615611eef5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107cf565b611efb60008383611c6f565b6001600160a01b0382166000908152600360205260408120805460019290611f2490849061271d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001611f8f8461119b565b611f999190612749565b600083815260076020526040902054909150808214611fec576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061203190600190612749565b6000838152600960205260408120546008805493945090928490811061205957612059612838565b90600052602060002001549050806008838154811061207a5761207a612838565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806120b2576120b2612822565b6001900381819060005260206000200160009055905550505050565b60006120d98361119b565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461211e9061278c565b90600052602060002090601f0160209004810192826121405760008555612186565b82601f1061215957805160ff1916838001178555612186565b82800160010185558215612186579182015b8281111561218657825182559160200191906001019061216b565b50612192929150612196565b5090565b5b808211156121925760008155600101612197565b600067ffffffffffffffff8311156121c5576121c561284e565b6121d8601f8401601f19166020016126ec565b90508281528383830111156121ec57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461221a57600080fd5b919050565b60006020828403121561223157600080fd5b61152782612203565b6000806040838503121561224d57600080fd5b61225683612203565b915061226460208401612203565b90509250929050565b60008060006060848603121561228257600080fd5b61228b84612203565b925061229960208501612203565b9150604084013590509250925092565b600080600080608085870312156122bf57600080fd5b6122c885612203565b93506122d660208601612203565b925060408501359150606085013567ffffffffffffffff8111156122f957600080fd5b8501601f8101871361230a57600080fd5b612319878235602084016121ab565b91505092959194509250565b6000806040838503121561233857600080fd5b61234183612203565b91506020830135801515811461235657600080fd5b809150509250929050565b6000806040838503121561237457600080fd5b61237d83612203565b946020939093013593505050565b6000602080838503121561239e57600080fd5b823567ffffffffffffffff808211156123b657600080fd5b818501915085601f8301126123ca57600080fd5b8135818111156123dc576123dc61284e565b8060051b91506123ed8483016126ec565b8181528481019084860184860187018a101561240857600080fd5b600095505b8386101561242b57803583526001959095019491860191860161240d565b5098975050505050505050565b60006020828403121561244a57600080fd5b5035919050565b60006020828403121561246357600080fd5b813561152781612864565b60006020828403121561248057600080fd5b815161152781612864565b60006020828403121561249d57600080fd5b813567ffffffffffffffff8111156124b457600080fd5b8201601f810184136124c557600080fd5b611883848235602084016121ab565b600081518084526124ec816020860160208601612760565b601f01601f19169290920160200192915050565b6000845160206125138285838a01612760565b8551918401916125268184848a01612760565b8554920191600090600181811c908083168061254357607f831692505b85831081141561256157634e487b7160e01b85526022600452602485fd5b8080156125755760018114612586576125b3565b60ff198516885283880195506125b3565b60008b81526020902060005b858110156125ab5781548a820152908401908801612592565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906125f7908301846124d4565b9695505050505050565b60208152600061152760208301846124d4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156127155761271561284e565b604052919050565b60008219821115612730576127306127f6565b500190565b6000826127445761274461280c565b500490565b60008282101561275b5761275b6127f6565b500390565b60005b8381101561277b578181015183820152602001612763565b8381111561139b5750506000910152565b600181811c908216806127a057607f821691505b602082108114156127c157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127db576127db6127f6565b5060010190565b6000826127f1576127f161280c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f3157600080fdfea2646970667358221220941acd877ce224ecf8132064aa472cfbe02bddcd90504d4cd2ecd2e16e691ef564736f6c63430008070033

Deployed Bytecode Sourcemap

47323:3882:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40850:300;;;;;;;;;;-1:-1:-1;40850:300:0;;;;;:::i;:::-;;:::i;:::-;;;7859:14:1;;7852:22;7834:41;;7822:2;7807:18;40850:300:0;;;;;;;;49969:72;;;;;;;;;;;;;:::i;:::-;;28020:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29713:308::-;;;;;;;;;;-1:-1:-1;29713:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7157:32:1;;;7139:51;;7127:2;7112:18;29713:308:0;6993:203:1;29236:411:0;;;;;;;;;;-1:-1:-1;29236:411:0;;;;;:::i;:::-;;:::i;50637:84::-;;;;;;;;;;;;;:::i;48274:432::-;;;:::i;47660:39::-;;;;;;;;;;;;;;;;;;;8032:25:1;;;8020:2;8005:18;47660:39:0;7886:177:1;48714:585:0;;;;;;:::i;:::-;;:::i;41653:113::-;;;;;;;;;;-1:-1:-1;41741:10:0;:17;41653:113;;47904:41;;;;;;;;;;-1:-1:-1;47904:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;30772:376;;;;;;;;;;-1:-1:-1;30772:376:0;;;;;:::i;:::-;;:::i;41234:343::-;;;;;;;;;;-1:-1:-1;41234:343:0;;;;;:::i;:::-;;:::i;50283:98::-;;;;;;;;;;-1:-1:-1;50283:98:0;;;;;:::i;:::-;;:::i;51087:115::-;;;:::i;31219:185::-;;;;;;;;;;-1:-1:-1;31219:185:0;;;;;:::i;:::-;;:::i;50189:86::-;;;;;;;;;;-1:-1:-1;50189:86:0;;;;;:::i;:::-;;:::i;47547:106::-;;;;;;;;;;;;;:::i;41843:320::-;;;;;;;;;;-1:-1:-1;41843:320:0;;;;;:::i;:::-;;:::i;47869:28::-;;;;;;;;;;-1:-1:-1;47869:28:0;;;;;;;;;;;50823:78;;;;;;;;;;;;;:::i;50389:104::-;;;;;;;;;;-1:-1:-1;50389:104:0;;;;;:::i;:::-;;:::i;47793:32::-;;;;;;;;;;-1:-1:-1;47793:32:0;;;;;;;;27627:326;;;;;;;;;;-1:-1:-1;27627:326:0;;;;;:::i;:::-;;:::i;47416:80::-;;;;;;;;;;;;;:::i;27270:295::-;;;;;;;;;;-1:-1:-1;27270:295:0;;;;;:::i;:::-;;:::i;6870:94::-;;;;;;;;;;;;;:::i;6219:87::-;;;;;;;;;;-1:-1:-1;6292:6:0;;-1:-1:-1;;;;;6292:6:0;6219:87;;28189:104;;;;;;;;;;;;;:::i;50049:132::-;;;;;;;;;;-1:-1:-1;50049:132:0;;;;;:::i;:::-;;:::i;30093:327::-;;;;;;;;;;-1:-1:-1;30093:327:0;;;;;:::i;:::-;;:::i;47706:42::-;;;;;;;;;;;;;;;;31475:365;;;;;;;;;;-1:-1:-1;31475:365:0;;;;;:::i;:::-;;:::i;47503:37::-;;;;;;;;;;;;;:::i;49311:630::-;;;;;;;;;;-1:-1:-1;49311:630:0;;;;;:::i;:::-;;:::i;47832:30::-;;;;;;;;;;-1:-1:-1;47832:30:0;;;;;;;;;;;47755:31;;;;;;;;;;;;;;;;50729:82;;;;;;;;;;;;;:::i;50501:128::-;;;;;;;;;;-1:-1:-1;50501:128:0;;;;;:::i;:::-;;:::i;50993:86::-;;;;;;;;;;-1:-1:-1;50993:86:0;;;;;:::i;:::-;;:::i;30491:214::-;;;;;;;;;;-1:-1:-1;30491:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;30662:25:0;;;30633:4;30662:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30491:214;47952:88;;;;;;;;;;;;;;;;7119:229;;;;;;;;;;-1:-1:-1;7119:229:0;;;;;:::i;:::-;;:::i;50909:76::-;;;;;;;;;;;;;:::i;40850:300::-;40997:4;-1:-1:-1;;;;;;41039:50:0;;-1:-1:-1;;;41039:50:0;;:103;;;41106:36;41130:11;41106:23;:36::i;:::-;41019:123;40850:300;-1:-1:-1;;40850:300:0:o;49969:72::-;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;;;;;;;;;50018:8:::1;:15:::0;;-1:-1:-1;;50018:15:0::1;::::0;::::1;::::0;;49969:72::o;28020:100::-;28074:13;28107:5;28100:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28020:100;:::o;29713:308::-;29834:7;33476:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33476:16:0;29859:110;;;;-1:-1:-1;;;29859:110:0;;13228:2:1;29859:110:0;;;13210:21:1;13267:2;13247:18;;;13240:30;13306:34;13286:18;;;13279:62;-1:-1:-1;;;13357:18:1;;;13350:42;13409:19;;29859:110:0;13026:408:1;29859:110:0;-1:-1:-1;29989:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29989:24:0;;29713:308::o;29236:411::-;29317:13;29333:23;29348:7;29333:14;:23::i;:::-;29317:39;;29381:5;-1:-1:-1;;;;;29375:11:0;:2;-1:-1:-1;;;;;29375:11:0;;;29367:57;;;;-1:-1:-1;;;29367:57:0;;15895:2:1;29367:57:0;;;15877:21:1;15934:2;15914:18;;;15907:30;15973:34;15953:18;;;15946:62;-1:-1:-1;;;16024:18:1;;;16017:31;16065:19;;29367:57:0;15693:397:1;29367:57:0;5076:10;-1:-1:-1;;;;;29459:21:0;;;;:62;;-1:-1:-1;29484:37:0;29501:5;5076:10;30491:214;:::i;29484:37::-;29437:168;;;;-1:-1:-1;;;29437:168:0;;11261:2:1;29437:168:0;;;11243:21:1;11300:2;11280:18;;;11273:30;11339:34;11319:18;;;11312:62;11410:26;11390:18;;;11383:54;11454:19;;29437:168:0;11059:420:1;29437:168:0;29618:21;29627:2;29631:7;29618:8;:21::i;:::-;29306:341;29236:411;;:::o;50637:84::-;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;50692:13:::1;:21:::0;;-1:-1:-1;;50692:21:0::1;::::0;;50637:84::o;48274:432::-;48316:14;48333:13;41741:10;:17;;41653:113;48333:13;48374:10;48367:18;;;;:6;:18;;;;;;48316:30;;-1:-1:-1;48388:1:0;-1:-1:-1;48359:62:0;;;;-1:-1:-1;;;48359:62:0;;13641:2:1;48359:62:0;;;13623:21:1;13680:2;13660:18;;;13653:30;13719:29;13699:18;;;13692:57;13766:18;;48359:62:0;13439:351:1;48359:62:0;48441:13;;;;48440:14;48432:58;;;;-1:-1:-1;;;48432:58:0;;12507:2:1;48432:58:0;;;12489:21:1;12546:2;12526:18;;;12519:30;12585:33;12565:18;;;12558:61;12636:18;;48432:58:0;12305:355:1;48432:58:0;48518:9;;48509:6;:18;48501:56;;;;-1:-1:-1;;;48501:56:0;;15541:2:1;48501:56:0;;;15523:21:1;15580:2;15560:18;;;15553:30;-1:-1:-1;;;15599:18:1;;;15592:55;15664:18;;48501:56:0;15339:349:1;48501:56:0;48586:4;;48573:9;:17;;48565:58;;;;-1:-1:-1;;;48565:58:0;;15184:2:1;48565:58:0;;;15166:21:1;15223:2;15203:18;;;15196:30;15262;15242:18;;;15235:58;15310:18;;48565:58:0;14982:352:1;48565:58:0;48636:31;48646:10;48658:8;:6;48665:1;48658:8;:::i;:::-;48636:9;:31::i;:::-;48682:10;48675:18;;;;:6;:18;;;;;:23;;48697:1;;48675:18;:23;;48697:1;;48675:23;:::i;:::-;;;;-1:-1:-1;;;48274:432:0:o;48714:585::-;48782:14;48799:13;41741:10;:17;;41653:113;48799:13;48840:10;48833:18;;;;:6;:18;;;;;;48782:30;;-1:-1:-1;48854:1:0;-1:-1:-1;48825:62:0;;;;-1:-1:-1;;;48825:62:0;;13641:2:1;48825:62:0;;;13623:21:1;13680:2;13660:18;;;13653:30;13719:29;13699:18;;;13692:57;13766:18;;48825:62:0;13439:351:1;48825:62:0;48907:10;;;;;;;48906:11;48898:55;;;;-1:-1:-1;;;48898:55:0;;12507:2:1;48898:55:0;;;12489:21:1;12546:2;12526:18;;;12519:30;12585:33;12565:18;;;12558:61;12636:18;;48898:55:0;12305:355:1;48898:55:0;48981:9;;48972:6;:18;48964:56;;;;-1:-1:-1;;;48964:56:0;;15541:2:1;48964:56:0;;;15523:21:1;15580:2;15560:18;;;15553:30;-1:-1:-1;;;15599:18:1;;;15592:55;15664:18;;48964:56:0;15339:349:1;48964:56:0;49049:7;;49036:9;:20;;49028:61;;;;-1:-1:-1;;;49028:61:0;;15184:2:1;49028:61:0;;;15166:21:1;15223:2;15203:18;;;15196:30;15262;15242:18;;;15235:58;15310:18;;49028:61:0;14982:352:1;49028:61:0;49127:28;;-1:-1:-1;;49144:10:0;5376:2:1;5372:15;5368:53;49127:28:0;;;5356:66:1;49102:12:0;;5438::1;;49127:28:0;;;;;;;;;;;;49117:39;;;;;;49102:54;;49177:38;49196:6;49204:4;;49210;49177:18;:38::i;:::-;49168:48;;;;;;49229:31;49239:10;49251:8;:6;49258:1;49251:8;:::i;49229:31::-;49275:10;49268:18;;;;:6;:18;;;;;:23;;49290:1;;49268:18;:23;;49290:1;;49268:23;:::i;:::-;;;;-1:-1:-1;;;;;48714:585:0:o;30772:376::-;30981:41;5076:10;31014:7;30981:18;:41::i;:::-;30959:140;;;;-1:-1:-1;;;30959:140:0;;;;;;;:::i;:::-;31112:28;31122:4;31128:2;31132:7;31112:9;:28::i;41234:343::-;41376:7;41431:23;41448:5;41431:16;:23::i;:::-;41423:5;:31;41401:124;;;;-1:-1:-1;;;41401:124:0;;8494:2:1;41401:124:0;;;8476:21:1;8533:2;8513:18;;;8506:30;8572:34;8552:18;;;8545:62;-1:-1:-1;;;8623:18:1;;;8616:41;8674:19;;41401:124:0;8292:407:1;41401:124:0;-1:-1:-1;;;;;;41543:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;41234:343::o;50283:98::-;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;50352:7:::1;:21:::0;50283:98::o;51087:115::-;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;51143:51:::1;::::0;51151:10:::1;::::0;51172:21:::1;51143:51:::0;::::1;;;::::0;::::1;::::0;;;51172:21;51151:10;51143:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;51087:115::o:0;31219:185::-;31357:39;31374:4;31380:2;31384:7;31357:39;;;;;;;;;;;;:16;:39::i;50189:86::-;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;50252:4:::1;:15:::0;50189:86::o;47547:106::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41843:320::-;41963:7;42018:30;41741:10;:17;;41653:113;42018:30;42010:5;:38;41988:132;;;;-1:-1:-1;;;41988:132:0;;16715:2:1;41988:132:0;;;16697:21:1;16754:2;16734:18;;;16727:30;16793:34;16773:18;;;16766:62;-1:-1:-1;;;16844:18:1;;;16837:42;16896:19;;41988:132:0;16513:408:1;41988:132:0;42138:10;42149:5;42138:17;;;;;;;;:::i;:::-;;;;;;;;;42131:24;;41843:320;;;:::o;50823:78::-;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;50875:10:::1;:18:::0;;-1:-1:-1;;50875:18:0::1;::::0;;50823:78::o;50389:104::-;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;50464:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;50389:104:::0;:::o;27627:326::-;27744:7;27785:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27785:16:0;27834:19;27812:110;;;;-1:-1:-1;;;27812:110:0;;12097:2:1;27812:110:0;;;12079:21:1;12136:2;12116:18;;;12109:30;12175:34;12155:18;;;12148:62;-1:-1:-1;;;12226:18:1;;;12219:39;12275:19;;27812:110:0;11895:405:1;47416:80:0;;;;;;;:::i;27270:295::-;27387:7;-1:-1:-1;;;;;27434:19:0;;27412:111;;;;-1:-1:-1;;;27412:111:0;;11686:2:1;27412:111:0;;;11668:21:1;11725:2;11705:18;;;11698:30;11764:34;11744:18;;;11737:62;-1:-1:-1;;;11815:18:1;;;11808:40;11865:19;;27412:111:0;11484:406:1;27412:111:0;-1:-1:-1;;;;;;27541:16:0;;;;;:9;:16;;;;;;;27270:295::o;6870:94::-;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;6935:21:::1;6953:1;6935:9;:21::i;:::-;6870:94::o:0;28189:104::-;28245:13;28278:7;28271:14;;;;;:::i;50049:132::-;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;50138:35;;::::1;::::0;:14:::1;::::0;:35:::1;::::0;::::1;::::0;::::1;:::i;30093:327::-:0;-1:-1:-1;;;;;30228:24:0;;5076:10;30228:24;;30220:62;;;;-1:-1:-1;;;30220:62:0;;10494:2:1;30220:62:0;;;10476:21:1;10533:2;10513:18;;;10506:30;10572:27;10552:18;;;10545:55;10617:18;;30220:62:0;10292:349:1;30220:62:0;5076:10;30295:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30295:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30295:53:0;;;;;;;;;;30364:48;;7834:41:1;;;30295:42:0;;5076:10;30364:48;;7807:18:1;30364:48:0;;;;;;;30093:327;;:::o;31475:365::-;31664:41;5076:10;31697:7;31664:18;:41::i;:::-;31642:140;;;;-1:-1:-1;;;31642:140:0;;;;;;;:::i;:::-;31793:39;31807:4;31813:2;31817:7;31826:5;31793:13;:39::i;:::-;31475:365;;;;:::o;47503:37::-;;;;;;;:::i;49311:630::-;33452:4;33476:16;;;:7;:16;;;;;;49384:13;;-1:-1:-1;;;;;33476:16:0;49410:76;;;;-1:-1:-1;;;49410:76:0;;14768:2:1;49410:76:0;;;14750:21:1;14807:2;14787:18;;;14780:30;14846:34;14826:18;;;14819:62;-1:-1:-1;;;14897:18:1;;;14890:45;14952:19;;49410:76:0;14566:411:1;49410:76:0;49504:8;;;;;;;49499:63;;49536:14;49529:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49311:630;;;:::o;49499:63::-;49574:28;49605:10;:8;:10::i;:::-;49574:41;;49677:1;49652:14;49646:28;:32;:287;;;;;;;;;;;;;;;;;49770:14;49811:18;:7;:16;:18::i;:::-;49856:13;49727:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49646:287;49626:307;49311:630;-1:-1:-1;;;49311:630:0:o;50729:82::-;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;50783:13:::1;:20:::0;;-1:-1:-1;;50783:20:0::1;50799:4;50783:20;::::0;;50729:82::o;50501:128::-;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;50588:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;50993:86::-:0;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;51056:4:::1;:15:::0;50993:86::o;7119:229::-;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7222:22:0;::::1;7200:110;;;::::0;-1:-1:-1;;;7200:110:0;;9325:2:1;7200:110:0::1;::::0;::::1;9307:21:1::0;9364:2;9344:18;;;9337:30;9403:34;9383:18;;;9376:62;-1:-1:-1;;;9454:18:1;;;9447:36;9500:19;;7200:110:0::1;9123:402:1::0;7200:110:0::1;7321:19;7331:8;7321:9;:19::i;50909:76::-:0;6292:6;;-1:-1:-1;;;;;6292:6:0;5076:10;6439:23;6431:68;;;;-1:-1:-1;;;6431:68:0;;;;;;;:::i;:::-;50960:10:::1;:17:::0;;-1:-1:-1;;50960:17:0::1;;;::::0;;50909:76::o;26851:355::-;26998:4;-1:-1:-1;;;;;;27040:40:0;;-1:-1:-1;;;27040:40:0;;:105;;-1:-1:-1;;;;;;;27097:48:0;;-1:-1:-1;;;27097:48:0;27040:105;:158;;;-1:-1:-1;;;;;;;;;;18812:40:0;;;27162:36;18653:207;37510:174;37585:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37585:29:0;-1:-1:-1;;;;;37585:29:0;;;;;;;;:24;;37639:23;37585:24;37639:14;:23::i;:::-;-1:-1:-1;;;;;37630:46:0;;;;;;;;;;;37510:174;;:::o;34475:110::-;34551:26;34561:2;34565:7;34551:26;;;;;;;;;;;;:9;:26::i;835:190::-;960:4;1013;984:25;997:5;1004:4;984:12;:25::i;:::-;:33;;835:190;-1:-1:-1;;;;835:190:0:o;33681:452::-;33810:4;33476:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33476:16:0;33832:110;;;;-1:-1:-1;;;33832:110:0;;10848:2:1;33832:110:0;;;10830:21:1;10887:2;10867:18;;;10860:30;10926:34;10906:18;;;10899:62;-1:-1:-1;;;10977:18:1;;;10970:42;11029:19;;33832:110:0;10646:408:1;33832:110:0;33953:13;33969:23;33984:7;33969:14;:23::i;:::-;33953:39;;34022:5;-1:-1:-1;;;;;34011:16:0;:7;-1:-1:-1;;;;;34011:16:0;;:64;;;;34068:7;-1:-1:-1;;;;;34044:31:0;:20;34056:7;34044:11;:20::i;:::-;-1:-1:-1;;;;;34044:31:0;;34011:64;:113;;;-1:-1:-1;;;;;;30662:25:0;;;30633:4;30662:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;34092:32;34003:122;33681:452;-1:-1:-1;;;;33681:452:0:o;36777:615::-;36950:4;-1:-1:-1;;;;;36923:31:0;:23;36938:7;36923:14;:23::i;:::-;-1:-1:-1;;;;;36923:31:0;;36901:122;;;;-1:-1:-1;;;36901:122:0;;14358:2:1;36901:122:0;;;14340:21:1;14397:2;14377:18;;;14370:30;14436:34;14416:18;;;14409:62;-1:-1:-1;;;14487:18:1;;;14480:39;14536:19;;36901:122:0;14156:405:1;36901:122:0;-1:-1:-1;;;;;37042:16:0;;37034:65;;;;-1:-1:-1;;;37034:65:0;;10089:2:1;37034:65:0;;;10071:21:1;10128:2;10108:18;;;10101:30;10167:34;10147:18;;;10140:62;-1:-1:-1;;;10218:18:1;;;10211:34;10262:19;;37034:65:0;9887:400:1;37034:65:0;37112:39;37133:4;37139:2;37143:7;37112:20;:39::i;:::-;37216:29;37233:1;37237:7;37216:8;:29::i;:::-;-1:-1:-1;;;;;37258:15:0;;;;;;:9;:15;;;;;:20;;37277:1;;37258:15;:20;;37277:1;;37258:20;:::i;:::-;;;;-1:-1:-1;;;;;;;37289:13:0;;;;;;:9;:13;;;;;:18;;37306:1;;37289:13;:18;;37306:1;;37289:18;:::i;:::-;;;;-1:-1:-1;;37318:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37318:21:0;-1:-1:-1;;;;;37318:21:0;;;;;;;;;37357:27;;37318:16;;37357:27;;;;;;;36777:615;;;:::o;7356:173::-;7431:6;;;-1:-1:-1;;;;;7448:17:0;;;-1:-1:-1;;;;;;7448:17:0;;;;;;;7481:40;;7431:6;;;7448:17;7431:6;;7481:40;;7412:16;;7481:40;7401:128;7356:173;:::o;32722:352::-;32879:28;32889:4;32895:2;32899:7;32879:9;:28::i;:::-;32940:48;32963:4;32969:2;32973:7;32982:5;32940:22;:48::i;:::-;32918:148;;;;-1:-1:-1;;;32918:148:0;;;;;;;:::i;48143:108::-;48203:13;48236:7;48229:14;;;;;:::i;2594:723::-;2650:13;2871:10;2867:53;;-1:-1:-1;;2898:10:0;;;;;;;;;;;;-1:-1:-1;;;2898:10:0;;;;;2594:723::o;2867:53::-;2945:5;2930:12;2986:78;2993:9;;2986:78;;3019:8;;;;:::i;:::-;;-1:-1:-1;3042:10:0;;-1:-1:-1;3050:2:0;3042:10;;:::i;:::-;;;2986:78;;;3074:19;3106:6;3096:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3096:17:0;;3074:39;;3124:154;3131:10;;3124:154;;3158:11;3168:1;3158:11;;:::i;:::-;;-1:-1:-1;3227:10:0;3235:2;3227:5;:10;:::i;:::-;3214:24;;:2;:24;:::i;:::-;3201:39;;3184:6;3191;3184:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3184:56:0;;;;;;;;-1:-1:-1;3255:11:0;3264:2;3255:11;;:::i;:::-;;;3124:154;;34812:321;34942:18;34948:2;34952:7;34942:5;:18::i;:::-;34993:54;35024:1;35028:2;35032:7;35041:5;34993:22;:54::i;:::-;34971:154;;;;-1:-1:-1;;;34971:154:0;;;;;;;:::i;1387:675::-;1470:7;1513:4;1470:7;1528:497;1552:5;:12;1548:1;:16;1528:497;;;1586:20;1609:5;1615:1;1609:8;;;;;;;;:::i;:::-;;;;;;;1586:31;;1652:12;1636;:28;1632:382;;2138:13;2188:15;;;2224:4;2217:15;;;2271:4;2255:21;;1764:57;;1632:382;;;2138:13;2188:15;;;2224:4;2217:15;;;2271:4;2255:21;;1941:57;;1632:382;-1:-1:-1;1566:3:0;;;;:::i;:::-;;;;1528:497;;;-1:-1:-1;2042:12:0;1387:675;-1:-1:-1;;;1387:675:0:o;42776:589::-;-1:-1:-1;;;;;42982:18:0;;42978:187;;43017:40;43049:7;44192:10;:17;;44165:24;;;;:15;:24;;;;;:44;;;44220:24;;;;;;;;;;;;44088:164;43017:40;42978:187;;;43087:2;-1:-1:-1;;;;;43079:10:0;:4;-1:-1:-1;;;;;43079:10:0;;43075:90;;43106:47;43139:4;43145:7;43106:32;:47::i;:::-;-1:-1:-1;;;;;43179:16:0;;43175:183;;43212:45;43249:7;43212:36;:45::i;43175:183::-;43285:4;-1:-1:-1;;;;;43279:10:0;:2;-1:-1:-1;;;;;43279:10:0;;43275:83;;43306:40;43334:2;43338:7;43306:27;:40::i;38249:980::-;38404:4;-1:-1:-1;;;;;38425:13:0;;8611:20;8659:8;38421:801;;38478:175;;-1:-1:-1;;;38478:175:0;;-1:-1:-1;;;;;38478:36:0;;;;;:175;;5076:10;;38572:4;;38599:7;;38629:5;;38478:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38478:175:0;;;;;;;;-1:-1:-1;;38478:175:0;;;;;;;;;;;;:::i;:::-;;;38457:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38836:13:0;;38832:320;;38879:108;;-1:-1:-1;;;38879:108:0;;;;;;;:::i;38832:320::-;39102:6;39096:13;39087:6;39083:2;39079:15;39072:38;38457:710;-1:-1:-1;;;;;;38717:51:0;-1:-1:-1;;;38717:51:0;;-1:-1:-1;38710:58:0;;38421:801;-1:-1:-1;39206:4:0;38249:980;;;;;;:::o;35469:382::-;-1:-1:-1;;;;;35549:16:0;;35541:61;;;;-1:-1:-1;;;35541:61:0;;12867:2:1;35541:61:0;;;12849:21:1;;;12886:18;;;12879:30;12945:34;12925:18;;;12918:62;12997:18;;35541:61:0;12665:356:1;35541:61:0;33452:4;33476:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33476:16:0;:30;35613:58;;;;-1:-1:-1;;;35613:58:0;;9732:2:1;35613:58:0;;;9714:21:1;9771:2;9751:18;;;9744:30;9810;9790:18;;;9783:58;9858:18;;35613:58:0;9530:352:1;35613:58:0;35684:45;35713:1;35717:2;35721:7;35684:20;:45::i;:::-;-1:-1:-1;;;;;35742:13:0;;;;;;:9;:13;;;;;:18;;35759:1;;35742:13;:18;;35759:1;;35742:18;:::i;:::-;;;;-1:-1:-1;;35771:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35771:21:0;-1:-1:-1;;;;;35771:21:0;;;;;;;;35810:33;;35771:16;;;35810:33;;35771:16;;35810:33;35469:382;;:::o;44879:1002::-;45159:22;45209:1;45184:22;45201:4;45184:16;:22::i;:::-;:26;;;;:::i;:::-;45221:18;45242:26;;;:17;:26;;;;;;45159:51;;-1:-1:-1;45375:28:0;;;45371:328;;-1:-1:-1;;;;;45442:18:0;;45420:19;45442:18;;;:12;:18;;;;;;;;:34;;;;;;;;;45493:30;;;;;;:44;;;45610:30;;:17;:30;;;;;:43;;;45371:328;-1:-1:-1;45795:26:0;;;;:17;:26;;;;;;;;45788:33;;;-1:-1:-1;;;;;45839:18:0;;;;;:12;:18;;;;;:34;;;;;;;45832:41;44879:1002::o;46176:1079::-;46454:10;:17;46429:22;;46454:21;;46474:1;;46454:21;:::i;:::-;46486:18;46507:24;;;:15;:24;;;;;;46880:10;:26;;46429:46;;-1:-1:-1;46507:24:0;;46429:46;;46880:26;;;;;;:::i;:::-;;;;;;;;;46858:48;;46944:11;46919:10;46930;46919:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;47024:28;;;:15;:28;;;;;;;:41;;;47196:24;;;;;47189:31;47231:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;46247:1008;;;46176:1079;:::o;43666:221::-;43751:14;43768:20;43785:2;43768:16;:20::i;:::-;-1:-1:-1;;;;;43799:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;43844:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43666:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:186::-;662:6;715:2;703:9;694:7;690:23;686:32;683:52;;;731:1;728;721:12;683:52;754:29;773:9;754:29;:::i;794:260::-;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;;1010:38;1044:2;1033:9;1029:18;1010:38;:::i;:::-;1000:48;;794:260;;;;;:::o;1059:328::-;1136:6;1144;1152;1205:2;1193:9;1184:7;1180:23;1176:32;1173:52;;;1221:1;1218;1211:12;1173:52;1244:29;1263:9;1244:29;:::i;:::-;1234:39;;1292:38;1326:2;1315:9;1311:18;1292:38;:::i;:::-;1282:48;;1377:2;1366:9;1362:18;1349:32;1339:42;;1059:328;;;;;:::o;1392:666::-;1487:6;1495;1503;1511;1564:3;1552:9;1543:7;1539:23;1535:33;1532:53;;;1581:1;1578;1571:12;1532:53;1604:29;1623:9;1604:29;:::i;:::-;1594:39;;1652:38;1686:2;1675:9;1671:18;1652:38;:::i;:::-;1642:48;;1737:2;1726:9;1722:18;1709:32;1699:42;;1792:2;1781:9;1777:18;1764:32;1819:18;1811:6;1808:30;1805:50;;;1851:1;1848;1841:12;1805:50;1874:22;;1927:4;1919:13;;1915:27;-1:-1:-1;1905:55:1;;1956:1;1953;1946:12;1905:55;1979:73;2044:7;2039:2;2026:16;2021:2;2017;2013:11;1979:73;:::i;:::-;1969:83;;;1392:666;;;;;;;:::o;2063:347::-;2128:6;2136;2189:2;2177:9;2168:7;2164:23;2160:32;2157:52;;;2205:1;2202;2195:12;2157:52;2228:29;2247:9;2228:29;:::i;:::-;2218:39;;2307:2;2296:9;2292:18;2279:32;2354:5;2347:13;2340:21;2333:5;2330:32;2320:60;;2376:1;2373;2366:12;2320:60;2399:5;2389:15;;;2063:347;;;;;:::o;2415:254::-;2483:6;2491;2544:2;2532:9;2523:7;2519:23;2515:32;2512:52;;;2560:1;2557;2550:12;2512:52;2583:29;2602:9;2583:29;:::i;:::-;2573:39;2659:2;2644:18;;;;2631:32;;-1:-1:-1;;;2415:254:1:o;2674:957::-;2758:6;2789:2;2832;2820:9;2811:7;2807:23;2803:32;2800:52;;;2848:1;2845;2838:12;2800:52;2888:9;2875:23;2917:18;2958:2;2950:6;2947:14;2944:34;;;2974:1;2971;2964:12;2944:34;3012:6;3001:9;2997:22;2987:32;;3057:7;3050:4;3046:2;3042:13;3038:27;3028:55;;3079:1;3076;3069:12;3028:55;3115:2;3102:16;3137:2;3133;3130:10;3127:36;;;3143:18;;:::i;:::-;3189:2;3186:1;3182:10;3172:20;;3212:28;3236:2;3232;3228:11;3212:28;:::i;:::-;3274:15;;;3305:12;;;;3337:11;;;3367;;;3363:20;;3360:33;-1:-1:-1;3357:53:1;;;3406:1;3403;3396:12;3357:53;3428:1;3419:10;;3438:163;3452:2;3449:1;3446:9;3438:163;;;3509:17;;3497:30;;3470:1;3463:9;;;;;3547:12;;;;3579;;3438:163;;;-1:-1:-1;3620:5:1;2674:957;-1:-1:-1;;;;;;;;2674:957:1:o;3636:180::-;3695:6;3748:2;3736:9;3727:7;3723:23;3719:32;3716:52;;;3764:1;3761;3754:12;3716:52;-1:-1:-1;3787:23:1;;3636:180;-1:-1:-1;3636:180:1:o;3821:245::-;3879:6;3932:2;3920:9;3911:7;3907:23;3903:32;3900:52;;;3948:1;3945;3938:12;3900:52;3987:9;3974:23;4006:30;4030:5;4006:30;:::i;4071:249::-;4140:6;4193:2;4181:9;4172:7;4168:23;4164:32;4161:52;;;4209:1;4206;4199:12;4161:52;4241:9;4235:16;4260:30;4284:5;4260:30;:::i;4325:450::-;4394:6;4447:2;4435:9;4426:7;4422:23;4418:32;4415:52;;;4463:1;4460;4453:12;4415:52;4503:9;4490:23;4536:18;4528:6;4525:30;4522:50;;;4568:1;4565;4558:12;4522:50;4591:22;;4644:4;4636:13;;4632:27;-1:-1:-1;4622:55:1;;4673:1;4670;4663:12;4622:55;4696:73;4761:7;4756:2;4743:16;4738:2;4734;4730:11;4696:73;:::i;4965:257::-;5006:3;5044:5;5038:12;5071:6;5066:3;5059:19;5087:63;5143:6;5136:4;5131:3;5127:14;5120:4;5113:5;5109:16;5087:63;:::i;:::-;5204:2;5183:15;-1:-1:-1;;5179:29:1;5170:39;;;;5211:4;5166:50;;4965:257;-1:-1:-1;;4965:257:1:o;5461:1527::-;5685:3;5723:6;5717:13;5749:4;5762:51;5806:6;5801:3;5796:2;5788:6;5784:15;5762:51;:::i;:::-;5876:13;;5835:16;;;;5898:55;5876:13;5835:16;5920:15;;;5898:55;:::i;:::-;6042:13;;5975:20;;;6015:1;;6102;6124:18;;;;6177;;;;6204:93;;6282:4;6272:8;6268:19;6256:31;;6204:93;6345:2;6335:8;6332:16;6312:18;6309:40;6306:167;;;-1:-1:-1;;;6372:33:1;;6428:4;6425:1;6418:15;6458:4;6379:3;6446:17;6306:167;6489:18;6516:110;;;;6640:1;6635:328;;;;6482:481;;6516:110;-1:-1:-1;;6551:24:1;;6537:39;;6596:20;;;;-1:-1:-1;6516:110:1;;6635:328;17461:1;17454:14;;;17498:4;17485:18;;6730:1;6744:169;6758:8;6755:1;6752:15;6744:169;;;6840:14;;6825:13;;;6818:37;6883:16;;;;6775:10;;6744:169;;;6748:3;;6944:8;6937:5;6933:20;6926:27;;6482:481;-1:-1:-1;6979:3:1;;5461:1527;-1:-1:-1;;;;;;;;;;;5461:1527:1:o;7201:488::-;-1:-1:-1;;;;;7470:15:1;;;7452:34;;7522:15;;7517:2;7502:18;;7495:43;7569:2;7554:18;;7547:34;;;7617:3;7612:2;7597:18;;7590:31;;;7395:4;;7638:45;;7663:19;;7655:6;7638:45;:::i;:::-;7630:53;7201:488;-1:-1:-1;;;;;;7201:488:1:o;8068:219::-;8217:2;8206:9;8199:21;8180:4;8237:44;8277:2;8266:9;8262:18;8254:6;8237:44;:::i;8704:414::-;8906:2;8888:21;;;8945:2;8925:18;;;8918:30;8984:34;8979:2;8964:18;;8957:62;-1:-1:-1;;;9050:2:1;9035:18;;9028:48;9108:3;9093:19;;8704:414::o;13795:356::-;13997:2;13979:21;;;14016:18;;;14009:30;14075:34;14070:2;14055:18;;14048:62;14142:2;14127:18;;13795:356::o;16095:413::-;16297:2;16279:21;;;16336:2;16316:18;;;16309:30;16375:34;16370:2;16355:18;;16348:62;-1:-1:-1;;;16441:2:1;16426:18;;16419:47;16498:3;16483:19;;16095:413::o;17108:275::-;17179:2;17173:9;17244:2;17225:13;;-1:-1:-1;;17221:27:1;17209:40;;17279:18;17264:34;;17300:22;;;17261:62;17258:88;;;17326:18;;:::i;:::-;17362:2;17355:22;17108:275;;-1:-1:-1;17108:275:1:o;17514:128::-;17554:3;17585:1;17581:6;17578:1;17575:13;17572:39;;;17591:18;;:::i;:::-;-1:-1:-1;17627:9:1;;17514:128::o;17647:120::-;17687:1;17713;17703:35;;17718:18;;:::i;:::-;-1:-1:-1;17752:9:1;;17647:120::o;17772:125::-;17812:4;17840:1;17837;17834:8;17831:34;;;17845:18;;:::i;:::-;-1:-1:-1;17882:9:1;;17772:125::o;17902:258::-;17974:1;17984:113;17998:6;17995:1;17992:13;17984:113;;;18074:11;;;18068:18;18055:11;;;18048:39;18020:2;18013:10;17984:113;;;18115:6;18112:1;18109:13;18106:48;;;-1:-1:-1;;18150:1:1;18132:16;;18125:27;17902:258::o;18165:380::-;18244:1;18240:12;;;;18287;;;18308:61;;18362:4;18354:6;18350:17;18340:27;;18308:61;18415:2;18407:6;18404:14;18384:18;18381:38;18378:161;;;18461:10;18456:3;18452:20;18449:1;18442:31;18496:4;18493:1;18486:15;18524:4;18521:1;18514:15;18378:161;;18165:380;;;:::o;18550:135::-;18589:3;-1:-1:-1;;18610:17:1;;18607:43;;;18630:18;;:::i;:::-;-1:-1:-1;18677:1:1;18666:13;;18550:135::o;18690:112::-;18722:1;18748;18738:35;;18753:18;;:::i;:::-;-1:-1:-1;18787:9:1;;18690:112::o;18807:127::-;18868:10;18863:3;18859:20;18856:1;18849:31;18899:4;18896:1;18889:15;18923:4;18920:1;18913:15;18939:127;19000:10;18995:3;18991:20;18988:1;18981:31;19031:4;19028:1;19021:15;19055:4;19052:1;19045:15;19071:127;19132:10;19127:3;19123:20;19120:1;19113:31;19163:4;19160:1;19153:15;19187:4;19184:1;19177:15;19203:127;19264:10;19259:3;19255:20;19252:1;19245:31;19295:4;19292:1;19285:15;19319:4;19316:1;19309:15;19335:127;19396:10;19391:3;19387:20;19384:1;19377:31;19427:4;19424:1;19417:15;19451:4;19448:1;19441:15;19467:131;-1:-1:-1;;;;;;19541:32:1;;19531:43;;19521:71;;19588:1;19585;19578:12

Swarm Source

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