ETH Price: $3,448.51 (+1.47%)

Token

Elev8 NFT (ELEV8)
 

Overview

Max Total Supply

888 ELEV8

Holders

262

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ELEV8
0x974f2bfa4df68a3acde38e1b28b8804a865f01a1
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:
Elev8

Compiler Version
v0.8.13+commit.abaa5c0e

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-13
*/

// 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/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/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/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/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/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: [email protected]/contracts/IERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

// File: [email protected]/contracts/ERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // 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_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * 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) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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) if(!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 virtual 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 virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract()) if(!_checkContractOnERC721Received(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 _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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 {
        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 > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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) 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 > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // 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 storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @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 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * 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`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    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.
     * And also called after one token has been burned.
     *
     * 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` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// 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: contracts/Elev8.sol



pragma solidity 0.8.13;








contract Elev8 is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    uint256 public constant GENESIS_SUPPLY = 888;
    uint256 public constant MAX_PER_PUBLIC_GENESIS_TX = 5;
    uint256 public constant MAX_PER_GENESIS_ADDRESS = 2;
    uint256 public constant MAX_PER_PUBLIC_MINT_TX = 10;
    uint256 public constant RESERVE_QTY = 18;

    uint256 public publicSalePrice = 0.04 ether;
    uint256 public maxSupply = 8888;

    uint256 public genesisMintCount;
    uint256 public balanceAfterTeamPayments;

    bytes32 public genesisMerkleRoot;

    bool public genesisMintActive;
    bool public genesisPublicMintActive;
    bool public publicMintActive;

    bool public genesisMintsRevealed;
    bool public publicMintsRevealed;

    mapping(address => uint256) public genesisMintCounts;

    string private _baseUri;
    string private _contractURI;
    address[2] private _admins;

    address private constant _PROJECT =
        0x15B31F13D09420c0ADCB3A9AF7be29d6AdCF31BA;
    address private constant _PICO = 
        0x86190c50d1dD3Eeb2Ab1dbb8E7195F2195AF321f;

    bool private _adminsSet = false;
    uint256 private _qtyReserved = 0;

    event GenesisMintStateChanged(address indexed caller, bool indexed active);
    event GenesisPublicMintStateChanged(address indexed caller, bool indexed active);
    event PublicMintStateChanged(address indexed caller, bool indexed active);
    event PublicSalePriceChanged(address indexed caller, uint256 indexed newPrice);
    event MaxSupplyChanged(address indexed caller, uint256 newValue);
    event TeamMemberPayment(
        address indexed recipient,
        uint256 totalSold,
        uint256 baseAmount,
        uint256 paymentAmount
    );

    modifier canActivate(bool active) {
        if (active) {
            require(
                bytes(_baseUri).length > 0,
                "Metadata url has not been set"
            );
        }
        _;
    }

    modifier onlyOwnerOrAdmin() {
        require(
            _msgSender() == owner() ||
                (_adminsSet &&
                    (_msgSender() == _admins[0] || _msgSender() == _admins[1])),
            "Not owner or admin"
        );
        _;
    }

    modifier validProof(bytes32[] calldata merkleProof) {
        require(
            MerkleProof.verify(
                merkleProof, 
                genesisMerkleRoot, 
                keccak256(abi.encodePacked(_msgSender()))
            ), 
            "Invalid proof"
        );
        _;
    }

    constructor(string memory name, string memory symbol)
        ERC721A(name, symbol)
    {
        require(
            bytes(name).length > 0 && bytes(symbol).length > 0,
            "Name and Symbol"
        );
    }

    function genesisMint(uint256 qty, bytes32[] calldata merkleProof) external nonReentrant validProof(merkleProof) {
        require(genesisMintActive, "Genesis minting inactive");
        require(
            genesisMintCount + qty + RESERVE_QTY <= GENESIS_SUPPLY,
            "Exceeds available supply"
        );
        require(genesisMintCounts[_msgSender()] + qty <= MAX_PER_GENESIS_ADDRESS, "Exceeds address quantity limit");

        genesisMintCount += qty;
        genesisMintCounts[_msgSender()] += qty;

        _internalMint(_msgSender(), qty);
    }

    function genesisPublicMint(uint256 qty) external nonReentrant {
        require(
            genesisPublicMintActive, 
            "Genesis public minting inactive"
        );
        require(
            genesisMintCount + qty + RESERVE_QTY <= GENESIS_SUPPLY,
            "Exceeds available supply"
        );
        require(qty <= MAX_PER_PUBLIC_GENESIS_TX, "Exceeds tx quantity limit");

        genesisMintCount += qty;
        _internalMint(_msgSender(), qty);
    }

    function mint(uint256 qty) external payable nonReentrant {
        require(publicMintActive, "Public minting inactive");
        require(msg.value == (publicSalePrice * qty), "Incorrect payment amount");
        require(qty <= MAX_PER_PUBLIC_MINT_TX, "Exceeds tx quantity limit");

        _internalMint(_msgSender(), qty);
    }

    function distributeFromReserve(uint256 qty, address recipient)
        external
        nonReentrant
        onlyOwner
    {
        require(_qtyReserved + qty <= RESERVE_QTY, "Exceeds reserve quantity");

        _qtyReserved += qty;
        _internalMint(recipient, qty);
    }

    function payTeam() external onlyOwnerOrAdmin nonReentrant {
        require(
            address(this).balance > balanceAfterTeamPayments,
            "No payable balance"
        );
        uint256 payableBalance = address(this).balance -
            balanceAfterTeamPayments;

        uint256 paymentAmount = (payableBalance * 10) / 100; // 10%

        // Keep track of the balance after each time the team is paid so we don't pay the team
        // on amounts they've already been paid from
        balanceAfterTeamPayments += (payableBalance - paymentAmount);

        require(payable(_PICO).send(paymentAmount), "Team payment failed");

        emit TeamMemberPayment(
            _PICO,
            totalSupply() - _qtyReserved - genesisMintCount, // This is the non-free mint qty
            payableBalance,
            paymentAmount
        );
    }

    function withdrawToProjectAccount(uint256 amount)
        external
        onlyOwner
        nonReentrant
    {
        require(amount > 0, "Amount cannot be zero");
        require(
            balanceAfterTeamPayments >= amount,
            "Exceeds withdrawable amount"
        );

        balanceAfterTeamPayments -= amount;
        require(payable(_PROJECT).send(amount), "Project withdraw failed");
    }

    function setBaseURI(string calldata baseURI) external onlyOwnerOrAdmin {
        require(bytes(baseURI).length > 0, "baseURI is required");
        _baseUri = baseURI;
    }

    function setAdmins(address[2] calldata adminAddresses) external onlyOwner {
        require(
            adminAddresses[0] != address(0) && adminAddresses[1] != address(0),
            "Invalid address"
        );

        _admins = adminAddresses;
        _adminsSet = true;
    }

    function setGenesisSaleActive(bool active)
        external
        onlyOwnerOrAdmin
        canActivate(active)
    {
        genesisMintActive = active;
        emit GenesisMintStateChanged(_msgSender(), active);
    }

     function setGenesisPublicSaleActive(bool active)
        external
        onlyOwnerOrAdmin
        canActivate(active)
    {
        genesisPublicMintActive = active;
        emit GenesisPublicMintStateChanged(_msgSender(), active);
    }

    function setPublicSaleActive(bool active)
        external
        onlyOwnerOrAdmin
        canActivate(active)
    {
        publicMintActive = active;
        emit GenesisMintStateChanged(_msgSender(), active);
    }

    function setPublicSalePrice(uint256 newPrice) external onlyOwnerOrAdmin {
        // The public sale price cannot be increased after the first public
        // mint, but it can be decreased. Any changes will be communicated beforehand
        require(newPrice <= publicSalePrice || totalSupply() <= GENESIS_SUPPLY, "Cannot increase price");
        publicSalePrice = newPrice;
        emit PublicSalePriceChanged(_msgSender(), newPrice);
    }

    function setMaxSupply(uint256 newValue) external onlyOwnerOrAdmin {
        require(newValue < maxSupply, "Cannot increase supply");
        require(newValue >= totalSupply(), "Total minted exceeds new value");
        maxSupply = newValue;
        emit MaxSupplyChanged(_msgSender(), newValue);
    }

    function setGenesisMerkleRoot(bytes32 merkleRoot) external onlyOwnerOrAdmin {
        genesisMerkleRoot = merkleRoot;
    }

    function revealGenesisMints() external onlyOwnerOrAdmin {
        genesisMintsRevealed = true;
    }

    function revealPublicMints() external onlyOwnerOrAdmin {
        publicMintsRevealed = true;
    }

    /// @dev Returns the tokenIds of the address. O(totalSupply) in complexity.
    /// Inspired by https://github.com/chiru-labs/ERC721A/issues/115#issue-1140835245
    /// Modified to bail out of the loop once we've found the expected number of tokens
    function tokensOfOwner(address owner)
        external
        view
        returns (uint256[] memory)
    {
        unchecked {
            uint256 ownerBalance = balanceOf(owner);
            uint256[] memory a = new uint256[](ownerBalance);
            uint256 end = _currentIndex;
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            for (uint256 i; i < end; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    a[tokenIdsIdx++] = i;
                }
                // No need to continue if we've already collected the expected number
                // of token ids for this owner, so let's bail
                if (tokenIdsIdx == ownerBalance) {
                    break;
                }
            }
            return a;
        }
    }

    function burn(uint256 tokenId) public {
        require(_ownerships[tokenId].addr == _msgSender(), "Not owner");
        _burn(tokenId);
    }

    function setContractURI(string memory newUri) public onlyOwner {
        _contractURI = newUri;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(tokenId), "Nonexistent tokenId");
        return
            string(
                abi.encodePacked(_baseUri, "/", tokenId.toString())
            );
    }

    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

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

    /// @notice By default, ERC721A starts minting from 0, which is undesirable in our case, so we'll
    /// override that to start from 1
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function _internalMint(address recipient, uint256 qty) private {
        require(qty > 0, "Quantity cannot be zero");
        require(
            (totalSupply() + qty + (RESERVE_QTY - _qtyReserved)) <= maxSupply,
            "Exceeds total supply"
        );
        _safeMint(recipient, qty);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"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":"OwnerQueryForNonexistentToken","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":"caller","type":"address"},{"indexed":true,"internalType":"bool","name":"active","type":"bool"}],"name":"GenesisMintStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"bool","name":"active","type":"bool"}],"name":"GenesisPublicMintStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"MaxSupplyChanged","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":"caller","type":"address"},{"indexed":true,"internalType":"bool","name":"active","type":"bool"}],"name":"PublicMintStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PublicSalePriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"baseAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paymentAmount","type":"uint256"}],"name":"TeamMemberPayment","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":[],"name":"GENESIS_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_GENESIS_ADDRESS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_PUBLIC_GENESIS_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_PUBLIC_MINT_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_QTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceAfterTeamPayments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"distributeFromReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"genesisMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"genesisMintCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisMintsRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"genesisPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisPublicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintsRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealGenesisMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealPublicMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[2]","name":"adminAddresses","type":"address[2]"}],"name":"setAdmins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setGenesisMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setGenesisPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setGenesisSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToProjectAccount","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052668e1bc9bf040000600a556122b8600b556015805460ff1916905560006016553480156200003157600080fd5b5060405162003824380380620038248339810160408190526200005491620002bd565b8151829082906200006d9060029060208501906200014a565b508051620000839060039060208401906200014a565b50506001600055506200009633620000f8565b6001600955815115801590620000ad575060008151115b620000f05760405162461bcd60e51b815260206004820152600f60248201526e13985b5948185b990814de5b589bdb608a1b604482015260640160405180910390fd5b505062000363565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001589062000327565b90600052602060002090601f0160209004810192826200017c5760008555620001c7565b82601f106200019757805160ff1916838001178555620001c7565b82800160010185558215620001c7579182015b82811115620001c7578251825591602001919060010190620001aa565b50620001d5929150620001d9565b5090565b5b80821115620001d55760008155600101620001da565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200021857600080fd5b81516001600160401b0380821115620002355762000235620001f0565b604051601f8301601f19908116603f01168101908282118183101715620002605762000260620001f0565b816040528381526020925086838588010111156200027d57600080fd5b600091505b83821015620002a1578582018301518183018401529082019062000282565b83821115620002b35760008385830101525b9695505050505050565b60008060408385031215620002d157600080fd5b82516001600160401b0380821115620002e957600080fd5b620002f78683870162000206565b935060208501519150808211156200030e57600080fd5b506200031d8582860162000206565b9150509250929050565b600181811c908216806200033c57607f821691505b6020821081036200035d57634e487b7160e01b600052602260045260246000fd5b50919050565b6134b180620003736000396000f3fe60806040526004361061031a5760003560e01c80638da5cb5b116101ab578063bfa25026116100f7578063e2e06fa311610095578063eb50411e1161006f578063eb50411e1461090e578063f2fde38b1461092e578063f3fdf3751461094e578063f77e58ae1461096357600080fd5b8063e2e06fa314610890578063e8a3d485146108b0578063e985e9c5146108c557600080fd5b8063ccadd472116100d1578063ccadd47214610818578063d5abeb011461083a578063d642aad114610850578063dc6de2b21461087057600080fd5b8063bfa25026146107c2578063c87b56dd146107e3578063c9a1cb991461080357600080fd5b80639ba9116311610164578063a22cb4651161013e578063a22cb4651461074d578063ac78dc161461076d578063b67c25a314610782578063b88d4fde146107a257600080fd5b80639ba91163146107005780639fbebe811461071a578063a0712d681461073a57600080fd5b80638da5cb5b14610661578063938e3d7b1461067f57806394bc7a941461069f57806395d89b41146106bf57806399ec6765146106d45780639b6860c8146106ea57600080fd5b80635bc6b4011161026a57806370a0823111610223578063791a2519116101fd578063791a2519146105df5780638383f9cd146105ff5780638462151c1461061f5780638bdd1b951461064c57600080fd5b806370a0823114610595578063715018a6146105b5578063783a1d5a146105ca57600080fd5b80635bc6b401146104dc5780636352211e146104f2578063662111ae146105125780636f8b44b0146105285780636fac2b1514610548578063704a68d61461057557600080fd5b806321f3b038116102d75780633b50dcec116102b15780633b50dcec1461046757806342842e0e1461047c57806342966c681461049c57806355f804b3146104bc57600080fd5b806321f3b0381461041357806323b872dd146104285780632a49675e1461044857600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780630a6f94fc146103d057806318160ddd146103f0575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612cfe565b610979565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b5061036961098a565b60405161034b9190612d73565b34801561038257600080fd5b50610396610391366004612d86565b610a1c565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c9366004612dbb565b610a60565b005b3480156103dc57600080fd5b506103ce6103eb366004612de5565b610ae6565b3480156103fc57600080fd5b50610405610b8e565b60405190815260200161034b565b34801561041f57600080fd5b50610405600a81565b34801561043457600080fd5b506103ce610443366004612e0d565b610b9c565b34801561045457600080fd5b50600f5461033f90610100900460ff1681565b34801561047357600080fd5b50610405600581565b34801561048857600080fd5b506103ce610497366004612e0d565b610ba7565b3480156104a857600080fd5b506103ce6104b7366004612d86565b610bc2565b3480156104c857600080fd5b506103ce6104d7366004612e49565b610c20565b3480156104e857600080fd5b50610405600c5481565b3480156104fe57600080fd5b5061039661050d366004612d86565b610ce1565b34801561051e57600080fd5b50610405600e5481565b34801561053457600080fd5b506103ce610543366004612d86565b610cf3565b34801561055457600080fd5b50610405610563366004612eba565b60106020526000908152604090205481565b34801561058157600080fd5b506103ce610590366004612ee5565b610e43565b3480156105a157600080fd5b506104056105b0366004612eba565b610f36565b3480156105c157600080fd5b506103ce610f84565b3480156105d657600080fd5b506103ce610f98565b3480156105eb57600080fd5b506103ce6105fa366004612d86565b611021565b34801561060b57600080fd5b506103ce61061a366004612f00565b611126565b34801561062b57600080fd5b5061063f61063a366004612eba565b611379565b60405161034b9190612f7e565b34801561065857600080fd5b50610405600281565b34801561066d57600080fd5b506008546001600160a01b0316610396565b34801561068b57600080fd5b506103ce61069a36600461304d565b6114b4565b3480156106ab57600080fd5b506103ce6106ba366004613095565b6114d3565b3480156106cb57600080fd5b5061036961158b565b3480156106e057600080fd5b5061040561037881565b3480156106f657600080fd5b50610405600a5481565b34801561070c57600080fd5b50600f5461033f9060ff1681565b34801561072657600080fd5b506103ce610735366004612d86565b61159a565b6103ce610748366004612d86565b611611565b34801561075957600080fd5b506103ce6107683660046130c1565b61174c565b34801561077957600080fd5b506103ce6117e1565b34801561078e57600080fd5b50600f5461033f9062010000900460ff1681565b3480156107ae57600080fd5b506103ce6107bd3660046130eb565b611a07565b3480156107ce57600080fd5b50600f5461033f906301000000900460ff1681565b3480156107ef57600080fd5b506103696107fe366004612d86565b611a51565b34801561080f57600080fd5b506103ce611ad0565b34801561082457600080fd5b50600f5461033f90640100000000900460ff1681565b34801561084657600080fd5b50610405600b5481565b34801561085c57600080fd5b506103ce61086b366004612ee5565b611b57565b34801561087c57600080fd5b506103ce61088b366004612d86565b611c46565b34801561089c57600080fd5b506103ce6108ab366004612ee5565b611d9f565b3480156108bc57600080fd5b50610369611e67565b3480156108d157600080fd5b5061033f6108e0366004613166565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561091a57600080fd5b506103ce610929366004612d86565b611e76565b34801561093a57600080fd5b506103ce610949366004612eba565b611fc8565b34801561095a57600080fd5b50610405601281565b34801561096f57600080fd5b50610405600d5481565b60006109848261203e565b92915050565b60606002805461099990613190565b80601f01602080910402602001604051908101604052809291908181526020018280546109c590613190565b8015610a125780601f106109e757610100808354040283529160200191610a12565b820191906000526020600020905b8154815290600101906020018083116109f557829003601f168201915b5050505050905090565b6000610a278261208e565b610a44576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a6b82610ce1565b9050806001600160a01b0316836001600160a01b031603610a9f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610ad657610ab981336108e0565b610ad6576040516367d9dca160e11b815260040160405180910390fd5b610ae18383836120c7565b505050565b610aee612123565b6000610afd6020830183612eba565b6001600160a01b031614158015610b2d57506000610b216040830160208401612eba565b6001600160a01b031614155b610b705760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b610b7d6013826002612b95565b50506015805460ff19166001179055565b600154600054036000190190565b610ae183838361217d565b610ae183838360405180602001604052806000815250611a07565b6000818152600460205260409020546001600160a01b03163314610c145760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b6044820152606401610b67565b610c1d81612358565b50565b6008546001600160a01b0316331480610c76575060155460ff168015610c7657506013546001600160a01b0316336001600160a01b03161480610c7657506014546001600160a01b0316336001600160a01b0316145b610c925760405162461bcd60e51b8152600401610b67906131da565b80610cd55760405162461bcd60e51b815260206004820152601360248201527218985cd9555492481a5cc81c995c5d5a5c9959606a1b6044820152606401610b67565b610ae160118383612beb565b6000610cec82612363565b5192915050565b6008546001600160a01b0316331480610d49575060155460ff168015610d4957506013546001600160a01b0316336001600160a01b03161480610d4957506014546001600160a01b0316336001600160a01b0316145b610d655760405162461bcd60e51b8152600401610b67906131da565b600b548110610daf5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f7420696e63726561736520737570706c7960501b6044820152606401610b67565b610db7610b8e565b811015610e065760405162461bcd60e51b815260206004820152601e60248201527f546f74616c206d696e7465642065786365656473206e65772076616c756500006044820152606401610b67565b600b81905560405181815233907f28c4702f31a5488ef1826a30b4d837dab0940e925b9f503fe0644b7f1bd2f20f9060200160405180910390a250565b6008546001600160a01b0316331480610e99575060155460ff168015610e9957506013546001600160a01b0316336001600160a01b03161480610e9957506014546001600160a01b0316336001600160a01b0316145b610eb55760405162461bcd60e51b8152600401610b67906131da565b808015610eea57600060118054610ecb90613190565b905011610eea5760405162461bcd60e51b8152600401610b6790613206565b600f805460ff1916831515908117909155335b6001600160a01b03167f161a054f8f5c1c1b5e74c919c625095dfa0ac7d9c2fbbea163c6fc4b30f4121860405160405180910390a35050565b60006001600160a01b038216610f5f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610f8c612123565b610f966000612485565b565b6008546001600160a01b0316331480610fee575060155460ff168015610fee57506013546001600160a01b0316336001600160a01b03161480610fee57506014546001600160a01b0316336001600160a01b0316145b61100a5760405162461bcd60e51b8152600401610b67906131da565b600f805464ff000000001916640100000000179055565b6008546001600160a01b0316331480611077575060155460ff16801561107757506013546001600160a01b0316336001600160a01b0316148061107757506014546001600160a01b0316336001600160a01b0316145b6110935760405162461bcd60e51b8152600401610b67906131da565b600a54811115806110ad57506103786110aa610b8e565b11155b6110f15760405162461bcd60e51b815260206004820152601560248201527443616e6e6f7420696e63726561736520707269636560581b6044820152606401610b67565b600a819055604051819033907f7e551f7241740ef6751c2f6bc2ba929ee4a88127156bad09dfc6474d4c41006090600090a350565b6002600954036111485760405162461bcd60e51b8152600401610b679061323d565b600260098190555081816111c782828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050604051602081830303815290604052805190602001206124d7565b6112035760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610b67565b600f5460ff166112555760405162461bcd60e51b815260206004820152601860248201527f47656e65736973206d696e74696e6720696e61637469766500000000000000006044820152606401610b67565b610378601286600c54611268919061328a565b611272919061328a565b11156112bb5760405162461bcd60e51b81526020600482015260186024820152774578636565647320617661696c61626c6520737570706c7960401b6044820152606401610b67565b336000908152601060205260409020546002906112d990879061328a565b11156113275760405162461bcd60e51b815260206004820152601e60248201527f457863656564732061646472657373207175616e74697479206c696d697400006044820152606401610b67565b84600c6000828254611339919061328a565b9091555050336000908152601060205260408120805487929061135d90849061328a565b9091555061136d905033866124ed565b50506001600955505050565b6060600061138683610f36565b90506000816001600160401b038111156113a2576113a2612fc2565b6040519080825280602002602001820160405280156113cb578160200160208202803683370190505b506000805491925080805b838110156114a857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529061143d57506114a0565b80516001600160a01b03161561145257805192505b886001600160a01b0316836001600160a01b0316036114915781868580600101965081518110611484576114846131c4565b6020026020010181815250505b86840361149e57506114a8565b505b6001016113d6565b50929695505050505050565b6114bc612123565b80516114cf906012906020840190612c5f565b5050565b6002600954036114f55760405162461bcd60e51b8152600401610b679061323d565b6002600955611502612123565b601282601654611512919061328a565b11156115605760405162461bcd60e51b815260206004820152601860248201527f457863656564732072657365727665207175616e7469747900000000000000006044820152606401610b67565b8160166000828254611572919061328a565b90915550611582905081836124ed565b50506001600955565b60606003805461099990613190565b6008546001600160a01b03163314806115f0575060155460ff1680156115f057506013546001600160a01b0316336001600160a01b031614806115f057506014546001600160a01b0316336001600160a01b0316145b61160c5760405162461bcd60e51b8152600401610b67906131da565b600e55565b6002600954036116335760405162461bcd60e51b8152600401610b679061323d565b6002600955600f5462010000900460ff166116905760405162461bcd60e51b815260206004820152601760248201527f5075626c6963206d696e74696e6720696e6163746976650000000000000000006044820152606401610b67565b80600a5461169e91906132a2565b34146116ec5760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374207061796d656e7420616d6f756e7400000000000000006044820152606401610b67565b600a8111156117395760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81d1e081c5d585b9d1a5d1e481b1a5b5a5d603a1b6044820152606401610b67565b611744335b826124ed565b506001600955565b336001600160a01b038316036117755760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331480611837575060155460ff16801561183757506013546001600160a01b0316336001600160a01b0316148061183757506014546001600160a01b0316336001600160a01b0316145b6118535760405162461bcd60e51b8152600401610b67906131da565b6002600954036118755760405162461bcd60e51b8152600401610b679061323d565b6002600955600d5447116118c05760405162461bcd60e51b81526020600482015260126024820152714e6f2070617961626c652062616c616e636560701b6044820152606401610b67565b6000600d54476118d091906132c1565b9050600060646118e183600a6132a2565b6118eb91906132ee565b90506118f781836132c1565b600d6000828254611908919061328a565b90915550506040517386190c50d1dd3eeb2ab1dbb8e7195f2195af321f9082156108fc029083906000818181858888f1935050505061197f5760405162461bcd60e51b81526020600482015260136024820152721519585b481c185e5b595b9d0819985a5b1959606a1b6044820152606401610b67565b7386190c50d1dd3eeb2ab1dbb8e7195f2195af321f6001600160a01b03167f977a6da50cd34049fc55b2cea88cab5c375867bba0044c08fe032978c16c4ea5600c546016546119cc610b8e565b6119d691906132c1565b6119e091906132c1565b6040805191825260208201869052810184905260600160405180910390a250506001600955565b611a1284848461217d565b6001600160a01b0383163b15611a4b57611a2e848484846125ba565b611a4b576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611a5c8261208e565b611a9e5760405162461bcd60e51b8152602060048201526013602482015272139bdb995e1a5cdd195b9d081d1bdad95b9259606a1b6044820152606401610b67565b6011611aa9836126a6565b604051602001611aba92919061331e565b6040516020818303038152906040529050919050565b6008546001600160a01b0316331480611b26575060155460ff168015611b2657506013546001600160a01b0316336001600160a01b03161480611b2657506014546001600160a01b0316336001600160a01b0316145b611b425760405162461bcd60e51b8152600401610b67906131da565b600f805463ff00000019166301000000179055565b6008546001600160a01b0316331480611bad575060155460ff168015611bad57506013546001600160a01b0316336001600160a01b03161480611bad57506014546001600160a01b0316336001600160a01b0316145b611bc95760405162461bcd60e51b8152600401610b67906131da565b808015611bfe57600060118054611bdf90613190565b905011611bfe5760405162461bcd60e51b8152600401610b6790613206565b600f805461ff0019166101008415159081029190911790915560405133907fa10f8d478ca08c91de8bca8ba2016b83b9eecf85aab98ca47cc970ab335f907990600090a35050565b611c4e612123565b600260095403611c705760405162461bcd60e51b8152600401610b679061323d565b600260095580611cba5760405162461bcd60e51b8152602060048201526015602482015274416d6f756e742063616e6e6f74206265207a65726f60581b6044820152606401610b67565b80600d541015611d0c5760405162461bcd60e51b815260206004820152601b60248201527f4578636565647320776974686472617761626c6520616d6f756e7400000000006044820152606401610b67565b80600d6000828254611d1e91906132c1565b90915550506040517315b31f13d09420c0adcb3a9af7be29d6adcf31ba9082156108fc029083906000818181858888f193505050506117445760405162461bcd60e51b815260206004820152601760248201527f50726f6a656374207769746864726177206661696c65640000000000000000006044820152606401610b67565b6008546001600160a01b0316331480611df5575060155460ff168015611df557506013546001600160a01b0316336001600160a01b03161480611df557506014546001600160a01b0316336001600160a01b0316145b611e115760405162461bcd60e51b8152600401610b67906131da565b808015611e4657600060118054611e2790613190565b905011611e465760405162461bcd60e51b8152600401610b6790613206565b600f805462ff00001916620100008415159081029190911790915533610efd565b60606012805461099990613190565b600260095403611e985760405162461bcd60e51b8152600401610b679061323d565b6002600955600f54610100900460ff16611ef45760405162461bcd60e51b815260206004820152601f60248201527f47656e65736973207075626c6963206d696e74696e6720696e616374697665006044820152606401610b67565b610378601282600c54611f07919061328a565b611f11919061328a565b1115611f5a5760405162461bcd60e51b81526020600482015260186024820152774578636565647320617661696c61626c6520737570706c7960401b6044820152606401610b67565b6005811115611fa75760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81d1e081c5d585b9d1a5d1e481b1a5b5a5d603a1b6044820152606401610b67565b80600c6000828254611fb9919061328a565b9091555061174490503361173e565b611fd0612123565b6001600160a01b0381166120355760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b67565b610c1d81612485565b60006001600160e01b031982166380ac58cd60e01b148061206f57506001600160e01b03198216635b5e139f60e01b145b8061098457506301ffc9a760e01b6001600160e01b0319831614610984565b6000816001111580156120a2575060005482105b8015610984575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610f965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b67565b600061218882612363565b9050836001600160a01b031681600001516001600160a01b0316146121bf5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806121dd57506121dd85336108e0565b806121f85750336121ed84610a1c565b6001600160a01b0316145b90508061221857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661223f57604051633a954ecd60e21b815260040160405180910390fd5b61224b600084876120c7565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661231f57600054821461231f57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061345c83398151915260405160405180910390a45050505050565b610c1d8160006127a6565b6040805160608101825260008082526020820181905291810191909152818060011161246c5760005481101561246c57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061246a5780516001600160a01b031615612401579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612465579392505050565b612401565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826124e48584612959565b14949350505050565b6000811161253d5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610b67565b600b5460165461254e9060126132c1565b82612557610b8e565b612561919061328a565b61256b919061328a565b11156125b05760405162461bcd60e51b81526020600482015260146024820152734578636565647320746f74616c20737570706c7960601b6044820152606401610b67565b6114cf82826129a6565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906125ef9033908990889088906004016133d4565b6020604051808303816000875af192505050801561262a575060408051601f3d908101601f1916820190925261262791810190613411565b60015b612688573d808015612658576040519150601f19603f3d011682016040523d82523d6000602084013e61265d565b606091505b508051600003612680576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036126cd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126f757806126e18161342e565b91506126f09050600a836132ee565b91506126d1565b6000816001600160401b0381111561271157612711612fc2565b6040519080825280601f01601f19166020018201604052801561273b576020820181803683370190505b5090505b841561269e576127506001836132c1565b915061275d600a86613447565b61276890603061328a565b60f81b81838151811061277d5761277d6131c4565b60200101906001600160f81b031916908160001a90535061279f600a866132ee565b945061273f565b60006127b183612363565b80519091508215612817576000336001600160a01b03831614806127da57506127da82336108e0565b806127f55750336127ea86610a1c565b6001600160a01b0316145b90508061281557604051632ce44b5f60e11b815260040160405180910390fd5b505b612823600085836120c7565b6001600160a01b0380821660008181526005602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526004909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661292157600054821461292157805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b0384169060008051602061345c833981519152908390a4505060018054810190555050565b600081815b845181101561299e5761298a8286838151811061297d5761297d6131c4565b60200260200101516129c0565b9150806129968161342e565b91505061295e565b509392505050565b6114cf8282604051806020016040528060008152506129f2565b60008183106129dc5760008281526020849052604090206129eb565b60008381526020839052604090205b9392505050565b6000546001600160a01b038416612a1b57604051622e076360e81b815260040160405180910390fd5b82600003612a3c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612b52575b60405182906001600160a01b0388169060009060008051602061345c833981519152908290a4612b1b60008784806001019550876125ba565b612b38576040516368d2bf6b60e11b815260040160405180910390fd5b808210612ae2578260005414612b4d57600080fd5b612b85565b5b6040516001830192906001600160a01b0388169060009060008051602061345c833981519152908290a4808210612b53575b506000908155611a4b9085838684565b8260028101928215612bdb579160200282015b82811115612bdb5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612ba8565b50612be7929150612cd3565b5090565b828054612bf790613190565b90600052602060002090601f016020900481019282612c195760008555612bdb565b82601f10612c325782800160ff19823516178555612bdb565b82800160010185558215612bdb579182015b82811115612bdb578235825591602001919060010190612c44565b828054612c6b90613190565b90600052602060002090601f016020900481019282612c8d5760008555612bdb565b82601f10612ca657805160ff1916838001178555612bdb565b82800160010185558215612bdb579182015b82811115612bdb578251825591602001919060010190612cb8565b5b80821115612be75760008155600101612cd4565b6001600160e01b031981168114610c1d57600080fd5b600060208284031215612d1057600080fd5b81356129eb81612ce8565b60005b83811015612d36578181015183820152602001612d1e565b83811115611a4b5750506000910152565b60008151808452612d5f816020860160208601612d1b565b601f01601f19169290920160200192915050565b6020815260006129eb6020830184612d47565b600060208284031215612d9857600080fd5b5035919050565b80356001600160a01b0381168114612db657600080fd5b919050565b60008060408385031215612dce57600080fd5b612dd783612d9f565b946020939093013593505050565b600060408284031215612df757600080fd5b82604083011115612e0757600080fd5b50919050565b600080600060608486031215612e2257600080fd5b612e2b84612d9f565b9250612e3960208501612d9f565b9150604084013590509250925092565b60008060208385031215612e5c57600080fd5b82356001600160401b0380821115612e7357600080fd5b818501915085601f830112612e8757600080fd5b813581811115612e9657600080fd5b866020828501011115612ea857600080fd5b60209290920196919550909350505050565b600060208284031215612ecc57600080fd5b6129eb82612d9f565b80358015158114612db657600080fd5b600060208284031215612ef757600080fd5b6129eb82612ed5565b600080600060408486031215612f1557600080fd5b8335925060208401356001600160401b0380821115612f3357600080fd5b818601915086601f830112612f4757600080fd5b813581811115612f5657600080fd5b8760208260051b8501011115612f6b57600080fd5b6020830194508093505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612fb657835183529284019291840191600101612f9a565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612ff257612ff2612fc2565b604051601f8501601f19908116603f0116810190828211818310171561301a5761301a612fc2565b8160405280935085815286868601111561303357600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561305f57600080fd5b81356001600160401b0381111561307557600080fd5b8201601f8101841361308657600080fd5b61269e84823560208401612fd8565b600080604083850312156130a857600080fd5b823591506130b860208401612d9f565b90509250929050565b600080604083850312156130d457600080fd5b6130dd83612d9f565b91506130b860208401612ed5565b6000806000806080858703121561310157600080fd5b61310a85612d9f565b935061311860208601612d9f565b92506040850135915060608501356001600160401b0381111561313a57600080fd5b8501601f8101871361314b57600080fd5b61315a87823560208401612fd8565b91505092959194509250565b6000806040838503121561317957600080fd5b61318283612d9f565b91506130b860208401612d9f565b600181811c908216806131a457607f821691505b602082108103612e0757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252601290820152712737ba1037bbb732b91037b91030b236b4b760711b604082015260600190565b6020808252601d908201527f4d657461646174612075726c20686173206e6f74206265656e20736574000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561329d5761329d613274565b500190565b60008160001904831182151516156132bc576132bc613274565b500290565b6000828210156132d3576132d3613274565b500390565b634e487b7160e01b600052601260045260246000fd5b6000826132fd576132fd6132d8565b500490565b60008151613314818560208601612d1b565b9290920192915050565b600080845481600182811c91508083168061333a57607f831692505b6020808410820361335957634e487b7160e01b86526022600452602486fd5b81801561336d576001811461337e576133ab565b60ff198616895284890196506133ab565b60008b81526020902060005b868110156133a35781548b82015290850190830161338a565b505084890196505b5050505050506133cb6133c582602f60f81b815260010190565b85613302565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061340790830184612d47565b9695505050505050565b60006020828403121561342357600080fd5b81516129eb81612ce8565b60006001820161344057613440613274565b5060010190565b600082613456576134566132d8565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ada9ced9459d59f04246682d1ab9c5bcb14dbaa61e5a0dc2ac769ca35a524a4c64736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000009456c657638204e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005454c455638000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061031a5760003560e01c80638da5cb5b116101ab578063bfa25026116100f7578063e2e06fa311610095578063eb50411e1161006f578063eb50411e1461090e578063f2fde38b1461092e578063f3fdf3751461094e578063f77e58ae1461096357600080fd5b8063e2e06fa314610890578063e8a3d485146108b0578063e985e9c5146108c557600080fd5b8063ccadd472116100d1578063ccadd47214610818578063d5abeb011461083a578063d642aad114610850578063dc6de2b21461087057600080fd5b8063bfa25026146107c2578063c87b56dd146107e3578063c9a1cb991461080357600080fd5b80639ba9116311610164578063a22cb4651161013e578063a22cb4651461074d578063ac78dc161461076d578063b67c25a314610782578063b88d4fde146107a257600080fd5b80639ba91163146107005780639fbebe811461071a578063a0712d681461073a57600080fd5b80638da5cb5b14610661578063938e3d7b1461067f57806394bc7a941461069f57806395d89b41146106bf57806399ec6765146106d45780639b6860c8146106ea57600080fd5b80635bc6b4011161026a57806370a0823111610223578063791a2519116101fd578063791a2519146105df5780638383f9cd146105ff5780638462151c1461061f5780638bdd1b951461064c57600080fd5b806370a0823114610595578063715018a6146105b5578063783a1d5a146105ca57600080fd5b80635bc6b401146104dc5780636352211e146104f2578063662111ae146105125780636f8b44b0146105285780636fac2b1514610548578063704a68d61461057557600080fd5b806321f3b038116102d75780633b50dcec116102b15780633b50dcec1461046757806342842e0e1461047c57806342966c681461049c57806355f804b3146104bc57600080fd5b806321f3b0381461041357806323b872dd146104285780632a49675e1461044857600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780630a6f94fc146103d057806318160ddd146103f0575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612cfe565b610979565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b5061036961098a565b60405161034b9190612d73565b34801561038257600080fd5b50610396610391366004612d86565b610a1c565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c9366004612dbb565b610a60565b005b3480156103dc57600080fd5b506103ce6103eb366004612de5565b610ae6565b3480156103fc57600080fd5b50610405610b8e565b60405190815260200161034b565b34801561041f57600080fd5b50610405600a81565b34801561043457600080fd5b506103ce610443366004612e0d565b610b9c565b34801561045457600080fd5b50600f5461033f90610100900460ff1681565b34801561047357600080fd5b50610405600581565b34801561048857600080fd5b506103ce610497366004612e0d565b610ba7565b3480156104a857600080fd5b506103ce6104b7366004612d86565b610bc2565b3480156104c857600080fd5b506103ce6104d7366004612e49565b610c20565b3480156104e857600080fd5b50610405600c5481565b3480156104fe57600080fd5b5061039661050d366004612d86565b610ce1565b34801561051e57600080fd5b50610405600e5481565b34801561053457600080fd5b506103ce610543366004612d86565b610cf3565b34801561055457600080fd5b50610405610563366004612eba565b60106020526000908152604090205481565b34801561058157600080fd5b506103ce610590366004612ee5565b610e43565b3480156105a157600080fd5b506104056105b0366004612eba565b610f36565b3480156105c157600080fd5b506103ce610f84565b3480156105d657600080fd5b506103ce610f98565b3480156105eb57600080fd5b506103ce6105fa366004612d86565b611021565b34801561060b57600080fd5b506103ce61061a366004612f00565b611126565b34801561062b57600080fd5b5061063f61063a366004612eba565b611379565b60405161034b9190612f7e565b34801561065857600080fd5b50610405600281565b34801561066d57600080fd5b506008546001600160a01b0316610396565b34801561068b57600080fd5b506103ce61069a36600461304d565b6114b4565b3480156106ab57600080fd5b506103ce6106ba366004613095565b6114d3565b3480156106cb57600080fd5b5061036961158b565b3480156106e057600080fd5b5061040561037881565b3480156106f657600080fd5b50610405600a5481565b34801561070c57600080fd5b50600f5461033f9060ff1681565b34801561072657600080fd5b506103ce610735366004612d86565b61159a565b6103ce610748366004612d86565b611611565b34801561075957600080fd5b506103ce6107683660046130c1565b61174c565b34801561077957600080fd5b506103ce6117e1565b34801561078e57600080fd5b50600f5461033f9062010000900460ff1681565b3480156107ae57600080fd5b506103ce6107bd3660046130eb565b611a07565b3480156107ce57600080fd5b50600f5461033f906301000000900460ff1681565b3480156107ef57600080fd5b506103696107fe366004612d86565b611a51565b34801561080f57600080fd5b506103ce611ad0565b34801561082457600080fd5b50600f5461033f90640100000000900460ff1681565b34801561084657600080fd5b50610405600b5481565b34801561085c57600080fd5b506103ce61086b366004612ee5565b611b57565b34801561087c57600080fd5b506103ce61088b366004612d86565b611c46565b34801561089c57600080fd5b506103ce6108ab366004612ee5565b611d9f565b3480156108bc57600080fd5b50610369611e67565b3480156108d157600080fd5b5061033f6108e0366004613166565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561091a57600080fd5b506103ce610929366004612d86565b611e76565b34801561093a57600080fd5b506103ce610949366004612eba565b611fc8565b34801561095a57600080fd5b50610405601281565b34801561096f57600080fd5b50610405600d5481565b60006109848261203e565b92915050565b60606002805461099990613190565b80601f01602080910402602001604051908101604052809291908181526020018280546109c590613190565b8015610a125780601f106109e757610100808354040283529160200191610a12565b820191906000526020600020905b8154815290600101906020018083116109f557829003601f168201915b5050505050905090565b6000610a278261208e565b610a44576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a6b82610ce1565b9050806001600160a01b0316836001600160a01b031603610a9f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610ad657610ab981336108e0565b610ad6576040516367d9dca160e11b815260040160405180910390fd5b610ae18383836120c7565b505050565b610aee612123565b6000610afd6020830183612eba565b6001600160a01b031614158015610b2d57506000610b216040830160208401612eba565b6001600160a01b031614155b610b705760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b610b7d6013826002612b95565b50506015805460ff19166001179055565b600154600054036000190190565b610ae183838361217d565b610ae183838360405180602001604052806000815250611a07565b6000818152600460205260409020546001600160a01b03163314610c145760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b6044820152606401610b67565b610c1d81612358565b50565b6008546001600160a01b0316331480610c76575060155460ff168015610c7657506013546001600160a01b0316336001600160a01b03161480610c7657506014546001600160a01b0316336001600160a01b0316145b610c925760405162461bcd60e51b8152600401610b67906131da565b80610cd55760405162461bcd60e51b815260206004820152601360248201527218985cd9555492481a5cc81c995c5d5a5c9959606a1b6044820152606401610b67565b610ae160118383612beb565b6000610cec82612363565b5192915050565b6008546001600160a01b0316331480610d49575060155460ff168015610d4957506013546001600160a01b0316336001600160a01b03161480610d4957506014546001600160a01b0316336001600160a01b0316145b610d655760405162461bcd60e51b8152600401610b67906131da565b600b548110610daf5760405162461bcd60e51b815260206004820152601660248201527543616e6e6f7420696e63726561736520737570706c7960501b6044820152606401610b67565b610db7610b8e565b811015610e065760405162461bcd60e51b815260206004820152601e60248201527f546f74616c206d696e7465642065786365656473206e65772076616c756500006044820152606401610b67565b600b81905560405181815233907f28c4702f31a5488ef1826a30b4d837dab0940e925b9f503fe0644b7f1bd2f20f9060200160405180910390a250565b6008546001600160a01b0316331480610e99575060155460ff168015610e9957506013546001600160a01b0316336001600160a01b03161480610e9957506014546001600160a01b0316336001600160a01b0316145b610eb55760405162461bcd60e51b8152600401610b67906131da565b808015610eea57600060118054610ecb90613190565b905011610eea5760405162461bcd60e51b8152600401610b6790613206565b600f805460ff1916831515908117909155335b6001600160a01b03167f161a054f8f5c1c1b5e74c919c625095dfa0ac7d9c2fbbea163c6fc4b30f4121860405160405180910390a35050565b60006001600160a01b038216610f5f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610f8c612123565b610f966000612485565b565b6008546001600160a01b0316331480610fee575060155460ff168015610fee57506013546001600160a01b0316336001600160a01b03161480610fee57506014546001600160a01b0316336001600160a01b0316145b61100a5760405162461bcd60e51b8152600401610b67906131da565b600f805464ff000000001916640100000000179055565b6008546001600160a01b0316331480611077575060155460ff16801561107757506013546001600160a01b0316336001600160a01b0316148061107757506014546001600160a01b0316336001600160a01b0316145b6110935760405162461bcd60e51b8152600401610b67906131da565b600a54811115806110ad57506103786110aa610b8e565b11155b6110f15760405162461bcd60e51b815260206004820152601560248201527443616e6e6f7420696e63726561736520707269636560581b6044820152606401610b67565b600a819055604051819033907f7e551f7241740ef6751c2f6bc2ba929ee4a88127156bad09dfc6474d4c41006090600090a350565b6002600954036111485760405162461bcd60e51b8152600401610b679061323d565b600260098190555081816111c782828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e546040516bffffffffffffffffffffffff193360601b1660208201529092506034019050604051602081830303815290604052805190602001206124d7565b6112035760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610b67565b600f5460ff166112555760405162461bcd60e51b815260206004820152601860248201527f47656e65736973206d696e74696e6720696e61637469766500000000000000006044820152606401610b67565b610378601286600c54611268919061328a565b611272919061328a565b11156112bb5760405162461bcd60e51b81526020600482015260186024820152774578636565647320617661696c61626c6520737570706c7960401b6044820152606401610b67565b336000908152601060205260409020546002906112d990879061328a565b11156113275760405162461bcd60e51b815260206004820152601e60248201527f457863656564732061646472657373207175616e74697479206c696d697400006044820152606401610b67565b84600c6000828254611339919061328a565b9091555050336000908152601060205260408120805487929061135d90849061328a565b9091555061136d905033866124ed565b50506001600955505050565b6060600061138683610f36565b90506000816001600160401b038111156113a2576113a2612fc2565b6040519080825280602002602001820160405280156113cb578160200160208202803683370190505b506000805491925080805b838110156114a857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16158015928201929092529061143d57506114a0565b80516001600160a01b03161561145257805192505b886001600160a01b0316836001600160a01b0316036114915781868580600101965081518110611484576114846131c4565b6020026020010181815250505b86840361149e57506114a8565b505b6001016113d6565b50929695505050505050565b6114bc612123565b80516114cf906012906020840190612c5f565b5050565b6002600954036114f55760405162461bcd60e51b8152600401610b679061323d565b6002600955611502612123565b601282601654611512919061328a565b11156115605760405162461bcd60e51b815260206004820152601860248201527f457863656564732072657365727665207175616e7469747900000000000000006044820152606401610b67565b8160166000828254611572919061328a565b90915550611582905081836124ed565b50506001600955565b60606003805461099990613190565b6008546001600160a01b03163314806115f0575060155460ff1680156115f057506013546001600160a01b0316336001600160a01b031614806115f057506014546001600160a01b0316336001600160a01b0316145b61160c5760405162461bcd60e51b8152600401610b67906131da565b600e55565b6002600954036116335760405162461bcd60e51b8152600401610b679061323d565b6002600955600f5462010000900460ff166116905760405162461bcd60e51b815260206004820152601760248201527f5075626c6963206d696e74696e6720696e6163746976650000000000000000006044820152606401610b67565b80600a5461169e91906132a2565b34146116ec5760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374207061796d656e7420616d6f756e7400000000000000006044820152606401610b67565b600a8111156117395760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81d1e081c5d585b9d1a5d1e481b1a5b5a5d603a1b6044820152606401610b67565b611744335b826124ed565b506001600955565b336001600160a01b038316036117755760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331480611837575060155460ff16801561183757506013546001600160a01b0316336001600160a01b0316148061183757506014546001600160a01b0316336001600160a01b0316145b6118535760405162461bcd60e51b8152600401610b67906131da565b6002600954036118755760405162461bcd60e51b8152600401610b679061323d565b6002600955600d5447116118c05760405162461bcd60e51b81526020600482015260126024820152714e6f2070617961626c652062616c616e636560701b6044820152606401610b67565b6000600d54476118d091906132c1565b9050600060646118e183600a6132a2565b6118eb91906132ee565b90506118f781836132c1565b600d6000828254611908919061328a565b90915550506040517386190c50d1dd3eeb2ab1dbb8e7195f2195af321f9082156108fc029083906000818181858888f1935050505061197f5760405162461bcd60e51b81526020600482015260136024820152721519585b481c185e5b595b9d0819985a5b1959606a1b6044820152606401610b67565b7386190c50d1dd3eeb2ab1dbb8e7195f2195af321f6001600160a01b03167f977a6da50cd34049fc55b2cea88cab5c375867bba0044c08fe032978c16c4ea5600c546016546119cc610b8e565b6119d691906132c1565b6119e091906132c1565b6040805191825260208201869052810184905260600160405180910390a250506001600955565b611a1284848461217d565b6001600160a01b0383163b15611a4b57611a2e848484846125ba565b611a4b576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611a5c8261208e565b611a9e5760405162461bcd60e51b8152602060048201526013602482015272139bdb995e1a5cdd195b9d081d1bdad95b9259606a1b6044820152606401610b67565b6011611aa9836126a6565b604051602001611aba92919061331e565b6040516020818303038152906040529050919050565b6008546001600160a01b0316331480611b26575060155460ff168015611b2657506013546001600160a01b0316336001600160a01b03161480611b2657506014546001600160a01b0316336001600160a01b0316145b611b425760405162461bcd60e51b8152600401610b67906131da565b600f805463ff00000019166301000000179055565b6008546001600160a01b0316331480611bad575060155460ff168015611bad57506013546001600160a01b0316336001600160a01b03161480611bad57506014546001600160a01b0316336001600160a01b0316145b611bc95760405162461bcd60e51b8152600401610b67906131da565b808015611bfe57600060118054611bdf90613190565b905011611bfe5760405162461bcd60e51b8152600401610b6790613206565b600f805461ff0019166101008415159081029190911790915560405133907fa10f8d478ca08c91de8bca8ba2016b83b9eecf85aab98ca47cc970ab335f907990600090a35050565b611c4e612123565b600260095403611c705760405162461bcd60e51b8152600401610b679061323d565b600260095580611cba5760405162461bcd60e51b8152602060048201526015602482015274416d6f756e742063616e6e6f74206265207a65726f60581b6044820152606401610b67565b80600d541015611d0c5760405162461bcd60e51b815260206004820152601b60248201527f4578636565647320776974686472617761626c6520616d6f756e7400000000006044820152606401610b67565b80600d6000828254611d1e91906132c1565b90915550506040517315b31f13d09420c0adcb3a9af7be29d6adcf31ba9082156108fc029083906000818181858888f193505050506117445760405162461bcd60e51b815260206004820152601760248201527f50726f6a656374207769746864726177206661696c65640000000000000000006044820152606401610b67565b6008546001600160a01b0316331480611df5575060155460ff168015611df557506013546001600160a01b0316336001600160a01b03161480611df557506014546001600160a01b0316336001600160a01b0316145b611e115760405162461bcd60e51b8152600401610b67906131da565b808015611e4657600060118054611e2790613190565b905011611e465760405162461bcd60e51b8152600401610b6790613206565b600f805462ff00001916620100008415159081029190911790915533610efd565b60606012805461099990613190565b600260095403611e985760405162461bcd60e51b8152600401610b679061323d565b6002600955600f54610100900460ff16611ef45760405162461bcd60e51b815260206004820152601f60248201527f47656e65736973207075626c6963206d696e74696e6720696e616374697665006044820152606401610b67565b610378601282600c54611f07919061328a565b611f11919061328a565b1115611f5a5760405162461bcd60e51b81526020600482015260186024820152774578636565647320617661696c61626c6520737570706c7960401b6044820152606401610b67565b6005811115611fa75760405162461bcd60e51b8152602060048201526019602482015278115e18d959591cc81d1e081c5d585b9d1a5d1e481b1a5b5a5d603a1b6044820152606401610b67565b80600c6000828254611fb9919061328a565b9091555061174490503361173e565b611fd0612123565b6001600160a01b0381166120355760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b67565b610c1d81612485565b60006001600160e01b031982166380ac58cd60e01b148061206f57506001600160e01b03198216635b5e139f60e01b145b8061098457506301ffc9a760e01b6001600160e01b0319831614610984565b6000816001111580156120a2575060005482105b8015610984575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610f965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b67565b600061218882612363565b9050836001600160a01b031681600001516001600160a01b0316146121bf5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806121dd57506121dd85336108e0565b806121f85750336121ed84610a1c565b6001600160a01b0316145b90508061221857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661223f57604051633a954ecd60e21b815260040160405180910390fd5b61224b600084876120c7565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661231f57600054821461231f57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061345c83398151915260405160405180910390a45050505050565b610c1d8160006127a6565b6040805160608101825260008082526020820181905291810191909152818060011161246c5760005481101561246c57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061246a5780516001600160a01b031615612401579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612465579392505050565b612401565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826124e48584612959565b14949350505050565b6000811161253d5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f0000000000000000006044820152606401610b67565b600b5460165461254e9060126132c1565b82612557610b8e565b612561919061328a565b61256b919061328a565b11156125b05760405162461bcd60e51b81526020600482015260146024820152734578636565647320746f74616c20737570706c7960601b6044820152606401610b67565b6114cf82826129a6565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906125ef9033908990889088906004016133d4565b6020604051808303816000875af192505050801561262a575060408051601f3d908101601f1916820190925261262791810190613411565b60015b612688573d808015612658576040519150601f19603f3d011682016040523d82523d6000602084013e61265d565b606091505b508051600003612680576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036126cd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126f757806126e18161342e565b91506126f09050600a836132ee565b91506126d1565b6000816001600160401b0381111561271157612711612fc2565b6040519080825280601f01601f19166020018201604052801561273b576020820181803683370190505b5090505b841561269e576127506001836132c1565b915061275d600a86613447565b61276890603061328a565b60f81b81838151811061277d5761277d6131c4565b60200101906001600160f81b031916908160001a90535061279f600a866132ee565b945061273f565b60006127b183612363565b80519091508215612817576000336001600160a01b03831614806127da57506127da82336108e0565b806127f55750336127ea86610a1c565b6001600160a01b0316145b90508061281557604051632ce44b5f60e11b815260040160405180910390fd5b505b612823600085836120c7565b6001600160a01b0380821660008181526005602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526004909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b17855591890180845292208054919490911661292157600054821461292157805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b0384169060008051602061345c833981519152908390a4505060018054810190555050565b600081815b845181101561299e5761298a8286838151811061297d5761297d6131c4565b60200260200101516129c0565b9150806129968161342e565b91505061295e565b509392505050565b6114cf8282604051806020016040528060008152506129f2565b60008183106129dc5760008281526020849052604090206129eb565b60008381526020839052604090205b9392505050565b6000546001600160a01b038416612a1b57604051622e076360e81b815260040160405180910390fd5b82600003612a3c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612b52575b60405182906001600160a01b0388169060009060008051602061345c833981519152908290a4612b1b60008784806001019550876125ba565b612b38576040516368d2bf6b60e11b815260040160405180910390fd5b808210612ae2578260005414612b4d57600080fd5b612b85565b5b6040516001830192906001600160a01b0388169060009060008051602061345c833981519152908290a4808210612b53575b506000908155611a4b9085838684565b8260028101928215612bdb579160200282015b82811115612bdb5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612ba8565b50612be7929150612cd3565b5090565b828054612bf790613190565b90600052602060002090601f016020900481019282612c195760008555612bdb565b82601f10612c325782800160ff19823516178555612bdb565b82800160010185558215612bdb579182015b82811115612bdb578235825591602001919060010190612c44565b828054612c6b90613190565b90600052602060002090601f016020900481019282612c8d5760008555612bdb565b82601f10612ca657805160ff1916838001178555612bdb565b82800160010185558215612bdb579182015b82811115612bdb578251825591602001919060010190612cb8565b5b80821115612be75760008155600101612cd4565b6001600160e01b031981168114610c1d57600080fd5b600060208284031215612d1057600080fd5b81356129eb81612ce8565b60005b83811015612d36578181015183820152602001612d1e565b83811115611a4b5750506000910152565b60008151808452612d5f816020860160208601612d1b565b601f01601f19169290920160200192915050565b6020815260006129eb6020830184612d47565b600060208284031215612d9857600080fd5b5035919050565b80356001600160a01b0381168114612db657600080fd5b919050565b60008060408385031215612dce57600080fd5b612dd783612d9f565b946020939093013593505050565b600060408284031215612df757600080fd5b82604083011115612e0757600080fd5b50919050565b600080600060608486031215612e2257600080fd5b612e2b84612d9f565b9250612e3960208501612d9f565b9150604084013590509250925092565b60008060208385031215612e5c57600080fd5b82356001600160401b0380821115612e7357600080fd5b818501915085601f830112612e8757600080fd5b813581811115612e9657600080fd5b866020828501011115612ea857600080fd5b60209290920196919550909350505050565b600060208284031215612ecc57600080fd5b6129eb82612d9f565b80358015158114612db657600080fd5b600060208284031215612ef757600080fd5b6129eb82612ed5565b600080600060408486031215612f1557600080fd5b8335925060208401356001600160401b0380821115612f3357600080fd5b818601915086601f830112612f4757600080fd5b813581811115612f5657600080fd5b8760208260051b8501011115612f6b57600080fd5b6020830194508093505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015612fb657835183529284019291840191600101612f9a565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612ff257612ff2612fc2565b604051601f8501601f19908116603f0116810190828211818310171561301a5761301a612fc2565b8160405280935085815286868601111561303357600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561305f57600080fd5b81356001600160401b0381111561307557600080fd5b8201601f8101841361308657600080fd5b61269e84823560208401612fd8565b600080604083850312156130a857600080fd5b823591506130b860208401612d9f565b90509250929050565b600080604083850312156130d457600080fd5b6130dd83612d9f565b91506130b860208401612ed5565b6000806000806080858703121561310157600080fd5b61310a85612d9f565b935061311860208601612d9f565b92506040850135915060608501356001600160401b0381111561313a57600080fd5b8501601f8101871361314b57600080fd5b61315a87823560208401612fd8565b91505092959194509250565b6000806040838503121561317957600080fd5b61318283612d9f565b91506130b860208401612d9f565b600181811c908216806131a457607f821691505b602082108103612e0757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252601290820152712737ba1037bbb732b91037b91030b236b4b760711b604082015260600190565b6020808252601d908201527f4d657461646174612075726c20686173206e6f74206265656e20736574000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561329d5761329d613274565b500190565b60008160001904831182151516156132bc576132bc613274565b500290565b6000828210156132d3576132d3613274565b500390565b634e487b7160e01b600052601260045260246000fd5b6000826132fd576132fd6132d8565b500490565b60008151613314818560208601612d1b565b9290920192915050565b600080845481600182811c91508083168061333a57607f831692505b6020808410820361335957634e487b7160e01b86526022600452602486fd5b81801561336d576001811461337e576133ab565b60ff198616895284890196506133ab565b60008b81526020902060005b868110156133a35781548b82015290850190830161338a565b505084890196505b5050505050506133cb6133c582602f60f81b815260010190565b85613302565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061340790830184612d47565b9695505050505050565b60006020828403121561342357600080fd5b81516129eb81612ce8565b60006001820161344057613440613274565b5060010190565b600082613456576134566132d8565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ada9ced9459d59f04246682d1ab9c5bcb14dbaa61e5a0dc2ac769ca35a524a4c64736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000009456c657638204e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005454c455638000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Elev8 NFT
Arg [1] : symbol (string): ELEV8

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [3] : 456c657638204e46540000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 454c455638000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

60602:11140:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70853:203;;;;;;;;;;-1:-1:-1;70853:203:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;70853:203:0;;;;;;;;43746:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45250:204::-;;;;;;;;;;-1:-1:-1;45250:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;45250:204:0;1550:203:1;44812:372:0;;;;;;;;;;-1:-1:-1;44812:372:0;;;;;:::i;:::-;;:::i;:::-;;66643:289;;;;;;;;;;-1:-1:-1;66643:289:0;;;;;:::i;:::-;;:::i;39871:312::-;;;;;;;;;;;;;:::i;:::-;;;2597:25:1;;;2585:2;2570:18;39871:312:0;2451:177:1;60864:51:0;;;;;;;;;;;;60913:2;60864:51;;46115:170;;;;;;;;;;-1:-1:-1;46115:170:0;;;;;:::i;:::-;;:::i;61224:35::-;;;;;;;;;;-1:-1:-1;61224:35:0;;;;;;;;;;;60746:53;;;;;;;;;;;;60798:1;60746:53;;46356:185;;;;;;;;;;-1:-1:-1;46356:185:0;;;;;:::i;:::-;;:::i;70166:145::-;;;;;;;;;;-1:-1:-1;70166:145:0;;;;;:::i;:::-;;:::i;66459:176::-;;;;;;;;;;-1:-1:-1;66459:176:0;;;;;:::i;:::-;;:::i;61061:31::-;;;;;;;;;;;;;;;;43554:125;;;;;;;;;;-1:-1:-1;43554:125:0;;;;;:::i;:::-;;:::i;61147:32::-;;;;;;;;;;;;;;;;68120:306;;;;;;;;;;-1:-1:-1;68120:306:0;;;;;:::i;:::-;;:::i;61382:52::-;;;;;;;;;;-1:-1:-1;61382:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;66940:227;;;;;;;;;;-1:-1:-1;66940:227:0;;;;;:::i;:::-;;:::i;41000:206::-;;;;;;;;;;-1:-1:-1;41000:206:0;;;;;:::i;:::-;;:::i;26364:103::-;;;;;;;;;;;;;:::i;68677:100::-;;;;;;;;;;;;;:::i;67662:450::-;;;;;;;;;;-1:-1:-1;67662:450:0;;;;;:::i;:::-;;:::i;63427:572::-;;;;;;;;;;-1:-1:-1;63427:572:0;;;;;:::i;:::-;;:::i;69042:1116::-;;;;;;;;;;-1:-1:-1;69042:1116:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;60806:51::-;;;;;;;;;;;;60856:1;60806:51;;25716:87;;;;;;;;;;-1:-1:-1;25789:6:0;;-1:-1:-1;;;;;25789:6:0;25716:87;;70319:103;;;;;;;;;;-1:-1:-1;70319:103:0;;;;;:::i;:::-;;:::i;64843:288::-;;;;;;;;;;-1:-1:-1;64843:288:0;;;;;:::i;:::-;;:::i;43915:104::-;;;;;;;;;;;;;:::i;60695:44::-;;;;;;;;;;;;60736:3;60695:44;;60971:43;;;;;;;;;;;;;;;;61188:29;;;;;;;;;;-1:-1:-1;61188:29:0;;;;;;;;68434:125;;;;;;;;;;-1:-1:-1;68434:125:0;;;;;:::i;:::-;;:::i;64500:335::-;;;;;;:::i;:::-;;:::i;45526:287::-;;;;;;;;;;-1:-1:-1;45526:287:0;;;;;:::i;:::-;;:::i;65139:881::-;;;;;;;;;;;;;:::i;61266:28::-;;;;;;;;;;-1:-1:-1;61266:28:0;;;;;;;;;;;46612:370;;;;;;;;;;-1:-1:-1;46612:370:0;;;;;:::i;:::-;;:::i;61303:32::-;;;;;;;;;;-1:-1:-1;61303:32:0;;;;;;;;;;;70430:310;;;;;;;;;;-1:-1:-1;70430:310:0;;;;;:::i;:::-;;:::i;68567:102::-;;;;;;;;;;;;;:::i;61342:31::-;;;;;;;;;;-1:-1:-1;61342:31:0;;;;;;;;;;;61021;;;;;;;;;;;;;;;;67176:245;;;;;;;;;;-1:-1:-1;67176:245:0;;;;;:::i;:::-;;:::i;66028:423::-;;;;;;;;;;-1:-1:-1;66028:423:0;;;;;:::i;:::-;;:::i;67429:225::-;;;;;;;;;;-1:-1:-1;67429:225:0;;;;;:::i;:::-;;:::i;70748:97::-;;;;;;;;;;;;;:::i;45884:164::-;;;;;;;;;;-1:-1:-1;45884:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;46005:25:0;;;45981:4;46005:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45884:164;64007:485;;;;;;;;;;-1:-1:-1;64007:485:0;;;;;:::i;:::-;;:::i;26622:201::-;;;;;;;;;;-1:-1:-1;26622:201:0;;;;;:::i;:::-;;:::i;60922:40::-;;;;;;;;;;;;60960:2;60922:40;;61099:39;;;;;;;;;;;;;;;;70853:203;70983:4;71012:36;71036:11;71012:23;:36::i;:::-;71005:43;70853:203;-1:-1:-1;;70853:203:0:o;43746:100::-;43800:13;43833:5;43826:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43746:100;:::o;45250:204::-;45318:7;45343:16;45351:7;45343;:16::i;:::-;45338:64;;45368:34;;-1:-1:-1;;;45368:34:0;;;;;;;;;;;45338:64;-1:-1:-1;45422:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45422:24:0;;45250:204::o;44812:372::-;44885:13;44901:24;44917:7;44901:15;:24::i;:::-;44885:40;;44946:5;-1:-1:-1;;;;;44940:11:0;:2;-1:-1:-1;;;;;44940:11:0;;44936:48;;44960:24;;-1:-1:-1;;;44960:24:0;;;;;;;;;;;44936:48;24347:10;-1:-1:-1;;;;;45001:21:0;;;44997:139;;45028:37;45045:5;24347:10;45884:164;:::i;45028:37::-;45024:112;;45089:35;;-1:-1:-1;;;45089:35:0;;;;;;;;;;;45024:112;45148:28;45157:2;45161:7;45170:5;45148:8;:28::i;:::-;44874:310;44812:372;;:::o;66643:289::-;25602:13;:11;:13::i;:::-;66779:1:::1;66750:17;;::::0;::::1;:14:::0;:17:::1;:::i;:::-;-1:-1:-1::0;;;;;66750:31:0::1;;;:66;;;;-1:-1:-1::0;66814:1:0::1;66785:17;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;66785:31:0::1;;;66750:66;66728:131;;;::::0;-1:-1:-1;;;66728:131:0;;9195:2:1;66728:131:0::1;::::0;::::1;9177:21:1::0;9234:2;9214:18;;;9207:30;-1:-1:-1;;;9253:18:1;;;9246:45;9308:18;;66728:131:0::1;;;;;;;;;66872:24;:7;66882:14:::0;66872:24:::1;;:::i;:::-;-1:-1:-1::0;;66907:10:0::1;:17:::0;;-1:-1:-1;;66907:17:0::1;66920:4;66907:17;::::0;;66643:289::o;39871:312::-;71415:1;40134:12;39924:7;40118:13;:28;-1:-1:-1;;40118:46:0;;39871:312::o;46115:170::-;46249:28;46259:4;46265:2;46269:7;46249:9;:28::i;46356:185::-;46494:39;46511:4;46517:2;46521:7;46494:39;;;;;;;;;;;;:16;:39::i;70166:145::-;70223:20;;;;:11;:20;;;;;:25;-1:-1:-1;;;;;70223:25:0;24347:10;70223:41;70215:63;;;;-1:-1:-1;;;70215:63:0;;9539:2:1;70215:63:0;;;9521:21:1;9578:1;9558:18;;;9551:29;-1:-1:-1;;;9596:18:1;;;9589:39;9645:18;;70215:63:0;9337:332:1;70215:63:0;70289:14;70295:7;70289:5;:14::i;:::-;70166:145;:::o;66459:176::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;66549:25;66541:57:::1;;;::::0;-1:-1:-1;;;66541:57:0;;10223:2:1;66541:57:0::1;::::0;::::1;10205:21:1::0;10262:2;10242:18;;;10235:30;-1:-1:-1;;;10281:18:1;;;10274:49;10340:18;;66541:57:0::1;10021:343:1::0;66541:57:0::1;66609:18;:8;66620:7:::0;;66609:18:::1;:::i;43554:125::-:0;43618:7;43645:21;43658:7;43645:12;:21::i;:::-;:26;;43554:125;-1:-1:-1;;43554:125:0:o;68120:306::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;68216:9:::1;;68205:8;:20;68197:55;;;::::0;-1:-1:-1;;;68197:55:0;;10571:2:1;68197:55:0::1;::::0;::::1;10553:21:1::0;10610:2;10590:18;;;10583:30;-1:-1:-1;;;10629:18:1;;;10622:52;10691:18;;68197:55:0::1;10369:346:1::0;68197:55:0::1;68283:13;:11;:13::i;:::-;68271:8;:25;;68263:68;;;::::0;-1:-1:-1;;;68263:68:0;;10922:2:1;68263:68:0::1;::::0;::::1;10904:21:1::0;10961:2;10941:18;;;10934:30;11000:32;10980:18;;;10973:60;11050:18;;68263:68:0::1;10720:354:1::0;68263:68:0::1;68342:9;:20:::0;;;68378:40:::1;::::0;2597:25:1;;;24347:10:0;;68378:40:::1;::::0;2585:2:1;2570:18;68378:40:0::1;;;;;;;68120:306:::0;:::o;66940:227::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;67048:6:::1;62426;62422:156;;;62500:1;62481:8;62475:22;;;;;:::i;:::-;;;:26;62449:117;;;;-1:-1:-1::0;;;62449:117:0::1;;;;;;;:::i;:::-;67072:17:::2;:26:::0;;-1:-1:-1;;67072:26:0::2;::::0;::::2;;::::0;;::::2;::::0;;;24347:10;67138:12:::2;-1:-1:-1::0;;;;;67114:45:0::2;;;;;;;;;;;62862:1:::1;66940:227:::0;:::o;41000:206::-;41064:7;-1:-1:-1;;;;;41088:19:0;;41084:60;;41116:28;;-1:-1:-1;;;41116:28:0;;;;;;;;;;;41084:60;-1:-1:-1;;;;;;41170:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;41170:27:0;;41000:206::o;26364:103::-;25602:13;:11;:13::i;:::-;26429:30:::1;26456:1;26429:18;:30::i;:::-;26364:103::o:0;68677:100::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;68743:19:::1;:26:::0;;-1:-1:-1;;68743:26:0::1;::::0;::::1;::::0;;68677:100::o;67662:450::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;67929:15:::1;;67917:8;:27;;:62;;;;60736:3;67948:13;:11;:13::i;:::-;:31;;67917:62;67909:96;;;::::0;-1:-1:-1;;;67909:96:0;;11639:2:1;67909:96:0::1;::::0;::::1;11621:21:1::0;11678:2;11658:18;;;11651:30;-1:-1:-1;;;11697:18:1;;;11690:51;11758:18;;67909:96:0::1;11437:345:1::0;67909:96:0::1;68016:15;:26:::0;;;68058:46:::1;::::0;68016:26;;24347:10;;68058:46:::1;::::0;;;::::1;67662:450:::0;:::o;63427:572::-;22641:1;23239:7;;:19;23231:63;;;;-1:-1:-1;;;23231:63:0;;;;;;;:::i;:::-;22641:1;23372:7;:18;;;;63526:11:::1;;62964:161;63001:11;;62964:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;63032:17:0::1;::::0;63079:30:::1;::::0;-1:-1:-1;;24347:10:0;12296:2:1;12292:15;12288:53;63079:30:0::1;::::0;::::1;12276:66:1::0;63032:17:0;;-1:-1:-1;12358:12:1;;;-1:-1:-1;63079:30:0::1;;;;;;;;;;;;63069:41;;;;;;62964:18;:161::i;:::-;62942:225;;;::::0;-1:-1:-1;;;62942:225:0;;12583:2:1;62942:225:0::1;::::0;::::1;12565:21:1::0;12622:2;12602:18;;;12595:30;-1:-1:-1;;;12641:18:1;;;12634:43;12694:18;;62942:225:0::1;12381:337:1::0;62942:225:0::1;63558:17:::2;::::0;::::2;;63550:54;;;::::0;-1:-1:-1;;;63550:54:0;;12925:2:1;63550:54:0::2;::::0;::::2;12907:21:1::0;12964:2;12944:18;;;12937:30;13003:26;12983:18;;;12976:54;13047:18;;63550:54:0::2;12723:348:1::0;63550:54:0::2;60736:3;60960:2;63656:3;63637:16;;:22;;;;:::i;:::-;:36;;;;:::i;:::-;:54;;63615:128;;;::::0;-1:-1:-1;;;63615:128:0;;13543:2:1;63615:128:0::2;::::0;::::2;13525:21:1::0;13582:2;13562:18;;;13555:30;-1:-1:-1;;;13601:18:1;;;13594:54;13665:18;;63615:128:0::2;13341:348:1::0;63615:128:0::2;24347:10:::0;63762:31:::2;::::0;;;:17:::2;:31;::::0;;;;;60856:1:::2;::::0;63762:37:::2;::::0;63796:3;;63762:37:::2;:::i;:::-;:64;;63754:107;;;::::0;-1:-1:-1;;;63754:107:0;;13896:2:1;63754:107:0::2;::::0;::::2;13878:21:1::0;13935:2;13915:18;;;13908:30;13974:32;13954:18;;;13947:60;14024:18;;63754:107:0::2;13694:354:1::0;63754:107:0::2;63894:3;63874:16;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;24347:10:0;63908:31:::2;::::0;;;:17:::2;:31;::::0;;;;:38;;63943:3;;63908:31;:38:::2;::::0;63943:3;;63908:38:::2;:::i;:::-;::::0;;;-1:-1:-1;63959:32:0::2;::::0;-1:-1:-1;24347:10:0;63987:3:::2;63959:13;:32::i;:::-;-1:-1:-1::0;;22597:1:0;23551:7;:22;-1:-1:-1;;;63427:572:0:o;69042:1116::-;69130:16;69189:20;69212:16;69222:5;69212:9;:16::i;:::-;69189:39;;69243:18;69278:12;-1:-1:-1;;;;;69264:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69264:27:0;-1:-1:-1;69306:11:0;69320:13;;69243:48;;-1:-1:-1;69306:11:0;;69422:695;69442:3;69438:1;:7;69422:695;;;69471:31;69505:14;;;:11;:14;;;;;;;;;69471:48;;;;;;;;;-1:-1:-1;;;;;69471:48:0;;;;-1:-1:-1;;;69471:48:0;;-1:-1:-1;;;;;69471:48:0;;;;;;;;-1:-1:-1;;;69471:48:0;;;;;;;;;;;;;;;;69538:73;;69583:8;;;69538:73;69633:14;;-1:-1:-1;;;;;69633:28:0;;69629:111;;69706:14;;;-1:-1:-1;69629:111:0;69783:5;-1:-1:-1;;;;;69762:26:0;:17;-1:-1:-1;;;;;69762:26:0;;69758:95;;69832:1;69813;69815:13;;;;;;69813:16;;;;;;;;:::i;:::-;;;;;;:20;;;;;69758:95;70040:12;70025:11;:27;70021:81;;70077:5;;;70021:81;69452:665;69422:695;69447:3;;69422:695;;;-1:-1:-1;70138:1:0;;69042:1116;-1:-1:-1;;;;;;69042:1116:0:o;70319:103::-;25602:13;:11;:13::i;:::-;70393:21;;::::1;::::0;:12:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;70319:103:::0;:::o;64843:288::-;22641:1;23239:7;;:19;23231:63;;;;-1:-1:-1;;;23231:63:0;;;;;;;:::i;:::-;22641:1;23372:7;:18;25602:13:::1;:11;:13::i;:::-;60960:2:::2;65004:3;64989:12;;:18;;;;:::i;:::-;:33;;64981:70;;;::::0;-1:-1:-1;;;64981:70:0;;14255:2:1;64981:70:0::2;::::0;::::2;14237:21:1::0;14294:2;14274:18;;;14267:30;14333:26;14313:18;;;14306:54;14377:18;;64981:70:0::2;14053:348:1::0;64981:70:0::2;65080:3;65064:12;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;65094:29:0::2;::::0;-1:-1:-1;65108:9:0;65119:3;65094:13:::2;:29::i;:::-;-1:-1:-1::0;;22597:1:0;23551:7;:22;64843:288::o;43915:104::-;43971:13;44004:7;43997:14;;;;;:::i;68434:125::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;68521:17:::1;:30:::0;68434:125::o;64500:335::-;22641:1;23239:7;;:19;23231:63;;;;-1:-1:-1;;;23231:63:0;;;;;;;:::i;:::-;22641:1;23372:7;:18;64576:16:::1;::::0;;;::::1;;;64568:52;;;::::0;-1:-1:-1;;;64568:52:0;;14608:2:1;64568:52:0::1;::::0;::::1;14590:21:1::0;14647:2;14627:18;;;14620:30;14686:25;14666:18;;;14659:53;14729:18;;64568:52:0::1;14406:347:1::0;64568:52:0::1;64671:3;64653:15;;:21;;;;:::i;:::-;64639:9;:36;64631:73;;;::::0;-1:-1:-1;;;64631:73:0;;15133:2:1;64631:73:0::1;::::0;::::1;15115:21:1::0;15172:2;15152:18;;;15145:30;15211:26;15191:18;;;15184:54;15255:18;;64631:73:0::1;14931:348:1::0;64631:73:0::1;60913:2;64723:3;:29;;64715:67;;;::::0;-1:-1:-1;;;64715:67:0;;15486:2:1;64715:67:0::1;::::0;::::1;15468:21:1::0;15525:2;15505:18;;;15498:30;-1:-1:-1;;;15544:18:1;;;15537:55;15609:18;;64715:67:0::1;15284:349:1::0;64715:67:0::1;64795:32;24347:10:::0;64809:12:::1;64823:3;64795:13;:32::i;:::-;-1:-1:-1::0;22597:1:0;23551:7;:22;64500:335::o;45526:287::-;24347:10;-1:-1:-1;;;;;45625:24:0;;;45621:54;;45658:17;;-1:-1:-1;;;45658:17:0;;;;;;;;;;;45621:54;24347:10;45688:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45688:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45688:53:0;;;;;;;;;;45757:48;;540:41:1;;;45688:42:0;;24347:10;45757:48;;513:18:1;45757:48:0;;;;;;;45526:287;;:::o;65139:881::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;22641:1:::1;23239:7;;:19:::0;23231:63:::1;;;;-1:-1:-1::0;;;23231:63:0::1;;;;;;;:::i;:::-;22641:1;23372:7;:18:::0;65254:24:::2;::::0;65230:21:::2;:48;65208:116;;;::::0;-1:-1:-1;;;65208:116:0;;15840:2:1;65208:116:0::2;::::0;::::2;15822:21:1::0;15879:2;15859:18;;;15852:30;-1:-1:-1;;;15898:18:1;;;15891:48;15956:18;;65208:116:0::2;15638:342:1::0;65208:116:0::2;65335:22;65397:24;;65360:21;:61;;;;:::i;:::-;65335:86:::0;-1:-1:-1;65434:21:0::2;65482:3;65459:19;65335:86:::0;65476:2:::2;65459:19;:::i;:::-;65458:27;;;;:::i;:::-;65434:51:::0;-1:-1:-1;65684:30:0::2;65434:51:::0;65684:14;:30:::2;:::i;:::-;65655:24;;:60;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;65736:34:0::2;::::0;61679:42:::2;::::0;65736:34;::::2;;;::::0;65756:13;;65736:34:::2;::::0;;;65756:13;61679:42;65736:34;::::2;;;;;;65728:66;;;::::0;-1:-1:-1;;;65728:66:0;;16574:2:1;65728:66:0::2;::::0;::::2;16556:21:1::0;16613:2;16593:18;;;16586:30;-1:-1:-1;;;16632:18:1;;;16625:49;16691:18;;65728:66:0::2;16372:343:1::0;65728:66:0::2;61679:42;-1:-1:-1::0;;;;;65812:200:0::2;;65895:16;;65880:12;;65864:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:47;;;;:::i;:::-;65812:200;::::0;;16922:25:1;;;16978:2;16963:18;;16956:34;;;17006:18;;16999:34;;;16910:2;16895:18;65812:200:0::2;;;;;;;-1:-1:-1::0;;22597:1:0::1;23551:7;:22:::0;65139:881::o;46612:370::-;46779:28;46789:4;46795:2;46799:7;46779:9;:28::i;:::-;-1:-1:-1;;;;;46822:13:0;;1528:19;:23;46818:157;;46843:56;46874:4;46880:2;46884:7;46893:5;46843:30;:56::i;:::-;46839:136;;46923:40;;-1:-1:-1;;;46923:40:0;;;;;;;;;;;46839:136;46612:370;;;;:::o;70430:310::-;70531:13;70570:16;70578:7;70570;:16::i;:::-;70562:48;;;;-1:-1:-1;;;70562:48:0;;17246:2:1;70562:48:0;;;17228:21:1;17285:2;17265:18;;;17258:30;-1:-1:-1;;;17304:18:1;;;17297:49;17363:18;;70562:48:0;17044:343:1;70562:48:0;70683:8;70698:18;:7;:16;:18::i;:::-;70666:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70621:111;;70430:310;;;:::o;68567:102::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;68634:20:::1;:27:::0;;-1:-1:-1;;68634:27:0::1;::::0;::::1;::::0;;68567:102::o;67176:245::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;67290:6:::1;62426;62422:156;;;62500:1;62481:8;62475:22;;;;;:::i;:::-;;;:26;62449:117;;;;-1:-1:-1::0;;;62449:117:0::1;;;;;;;:::i;:::-;67314:23:::2;:32:::0;;-1:-1:-1;;67314:32:0::2;;::::0;::::2;;::::0;;::::2;::::0;;;::::2;::::0;;;67362:51:::2;::::0;24347:10;;67362:51:::2;::::0;-1:-1:-1;;67362:51:0::2;62862:1:::1;67176:245:::0;:::o;66028:423::-;25602:13;:11;:13::i;:::-;22641:1:::1;23239:7;;:19:::0;23231:63:::1;;;;-1:-1:-1::0;;;23231:63:0::1;;;;;;;:::i;:::-;22641:1;23372:7;:18:::0;66161:10;66153:44:::2;;;::::0;-1:-1:-1;;;66153:44:0;;19340:2:1;66153:44:0::2;::::0;::::2;19322:21:1::0;19379:2;19359:18;;;19352:30;-1:-1:-1;;;19398:18:1;;;19391:51;19459:18;;66153:44:0::2;19138:345:1::0;66153:44:0::2;66258:6;66230:24;;:34;;66208:111;;;::::0;-1:-1:-1;;;66208:111:0;;19690:2:1;66208:111:0::2;::::0;::::2;19672:21:1::0;19729:2;19709:18;;;19702:30;19768:29;19748:18;;;19741:57;19815:18;;66208:111:0::2;19488:351:1::0;66208:111:0::2;66360:6;66332:24;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;66385:30:0::2;::::0;61587:42:::2;::::0;66385:30;::::2;;;::::0;66408:6;;66385:30:::2;::::0;;;66408:6;61587:42;66385:30;::::2;;;;;;66377:66;;;::::0;-1:-1:-1;;;66377:66:0;;20046:2:1;66377:66:0::2;::::0;::::2;20028:21:1::0;20085:2;20065:18;;;20058:30;20124:25;20104:18;;;20097:53;20167:18;;66377:66:0::2;19844:347:1::0;67429:225:0;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;62666:23;;:139;;-1:-1:-1;62711:10:0;;;;:93;;;;-1:-1:-1;62763:7:0;:10;-1:-1:-1;;;;;62763:10:0;24347;-1:-1:-1;;;;;62747:26:0;;:56;;;-1:-1:-1;62793:10:0;;-1:-1:-1;;;;;62793:10:0;24347;-1:-1:-1;;;;;62777:26:0;;62747:56;62644:207;;;;-1:-1:-1;;;62644:207:0;;;;;;;:::i;:::-;67536:6:::1;62426;62422:156;;;62500:1;62481:8;62475:22;;;;;:::i;:::-;;;:26;62449:117;;;;-1:-1:-1::0;;;62449:117:0::1;;;;;;;:::i;:::-;67560:16:::2;:25:::0;;-1:-1:-1;;67560:25:0::2;::::0;;::::2;;::::0;;::::2;::::0;;;::::2;::::0;;;24347:10;67625:12:::2;24267:98:::0;70748:97;70792:13;70825:12;70818:19;;;;;:::i;64007:485::-;22641:1;23239:7;;:19;23231:63;;;;-1:-1:-1;;;23231:63:0;;;;;;;:::i;:::-;22641:1;23372:7;:18;64102:23:::1;::::0;::::1;::::0;::::1;;;64080:105;;;::::0;-1:-1:-1;;;64080:105:0;;20398:2:1;64080:105:0::1;::::0;::::1;20380:21:1::0;20437:2;20417:18;;;20410:30;20476:33;20456:18;;;20449:61;20527:18;;64080:105:0::1;20196:355:1::0;64080:105:0::1;60736:3;60960:2;64237:3;64218:16;;:22;;;;:::i;:::-;:36;;;;:::i;:::-;:54;;64196:128;;;::::0;-1:-1:-1;;;64196:128:0;;13543:2:1;64196:128:0::1;::::0;::::1;13525:21:1::0;13582:2;13562:18;;;13555:30;-1:-1:-1;;;13601:18:1;;;13594:54;13665:18;;64196:128:0::1;13341:348:1::0;64196:128:0::1;60798:1;64343:3;:32;;64335:70;;;::::0;-1:-1:-1;;;64335:70:0;;15486:2:1;64335:70:0::1;::::0;::::1;15468:21:1::0;15525:2;15505:18;;;15498:30;-1:-1:-1;;;15544:18:1;;;15537:55;15609:18;;64335:70:0::1;15284:349:1::0;64335:70:0::1;64438:3;64418:16;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;64452:32:0::1;::::0;-1:-1:-1;24347:10:0;64466:12:::1;24267:98:::0;26622:201;25602:13;:11;:13::i;:::-;-1:-1:-1;;;;;26711:22:0;::::1;26703:73;;;::::0;-1:-1:-1;;;26703:73:0;;20758:2:1;26703:73:0::1;::::0;::::1;20740:21:1::0;20797:2;20777:18;;;20770:30;20836:34;20816:18;;;20809:62;-1:-1:-1;;;20887:18:1;;;20880:36;20933:19;;26703:73:0::1;20556:402:1::0;26703:73:0::1;26787:28;26806:8;26787:18;:28::i;40631:305::-:0;40733:4;-1:-1:-1;;;;;;40770:40:0;;-1:-1:-1;;;40770:40:0;;:105;;-1:-1:-1;;;;;;;40827:48:0;;-1:-1:-1;;;40827:48:0;40770:105;:158;;;-1:-1:-1;;;;;;;;;;29072:40:0;;;40892:36;28963:157;47237:174;47294:4;47337:7;71415:1;47318:26;;:53;;;;;47358:13;;47348:7;:23;47318:53;:85;;;;-1:-1:-1;;47376:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;47376:27:0;;;;47375:28;;47237:174::o;56459:196::-;56574:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;56574:29:0;-1:-1:-1;;;;;56574:29:0;;;;;;;;;56619:28;;56574:24;;56619:28;;;;;;;56459:196;;;:::o;25881:132::-;25789:6;;-1:-1:-1;;;;;25789:6:0;24347:10;25945:23;25937:68;;;;-1:-1:-1;;;25937:68:0;;21165:2:1;25937:68:0;;;21147:21:1;;;21184:18;;;21177:30;21243:34;21223:18;;;21216:62;21295:18;;25937:68:0;20963:356:1;51407:2130:0;51522:35;51560:21;51573:7;51560:12;:21::i;:::-;51522:59;;51620:4;-1:-1:-1;;;;;51598:26:0;:13;:18;;;-1:-1:-1;;;;;51598:26:0;;51594:67;;51633:28;;-1:-1:-1;;;51633:28:0;;;;;;;;;;;51594:67;51674:22;24347:10;-1:-1:-1;;;;;51700:20:0;;;;:73;;-1:-1:-1;51737:36:0;51754:4;24347:10;45884:164;:::i;51737:36::-;51700:126;;;-1:-1:-1;24347:10:0;51790:20;51802:7;51790:11;:20::i;:::-;-1:-1:-1;;;;;51790:36:0;;51700:126;51674:153;;51845:17;51840:66;;51871:35;;-1:-1:-1;;;51871:35:0;;;;;;;;;;;51840:66;-1:-1:-1;;;;;51921:16:0;;51917:52;;51946:23;;-1:-1:-1;;;51946:23:0;;;;;;;;;;;51917:52;52090:35;52107:1;52111:7;52120:4;52090:8;:35::i;:::-;-1:-1:-1;;;;;52421:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;52421:31:0;;;-1:-1:-1;;;;;52421:31:0;;;-1:-1:-1;;52421:31:0;;;;;;;52467:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;52467:29:0;;;;;;;;;;;52547:20;;;:11;:20;;;;;;52582:18;;-1:-1:-1;;;;;;52615:49:0;;;;-1:-1:-1;;;52648:15:0;52615:49;;;;;;;;;;52938:11;;52998:24;;;;;53041:13;;52547:20;;52998:24;;53041:13;53037:384;;53251:13;;53236:11;:28;53232:174;;53289:20;;53358:28;;;;-1:-1:-1;;;;;53332:54:0;-1:-1:-1;;;53332:54:0;-1:-1:-1;;;;;;53332:54:0;;;-1:-1:-1;;;;;53289:20:0;;53332:54;;;;53232:174;52396:1036;;;53468:7;53464:2;-1:-1:-1;;;;;53449:27:0;53458:4;-1:-1:-1;;;;;53449:27:0;-1:-1:-1;;;;;;;;;;;53449:27:0;;;;;;;;;51511:2026;;51407:2130;;;:::o;53615:89::-;53675:21;53681:7;53690:5;53675;:21::i;42381:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;42492:7:0;;71415:1;42541:23;42537:888;;42577:13;;42570:4;:20;42566:859;;;42611:31;42645:17;;;:11;:17;;;;;;;;;42611:51;;;;;;;;;-1:-1:-1;;;;;42611:51:0;;;;-1:-1:-1;;;42611:51:0;;-1:-1:-1;;;;;42611:51:0;;;;;;;;-1:-1:-1;;;42611:51:0;;;;;;;;;;;;;;42681:729;;42731:14;;-1:-1:-1;;;;;42731:28:0;;42727:101;;42795:9;42381:1111;-1:-1:-1;;;42381:1111:0:o;42727:101::-;-1:-1:-1;;;43170:6:0;43215:17;;;;:11;:17;;;;;;;;;43203:29;;;;;;;;;-1:-1:-1;;;;;43203:29:0;;;;;-1:-1:-1;;;43203:29:0;;-1:-1:-1;;;;;43203:29:0;;;;;;;;-1:-1:-1;;;43203:29:0;;;;;;;;;;;;;43263:28;43259:109;;43331:9;42381:1111;-1:-1:-1;;;42381:1111:0:o;43259:109::-;43130:261;;;42592:833;42566:859;43453:31;;-1:-1:-1;;;43453:31:0;;;;;;;;;;;26983:191;27076:6;;;-1:-1:-1;;;;;27093:17:0;;;-1:-1:-1;;;;;;27093:17:0;;;;;;;27126:40;;27076:6;;;27093:17;27076:6;;27126:40;;27057:16;;27126:40;27046:128;26983:191;:::o;13323:190::-;13448:4;13501;13472:25;13485:5;13492:4;13472:12;:25::i;:::-;:33;;13323:190;-1:-1:-1;;;;13323:190:0:o;71432:307::-;71520:1;71514:3;:7;71506:43;;;;-1:-1:-1;;;71506:43:0;;21526:2:1;71506:43:0;;;21508:21:1;21565:2;21545:18;;;21538:30;21604:25;21584:18;;;21577:53;21647:18;;71506:43:0;21324:347:1;71506:43:0;71638:9;;71620:12;;71606:26;;60960:2;71606:26;:::i;:::-;71599:3;71583:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:50;;;;:::i;:::-;71582:65;;71560:135;;;;-1:-1:-1;;;71560:135:0;;21878:2:1;71560:135:0;;;21860:21:1;21917:2;21897:18;;;21890:30;-1:-1:-1;;;21936:18:1;;;21929:50;21996:18;;71560:135:0;21676:344:1;71560:135:0;71706:25;71716:9;71727:3;71706:9;:25::i;57147:667::-;57331:72;;-1:-1:-1;;;57331:72:0;;57310:4;;-1:-1:-1;;;;;57331:36:0;;;;;:72;;24347:10;;57382:4;;57388:7;;57397:5;;57331:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57331:72:0;;;;;;;;-1:-1:-1;;57331:72:0;;;;;;;;;;;;:::i;:::-;;;57327:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57565:6;:13;57582:1;57565:18;57561:235;;57611:40;;-1:-1:-1;;;57611:40:0;;;;;;;;;;;57561:235;57754:6;57748:13;57739:6;57735:2;57731:15;57724:38;57327:480;-1:-1:-1;;;;;;57450:55:0;-1:-1:-1;;;57450:55:0;;-1:-1:-1;57327:480:0;57147:667;;;;;;:::o;10037:723::-;10093:13;10314:5;10323:1;10314:10;10310:53;;-1:-1:-1;;10341:10:0;;;;;;;;;;;;-1:-1:-1;;;10341:10:0;;;;;10037:723::o;10310:53::-;10388:5;10373:12;10429:78;10436:9;;10429:78;;10462:8;;;;:::i;:::-;;-1:-1:-1;10485:10:0;;-1:-1:-1;10493:2:0;10485:10;;:::i;:::-;;;10429:78;;;10517:19;10549:6;-1:-1:-1;;;;;10539:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10539:17:0;;10517:39;;10567:154;10574:10;;10567:154;;10601:11;10611:1;10601:11;;:::i;:::-;;-1:-1:-1;10670:10:0;10678:2;10670:5;:10;:::i;:::-;10657:24;;:2;:24;:::i;:::-;10644:39;;10627:6;10634;10627:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10627:56:0;;;;;;;;-1:-1:-1;10698:11:0;10707:2;10698:11;;:::i;:::-;;;10567:154;;53933:2408;54013:35;54051:21;54064:7;54051:12;:21::i;:::-;54100:18;;54013:59;;-1:-1:-1;54131:290:0;;;;54165:22;24347:10;-1:-1:-1;;;;;54191:20:0;;;;:77;;-1:-1:-1;54232:36:0;54249:4;24347:10;45884:164;:::i;54232:36::-;54191:134;;;-1:-1:-1;24347:10:0;54289:20;54301:7;54289:11;:20::i;:::-;-1:-1:-1;;;;;54289:36:0;;54191:134;54165:161;;54348:17;54343:66;;54374:35;;-1:-1:-1;;;54374:35:0;;;;;;;;;;;54343:66;54150:271;54131:290;54549:35;54566:1;54570:7;54579:4;54549:8;:35::i;:::-;-1:-1:-1;;;;;54914:18:0;;;54880:31;54914:18;;;:12;:18;;;;;;;;54947:24;;-1:-1:-1;;;;;;;;;;54947:24:0;;;;;;;;;-1:-1:-1;;54947:24:0;;;;54986:29;;;;;54970:1;54986:29;;;;;;;;-1:-1:-1;;54986:29:0;;;;;;;;;;55148:20;;;:11;:20;;;;;;55183;;-1:-1:-1;;;;55251:15:0;55218:49;;;-1:-1:-1;;;55218:49:0;-1:-1:-1;;;;;;55218:49:0;;;;;;;;;;55282:22;-1:-1:-1;;;55282:22:0;;;55574:11;;;55634:24;;;;;55677:13;;54914:18;;55634:24;;55677:13;55673:384;;55887:13;;55872:11;:28;55868:174;;55925:20;;55994:28;;;;-1:-1:-1;;;;;55968:54:0;-1:-1:-1;;;55968:54:0;-1:-1:-1;;;;;;55968:54:0;;;-1:-1:-1;;;;;55925:20:0;;55968:54;;;;55868:174;-1:-1:-1;;56085:35:0;;56112:7;;-1:-1:-1;56108:1:0;;-1:-1:-1;;;;;;56085:35:0;;;-1:-1:-1;;;;;;;;;;;56085:35:0;56108:1;;56085:35;-1:-1:-1;;56308:12:0;:14;;;;;;-1:-1:-1;;53933:2408:0:o;14190:296::-;14273:7;14316:4;14273:7;14331:118;14355:5;:12;14351:1;:16;14331:118;;;14404:33;14414:12;14428:5;14434:1;14428:8;;;;;;;;:::i;:::-;;;;;;;14404:9;:33::i;:::-;14389:48;-1:-1:-1;14369:3:0;;;;:::i;:::-;;;;14331:118;;;-1:-1:-1;14466:12:0;14190:296;-1:-1:-1;;;14190:296:0:o;47495:104::-;47564:27;47574:2;47578:8;47564:27;;;;;;;;;;;;:9;:27::i;20397:149::-;20460:7;20491:1;20487;:5;:51;;20622:13;20716:15;;;20752:4;20745:15;;;20799:4;20783:21;;20487:51;;;20622:13;20716:15;;;20752:4;20745:15;;;20799:4;20783:21;;20495:20;20480:58;20397:149;-1:-1:-1;;;20397:149:0:o;47972:1749::-;48095:20;48118:13;-1:-1:-1;;;;;48146:16:0;;48142:48;;48171:19;;-1:-1:-1;;;48171:19:0;;;;;;;;;;;48142:48;48205:8;48217:1;48205:13;48201:44;;48227:18;;-1:-1:-1;;;48227:18:0;;;;;;;;;;;48201:44;-1:-1:-1;;;;;48596:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;48655:49:0;;-1:-1:-1;;;;;48596:44:0;;;;;;;48655:49;;;;-1:-1:-1;;48596:44:0;;;;;;48655:49;;;;;;;;;;;;;;;;48721:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;48771:66:0;;;-1:-1:-1;;;48821:15:0;48771:66;;;;;;;;;;;;;48721:25;;48918:23;;;;1528:19;:23;48958:631;;48998:313;49029:38;;49054:12;;-1:-1:-1;;;;;49029:38:0;;;49046:1;;-1:-1:-1;;;;;;;;;;;49029:38:0;49046:1;;49029:38;49095:69;49134:1;49138:2;49142:14;;;;;;49158:5;49095:30;:69::i;:::-;49090:174;;49200:40;;-1:-1:-1;;;49200:40:0;;;;;;;;;;;49090:174;49306:3;49291:12;:18;48998:313;;49392:12;49375:13;;:29;49371:43;;49406:8;;;49371:43;48958:631;;;49455:119;49486:40;;49511:14;;;;;-1:-1:-1;;;;;49486:40:0;;;49503:1;;-1:-1:-1;;;;;;;;;;;49486:40:0;49503:1;;49486:40;49569:3;49554:12;:18;49455:119;;48958:631;-1:-1:-1;49603:13:0;:28;;;49653:60;;49686:2;49690:12;49704:8;49653:60;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:1;;1865:42;;1855:70;;1921:1;1918;1911:12;1855:70;1758:173;;;:::o;1936:254::-;2004:6;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;2104:29;2123:9;2104:29;:::i;:::-;2094:39;2180:2;2165:18;;;;2152:32;;-1:-1:-1;;;1936:254:1:o;2195:251::-;2279:6;2332:2;2320:9;2311:7;2307:23;2303:32;2300:52;;;2348:1;2345;2338:12;2300:52;2387:7;2382:2;2371:9;2367:18;2364:31;2361:51;;;2408:1;2405;2398:12;2361:51;-1:-1:-1;2431:9:1;2195:251;-1:-1:-1;2195:251:1:o;2633:328::-;2710:6;2718;2726;2779:2;2767:9;2758:7;2754:23;2750:32;2747:52;;;2795:1;2792;2785:12;2747:52;2818:29;2837:9;2818:29;:::i;:::-;2808:39;;2866:38;2900:2;2889:9;2885:18;2866:38;:::i;:::-;2856:48;;2951:2;2940:9;2936:18;2923:32;2913:42;;2633:328;;;;;:::o;2966:592::-;3037:6;3045;3098:2;3086:9;3077:7;3073:23;3069:32;3066:52;;;3114:1;3111;3104:12;3066:52;3154:9;3141:23;-1:-1:-1;;;;;3224:2:1;3216:6;3213:14;3210:34;;;3240:1;3237;3230:12;3210:34;3278:6;3267:9;3263:22;3253:32;;3323:7;3316:4;3312:2;3308:13;3304:27;3294:55;;3345:1;3342;3335:12;3294:55;3385:2;3372:16;3411:2;3403:6;3400:14;3397:34;;;3427:1;3424;3417:12;3397:34;3472:7;3467:2;3458:6;3454:2;3450:15;3446:24;3443:37;3440:57;;;3493:1;3490;3483:12;3440:57;3524:2;3516:11;;;;;3546:6;;-1:-1:-1;2966:592:1;;-1:-1:-1;;;;2966:592:1:o;3745:186::-;3804:6;3857:2;3845:9;3836:7;3832:23;3828:32;3825:52;;;3873:1;3870;3863:12;3825:52;3896:29;3915:9;3896:29;:::i;3936:160::-;4001:20;;4057:13;;4050:21;4040:32;;4030:60;;4086:1;4083;4076:12;4101:180;4157:6;4210:2;4198:9;4189:7;4185:23;4181:32;4178:52;;;4226:1;4223;4216:12;4178:52;4249:26;4265:9;4249:26;:::i;4286:683::-;4381:6;4389;4397;4450:2;4438:9;4429:7;4425:23;4421:32;4418:52;;;4466:1;4463;4456:12;4418:52;4502:9;4489:23;4479:33;;4563:2;4552:9;4548:18;4535:32;-1:-1:-1;;;;;4627:2:1;4619:6;4616:14;4613:34;;;4643:1;4640;4633:12;4613:34;4681:6;4670:9;4666:22;4656:32;;4726:7;4719:4;4715:2;4711:13;4707:27;4697:55;;4748:1;4745;4738:12;4697:55;4788:2;4775:16;4814:2;4806:6;4803:14;4800:34;;;4830:1;4827;4820:12;4800:34;4883:7;4878:2;4868:6;4865:1;4861:14;4857:2;4853:23;4849:32;4846:45;4843:65;;;4904:1;4901;4894:12;4843:65;4935:2;4931;4927:11;4917:21;;4957:6;4947:16;;;;;4286:683;;;;;:::o;4974:632::-;5145:2;5197:21;;;5267:13;;5170:18;;;5289:22;;;5116:4;;5145:2;5368:15;;;;5342:2;5327:18;;;5116:4;5411:169;5425:6;5422:1;5419:13;5411:169;;;5486:13;;5474:26;;5555:15;;;;5520:12;;;;5447:1;5440:9;5411:169;;;-1:-1:-1;5597:3:1;;4974:632;-1:-1:-1;;;;;;4974:632:1:o;5611:127::-;5672:10;5667:3;5663:20;5660:1;5653:31;5703:4;5700:1;5693:15;5727:4;5724:1;5717:15;5743:632;5808:5;-1:-1:-1;;;;;5879:2:1;5871:6;5868:14;5865:40;;;5885:18;;:::i;:::-;5960:2;5954:9;5928:2;6014:15;;-1:-1:-1;;6010:24:1;;;6036:2;6006:33;6002:42;5990:55;;;6060:18;;;6080:22;;;6057:46;6054:72;;;6106:18;;:::i;:::-;6146:10;6142:2;6135:22;6175:6;6166:15;;6205:6;6197;6190:22;6245:3;6236:6;6231:3;6227:16;6224:25;6221:45;;;6262:1;6259;6252:12;6221:45;6312:6;6307:3;6300:4;6292:6;6288:17;6275:44;6367:1;6360:4;6351:6;6343;6339:19;6335:30;6328:41;;;;5743:632;;;;;:::o;6380:451::-;6449:6;6502:2;6490:9;6481:7;6477:23;6473:32;6470:52;;;6518:1;6515;6508:12;6470:52;6558:9;6545:23;-1:-1:-1;;;;;6583:6:1;6580:30;6577:50;;;6623:1;6620;6613:12;6577:50;6646:22;;6699:4;6691:13;;6687:27;-1:-1:-1;6677:55:1;;6728:1;6725;6718:12;6677:55;6751:74;6817:7;6812:2;6799:16;6794:2;6790;6786:11;6751:74;:::i;6836:254::-;6904:6;6912;6965:2;6953:9;6944:7;6940:23;6936:32;6933:52;;;6981:1;6978;6971:12;6933:52;7017:9;7004:23;6994:33;;7046:38;7080:2;7069:9;7065:18;7046:38;:::i;:::-;7036:48;;6836:254;;;;;:::o;7280:::-;7345:6;7353;7406:2;7394:9;7385:7;7381:23;7377:32;7374:52;;;7422:1;7419;7412:12;7374:52;7445:29;7464:9;7445:29;:::i;:::-;7435:39;;7493:35;7524:2;7513:9;7509:18;7493:35;:::i;7539:667::-;7634:6;7642;7650;7658;7711:3;7699:9;7690:7;7686:23;7682:33;7679:53;;;7728:1;7725;7718:12;7679:53;7751:29;7770:9;7751:29;:::i;:::-;7741:39;;7799:38;7833:2;7822:9;7818:18;7799:38;:::i;:::-;7789:48;;7884:2;7873:9;7869:18;7856:32;7846:42;;7939:2;7928:9;7924:18;7911:32;-1:-1:-1;;;;;7958:6:1;7955:30;7952:50;;;7998:1;7995;7988:12;7952:50;8021:22;;8074:4;8066:13;;8062:27;-1:-1:-1;8052:55:1;;8103:1;8100;8093:12;8052:55;8126:74;8192:7;8187:2;8174:16;8169:2;8165;8161:11;8126:74;:::i;:::-;8116:84;;;7539:667;;;;;;;:::o;8211:260::-;8279:6;8287;8340:2;8328:9;8319:7;8315:23;8311:32;8308:52;;;8356:1;8353;8346:12;8308:52;8379:29;8398:9;8379:29;:::i;:::-;8369:39;;8427:38;8461:2;8450:9;8446:18;8427:38;:::i;8476:380::-;8555:1;8551:12;;;;8598;;;8619:61;;8673:4;8665:6;8661:17;8651:27;;8619:61;8726:2;8718:6;8715:14;8695:18;8692:38;8689:161;;8772:10;8767:3;8763:20;8760:1;8753:31;8807:4;8804:1;8797:15;8835:4;8832:1;8825:15;8861:127;8922:10;8917:3;8913:20;8910:1;8903:31;8953:4;8950:1;8943:15;8977:4;8974:1;8967:15;9674:342;9876:2;9858:21;;;9915:2;9895:18;;;9888:30;-1:-1:-1;;;9949:2:1;9934:18;;9927:48;10007:2;9992:18;;9674:342::o;11079:353::-;11281:2;11263:21;;;11320:2;11300:18;;;11293:30;11359:31;11354:2;11339:18;;11332:59;11423:2;11408:18;;11079:353::o;11787:355::-;11989:2;11971:21;;;12028:2;12008:18;;;12001:30;12067:33;12062:2;12047:18;;12040:61;12133:2;12118:18;;11787:355::o;13076:127::-;13137:10;13132:3;13128:20;13125:1;13118:31;13168:4;13165:1;13158:15;13192:4;13189:1;13182:15;13208:128;13248:3;13279:1;13275:6;13272:1;13269:13;13266:39;;;13285:18;;:::i;:::-;-1:-1:-1;13321:9:1;;13208:128::o;14758:168::-;14798:7;14864:1;14860;14856:6;14852:14;14849:1;14846:21;14841:1;14834:9;14827:17;14823:45;14820:71;;;14871:18;;:::i;:::-;-1:-1:-1;14911:9:1;;14758:168::o;15985:125::-;16025:4;16053:1;16050;16047:8;16044:34;;;16058:18;;:::i;:::-;-1:-1:-1;16095:9:1;;15985:125::o;16115:127::-;16176:10;16171:3;16167:20;16164:1;16157:31;16207:4;16204:1;16197:15;16231:4;16228:1;16221:15;16247:120;16287:1;16313;16303:35;;16318:18;;:::i;:::-;-1:-1:-1;16352:9:1;;16247:120::o;17637:185::-;17679:3;17717:5;17711:12;17732:52;17777:6;17772:3;17765:4;17758:5;17754:16;17732:52;:::i;:::-;17800:16;;;;;17637:185;-1:-1:-1;;17637:185:1:o;17827:1306::-;18104:3;18133:1;18166:6;18160:13;18196:3;18218:1;18246:9;18242:2;18238:18;18228:28;;18306:2;18295:9;18291:18;18328;18318:61;;18372:4;18364:6;18360:17;18350:27;;18318:61;18398:2;18446;18438:6;18435:14;18415:18;18412:38;18409:165;;-1:-1:-1;;;18473:33:1;;18529:4;18526:1;18519:15;18559:4;18480:3;18547:17;18409:165;18590:18;18617:104;;;;18735:1;18730:320;;;;18583:467;;18617:104;-1:-1:-1;;18650:24:1;;18638:37;;18695:16;;;;-1:-1:-1;18617:104:1;;18730:320;17465:1;17458:14;;;17502:4;17489:18;;18825:1;18839:165;18853:6;18850:1;18847:13;18839:165;;;18931:14;;18918:11;;;18911:35;18974:16;;;;18868:10;;18839:165;;;18843:3;;19033:6;19028:3;19024:16;19017:23;;18583:467;;;;;;;19066:61;19092:34;19122:3;-1:-1:-1;;;17583:16:1;;17624:1;17615:11;;17518:114;19092:34;19084:6;19066:61;:::i;:::-;19059:68;17827:1306;-1:-1:-1;;;;;17827:1306:1:o;22025:500::-;-1:-1:-1;;;;;22294:15:1;;;22276:34;;22346:15;;22341:2;22326:18;;22319:43;22393:2;22378:18;;22371:34;;;22441:3;22436:2;22421:18;;22414:31;;;22219:4;;22462:57;;22499:19;;22491:6;22462:57;:::i;:::-;22454:65;22025:500;-1:-1:-1;;;;;;22025:500:1:o;22530:249::-;22599:6;22652:2;22640:9;22631:7;22627:23;22623:32;22620:52;;;22668:1;22665;22658:12;22620:52;22700:9;22694:16;22719:30;22743:5;22719:30;:::i;22784:135::-;22823:3;22844:17;;;22841:43;;22864:18;;:::i;:::-;-1:-1:-1;22911:1:1;22900:13;;22784:135::o;22924:112::-;22956:1;22982;22972:35;;22987:18;;:::i;:::-;-1:-1:-1;23021:9:1;;22924:112::o

Swarm Source

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