ETH Price: $3,322.94 (+2.56%)
Gas: 4 Gwei

Token

Zombie Apes Comic Issue 1 Covers (ZAC01C)
 

Overview

Max Total Supply

666 ZAC01C

Holders

163

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
fishheadsoup.eth
Balance
1 ZAC01C
0x67012765A786184DF1d3157732F047dAB4aAD0f4
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:
ComicCover

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-09
*/

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


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

pragma solidity ^0.8.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: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (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: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (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);

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

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


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

pragma solidity ^0.8.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: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error UnableDetermineTokenOwner();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal _currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        if (index >= totalSupply()) revert TokenIndexOutOfBounds();
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        assert(false);
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();

        unchecked {
            for (uint256 curr = tokenId;; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) revert ApprovalCallerNotOwnerNorApproved();

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _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 {
        _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 override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) revert TransferToNonERC721ReceiverImplementer();
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }

                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) revert TransferToNonERC721ReceiverImplementer();
                else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: ComicCover.sol


// Creator: ZombieDaoDev

pragma solidity ^0.8.4;





contract IERC20 {
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public returns (bool) {}

    function transfer(address recipient, uint256 amount)
        public
        returns (bool)
    {}

    function balanceOf(address account) public view returns (uint256) {}
}

contract ComicCover is ERC721A, Ownable, ReentrancyGuard {
    uint256 public nftPrice = 0.025 ether;
    uint256 public tknPrice = 500 ether;

    uint256 public nftLimit = 666;
    uint256 public reserved = 100;
    uint256 public capPublic = 4;
    uint256 public capToken = 4;
    uint256 public tknLimit = 10;

    uint256 public freeMultiple = 2;
    address public tokenAddress;

    bool public saleOpen = false;
    bool public saleToken = false;

    bool public whitelistLimit = true;

    bytes32 public merkleRoot;

    string public baseURI = "";

    mapping(address => uint256) public whitelistAddresses;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initURI,
        bytes32 _merkleRoot,
        address _tokenAddress
    ) ERC721A(_name, _symbol) {
        baseURI = _initURI;
        merkleRoot = _merkleRoot;
        tokenAddress = _tokenAddress;
    }

    function _mint(address _to, uint256 _amount) internal {
        require(tx.origin == msg.sender, "ComicCover: Self Mint Only");
        uint256 _mintAmount = _amount + (_amount / freeMultiple);
        require(
            totalSupply() + _mintAmount <= (nftLimit - reserved),
            "ComicCover: Sold Out"
        );
        _safeMint(_to, _mintAmount);
    }

    function mint(address _to, uint256 _amount) public payable {
        require(saleOpen == true, "ComicCover: Not Started");
        require(_amount <= capPublic, "ComicCover: Amount Limit");
        require(msg.value == nftPrice * _amount, "ComicCover: Incorrect Value");
        _mint(_to, _amount);
    }

    function mintToken(uint256 _amount, bytes32[] calldata proof) public {
        require(saleToken == true, "ComicCover: Not Started");
        require(_amount <= capToken, "ComicCover: Amount Limit");
        uint256 _mintAmount = _amount + (_amount / freeMultiple);
        if (whitelistLimit) {
            require(
                MerkleProof.verify(
                    proof,
                    merkleRoot,
                    keccak256(abi.encodePacked(_msgSender()))
                ),
                "ComicCover: Not Whitelisted"
            );
            require(
                whitelistAddresses[_msgSender()] + _mintAmount <= tknLimit,
                "ComicCover: Token Limit"
            );
        }
        IERC20(tokenAddress).transferFrom(
            _msgSender(),
            address(this),
            tknPrice * _amount
        );
        _mint(_msgSender(), _amount);
        whitelistAddresses[_msgSender()] += _mintAmount;
    }

    function airdrop(address[] memory _to, uint256[] memory _amount)
        public
        onlyOwner
    {
        require(_to.length == _amount.length, "ComicCover: Length Missmatch");
        for (uint256 i = 0; i < _to.length; i++) {
            require(
                totalSupply() + _amount[i] <= nftLimit,
                "ComicCover: Sold Out"
            );
            _safeMint(_to[i], _amount[i]);

            if (reserved > 0 && reserved >= _amount[i]) {
                reserved -= _amount[i];
            } else {
                reserved = 0;
            }
        }
    }

    function tokensOfOwnerByIndex(address _owner, uint256 _index)
        public
        view
        returns (uint256)
    {
        return tokensOfOwner(_owner)[_index];
    }

    function tokensOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 _tokenCount = balanceOf(_owner);
        uint256[] memory _tokenIds = new uint256[](_tokenCount);
        uint256 _tokenIndex = 0;
        for (uint256 i = 0; i < totalSupply(); i++) {
            if (ownerOf(i) == _owner) {
                _tokenIds[_tokenIndex] = i;
                _tokenIndex++;
            }
        }
        return _tokenIds;
    }

    function toggleSaleOpen() public onlyOwner {
        saleOpen = !saleOpen;
    }

    function toggleSaleToken() public onlyOwner {
        saleToken = !saleToken;
    }

    function toggleSaleOn() public onlyOwner {
        saleOpen = true;
        saleToken = true;
    }

    function toggleWhitelistLimit() public onlyOwner {
        whitelistLimit = !whitelistLimit;
    }

    function setNftPrice(uint256 _nftPrice) public onlyOwner {
        nftPrice = _nftPrice;
    }

    function setTknPrice(uint256 _tknPrice) public onlyOwner {
        tknPrice = _tknPrice;
    }

    function withdraw() public onlyOwner {
        (bool transfer, ) = payable(_msgSender()).call{
            value: address(this).balance
        }("");
        require(transfer, "ComicCover: Transfer Failed");
        IERC20(tokenAddress).transfer(
            _msgSender(),
            IERC20(tokenAddress).balanceOf(address(this))
        );
    }

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

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

    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(baseURI, "contract"));
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initURI","type":"string"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"address","name":"_tokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"_amount","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMultiple","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":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","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":"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":[],"name":"saleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftPrice","type":"uint256"}],"name":"setNftPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tknPrice","type":"uint256"}],"name":"setTknPrice","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":[],"name":"tknLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tknPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokensOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6658d15e17628000600955681b1ae4d6e2ef500000600a90815561029a600b556064600c556004600d819055600e55600f5560026010556011805462ffffff60a01b1916600160b01b17905560a06040526000608090815260139062000066908262000211565b503480156200007457600080fd5b5060405162002d4338038062002d43833981016040819052620000979162000394565b84846001620000a7838262000211565b506002620000b6828262000211565b505050620000d3620000cd6200011660201b60201c565b6200011a565b60016008556013620000e6848262000211565b50601291909155601180546001600160a01b0319166001600160a01b039092169190911790555062000453915050565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200019757607f821691505b602082108103620001b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200020c57600081815260208120601f850160051c81016020861015620001e75750805b601f850160051c820191505b818110156200020857828155600101620001f3565b5050505b505050565b81516001600160401b038111156200022d576200022d6200016c565b62000245816200023e845462000182565b84620001be565b602080601f8311600181146200027d5760008415620002645750858301515b600019600386901b1c1916600185901b17855562000208565b600085815260208120601f198616915b82811015620002ae578886015182559484019460019091019084016200028d565b5085821015620002cd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f830112620002ef57600080fd5b81516001600160401b03808211156200030c576200030c6200016c565b604051601f8301601f19908116603f011681019082821181831017156200033757620003376200016c565b816040528381526020925086838588010111156200035457600080fd5b600091505b8382101562000378578582018301518183018401529082019062000359565b838211156200038a5760008385830101525b9695505050505050565b600080600080600060a08688031215620003ad57600080fd5b85516001600160401b0380821115620003c557600080fd5b620003d389838a01620002dd565b96506020880151915080821115620003ea57600080fd5b620003f889838a01620002dd565b955060408801519150808211156200040f57600080fd5b506200041e88828901620002dd565b60608801516080890151919550935090506001600160a01b03811681146200044557600080fd5b809150509295509295909350565b6128e080620004636000396000f3fe6080604052600436106102ae5760003560e01c806370a0823111610175578063a22cb465116100dc578063cb4e832611610095578063e985e3671161006f578063e985e367146107e1578063e985e9c514610802578063f2fde38b1461084b578063fe60d12c1461086b57600080fd5b8063cb4e8326146107a0578063dd4ed4d3146107b6578063e8a3d485146107cc57600080fd5b8063a22cb465146106f5578063ae7c122e14610715578063b4f666da14610735578063b88d4fde1461074b578063bb6d44b71461076b578063c87b56dd1461078057600080fd5b80638393634c1161012e5780638393634c1461063f5780638462151c146106545780638da5cb5b1461068157806395d89b411461069f57806399288dbb146106b45780639d76ea58146106d557600080fd5b806370a08231146105a0578063715018a6146105c05780637c620f95146105d55780637cb64759146105ea5780637d020a291461060a5780637d9a7a4c1461061f57600080fd5b8063374329dc116102195780634f6ccce7116101d25780634f6ccce7146104de57806355f804b3146104fe5780636352211e1461051e578063672434821461053e57806369ddd67d1461055e5780636c0360eb1461058b57600080fd5b8063374329dc146104405780633ccfd60b1461046057806340c10f191461047557806342842e0e146104885780634707f44f146104a857806349ab72c9146104c857600080fd5b806318160ddd1161026b57806318160ddd1461039e57806323b872dd146103b35780632a7065ea146103d35780632eb4a7ab146103e95780632f745c59146103ff578063302150e51461041f57600080fd5b806301ffc9a7146102b357806302fe4728146102e857806306fdde031461030c578063081812fc1461032e578063095ea7b3146103665780630d39fc8114610388575b600080fd5b3480156102bf57600080fd5b506102d36102ce366004612012565b610881565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fe60105481565b6040519081526020016102df565b34801561031857600080fd5b506103216108ee565b6040516102df9190612087565b34801561033a57600080fd5b5061034e61034936600461209a565b610980565b6040516001600160a01b0390911681526020016102df565b34801561037257600080fd5b506103866103813660046120cf565b6109c6565b005b34801561039457600080fd5b506102fe60095481565b3480156103aa57600080fd5b506000546102fe565b3480156103bf57600080fd5b506103866103ce3660046120f9565b610a53565b3480156103df57600080fd5b506102fe600b5481565b3480156103f557600080fd5b506102fe60125481565b34801561040b57600080fd5b506102fe61041a3660046120cf565b610a5e565b34801561042b57600080fd5b506011546102d390600160b01b900460ff1681565b34801561044c57600080fd5b5061038661045b36600461209a565b610b30565b34801561046c57600080fd5b50610386610b3d565b6103866104833660046120cf565b610cd3565b34801561049457600080fd5b506103866104a33660046120f9565b610dde565b3480156104b457600080fd5b506102fe6104c33660046120cf565b610df9565b3480156104d457600080fd5b506102fe600f5481565b3480156104ea57600080fd5b506102fe6104f936600461209a565b610e25565b34801561050a57600080fd5b506103866105193660046121d2565b610e4c565b34801561052a57600080fd5b5061034e61053936600461209a565b610e60565b34801561054a57600080fd5b506103866105593660046122a8565b610e72565b34801561056a57600080fd5b506102fe610579366004612367565b60146020526000908152604090205481565b34801561059757600080fd5b50610321611008565b3480156105ac57600080fd5b506102fe6105bb366004612367565b611096565b3480156105cc57600080fd5b506103866110e4565b3480156105e157600080fd5b506103866110f8565b3480156105f657600080fd5b5061038661060536600461209a565b611121565b34801561061657600080fd5b5061038661112e565b34801561062b57600080fd5b5061038661063a36600461209a565b611157565b34801561064b57600080fd5b50610386611164565b34801561066057600080fd5b5061067461066f366004612367565b61118d565b6040516102df9190612382565b34801561068d57600080fd5b506007546001600160a01b031661034e565b3480156106ab57600080fd5b50610321611259565b3480156106c057600080fd5b506011546102d390600160a01b900460ff1681565b3480156106e157600080fd5b5060115461034e906001600160a01b031681565b34801561070157600080fd5b506103866107103660046123d4565b611268565b34801561072157600080fd5b5061038661073036600461240b565b6112fd565b34801561074157600080fd5b506102fe600e5481565b34801561075757600080fd5b50610386610766366004612489565b6115cc565b34801561077757600080fd5b50610386611606565b34801561078c57600080fd5b5061032161079b36600461209a565b611625565b3480156107ac57600080fd5b506102fe600d5481565b3480156107c257600080fd5b506102fe600a5481565b3480156107d857600080fd5b506103216116ab565b3480156107ed57600080fd5b506011546102d390600160a81b900460ff1681565b34801561080e57600080fd5b506102d361081d366004612504565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561085757600080fd5b50610386610866366004612367565b6116d3565b34801561087757600080fd5b506102fe600c5481565b60006001600160e01b031982166380ac58cd60e01b14806108b257506001600160e01b03198216635b5e139f60e01b145b806108cd57506001600160e01b0319821663780e9d6360e01b145b806108e857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546108fd90612537565b80601f016020809104026020016040519081016040528092919081815260200182805461092990612537565b80156109765780601f1061094b57610100808354040283529160200191610976565b820191906000526020600020905b81548152906001019060200180831161095957829003601f168201915b5050505050905090565b600061098d826000541190565b6109aa576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006109d182610e60565b9050806001600160a01b0316836001600160a01b031603610a055760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a255750610a23813361081d565b155b15610a43576040516367d9dca160e11b815260040160405180910390fd5b610a4e83838361174c565b505050565b610a4e8383836117a8565b6000610a6983611096565b8210610a88576040516306ed618760e11b815260040160405180910390fd5b600080549080805b83811015610b1e576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610ae257805192505b876001600160a01b0316836001600160a01b031603610b1557868403610b0e575093506108e892505050565b6001909301925b50600101610a90565b50610b27612571565b50505092915050565b610b386119c5565b600a55565b610b456119c5565b604051600090339047908381818185875af1925050503d8060008114610b87576040519150601f19603f3d011682016040523d82523d6000602084013e610b8c565b606091505b5050905080610be25760405162461bcd60e51b815260206004820152601b60248201527f436f6d6963436f7665723a205472616e73666572204661696c6564000000000060448201526064015b60405180910390fd5b6011546001600160a01b031663a9059cbb336011546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c609190612587565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccf91906125a0565b5050565b601154600160a01b900460ff161515600114610d2b5760405162461bcd60e51b815260206004820152601760248201527610dbdb5a58d0dbdd995c8e88139bdd0814dd185c9d1959604a1b6044820152606401610bd9565b600d54811115610d785760405162461bcd60e51b815260206004820152601860248201527710dbdb5a58d0dbdd995c8e88105b5bdd5b9d08131a5b5a5d60421b6044820152606401610bd9565b80600954610d8691906125d3565b3414610dd45760405162461bcd60e51b815260206004820152601b60248201527f436f6d6963436f7665723a20496e636f72726563742056616c756500000000006044820152606401610bd9565b610ccf8282611a1f565b610a4e838383604051806020016040528060008152506115cc565b6000610e048361118d565b8281518110610e1557610e156125f2565b6020026020010151905092915050565b600080548210610e48576040516329c8c00760e21b815260040160405180910390fd5b5090565b610e546119c5565b6013610ccf8282612656565b6000610e6b82611afd565b5192915050565b610e7a6119c5565b8051825114610ecb5760405162461bcd60e51b815260206004820152601c60248201527f436f6d6963436f7665723a204c656e677468204d6973736d61746368000000006044820152606401610bd9565b60005b8251811015610a4e57600b54828281518110610eec57610eec6125f2565b6020026020010151610efd60005490565b610f079190612715565b1115610f4c5760405162461bcd60e51b815260206004820152601460248201527310dbdb5a58d0dbdd995c8e8814dbdb190813dd5d60621b6044820152606401610bd9565b610f88838281518110610f6157610f616125f2565b6020026020010151838381518110610f7b57610f7b6125f2565b6020026020010151611b91565b6000600c54118015610fb55750818181518110610fa757610fa76125f2565b6020026020010151600c5410155b15610ff057818181518110610fcc57610fcc6125f2565b6020026020010151600c6000828254610fe5919061272d565b90915550610ff69050565b6000600c555b8061100081612744565b915050610ece565b6013805461101590612537565b80601f016020809104026020016040519081016040528092919081815260200182805461104190612537565b801561108e5780601f106110635761010080835404028352916020019161108e565b820191906000526020600020905b81548152906001019060200180831161107157829003601f168201915b505050505081565b60006001600160a01b0382166110bf576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6110ec6119c5565b6110f66000611bab565b565b6111006119c5565b6011805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6111296119c5565b601255565b6111366119c5565b6011805460ff60b01b198116600160b01b9182900460ff1615909102179055565b61115f6119c5565b600955565b61116c6119c5565b6011805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6060600061119a83611096565b90506000816001600160401b038111156111b6576111b6612135565b6040519080825280602002602001820160405280156111df578160200160208202803683370190505b5090506000805b60005481101561124f57856001600160a01b031661120382610e60565b6001600160a01b03160361123d5780838381518110611224576112246125f2565b60209081029190910101528161123981612744565b9250505b8061124781612744565b9150506111e6565b5090949350505050565b6060600280546108fd90612537565b336001600160a01b038316036112915760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b601154600160a81b900460ff1615156001146113555760405162461bcd60e51b815260206004820152601760248201527610dbdb5a58d0dbdd995c8e88139bdd0814dd185c9d1959604a1b6044820152606401610bd9565b600e548311156113a25760405162461bcd60e51b815260206004820152601860248201527710dbdb5a58d0dbdd995c8e88105b5bdd5b9d08131a5b5a5d60421b6044820152606401610bd9565b6000601054846113b29190612773565b6113bc9085612715565b601154909150600160b01b900460ff16156114fe57611446838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506012546040516bffffffffffffffffffffffff193360601b166020820152909250603401905060405160208183030381529060405280519060200120611bfd565b6114925760405162461bcd60e51b815260206004820152601b60248201527f436f6d6963436f7665723a204e6f742057686974656c697374656400000000006044820152606401610bd9565b600f54336000908152601460205260409020546114b0908390612715565b11156114fe5760405162461bcd60e51b815260206004820152601760248201527f436f6d6963436f7665723a20546f6b656e204c696d69740000000000000000006044820152606401610bd9565b6011546001600160a01b03166323b872dd333087600a5461151f91906125d3565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015611573573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159791906125a0565b506115a23385611a1f565b33600090815260146020526040812080548392906115c1908490612715565b909155505050505050565b6115d78484846117a8565b6115e384848484611c13565b611600576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b61160e6119c5565b6011805461ffff60a01b191661010160a01b179055565b6060611632826000541190565b61164f57604051630a14c4b560e41b815260040160405180910390fd5b6000611659611d16565b9050805160000361167957604051806020016040528060008152506116a4565b8061168384611d25565b604051602001611694929190612787565b6040516020818303038152906040525b9392505050565b606060136040516020016116bf91906127b6565b604051602081830303815290604052905090565b6116db6119c5565b6001600160a01b0381166117405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bd9565b61174981611bab565b50565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006117b382611afd565b80519091506000906001600160a01b0316336001600160a01b031614806117e1575081516117e1903361081d565b806117fc5750336117f184610980565b6001600160a01b0316145b90508061181c57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146118515760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661187857604051633a954ecd60e21b815260040160405180910390fd5b611888600084846000015161174c565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b426001600160401b03160217905590860180835291205490911661197b5761192f816000541190565b1561197b57825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6007546001600160a01b031633146110f65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bd9565b323314611a6e5760405162461bcd60e51b815260206004820152601a60248201527f436f6d6963436f7665723a2053656c66204d696e74204f6e6c790000000000006044820152606401610bd9565b600060105482611a7e9190612773565b611a889083612715565b9050600c54600b54611a9a919061272d565b81611aa460005490565b611aae9190612715565b1115611af35760405162461bcd60e51b815260206004820152601460248201527310dbdb5a58d0dbdd995c8e8814dbdb190813dd5d60621b6044820152606401610bd9565b610a4e8382611b91565b6040805180820190915260008082526020820152611b1c826000541190565b611b3957604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611b87579392505050565b5060001901611b3b565b610ccf828260405180602001604052806000815250611e25565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611c0a8584611e32565b14949350505050565b60006001600160a01b0384163b15611d0a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c5790339089908890889060040161283c565b6020604051808303816000875af1925050508015611c92575060408051601f3d908101601f19168201909252611c8f91810190612879565b60015b611cf0573d808015611cc0576040519150601f19603f3d011682016040523d82523d6000602084013e611cc5565b606091505b508051600003611ce8576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d0e565b5060015b949350505050565b6060601380546108fd90612537565b606081600003611d4c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d765780611d6081612744565b9150611d6f9050600a83612773565b9150611d50565b6000816001600160401b03811115611d9057611d90612135565b6040519080825280601f01601f191660200182016040528015611dba576020820181803683370190505b5090505b8415611d0e57611dcf60018361272d565b9150611ddc600a86612896565b611de7906030612715565b60f81b818381518110611dfc57611dfc6125f2565b60200101906001600160f81b031916908160001a905350611e1e600a86612773565b9450611dbe565b610a4e8383836001611e7f565b600081815b8451811015611e7757611e6382868381518110611e5657611e566125f2565b6020026020010151611fd0565b915080611e6f81612744565b915050611e37565b509392505050565b6000546001600160a01b038516611ea857604051622e076360e81b815260040160405180910390fd5b83600003611ec95760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b85811015611fc75760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015611f9d5750611f9b6000888488611c13565b155b15611fbb576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611f46565b506000556119be565b6000818310611fec5760008281526020849052604090206116a4565b5060009182526020526040902090565b6001600160e01b03198116811461174957600080fd5b60006020828403121561202457600080fd5b81356116a481611ffc565b60005b8381101561204a578181015183820152602001612032565b838111156116005750506000910152565b6000815180845261207381602086016020860161202f565b601f01601f19169290920160200192915050565b6020815260006116a4602083018461205b565b6000602082840312156120ac57600080fd5b5035919050565b80356001600160a01b03811681146120ca57600080fd5b919050565b600080604083850312156120e257600080fd5b6120eb836120b3565b946020939093013593505050565b60008060006060848603121561210e57600080fd5b612117846120b3565b9250612125602085016120b3565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561217357612173612135565b604052919050565b60006001600160401b0383111561219457612194612135565b6121a7601f8401601f191660200161214b565b90508281528383830111156121bb57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156121e457600080fd5b81356001600160401b038111156121fa57600080fd5b8201601f8101841361220b57600080fd5b611d0e8482356020840161217b565b60006001600160401b0382111561223357612233612135565b5060051b60200190565b600082601f83011261224e57600080fd5b8135602061226361225e8361221a565b61214b565b82815260059290921b8401810191818101908684111561228257600080fd5b8286015b8481101561229d5780358352918301918301612286565b509695505050505050565b600080604083850312156122bb57600080fd5b82356001600160401b03808211156122d257600080fd5b818501915085601f8301126122e657600080fd5b813560206122f661225e8361221a565b82815260059290921b8401810191818101908984111561231557600080fd5b948201945b8386101561233a5761232b866120b3565b8252948201949082019061231a565b9650508601359250508082111561235057600080fd5b5061235d8582860161223d565b9150509250929050565b60006020828403121561237957600080fd5b6116a4826120b3565b6020808252825182820181905260009190848201906040850190845b818110156123ba5783518352928401929184019160010161239e565b50909695505050505050565b801515811461174957600080fd5b600080604083850312156123e757600080fd5b6123f0836120b3565b91506020830135612400816123c6565b809150509250929050565b60008060006040848603121561242057600080fd5b8335925060208401356001600160401b038082111561243e57600080fd5b818601915086601f83011261245257600080fd5b81358181111561246157600080fd5b8760208260051b850101111561247657600080fd5b6020830194508093505050509250925092565b6000806000806080858703121561249f57600080fd5b6124a8856120b3565b93506124b6602086016120b3565b92506040850135915060608501356001600160401b038111156124d857600080fd5b8501601f810187136124e957600080fd5b6124f88782356020840161217b565b91505092959194509250565b6000806040838503121561251757600080fd5b612520836120b3565b915061252e602084016120b3565b90509250929050565b600181811c9082168061254b57607f821691505b60208210810361256b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561259957600080fd5b5051919050565b6000602082840312156125b257600080fd5b81516116a4816123c6565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156125ed576125ed6125bd565b500290565b634e487b7160e01b600052603260045260246000fd5b601f821115610a4e57600081815260208120601f850160051c8101602086101561262f5750805b601f850160051c820191505b8181101561264e5782815560010161263b565b505050505050565b81516001600160401b0381111561266f5761266f612135565b6126838161267d8454612537565b84612608565b602080601f8311600181146126b857600084156126a05750858301515b600019600386901b1c1916600185901b17855561264e565b600085815260208120601f198616915b828110156126e7578886015182559484019460019091019084016126c8565b50858210156127055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008219821115612728576127286125bd565b500190565b60008282101561273f5761273f6125bd565b500390565b600060018201612756576127566125bd565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826127825761278261275d565b500490565b6000835161279981846020880161202f565b8351908301906127ad81836020880161202f565b01949350505050565b60008083546127c481612537565b600182811680156127dc57600181146127f157612820565b60ff1984168752821515830287019450612820565b8760005260208060002060005b858110156128175781548a8201529084019082016127fe565b50505082870194505b50506718dbdb9d1c9858dd60c21b835250506008019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061286f9083018461205b565b9695505050505050565b60006020828403121561288b57600080fd5b81516116a481611ffc565b6000826128a5576128a561275d565b50069056fea2646970667358221220a5d0d60d999ac393506cfc154206beece3bc1df291c9cc4ba3e7f1d0d399053664736f6c634300080f003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001202bef6c5fb263d4d425f4fcb39b927b119f42f2a05cfcf1c7123d44de2e00eace000000000000000000000000ceb726e6383468dd8ac0b513c8330cc9fb4024a800000000000000000000000000000000000000000000000000000000000000205a6f6d626965204170657320436f6d6963204973737565203120436f7665727300000000000000000000000000000000000000000000000000000000000000065a41433031430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f6d657461646174612e7a6f6d626965636f6d6963732e696f2f7a6131632f0000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c806370a0823111610175578063a22cb465116100dc578063cb4e832611610095578063e985e3671161006f578063e985e367146107e1578063e985e9c514610802578063f2fde38b1461084b578063fe60d12c1461086b57600080fd5b8063cb4e8326146107a0578063dd4ed4d3146107b6578063e8a3d485146107cc57600080fd5b8063a22cb465146106f5578063ae7c122e14610715578063b4f666da14610735578063b88d4fde1461074b578063bb6d44b71461076b578063c87b56dd1461078057600080fd5b80638393634c1161012e5780638393634c1461063f5780638462151c146106545780638da5cb5b1461068157806395d89b411461069f57806399288dbb146106b45780639d76ea58146106d557600080fd5b806370a08231146105a0578063715018a6146105c05780637c620f95146105d55780637cb64759146105ea5780637d020a291461060a5780637d9a7a4c1461061f57600080fd5b8063374329dc116102195780634f6ccce7116101d25780634f6ccce7146104de57806355f804b3146104fe5780636352211e1461051e578063672434821461053e57806369ddd67d1461055e5780636c0360eb1461058b57600080fd5b8063374329dc146104405780633ccfd60b1461046057806340c10f191461047557806342842e0e146104885780634707f44f146104a857806349ab72c9146104c857600080fd5b806318160ddd1161026b57806318160ddd1461039e57806323b872dd146103b35780632a7065ea146103d35780632eb4a7ab146103e95780632f745c59146103ff578063302150e51461041f57600080fd5b806301ffc9a7146102b357806302fe4728146102e857806306fdde031461030c578063081812fc1461032e578063095ea7b3146103665780630d39fc8114610388575b600080fd5b3480156102bf57600080fd5b506102d36102ce366004612012565b610881565b60405190151581526020015b60405180910390f35b3480156102f457600080fd5b506102fe60105481565b6040519081526020016102df565b34801561031857600080fd5b506103216108ee565b6040516102df9190612087565b34801561033a57600080fd5b5061034e61034936600461209a565b610980565b6040516001600160a01b0390911681526020016102df565b34801561037257600080fd5b506103866103813660046120cf565b6109c6565b005b34801561039457600080fd5b506102fe60095481565b3480156103aa57600080fd5b506000546102fe565b3480156103bf57600080fd5b506103866103ce3660046120f9565b610a53565b3480156103df57600080fd5b506102fe600b5481565b3480156103f557600080fd5b506102fe60125481565b34801561040b57600080fd5b506102fe61041a3660046120cf565b610a5e565b34801561042b57600080fd5b506011546102d390600160b01b900460ff1681565b34801561044c57600080fd5b5061038661045b36600461209a565b610b30565b34801561046c57600080fd5b50610386610b3d565b6103866104833660046120cf565b610cd3565b34801561049457600080fd5b506103866104a33660046120f9565b610dde565b3480156104b457600080fd5b506102fe6104c33660046120cf565b610df9565b3480156104d457600080fd5b506102fe600f5481565b3480156104ea57600080fd5b506102fe6104f936600461209a565b610e25565b34801561050a57600080fd5b506103866105193660046121d2565b610e4c565b34801561052a57600080fd5b5061034e61053936600461209a565b610e60565b34801561054a57600080fd5b506103866105593660046122a8565b610e72565b34801561056a57600080fd5b506102fe610579366004612367565b60146020526000908152604090205481565b34801561059757600080fd5b50610321611008565b3480156105ac57600080fd5b506102fe6105bb366004612367565b611096565b3480156105cc57600080fd5b506103866110e4565b3480156105e157600080fd5b506103866110f8565b3480156105f657600080fd5b5061038661060536600461209a565b611121565b34801561061657600080fd5b5061038661112e565b34801561062b57600080fd5b5061038661063a36600461209a565b611157565b34801561064b57600080fd5b50610386611164565b34801561066057600080fd5b5061067461066f366004612367565b61118d565b6040516102df9190612382565b34801561068d57600080fd5b506007546001600160a01b031661034e565b3480156106ab57600080fd5b50610321611259565b3480156106c057600080fd5b506011546102d390600160a01b900460ff1681565b3480156106e157600080fd5b5060115461034e906001600160a01b031681565b34801561070157600080fd5b506103866107103660046123d4565b611268565b34801561072157600080fd5b5061038661073036600461240b565b6112fd565b34801561074157600080fd5b506102fe600e5481565b34801561075757600080fd5b50610386610766366004612489565b6115cc565b34801561077757600080fd5b50610386611606565b34801561078c57600080fd5b5061032161079b36600461209a565b611625565b3480156107ac57600080fd5b506102fe600d5481565b3480156107c257600080fd5b506102fe600a5481565b3480156107d857600080fd5b506103216116ab565b3480156107ed57600080fd5b506011546102d390600160a81b900460ff1681565b34801561080e57600080fd5b506102d361081d366004612504565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561085757600080fd5b50610386610866366004612367565b6116d3565b34801561087757600080fd5b506102fe600c5481565b60006001600160e01b031982166380ac58cd60e01b14806108b257506001600160e01b03198216635b5e139f60e01b145b806108cd57506001600160e01b0319821663780e9d6360e01b145b806108e857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546108fd90612537565b80601f016020809104026020016040519081016040528092919081815260200182805461092990612537565b80156109765780601f1061094b57610100808354040283529160200191610976565b820191906000526020600020905b81548152906001019060200180831161095957829003601f168201915b5050505050905090565b600061098d826000541190565b6109aa576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006109d182610e60565b9050806001600160a01b0316836001600160a01b031603610a055760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a255750610a23813361081d565b155b15610a43576040516367d9dca160e11b815260040160405180910390fd5b610a4e83838361174c565b505050565b610a4e8383836117a8565b6000610a6983611096565b8210610a88576040516306ed618760e11b815260040160405180910390fd5b600080549080805b83811015610b1e576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610ae257805192505b876001600160a01b0316836001600160a01b031603610b1557868403610b0e575093506108e892505050565b6001909301925b50600101610a90565b50610b27612571565b50505092915050565b610b386119c5565b600a55565b610b456119c5565b604051600090339047908381818185875af1925050503d8060008114610b87576040519150601f19603f3d011682016040523d82523d6000602084013e610b8c565b606091505b5050905080610be25760405162461bcd60e51b815260206004820152601b60248201527f436f6d6963436f7665723a205472616e73666572204661696c6564000000000060448201526064015b60405180910390fd5b6011546001600160a01b031663a9059cbb336011546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610c3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c609190612587565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccf91906125a0565b5050565b601154600160a01b900460ff161515600114610d2b5760405162461bcd60e51b815260206004820152601760248201527610dbdb5a58d0dbdd995c8e88139bdd0814dd185c9d1959604a1b6044820152606401610bd9565b600d54811115610d785760405162461bcd60e51b815260206004820152601860248201527710dbdb5a58d0dbdd995c8e88105b5bdd5b9d08131a5b5a5d60421b6044820152606401610bd9565b80600954610d8691906125d3565b3414610dd45760405162461bcd60e51b815260206004820152601b60248201527f436f6d6963436f7665723a20496e636f72726563742056616c756500000000006044820152606401610bd9565b610ccf8282611a1f565b610a4e838383604051806020016040528060008152506115cc565b6000610e048361118d565b8281518110610e1557610e156125f2565b6020026020010151905092915050565b600080548210610e48576040516329c8c00760e21b815260040160405180910390fd5b5090565b610e546119c5565b6013610ccf8282612656565b6000610e6b82611afd565b5192915050565b610e7a6119c5565b8051825114610ecb5760405162461bcd60e51b815260206004820152601c60248201527f436f6d6963436f7665723a204c656e677468204d6973736d61746368000000006044820152606401610bd9565b60005b8251811015610a4e57600b54828281518110610eec57610eec6125f2565b6020026020010151610efd60005490565b610f079190612715565b1115610f4c5760405162461bcd60e51b815260206004820152601460248201527310dbdb5a58d0dbdd995c8e8814dbdb190813dd5d60621b6044820152606401610bd9565b610f88838281518110610f6157610f616125f2565b6020026020010151838381518110610f7b57610f7b6125f2565b6020026020010151611b91565b6000600c54118015610fb55750818181518110610fa757610fa76125f2565b6020026020010151600c5410155b15610ff057818181518110610fcc57610fcc6125f2565b6020026020010151600c6000828254610fe5919061272d565b90915550610ff69050565b6000600c555b8061100081612744565b915050610ece565b6013805461101590612537565b80601f016020809104026020016040519081016040528092919081815260200182805461104190612537565b801561108e5780601f106110635761010080835404028352916020019161108e565b820191906000526020600020905b81548152906001019060200180831161107157829003601f168201915b505050505081565b60006001600160a01b0382166110bf576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6110ec6119c5565b6110f66000611bab565b565b6111006119c5565b6011805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6111296119c5565b601255565b6111366119c5565b6011805460ff60b01b198116600160b01b9182900460ff1615909102179055565b61115f6119c5565b600955565b61116c6119c5565b6011805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6060600061119a83611096565b90506000816001600160401b038111156111b6576111b6612135565b6040519080825280602002602001820160405280156111df578160200160208202803683370190505b5090506000805b60005481101561124f57856001600160a01b031661120382610e60565b6001600160a01b03160361123d5780838381518110611224576112246125f2565b60209081029190910101528161123981612744565b9250505b8061124781612744565b9150506111e6565b5090949350505050565b6060600280546108fd90612537565b336001600160a01b038316036112915760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b601154600160a81b900460ff1615156001146113555760405162461bcd60e51b815260206004820152601760248201527610dbdb5a58d0dbdd995c8e88139bdd0814dd185c9d1959604a1b6044820152606401610bd9565b600e548311156113a25760405162461bcd60e51b815260206004820152601860248201527710dbdb5a58d0dbdd995c8e88105b5bdd5b9d08131a5b5a5d60421b6044820152606401610bd9565b6000601054846113b29190612773565b6113bc9085612715565b601154909150600160b01b900460ff16156114fe57611446838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506012546040516bffffffffffffffffffffffff193360601b166020820152909250603401905060405160208183030381529060405280519060200120611bfd565b6114925760405162461bcd60e51b815260206004820152601b60248201527f436f6d6963436f7665723a204e6f742057686974656c697374656400000000006044820152606401610bd9565b600f54336000908152601460205260409020546114b0908390612715565b11156114fe5760405162461bcd60e51b815260206004820152601760248201527f436f6d6963436f7665723a20546f6b656e204c696d69740000000000000000006044820152606401610bd9565b6011546001600160a01b03166323b872dd333087600a5461151f91906125d3565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015611573573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159791906125a0565b506115a23385611a1f565b33600090815260146020526040812080548392906115c1908490612715565b909155505050505050565b6115d78484846117a8565b6115e384848484611c13565b611600576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b61160e6119c5565b6011805461ffff60a01b191661010160a01b179055565b6060611632826000541190565b61164f57604051630a14c4b560e41b815260040160405180910390fd5b6000611659611d16565b9050805160000361167957604051806020016040528060008152506116a4565b8061168384611d25565b604051602001611694929190612787565b6040516020818303038152906040525b9392505050565b606060136040516020016116bf91906127b6565b604051602081830303815290604052905090565b6116db6119c5565b6001600160a01b0381166117405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bd9565b61174981611bab565b50565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006117b382611afd565b80519091506000906001600160a01b0316336001600160a01b031614806117e1575081516117e1903361081d565b806117fc5750336117f184610980565b6001600160a01b0316145b90508061181c57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146118515760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661187857604051633a954ecd60e21b815260040160405180910390fd5b611888600084846000015161174c565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b426001600160401b03160217905590860180835291205490911661197b5761192f816000541190565b1561197b57825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6007546001600160a01b031633146110f65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bd9565b323314611a6e5760405162461bcd60e51b815260206004820152601a60248201527f436f6d6963436f7665723a2053656c66204d696e74204f6e6c790000000000006044820152606401610bd9565b600060105482611a7e9190612773565b611a889083612715565b9050600c54600b54611a9a919061272d565b81611aa460005490565b611aae9190612715565b1115611af35760405162461bcd60e51b815260206004820152601460248201527310dbdb5a58d0dbdd995c8e8814dbdb190813dd5d60621b6044820152606401610bd9565b610a4e8382611b91565b6040805180820190915260008082526020820152611b1c826000541190565b611b3957604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611b87579392505050565b5060001901611b3b565b610ccf828260405180602001604052806000815250611e25565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611c0a8584611e32565b14949350505050565b60006001600160a01b0384163b15611d0a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c5790339089908890889060040161283c565b6020604051808303816000875af1925050508015611c92575060408051601f3d908101601f19168201909252611c8f91810190612879565b60015b611cf0573d808015611cc0576040519150601f19603f3d011682016040523d82523d6000602084013e611cc5565b606091505b508051600003611ce8576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d0e565b5060015b949350505050565b6060601380546108fd90612537565b606081600003611d4c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d765780611d6081612744565b9150611d6f9050600a83612773565b9150611d50565b6000816001600160401b03811115611d9057611d90612135565b6040519080825280601f01601f191660200182016040528015611dba576020820181803683370190505b5090505b8415611d0e57611dcf60018361272d565b9150611ddc600a86612896565b611de7906030612715565b60f81b818381518110611dfc57611dfc6125f2565b60200101906001600160f81b031916908160001a905350611e1e600a86612773565b9450611dbe565b610a4e8383836001611e7f565b600081815b8451811015611e7757611e6382868381518110611e5657611e566125f2565b6020026020010151611fd0565b915080611e6f81612744565b915050611e37565b509392505050565b6000546001600160a01b038516611ea857604051622e076360e81b815260040160405180910390fd5b83600003611ec95760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b85811015611fc75760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015611f9d5750611f9b6000888488611c13565b155b15611fbb576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611f46565b506000556119be565b6000818310611fec5760008281526020849052604090206116a4565b5060009182526020526040902090565b6001600160e01b03198116811461174957600080fd5b60006020828403121561202457600080fd5b81356116a481611ffc565b60005b8381101561204a578181015183820152602001612032565b838111156116005750506000910152565b6000815180845261207381602086016020860161202f565b601f01601f19169290920160200192915050565b6020815260006116a4602083018461205b565b6000602082840312156120ac57600080fd5b5035919050565b80356001600160a01b03811681146120ca57600080fd5b919050565b600080604083850312156120e257600080fd5b6120eb836120b3565b946020939093013593505050565b60008060006060848603121561210e57600080fd5b612117846120b3565b9250612125602085016120b3565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561217357612173612135565b604052919050565b60006001600160401b0383111561219457612194612135565b6121a7601f8401601f191660200161214b565b90508281528383830111156121bb57600080fd5b828260208301376000602084830101529392505050565b6000602082840312156121e457600080fd5b81356001600160401b038111156121fa57600080fd5b8201601f8101841361220b57600080fd5b611d0e8482356020840161217b565b60006001600160401b0382111561223357612233612135565b5060051b60200190565b600082601f83011261224e57600080fd5b8135602061226361225e8361221a565b61214b565b82815260059290921b8401810191818101908684111561228257600080fd5b8286015b8481101561229d5780358352918301918301612286565b509695505050505050565b600080604083850312156122bb57600080fd5b82356001600160401b03808211156122d257600080fd5b818501915085601f8301126122e657600080fd5b813560206122f661225e8361221a565b82815260059290921b8401810191818101908984111561231557600080fd5b948201945b8386101561233a5761232b866120b3565b8252948201949082019061231a565b9650508601359250508082111561235057600080fd5b5061235d8582860161223d565b9150509250929050565b60006020828403121561237957600080fd5b6116a4826120b3565b6020808252825182820181905260009190848201906040850190845b818110156123ba5783518352928401929184019160010161239e565b50909695505050505050565b801515811461174957600080fd5b600080604083850312156123e757600080fd5b6123f0836120b3565b91506020830135612400816123c6565b809150509250929050565b60008060006040848603121561242057600080fd5b8335925060208401356001600160401b038082111561243e57600080fd5b818601915086601f83011261245257600080fd5b81358181111561246157600080fd5b8760208260051b850101111561247657600080fd5b6020830194508093505050509250925092565b6000806000806080858703121561249f57600080fd5b6124a8856120b3565b93506124b6602086016120b3565b92506040850135915060608501356001600160401b038111156124d857600080fd5b8501601f810187136124e957600080fd5b6124f88782356020840161217b565b91505092959194509250565b6000806040838503121561251757600080fd5b612520836120b3565b915061252e602084016120b3565b90509250929050565b600181811c9082168061254b57607f821691505b60208210810361256b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561259957600080fd5b5051919050565b6000602082840312156125b257600080fd5b81516116a4816123c6565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156125ed576125ed6125bd565b500290565b634e487b7160e01b600052603260045260246000fd5b601f821115610a4e57600081815260208120601f850160051c8101602086101561262f5750805b601f850160051c820191505b8181101561264e5782815560010161263b565b505050505050565b81516001600160401b0381111561266f5761266f612135565b6126838161267d8454612537565b84612608565b602080601f8311600181146126b857600084156126a05750858301515b600019600386901b1c1916600185901b17855561264e565b600085815260208120601f198616915b828110156126e7578886015182559484019460019091019084016126c8565b50858210156127055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008219821115612728576127286125bd565b500190565b60008282101561273f5761273f6125bd565b500390565b600060018201612756576127566125bd565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826127825761278261275d565b500490565b6000835161279981846020880161202f565b8351908301906127ad81836020880161202f565b01949350505050565b60008083546127c481612537565b600182811680156127dc57600181146127f157612820565b60ff1984168752821515830287019450612820565b8760005260208060002060005b858110156128175781548a8201529084019082016127fe565b50505082870194505b50506718dbdb9d1c9858dd60c21b835250506008019392505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061286f9083018461205b565b9695505050505050565b60006020828403121561288b57600080fd5b81516116a481611ffc565b6000826128a5576128a561275d565b50069056fea2646970667358221220a5d0d60d999ac393506cfc154206beece3bc1df291c9cc4ba3e7f1d0d399053664736f6c634300080f0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001202bef6c5fb263d4d425f4fcb39b927b119f42f2a05cfcf1c7123d44de2e00eace000000000000000000000000ceb726e6383468dd8ac0b513c8330cc9fb4024a800000000000000000000000000000000000000000000000000000000000000205a6f6d626965204170657320436f6d6963204973737565203120436f7665727300000000000000000000000000000000000000000000000000000000000000065a41433031430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f6d657461646174612e7a6f6d626965636f6d6963732e696f2f7a6131632f0000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Zombie Apes Comic Issue 1 Covers
Arg [1] : _symbol (string): ZAC01C
Arg [2] : _initURI (string): https://metadata.zombiecomics.io/za1c/
Arg [3] : _merkleRoot (bytes32): 0x2bef6c5fb263d4d425f4fcb39b927b119f42f2a05cfcf1c7123d44de2e00eace
Arg [4] : _tokenAddress (address): 0xceb726e6383468dD8AC0b513c8330CC9Fb4024a8

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 2bef6c5fb263d4d425f4fcb39b927b119f42f2a05cfcf1c7123d44de2e00eace
Arg [4] : 000000000000000000000000ceb726e6383468dd8ac0b513c8330cc9fb4024a8
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [6] : 5a6f6d626965204170657320436f6d6963204973737565203120436f76657273
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 5a41433031430000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000026
Arg [10] : 68747470733a2f2f6d657461646174612e7a6f6d626965636f6d6963732e696f
Arg [11] : 2f7a6131632f0000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53148:5406:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40047:372;;;;;;;;;;-1:-1:-1;40047:372:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;40047:372:0;;;;;;;;53478:31;;;;;;;;;;;;;;;;;;;738:25:1;;;726:2;711:18;53478:31:0;592:177:1;41806:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43283:204::-;;;;;;;;;;-1:-1:-1;43283:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1874:32:1;;;1856:51;;1844:2;1829:18;43283:204:0;1710:203:1;42872:345:0;;;;;;;;;;-1:-1:-1;42872:345:0;;;;;:::i;:::-;;:::i;:::-;;53212:37;;;;;;;;;;;;;;;;38314:101;;;;;;;;;;-1:-1:-1;38367:7:0;38394:13;38314:101;;44140:170;;;;;;;;;;-1:-1:-1;44140:170:0;;;;;:::i;:::-;;:::i;53300:29::-;;;;;;;;;;;;;;;;53667:25;;;;;;;;;;;;;;;;38968:1007;;;;;;;;;;-1:-1:-1;38968:1007:0;;;;;:::i;:::-;;:::i;53625:33::-;;;;;;;;;;-1:-1:-1;53625:33:0;;;;-1:-1:-1;;;53625:33:0;;;;;;57612:96;;;;;;;;;;-1:-1:-1;57612:96:0;;;;;:::i;:::-;;:::i;57716:357::-;;;;;;;;;;;;;:::i;54498:310::-;;;;;;:::i;:::-;;:::i;44381:185::-;;;;;;;;;;-1:-1:-1;44381:185:0;;;;;:::i;:::-;;:::i;56418:179::-;;;;;;;;;;-1:-1:-1;56418:179:0;;;;;:::i;:::-;;:::i;53441:28::-;;;;;;;;;;;;;;;;38492:176;;;;;;;;;;-1:-1:-1;38492:176:0;;;;;:::i;:::-;;:::i;58081:104::-;;;;;;;;;;-1:-1:-1;58081:104:0;;;;;:::i;:::-;;:::i;41615:124::-;;;;;;;;;;-1:-1:-1;41615:124:0;;;;;:::i;:::-;;:::i;55805:605::-;;;;;;;;;;-1:-1:-1;55805:605:0;;;;;:::i;:::-;;:::i;53736:53::-;;;;;;;;;;-1:-1:-1;53736:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;53701:26;;;;;;;;;;;;;:::i;40483:206::-;;;;;;;;;;-1:-1:-1;40483:206:0;;;;;:::i;:::-;;:::i;16757:103::-;;;;;;;;;;;;;:::i;57197:85::-;;;;;;;;;;;;;:::i;58447:104::-;;;;;;;;;;-1:-1:-1;58447:104:0;;;;;:::i;:::-;;:::i;57400:100::-;;;;;;;;;;;;;:::i;57508:96::-;;;;;;;;;;-1:-1:-1;57508:96:0;;;;;:::i;:::-;;:::i;57107:82::-;;;;;;;;;;;;;:::i;56605:494::-;;;;;;;;;;-1:-1:-1;56605:494:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16109:87::-;;;;;;;;;;-1:-1:-1;16182:6:0;;-1:-1:-1;;;;;16182:6:0;16109:87;;41975:104;;;;;;;;;;;;;:::i;53552:28::-;;;;;;;;;;-1:-1:-1;53552:28:0;;;;-1:-1:-1;;;53552:28:0;;;;;;53516:27;;;;;;;;;;-1:-1:-1;53516:27:0;;;;-1:-1:-1;;;;;53516:27:0;;;43559:279;;;;;;;;;;-1:-1:-1;43559:279:0;;;;;:::i;:::-;;:::i;54816:981::-;;;;;;;;;;-1:-1:-1;54816:981:0;;;;;:::i;:::-;;:::i;53407:27::-;;;;;;;;;;;;;;;;44637:308;;;;;;;;;;-1:-1:-1;44637:308:0;;;;;:::i;:::-;;:::i;57290:102::-;;;;;;;;;;;;;:::i;42150:318::-;;;;;;;;;;-1:-1:-1;42150:318:0;;;;;:::i;:::-;;:::i;53372:28::-;;;;;;;;;;;;;;;;53256:35;;;;;;;;;;;;;;;;58309:130;;;;;;;;;;;;;:::i;53587:29::-;;;;;;;;;;-1:-1:-1;53587:29:0;;;;-1:-1:-1;;;53587:29:0;;;;;;43909:164;;;;;;;;;;-1:-1:-1;43909:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;44030:25:0;;;44006:4;44030:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43909:164;17015:201;;;;;;;;;;-1:-1:-1;17015:201:0;;;;;:::i;:::-;;:::i;53336:29::-;;;;;;;;;;;;;;;;40047:372;40149:4;-1:-1:-1;;;;;;40186:40:0;;-1:-1:-1;;;40186:40:0;;:105;;-1:-1:-1;;;;;;;40243:48:0;;-1:-1:-1;;;40243:48:0;40186:105;:172;;;-1:-1:-1;;;;;;;40308:50:0;;-1:-1:-1;;;40308:50:0;40186:172;:225;;;-1:-1:-1;;;;;;;;;;29072:40:0;;;40375:36;40166:245;40047:372;-1:-1:-1;;40047:372:0:o;41806:100::-;41860:13;41893:5;41886:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41806:100;:::o;43283:204::-;43351:7;43376:16;43384:7;45257:4;45291:13;-1:-1:-1;45281:23:0;45200:112;43376:16;43371:64;;43401:34;;-1:-1:-1;;;43401:34:0;;;;;;;;;;;43371:64;-1:-1:-1;43455:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43455:24:0;;43283:204::o;42872:345::-;42945:13;42961:24;42977:7;42961:15;:24::i;:::-;42945:40;;43006:5;-1:-1:-1;;;;;43000:11:0;:2;-1:-1:-1;;;;;43000:11:0;;42996:48;;43020:24;;-1:-1:-1;;;43020:24:0;;;;;;;;;;;42996:48;14740:10;-1:-1:-1;;;;;43061:21:0;;;;;;:63;;-1:-1:-1;43087:37:0;43104:5;14740:10;43909:164;:::i;43087:37::-;43086:38;43061:63;43057:111;;;43133:35;;-1:-1:-1;;;43133:35:0;;;;;;;;;;;43057:111;43181:28;43190:2;43194:7;43203:5;43181:8;:28::i;:::-;42934:283;42872:345;;:::o;44140:170::-;44274:28;44284:4;44290:2;44294:7;44274:9;:28::i;38968:1007::-;39057:7;39090:16;39100:5;39090:9;:16::i;:::-;39081:5;:25;39077:61;;39115:23;;-1:-1:-1;;;39115:23:0;;;;;;;;;;;39077:61;39149:22;38394:13;;;39149:22;;39412:466;39432:14;39428:1;:18;39412:466;;;39472:31;39506:14;;;:11;:14;;;;;;;;;39472:48;;;;;;;;;-1:-1:-1;;;;;39472:48:0;;;;;-1:-1:-1;;;39472:48:0;;;-1:-1:-1;;;;;39472:48:0;;;;;;;;39543:28;39539:111;;39616:14;;;-1:-1:-1;39539:111:0;39693:5;-1:-1:-1;;;;;39672:26:0;:17;-1:-1:-1;;;;;39672:26:0;;39668:195;;39742:5;39727:11;:20;39723:85;;-1:-1:-1;39783:1:0;-1:-1:-1;39776:8:0;;-1:-1:-1;;;39776:8:0;39723:85;39830:13;;;;;39668:195;-1:-1:-1;39448:3:0;;39412:466;;;-1:-1:-1;39954:13:0;;:::i;:::-;39066:909;;;38968:1007;;;;:::o;57612:96::-;15995:13;:11;:13::i;:::-;57680:8:::1;:20:::0;57612:96::o;57716:357::-;15995:13;:11;:13::i;:::-;57784:84:::1;::::0;57765:13:::1;::::0;14740:10;;57832:21:::1;::::0;57765:13;57784:84;57765:13;57784:84;57832:21;14740:10;57784:84:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57764:104;;;57887:8;57879:48;;;::::0;-1:-1:-1;;;57879:48:0;;10166:2:1;57879:48:0::1;::::0;::::1;10148:21:1::0;10205:2;10185:18;;;10178:30;10244:29;10224:18;;;10217:57;10291:18;;57879:48:0::1;;;;;;;;;57945:12;::::0;-1:-1:-1;;;;;57945:12:0::1;57938:29;14740:10:::0;58016:12:::1;::::0;58009:45:::1;::::0;-1:-1:-1;;;58009:45:0;;58048:4:::1;58009:45;::::0;::::1;1856:51:1::0;-1:-1:-1;;;;;58016:12:0;;::::1;::::0;58009:30:::1;::::0;1829:18:1;;58009:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57938:127;::::0;-1:-1:-1;;;;;;57938:127:0::1;::::0;;;;;;-1:-1:-1;;;;;10701:32:1;;;57938:127:0::1;::::0;::::1;10683:51:1::0;10750:18;;;10743:34;10656:18;;57938:127:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57753:320;57716:357::o:0;54498:310::-;54576:8;;-1:-1:-1;;;54576:8:0;;;;:16;;54588:4;54576:16;54568:52;;;;-1:-1:-1;;;54568:52:0;;11240:2:1;54568:52:0;;;11222:21:1;11279:2;11259:18;;;11252:30;-1:-1:-1;;;11298:18:1;;;11291:53;11361:18;;54568:52:0;11038:347:1;54568:52:0;54650:9;;54639:7;:20;;54631:57;;;;-1:-1:-1;;;54631:57:0;;11592:2:1;54631:57:0;;;11574:21:1;11631:2;11611:18;;;11604:30;-1:-1:-1;;;11650:18:1;;;11643:54;11714:18;;54631:57:0;11390:348:1;54631:57:0;54731:7;54720:8;;:18;;;;:::i;:::-;54707:9;:31;54699:71;;;;-1:-1:-1;;;54699:71:0;;12250:2:1;54699:71:0;;;12232:21:1;12289:2;12269:18;;;12262:30;12328:29;12308:18;;;12301:57;12375:18;;54699:71:0;12048:351:1;54699:71:0;54781:19;54787:3;54792:7;54781:5;:19::i;44381:185::-;44519:39;44536:4;44542:2;44546:7;44519:39;;;;;;;;;;;;:16;:39::i;56418:179::-;56528:7;56560:21;56574:6;56560:13;:21::i;:::-;56582:6;56560:29;;;;;;;;:::i;:::-;;;;;;;56553:36;;56418:179;;;;:::o;38492:176::-;38559:7;38394:13;;38583:5;:22;38579:58;;38614:23;;-1:-1:-1;;;38614:23:0;;;;;;;;;;;38579:58;-1:-1:-1;38655:5:0;38492:176::o;58081:104::-;15995:13;:11;:13::i;:::-;58156:7:::1;:21;58166:11:::0;58156:7;:21:::1;:::i;41615:124::-:0;41679:7;41706:20;41718:7;41706:11;:20::i;:::-;:25;;41615:124;-1:-1:-1;;41615:124:0:o;55805:605::-;15995:13;:11;:13::i;:::-;55943:7:::1;:14;55929:3;:10;:28;55921:69;;;::::0;-1:-1:-1;;;55921:69:0;;14942:2:1;55921:69:0::1;::::0;::::1;14924:21:1::0;14981:2;14961:18;;;14954:30;15020;15000:18;;;14993:58;15068:18;;55921:69:0::1;14740:352:1::0;55921:69:0::1;56006:9;56001:402;56025:3;:10;56021:1;:14;56001:402;;;56113:8;;56099:7;56107:1;56099:10;;;;;;;;:::i;:::-;;;;;;;56083:13;38367:7:::0;38394:13;;38314:101;56083:13:::1;:26;;;;:::i;:::-;:38;;56057:120;;;::::0;-1:-1:-1;;;56057:120:0;;15432:2:1;56057:120:0::1;::::0;::::1;15414:21:1::0;15471:2;15451:18;;;15444:30;-1:-1:-1;;;15490:18:1;;;15483:50;15550:18;;56057:120:0::1;15230:344:1::0;56057:120:0::1;56192:29;56202:3;56206:1;56202:6;;;;;;;;:::i;:::-;;;;;;;56210:7;56218:1;56210:10;;;;;;;;:::i;:::-;;;;;;;56192:9;:29::i;:::-;56253:1;56242:8;;:12;:38;;;;;56270:7;56278:1;56270:10;;;;;;;;:::i;:::-;;;;;;;56258:8;;:22;;56242:38;56238:154;;;56313:7;56321:1;56313:10;;;;;;;;:::i;:::-;;;;;;;56301:8;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;56238:154:0::1;::::0;-1:-1:-1;56238:154:0::1;;56375:1;56364:8;:12:::0;56238:154:::1;56037:3:::0;::::1;::::0;::::1;:::i;:::-;;;;56001:402;;53701:26:::0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40483:206::-;40547:7;-1:-1:-1;;;;;40571:19:0;;40567:60;;40599:28;;-1:-1:-1;;;40599:28:0;;;;;;;;;;;40567:60;-1:-1:-1;;;;;;40653:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;40653:27:0;;40483:206::o;16757:103::-;15995:13;:11;:13::i;:::-;16822:30:::1;16849:1;16822:18;:30::i;:::-;16757:103::o:0;57197:85::-;15995:13;:11;:13::i;:::-;57265:9:::1;::::0;;-1:-1:-1;;;;57252:22:0;::::1;-1:-1:-1::0;;;57265:9:0;;;::::1;;;57264:10;57252:22:::0;;::::1;;::::0;;57197:85::o;58447:104::-;15995:13;:11;:13::i;:::-;58519:10:::1;:24:::0;58447:104::o;57400:100::-;15995:13;:11;:13::i;:::-;57478:14:::1;::::0;;-1:-1:-1;;;;57460:32:0;::::1;-1:-1:-1::0;;;57478:14:0;;;::::1;;;57477:15;57460:32:::0;;::::1;;::::0;;57400:100::o;57508:96::-;15995:13;:11;:13::i;:::-;57576:8:::1;:20:::0;57508:96::o;57107:82::-;15995:13;:11;:13::i;:::-;57173:8:::1;::::0;;-1:-1:-1;;;;57161:20:0;::::1;-1:-1:-1::0;;;57173:8:0;;;::::1;;;57172:9;57161:20:::0;;::::1;;::::0;;57107:82::o;56605:494::-;56692:16;56726:19;56748:17;56758:6;56748:9;:17::i;:::-;56726:39;;56776:26;56819:11;-1:-1:-1;;;;;56805:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56805:26:0;;56776:55;;56842:19;56881:9;56876:189;38367:7;38394:13;56896:1;:17;56876:189;;;56953:6;-1:-1:-1;;;;;56939:20:0;:10;56947:1;56939:7;:10::i;:::-;-1:-1:-1;;;;;56939:20:0;;56935:119;;57005:1;56980:9;56990:11;56980:22;;;;;;;;:::i;:::-;;;;;;;;;;:26;57025:13;;;;:::i;:::-;;;;56935:119;56915:3;;;;:::i;:::-;;;;56876:189;;;-1:-1:-1;57082:9:0;;56605:494;-1:-1:-1;;;;56605:494:0:o;41975:104::-;42031:13;42064:7;42057:14;;;;;:::i;43559:279::-;14740:10;-1:-1:-1;;;;;43650:24:0;;;43646:54;;43683:17;;-1:-1:-1;;;43683:17:0;;;;;;;;;;;43646:54;14740:10;43713:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;43713:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;43713:53:0;;;;;;;;;;43782:48;;540:41:1;;;43713:42:0;;14740:10;43782:48;;513:18:1;43782:48:0;;;;;;;43559:279;;:::o;54816:981::-;54904:9;;-1:-1:-1;;;54904:9:0;;;;:17;;54917:4;54904:17;54896:53;;;;-1:-1:-1;;;54896:53:0;;11240:2:1;54896:53:0;;;11222:21:1;11279:2;11259:18;;;11252:30;-1:-1:-1;;;11298:18:1;;;11291:53;11361:18;;54896:53:0;11038:347:1;54896:53:0;54979:8;;54968:7;:19;;54960:56;;;;-1:-1:-1;;;54960:56:0;;11592:2:1;54960:56:0;;;11574:21:1;11631:2;11611:18;;;11604:30;-1:-1:-1;;;11650:18:1;;;11643:54;11714:18;;54960:56:0;11390:348:1;54960:56:0;55027:19;55070:12;;55060:7;:22;;;;:::i;:::-;55049:34;;:7;:34;:::i;:::-;55098:14;;55027:56;;-1:-1:-1;;;;55098:14:0;;;;55094:456;;;55155:162;55196:5;;55155:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55224:10:0;;55267:30;;-1:-1:-1;;14740:10:0;16255:2:1;16251:15;16247:53;55267:30:0;;;16235:66:1;55224:10:0;;-1:-1:-1;16317:12:1;;;-1:-1:-1;55267:30:0;;;;;;;;;;;;55257:41;;;;;;55155:18;:162::i;:::-;55129:251;;;;-1:-1:-1;;;55129:251:0;;16542:2:1;55129:251:0;;;16524:21:1;16581:2;16561:18;;;16554:30;16620:29;16600:18;;;16593:57;16667:18;;55129:251:0;16340:351:1;55129:251:0;55471:8;;14740:10;55421:32;;;;:18;:32;;;;;;:46;;55456:11;;55421:46;:::i;:::-;:58;;55395:143;;;;-1:-1:-1;;;55395:143:0;;16898:2:1;55395:143:0;;;16880:21:1;16937:2;16917:18;;;16910:30;16976:25;16956:18;;;16949:53;17019:18;;55395:143:0;16696:347:1;55395:143:0;55567:12;;-1:-1:-1;;;;;55567:12:0;55560:33;14740:10;55643:4;55674:7;55663:8;;:18;;;;:::i;:::-;55560:132;;-1:-1:-1;;;;;;55560:132:0;;;;;;;-1:-1:-1;;;;;17306:15:1;;;55560:132:0;;;17288:34:1;17358:15;;;;17338:18;;;17331:43;17390:18;;;17383:34;17223:18;;55560:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;55703:28:0;14740:10;55723:7;55703:5;:28::i;:::-;14740:10;55742:32;;;;:18;:32;;;;;:47;;55778:11;;55742:32;:47;;55778:11;;55742:47;:::i;:::-;;;;-1:-1:-1;;;;;;54816:981:0:o;44637:308::-;44796:28;44806:4;44812:2;44816:7;44796:9;:28::i;:::-;44840:48;44863:4;44869:2;44873:7;44882:5;44840:22;:48::i;:::-;44835:102;;44897:40;;-1:-1:-1;;;44897:40:0;;;;;;;;;;;44835:102;44637:308;;;;:::o;57290:102::-;15995:13;:11;:13::i;:::-;57342:8:::1;:15:::0;;-1:-1:-1;;;;57368:16:0;-1:-1:-1;;;57368:16:0;;;57290:102::o;42150:318::-;42223:13;42254:16;42262:7;45257:4;45291:13;-1:-1:-1;45281:23:0;45200:112;42254:16;42249:59;;42279:29;;-1:-1:-1;;;42279:29:0;;;;;;;;;;;42249:59;42321:21;42345:10;:8;:10::i;:::-;42321:34;;42379:7;42373:21;42398:1;42373:26;:87;;;;;;;;;;;;;;;;;42426:7;42435:18;:7;:16;:18::i;:::-;42409:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42373:87;42366:94;42150:318;-1:-1:-1;;;42150:318:0:o;58309:130::-;58353:13;58410:7;58393:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;58379:52;;58309:130;:::o;17015:201::-;15995:13;:11;:13::i;:::-;-1:-1:-1;;;;;17104:22:0;::::1;17096:73;;;::::0;-1:-1:-1;;;17096:73:0;;19093:2:1;17096:73:0::1;::::0;::::1;19075:21:1::0;19132:2;19112:18;;;19105:30;19171:34;19151:18;;;19144:62;-1:-1:-1;;;19222:18:1;;;19215:36;19268:19;;17096:73:0::1;18891:402:1::0;17096:73:0::1;17180:28;17199:8;17180:18;:28::i;:::-;17015:201:::0;:::o;49963:196::-;50078:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;50078:29:0;-1:-1:-1;;;;;50078:29:0;;;;;;;;;50123:28;;50078:24;;50123:28;;;;;;;49963:196;;;:::o;47883:1962::-;47998:35;48036:20;48048:7;48036:11;:20::i;:::-;48111:18;;47998:58;;-1:-1:-1;48069:22:0;;-1:-1:-1;;;;;48095:34:0;14740:10;-1:-1:-1;;;;;48095:34:0;;:101;;;-1:-1:-1;48163:18:0;;48146:50;;14740:10;43909:164;:::i;48146:50::-;48095:154;;;-1:-1:-1;14740:10:0;48213:20;48225:7;48213:11;:20::i;:::-;-1:-1:-1;;;;;48213:36:0;;48095:154;48069:181;;48268:17;48263:66;;48294:35;;-1:-1:-1;;;48294:35:0;;;;;;;;;;;48263:66;48366:4;-1:-1:-1;;;;;48344:26:0;:13;:18;;;-1:-1:-1;;;;;48344:26:0;;48340:67;;48379:28;;-1:-1:-1;;;48379:28:0;;;;;;;;;;;48340:67;-1:-1:-1;;;;;48422:16:0;;48418:52;;48447:23;;-1:-1:-1;;;48447:23:0;;;;;;;;;;;48418:52;48591:49;48608:1;48612:7;48621:13;:18;;;48591:8;:49::i;:::-;-1:-1:-1;;;;;48936:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;48936:31:0;;;-1:-1:-1;;;;;48936:31:0;;;-1:-1:-1;;48936:31:0;;;;;;;48982:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;48982:29:0;;;;;;;;;;;;;49028:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;49073:61:0;;;;-1:-1:-1;;;49118:15:0;-1:-1:-1;;;;;49073:61:0;;;;;49408:11;;;49438:24;;;;;:29;49408:11;;49438:29;49434:295;;49506:20;49514:11;45257:4;45291:13;-1:-1:-1;45281:23:0;45200:112;49506:20;49502:212;;;49583:18;;;49551:24;;;:11;:24;;;;;;;;:50;;49666:28;;;;-1:-1:-1;;;;;49624:70:0;-1:-1:-1;;;49624:70:0;-1:-1:-1;;;;;;49624:70:0;;;-1:-1:-1;;;;;49551:50:0;;;49624:70;;;;;;;49502:212;48911:829;49776:7;49772:2;-1:-1:-1;;;;;49757:27:0;49766:4;-1:-1:-1;;;;;49757:27:0;;;;;;;;;;;49795:42;47987:1858;;47883:1962;;;:::o;16274:132::-;16182:6;;-1:-1:-1;;;;;16182:6:0;14740:10;16338:23;16330:68;;;;-1:-1:-1;;;16330:68:0;;19500:2:1;16330:68:0;;;19482:21:1;;;19519:18;;;19512:30;19578:34;19558:18;;;19551:62;19630:18;;16330:68:0;19298:356:1;54117:373:0;54190:9;54203:10;54190:23;54182:62;;;;-1:-1:-1;;;54182:62:0;;19861:2:1;54182:62:0;;;19843:21:1;19900:2;19880:18;;;19873:30;19939:28;19919:18;;;19912:56;19985:18;;54182:62:0;19659:350:1;54182:62:0;54255:19;54298:12;;54288:7;:22;;;;:::i;:::-;54277:34;;:7;:34;:::i;:::-;54255:56;;54387:8;;54376;;:19;;;;:::i;:::-;54360:11;54344:13;38367:7;38394:13;;38314:101;54344:13;:27;;;;:::i;:::-;:52;;54322:122;;;;-1:-1:-1;;;54322:122:0;;15432:2:1;54322:122:0;;;15414:21:1;15471:2;15451:18;;;15444:30;-1:-1:-1;;;15490:18:1;;;15483:50;15550:18;;54322:122:0;15230:344:1;54322:122:0;54455:27;54465:3;54470:11;54455:9;:27::i;41106:447::-;-1:-1:-1;;;;;;;;;;;;;;;;;41206:16:0;41214:7;45257:4;45291:13;-1:-1:-1;45281:23:0;45200:112;41206:16;41201:61;;41231:31;;-1:-1:-1;;;41231:31:0;;;;;;;;;;;41201:61;41320:7;41300:235;41357:31;41391:17;;;:11;:17;;;;;;;;;41357:51;;;;;;;;;-1:-1:-1;;;;;41357:51:0;;;;;-1:-1:-1;;;41357:51:0;;;-1:-1:-1;;;;;41357:51:0;;;;;;;;41431:28;41427:93;;41491:9;41106:447;-1:-1:-1;;;41106:447:0:o;41427:93::-;-1:-1:-1;;;41330:6:0;41300:235;;45320:104;45389:27;45399:2;45403:8;45389:27;;;;;;;;;;;;:9;:27::i;17376:191::-;17469:6;;;-1:-1:-1;;;;;17486:17:0;;;-1:-1:-1;;;;;;17486:17:0;;;;;;;17519:40;;17469:6;;;17486:17;17469:6;;17519:40;;17450:16;;17519:40;17439:128;17376:191;:::o;1219:190::-;1344:4;1397;1368:25;1381:5;1388:4;1368:12;:25::i;:::-;:33;;1219:190;-1:-1:-1;;;;1219:190:0:o;50724:765::-;50879:4;-1:-1:-1;;;;;50900:13:0;;19102:19;:23;50896:586;;50936:72;;-1:-1:-1;;;50936:72:0;;-1:-1:-1;;;;;50936:36:0;;;;;:72;;14740:10;;50987:4;;50993:7;;51002:5;;50936:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50936:72:0;;;;;;;;-1:-1:-1;;50936:72:0;;;;;;;;;;;;:::i;:::-;;;50932:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51182:6;:13;51199:1;51182:18;51178:234;;51209:40;;-1:-1:-1;;;51209:40:0;;;;;;;;;;;51178:234;51362:6;51356:13;51347:6;51343:2;51339:15;51332:38;50932:495;-1:-1:-1;;;;;;51059:55:0;-1:-1:-1;;;51059:55:0;;-1:-1:-1;51052:62:0;;50896:586;-1:-1:-1;51466:4:0;50896:586;50724:765;;;;;;:::o;58193:108::-;58253:13;58286:7;58279:14;;;;;:::i;11914:723::-;11970:13;12191:5;12200:1;12191:10;12187:53;;-1:-1:-1;;12218:10:0;;;;;;;;;;;;-1:-1:-1;;;12218:10:0;;;;;11914:723::o;12187:53::-;12265:5;12250:12;12306:78;12313:9;;12306:78;;12339:8;;;;:::i;:::-;;-1:-1:-1;12362:10:0;;-1:-1:-1;12370:2:0;12362:10;;:::i;:::-;;;12306:78;;;12394:19;12426:6;-1:-1:-1;;;;;12416:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12416:17:0;;12394:39;;12444:154;12451:10;;12444:154;;12478:11;12488:1;12478:11;;:::i;:::-;;-1:-1:-1;12547:10:0;12555:2;12547:5;:10;:::i;:::-;12534:24;;:2;:24;:::i;:::-;12521:39;;12504:6;12511;12504:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;12504:56:0;;;;;;;;-1:-1:-1;12575:11:0;12584:2;12575:11;;:::i;:::-;;;12444:154;;45787:163;45910:32;45916:2;45920:8;45930:5;45937:4;45910:5;:32::i;2086:296::-;2169:7;2212:4;2169:7;2227:118;2251:5;:12;2247:1;:16;2227:118;;;2300:33;2310:12;2324:5;2330:1;2324:8;;;;;;;;:::i;:::-;;;;;;;2300:9;:33::i;:::-;2285:48;-1:-1:-1;2265:3:0;;;;:::i;:::-;;;;2227:118;;;-1:-1:-1;2362:12:0;2086:296;-1:-1:-1;;;2086:296:0:o;46209:1420::-;46348:20;46371:13;-1:-1:-1;;;;;46399:16:0;;46395:48;;46424:19;;-1:-1:-1;;;46424:19:0;;;;;;;;;;;46395:48;46458:8;46470:1;46458:13;46454:44;;46480:18;;-1:-1:-1;;;46480:18:0;;;;;;;;;;;46454:44;-1:-1:-1;;;;;46851:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;46851:45:0;;-1:-1:-1;;;;;46851:45:0;;;;;;;;;;46911:50;;;;;;;;;;;;;;46978:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;47028:66:0;;;;-1:-1:-1;;;47078:15:0;-1:-1:-1;;;;;47028:66:0;;;;;;46978:25;;47163:330;47183:8;47179:1;:12;47163:330;;;47222:38;;47247:12;;-1:-1:-1;;;;;47222:38:0;;;47239:1;;47222:38;;47239:1;;47222:38;47283:4;:68;;;;;47292:59;47323:1;47327:2;47331:12;47345:5;47292:22;:59::i;:::-;47291:60;47283:68;47279:164;;;47383:40;;-1:-1:-1;;;47383:40:0;;;;;;;;;;;47279:164;47463:14;;;;;47193:3;47163:330;;;-1:-1:-1;47509:13:0;:28;47561:60;44637:308;8293:149;8356:7;8387:1;8383;:5;:51;;8518:13;8612:15;;;8648:4;8641:15;;;8695:4;8679:21;;8383:51;;;-1:-1:-1;8518:13:0;8612:15;;;8648:4;8641:15;8695:4;8679:21;;;8293:149::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:::-;1079:3;1117:5;1111:12;1144:6;1139:3;1132:19;1160:63;1216:6;1209:4;1204:3;1200:14;1193:4;1186:5;1182:16;1160:63;:::i;:::-;1277:2;1256:15;-1:-1:-1;;1252:29:1;1243:39;;;;1284:4;1239:50;;1037:258;-1:-1:-1;;1037:258:1:o;1300:220::-;1449:2;1438:9;1431:21;1412:4;1469:45;1510:2;1499:9;1495:18;1487:6;1469:45;:::i;1525:180::-;1584:6;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;-1:-1:-1;1676:23:1;;1525:180;-1:-1:-1;1525:180:1:o;1918:173::-;1986:20;;-1:-1:-1;;;;;2035:31:1;;2025:42;;2015:70;;2081:1;2078;2071:12;2015:70;1918:173;;;:::o;2096:254::-;2164:6;2172;2225:2;2213:9;2204:7;2200:23;2196:32;2193:52;;;2241:1;2238;2231:12;2193:52;2264:29;2283:9;2264:29;:::i;:::-;2254:39;2340:2;2325:18;;;;2312:32;;-1:-1:-1;;;2096:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2870:127::-;2931:10;2926:3;2922:20;2919:1;2912:31;2962:4;2959:1;2952:15;2986:4;2983:1;2976:15;3002:275;3073:2;3067:9;3138:2;3119:13;;-1:-1:-1;;3115:27:1;3103:40;;-1:-1:-1;;;;;3158:34:1;;3194:22;;;3155:62;3152:88;;;3220:18;;:::i;:::-;3256:2;3249:22;3002:275;;-1:-1:-1;3002:275:1:o;3282:407::-;3347:5;-1:-1:-1;;;;;3373:6:1;3370:30;3367:56;;;3403:18;;:::i;:::-;3441:57;3486:2;3465:15;;-1:-1:-1;;3461:29:1;3492:4;3457:40;3441:57;:::i;:::-;3432:66;;3521:6;3514:5;3507:21;3561:3;3552:6;3547:3;3543:16;3540:25;3537:45;;;3578:1;3575;3568:12;3537:45;3627:6;3622:3;3615:4;3608:5;3604:16;3591:43;3681:1;3674:4;3665:6;3658:5;3654:18;3650:29;3643:40;3282:407;;;;;:::o;3694:451::-;3763:6;3816:2;3804:9;3795:7;3791:23;3787:32;3784:52;;;3832:1;3829;3822:12;3784:52;3872:9;3859:23;-1:-1:-1;;;;;3897:6:1;3894:30;3891:50;;;3937:1;3934;3927:12;3891:50;3960:22;;4013:4;4005:13;;4001:27;-1:-1:-1;3991:55:1;;4042:1;4039;4032:12;3991:55;4065:74;4131:7;4126:2;4113:16;4108:2;4104;4100:11;4065:74;:::i;4150:183::-;4210:4;-1:-1:-1;;;;;4235:6:1;4232:30;4229:56;;;4265:18;;:::i;:::-;-1:-1:-1;4310:1:1;4306:14;4322:4;4302:25;;4150:183::o;4338:662::-;4392:5;4445:3;4438:4;4430:6;4426:17;4422:27;4412:55;;4463:1;4460;4453:12;4412:55;4499:6;4486:20;4525:4;4549:60;4565:43;4605:2;4565:43;:::i;:::-;4549:60;:::i;:::-;4643:15;;;4729:1;4725:10;;;;4713:23;;4709:32;;;4674:12;;;;4753:15;;;4750:35;;;4781:1;4778;4771:12;4750:35;4817:2;4809:6;4805:15;4829:142;4845:6;4840:3;4837:15;4829:142;;;4911:17;;4899:30;;4949:12;;;;4862;;4829:142;;;-1:-1:-1;4989:5:1;4338:662;-1:-1:-1;;;;;;4338:662:1:o;5005:1146::-;5123:6;5131;5184:2;5172:9;5163:7;5159:23;5155:32;5152:52;;;5200:1;5197;5190:12;5152:52;5240:9;5227:23;-1:-1:-1;;;;;5310:2:1;5302:6;5299:14;5296:34;;;5326:1;5323;5316:12;5296:34;5364:6;5353:9;5349:22;5339:32;;5409:7;5402:4;5398:2;5394:13;5390:27;5380:55;;5431:1;5428;5421:12;5380:55;5467:2;5454:16;5489:4;5513:60;5529:43;5569:2;5529:43;:::i;5513:60::-;5607:15;;;5689:1;5685:10;;;;5677:19;;5673:28;;;5638:12;;;;5713:19;;;5710:39;;;5745:1;5742;5735:12;5710:39;5769:11;;;;5789:148;5805:6;5800:3;5797:15;5789:148;;;5871:23;5890:3;5871:23;:::i;:::-;5859:36;;5822:12;;;;5915;;;;5789:148;;;5956:5;-1:-1:-1;;5999:18:1;;5986:32;;-1:-1:-1;;6030:16:1;;;6027:36;;;6059:1;6056;6049:12;6027:36;;6082:63;6137:7;6126:8;6115:9;6111:24;6082:63;:::i;:::-;6072:73;;;5005:1146;;;;;:::o;6156:186::-;6215:6;6268:2;6256:9;6247:7;6243:23;6239:32;6236:52;;;6284:1;6281;6274:12;6236:52;6307:29;6326:9;6307:29;:::i;6532:632::-;6703:2;6755:21;;;6825:13;;6728:18;;;6847:22;;;6674:4;;6703:2;6926:15;;;;6900:2;6885:18;;;6674:4;6969:169;6983:6;6980:1;6977:13;6969:169;;;7044:13;;7032:26;;7113:15;;;;7078:12;;;;7005:1;6998:9;6969:169;;;-1:-1:-1;7155:3:1;;6532:632;-1:-1:-1;;;;;;6532:632:1:o;7169:118::-;7255:5;7248:13;7241:21;7234:5;7231:32;7221:60;;7277:1;7274;7267:12;7292:315;7357:6;7365;7418:2;7406:9;7397:7;7393:23;7389:32;7386:52;;;7434:1;7431;7424:12;7386:52;7457:29;7476:9;7457:29;:::i;:::-;7447:39;;7536:2;7525:9;7521:18;7508:32;7549:28;7571:5;7549:28;:::i;:::-;7596:5;7586:15;;;7292:315;;;;;:::o;7612:683::-;7707:6;7715;7723;7776:2;7764:9;7755:7;7751:23;7747:32;7744:52;;;7792:1;7789;7782:12;7744:52;7828:9;7815:23;7805:33;;7889:2;7878:9;7874:18;7861:32;-1:-1:-1;;;;;7953:2:1;7945:6;7942:14;7939:34;;;7969:1;7966;7959:12;7939:34;8007:6;7996:9;7992:22;7982:32;;8052:7;8045:4;8041:2;8037:13;8033:27;8023:55;;8074:1;8071;8064:12;8023:55;8114:2;8101:16;8140:2;8132:6;8129:14;8126:34;;;8156:1;8153;8146:12;8126:34;8209:7;8204:2;8194:6;8191:1;8187:14;8183:2;8179:23;8175:32;8172:45;8169:65;;;8230:1;8227;8220:12;8169:65;8261:2;8257;8253:11;8243:21;;8283:6;8273:16;;;;;7612:683;;;;;:::o;8300:667::-;8395:6;8403;8411;8419;8472:3;8460:9;8451:7;8447:23;8443:33;8440:53;;;8489:1;8486;8479:12;8440:53;8512:29;8531:9;8512:29;:::i;:::-;8502:39;;8560:38;8594:2;8583:9;8579:18;8560:38;:::i;:::-;8550:48;;8645:2;8634:9;8630:18;8617:32;8607:42;;8700:2;8689:9;8685:18;8672:32;-1:-1:-1;;;;;8719:6:1;8716:30;8713:50;;;8759:1;8756;8749:12;8713:50;8782:22;;8835:4;8827:13;;8823:27;-1:-1:-1;8813:55:1;;8864:1;8861;8854:12;8813:55;8887:74;8953:7;8948:2;8935:16;8930:2;8926;8922:11;8887:74;:::i;:::-;8877:84;;;8300:667;;;;;;;:::o;8972:260::-;9040:6;9048;9101:2;9089:9;9080:7;9076:23;9072:32;9069:52;;;9117:1;9114;9107:12;9069:52;9140:29;9159:9;9140:29;:::i;:::-;9130:39;;9188:38;9222:2;9211:9;9207:18;9188:38;:::i;:::-;9178:48;;8972:260;;;;;:::o;9237:380::-;9316:1;9312:12;;;;9359;;;9380:61;;9434:4;9426:6;9422:17;9412:27;;9380:61;9487:2;9479:6;9476:14;9456:18;9453:38;9450:161;;9533:10;9528:3;9524:20;9521:1;9514:31;9568:4;9565:1;9558:15;9596:4;9593:1;9586:15;9450:161;;9237:380;;;:::o;9622:127::-;9683:10;9678:3;9674:20;9671:1;9664:31;9714:4;9711:1;9704:15;9738:4;9735:1;9728:15;10320:184;10390:6;10443:2;10431:9;10422:7;10418:23;10414:32;10411:52;;;10459:1;10456;10449:12;10411:52;-1:-1:-1;10482:16:1;;10320:184;-1:-1:-1;10320:184:1:o;10788:245::-;10855:6;10908:2;10896:9;10887:7;10883:23;10879:32;10876:52;;;10924:1;10921;10914:12;10876:52;10956:9;10950:16;10975:28;10997:5;10975:28;:::i;11743:127::-;11804:10;11799:3;11795:20;11792:1;11785:31;11835:4;11832:1;11825:15;11859:4;11856:1;11849:15;11875:168;11915:7;11981:1;11977;11973:6;11969:14;11966:1;11963:21;11958:1;11951:9;11944:17;11940:45;11937:71;;;11988:18;;:::i;:::-;-1:-1:-1;12028:9:1;;11875:168::o;12404:127::-;12465:10;12460:3;12456:20;12453:1;12446:31;12496:4;12493:1;12486:15;12520:4;12517:1;12510:15;12662:545;12764:2;12759:3;12756:11;12753:448;;;12800:1;12825:5;12821:2;12814:17;12870:4;12866:2;12856:19;12940:2;12928:10;12924:19;12921:1;12917:27;12911:4;12907:38;12976:4;12964:10;12961:20;12958:47;;;-1:-1:-1;12999:4:1;12958:47;13054:2;13049:3;13045:12;13042:1;13038:20;13032:4;13028:31;13018:41;;13109:82;13127:2;13120:5;13117:13;13109:82;;;13172:17;;;13153:1;13142:13;13109:82;;;13113:3;;;12662:545;;;:::o;13383:1352::-;13509:3;13503:10;-1:-1:-1;;;;;13528:6:1;13525:30;13522:56;;;13558:18;;:::i;:::-;13587:97;13677:6;13637:38;13669:4;13663:11;13637:38;:::i;:::-;13631:4;13587:97;:::i;:::-;13739:4;;13803:2;13792:14;;13820:1;13815:663;;;;14522:1;14539:6;14536:89;;;-1:-1:-1;14591:19:1;;;14585:26;14536:89;-1:-1:-1;;13340:1:1;13336:11;;;13332:24;13328:29;13318:40;13364:1;13360:11;;;13315:57;14638:81;;13785:944;;13815:663;12609:1;12602:14;;;12646:4;12633:18;;-1:-1:-1;;13851:20:1;;;13969:236;13983:7;13980:1;13977:14;13969:236;;;14072:19;;;14066:26;14051:42;;14164:27;;;;14132:1;14120:14;;;;13999:19;;13969:236;;;13973:3;14233:6;14224:7;14221:19;14218:201;;;14294:19;;;14288:26;-1:-1:-1;;14377:1:1;14373:14;;;14389:3;14369:24;14365:37;14361:42;14346:58;14331:74;;14218:201;-1:-1:-1;;;;;14465:1:1;14449:14;;;14445:22;14432:36;;-1:-1:-1;13383:1352:1:o;15097:128::-;15137:3;15168:1;15164:6;15161:1;15158:13;15155:39;;;15174:18;;:::i;:::-;-1:-1:-1;15210:9:1;;15097:128::o;15579:125::-;15619:4;15647:1;15644;15641:8;15638:34;;;15652:18;;:::i;:::-;-1:-1:-1;15689:9:1;;15579:125::o;15709:135::-;15748:3;15769:17;;;15766:43;;15789:18;;:::i;:::-;-1:-1:-1;15836:1:1;15825:13;;15709:135::o;15849:127::-;15910:10;15905:3;15901:20;15898:1;15891:31;15941:4;15938:1;15931:15;15965:4;15962:1;15955:15;15981:120;16021:1;16047;16037:35;;16052:18;;:::i;:::-;-1:-1:-1;16086:9:1;;15981:120::o;17428:470::-;17607:3;17645:6;17639:13;17661:53;17707:6;17702:3;17695:4;17687:6;17683:17;17661:53;:::i;:::-;17777:13;;17736:16;;;;17799:57;17777:13;17736:16;17833:4;17821:17;;17799:57;:::i;:::-;17872:20;;17428:470;-1:-1:-1;;;;17428:470:1:o;17903:983::-;18132:3;18161:1;18194:6;18188:13;18224:36;18250:9;18224:36;:::i;:::-;18279:1;18296:18;;;18323:133;;;;18470:1;18465:356;;;;18289:532;;18323:133;-1:-1:-1;;18356:24:1;;18344:37;;18429:14;;18422:22;18410:35;;18401:45;;;-1:-1:-1;18323:133:1;;18465:356;18496:6;18493:1;18486:17;18526:4;18571:2;18568:1;18558:16;18596:1;18610:165;18624:6;18621:1;18618:13;18610:165;;;18702:14;;18689:11;;;18682:35;18745:16;;;;18639:10;;18610:165;;;18614:3;;;18804:6;18799:3;18795:16;18788:23;;18289:532;-1:-1:-1;;;;;18830:23:1;;-1:-1:-1;;18878:1:1;18869:11;;17903:983;-1:-1:-1;;;17903:983:1:o;20014:489::-;-1:-1:-1;;;;;20283:15:1;;;20265:34;;20335:15;;20330:2;20315:18;;20308:43;20382:2;20367:18;;20360:34;;;20430:3;20425:2;20410:18;;20403:31;;;20208:4;;20451:46;;20477:19;;20469:6;20451:46;:::i;:::-;20443:54;20014:489;-1:-1:-1;;;;;;20014:489:1:o;20508:249::-;20577:6;20630:2;20618:9;20609:7;20605:23;20601:32;20598:52;;;20646:1;20643;20636:12;20598:52;20678:9;20672:16;20697:30;20721:5;20697:30;:::i;20762:112::-;20794:1;20820;20810:35;;20825:18;;:::i;:::-;-1:-1:-1;20859:9:1;;20762:112::o

Swarm Source

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