ETH Price: $3,390.97 (+1.19%)

Token

Mitaverse (MITA)
 

Overview

Max Total Supply

2,256 MITA

Holders

718

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mattomalley.eth
Balance
6 MITA
0x0f7a2eb5dfe07f58b73f2a61094bbd3541d3c520
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:
mitaverse

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-23
*/

// File: contracts/operator-filter/lib/Constants.sol


pragma solidity ^0.8.17;

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

// File: contracts/operator-filter/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}

// File: contracts/operator-filter/OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

    /// @dev The constructor that is called when the contract is being deployed.
    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// File: contracts/operator-filter/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 * @dev    Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * 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.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
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 simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _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}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _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 sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _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}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _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/[email protected]/access/IAccessControl.sol


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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

// File: @openzeppelin/[email protected]/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/[email protected]/utils/Strings.sol


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

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _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) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _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/[email protected]/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/[email protected]/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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/[email protected]/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/[email protected]/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/[email protected]/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.8.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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/[email protected]/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: @openzeppelin/[email protected]/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/[email protected]/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

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

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

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

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Burnable.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _burn(tokenId);
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/[email protected]/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// File: contracts/user-sm/mitaverse/mitaverse.sol


pragma solidity ^0.8.9;









contract mitaverse is ERC721, ERC721Enumerable, ERC721URIStorage, AccessControl, ERC721Burnable, DefaultOperatorFilterer, ERC2981 {
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

    string private metadataUri;
    string private metadataSuffix = "";
    bool private _paused;

    uint256 public maxSupply;
    uint256 public tokenId;
    address public owner;
    mapping(uint256 => uint256) public rarity;

    struct SaleInfo {
        uint256 amount;
        uint256 price;
        uint64 startTime;
        uint64 endTime;
        uint256 startId;
        bytes32 merkleRoot;
        uint256 perTx;
        uint256 perWallet;
        uint256 maxLimit;
        uint256 minted;
    }
    mapping(uint16 => SaleInfo) public saleInfos;
    mapping(uint16 => mapping(address => uint256)) public mintLogs;

    uint16 public saleInfoNum = 0;
    bool private isRevealed = false;

    event Paused(address account);
    event Unpaused(address account);

    constructor(
        string memory name,
        string memory symbol,
        uint256 _maxSupply
    ) ERC721(name, symbol) {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(PAUSER_ROLE, msg.sender);
        _grantRole(MINTER_ROLE, msg.sender);
        tokenId = 1;
        maxSupply = _maxSupply;
        owner = msg.sender;
    }

    // =============================================================
    //                        INTERNAL METHODS
    // =============================================================

    function _logMint(address addr, uint16 step, uint256 quantity)
    private 
    {
        mintLogs[step][addr] += quantity;
        saleInfos[step].minted += quantity;
    }
    function _checkIsMintable(address addr, uint16 step, uint256 quantity) 
    internal 
    returns (bool) 
    {
        if (step >= saleInfoNum) revert("Not exist mint step");
        SaleInfo memory saleInfo = saleInfos[step];
        if (block.timestamp < saleInfo.startTime) revert("Minting hasn't started yet");
        if (block.timestamp > saleInfo.endTime) revert("Minting has ended");
        if (saleInfo.amount < saleInfo.minted + quantity) revert("Sold out in this step");
        if (tokenId + quantity - 1 > maxSupply) revert("Sold out for total supply");
        if (saleInfo.maxLimit != 0 && tokenId + quantity - 1 > saleInfo.maxLimit) revert("Sold out for max limit");
        if (saleInfo.perTx != 0 && saleInfo.perTx < quantity)
            revert("Exceeds the maximum number of mints per transaction");
        if (saleInfo.perWallet != 0 && saleInfo.perWallet < mintLogs[step][addr] + quantity)
            revert("Exceeds the maximum number of mints per wallet");
        if (quantity == 0) revert("Invalid quantity");
        if (msg.sender == addr && msg.value != saleInfo.price * quantity) revert("Invalid value");
        return true;
    }
    function _beforeTokenTransfer(address from, address to, uint256 _tokenId, uint256 batchSize)
        internal
        override(ERC721, ERC721Enumerable)
    {
        if(!paused() || from == address(0)) super._beforeTokenTransfer(from, to, _tokenId, batchSize);
        else revert("Pasused");
    }
    function _burn(uint256 _tokenId) internal override(ERC721, ERC721URIStorage) 
    {
        super._burn(_tokenId);
    }
    function transferOwnership(address newOwner) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _grantRole(DEFAULT_ADMIN_ROLE, newOwner);
        _grantRole(PAUSER_ROLE, newOwner);
        _grantRole(MINTER_ROLE, newOwner);
        _revokeRole(PAUSER_ROLE, msg.sender);
        _revokeRole(MINTER_ROLE, msg.sender);
        _revokeRole(DEFAULT_ADMIN_ROLE, msg.sender);
        owner = newOwner;
    }
     function _pause() internal virtual {
        _paused = true;
        emit Paused(_msgSender());
    }
      function _unpause() internal virtual {
        _paused = false;
        emit Unpaused(_msgSender());
    }

    // =============================================================
    //                        MINT METHODS
    // =============================================================

    function airdrop(address to, uint256 amount)
        public
        onlyRole(MINTER_ROLE)
    {
        if(tokenId + amount - 1 > maxSupply) revert("Sold out for max supply");
       for(uint256 i = 0; i < amount; i++) {
        _safeMint(to, tokenId);
        tokenId++;
        }
    }

    function mint(
        uint16 step,
        uint8 amount,
        bytes32[] memory proof
    ) external payable {
        SaleInfo memory saleInfo = saleInfos[step];
        _checkIsMintable(msg.sender, step, amount);
        if (!isWhiteListed(msg.sender, proof, step)) revert("Not in whitelist");
        for(uint256 i = 0; i < amount; i++) {
        _safeMint(msg.sender, saleInfo.startId + saleInfo.minted + i);
        tokenId++;
        }
        _logMint(msg.sender, step, amount);
    }
    
    function setSaleInfoList(
        uint256[] memory amounts,
        uint256[] memory prices,
        uint64[] memory startTimes,
        uint64[] memory endTimes,
        uint256[] memory startIds,
        bytes32[] memory merkleRoots,
        uint256[] memory perTxs,
        uint256[] memory perWallets,
        uint256[] memory maxLimits,
        uint16 startIdx
    ) external onlyRole(MINTER_ROLE) {
        require(startIdx <= saleInfoNum, "startIdx is out of range");
        for (uint16 i = 0; i < amounts.length; i++)
            saleInfos[i + startIdx] = SaleInfo(
                amounts[i],
                prices[i],
                startTimes[i],
                endTimes[i],
                startIds[i],
                merkleRoots[i],
                perTxs[i],
                perWallets[i],
                maxLimits[i],
                saleInfos[i + startIdx].minted
            );
        if (startIdx + amounts.length > saleInfoNum) saleInfoNum = startIdx + uint16(amounts.length);
    }
    function isWhiteListed(
        address _account,
        bytes32[] memory _proof,
        uint16 step
    ) public view returns (bool) {
        return
            saleInfos[step].merkleRoot == 0x0 || MerkleProof.verify(_proof, saleInfos[step].merkleRoot, leaf(_account));
    }
    function leaf(address _account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(_account));
    }
    function withdraw(uint256 amount)
    public
    onlyRole(DEFAULT_ADMIN_ROLE)
    {
    payable(msg.sender).transfer(amount);
    }
    function currentTime()
    public 
    view
    returns(uint256)
    {
        return block.timestamp;
    }

    // =============================================================
    //                        TOKEN METHODS
    // =============================================================

    function tokensOfOwner(address owner_)
        public
        view
        virtual
        returns (uint256[] memory)
    {
        uint256 balance = balanceOf(owner_);
        uint256[] memory result = new uint256[](balance);
        for (uint256 i = 0; i < balance; i++) {
            result[i] = tokenOfOwnerByIndex(owner_, i);
        }
        return result;
    }

    function setMaxSupply(uint256 _amount)
    public
    onlyRole(MINTER_ROLE)
    {
        maxSupply = _amount;
    }
    function tokenURI(uint256 _tokenId) public view virtual override(ERC721, ERC721URIStorage)
    returns (string memory)
    {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (!isRevealed) return string(abi.encodePacked(metadataUri, metadataSuffix));
        return string(abi.encodePacked(metadataUri, Strings.toString(_tokenId), metadataSuffix));
    }
    function contractURI()
    public
    view
    returns (string memory)
    {
        return string(abi.encodePacked(metadataUri, "contract", metadataSuffix));
    }
    function setMetadata(string calldata _metadataUri, string calldata _metadataSuffix, bool _isReveal)
    external
    onlyRole(MINTER_ROLE)
    {
        metadataUri = _metadataUri;
        metadataSuffix = _metadataSuffix;
        isRevealed = _isReveal;
    }
    function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC721, ERC721Enumerable, AccessControl, ERC2981)
    returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
     function setApprovalForAll(address operator, bool approved) public override(ERC721, IERC721) onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    /**
     * @dev See {IERC721-approve}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function approve(address operator, uint256 _tokenId) public override(ERC721, IERC721) onlyAllowedOperatorApproval(operator) {
        super.approve(operator, _tokenId);
    }

    /**
     * @dev See {IERC721-transferFrom}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function transferFrom(address from, address to, uint256 _tokenId) public override(ERC721, IERC721) onlyAllowedOperator(from) {
        super.transferFrom(from, to, _tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function safeTransferFrom(address from, address to, uint256 _tokenId) public override(ERC721, IERC721) onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, _tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function safeTransferFrom(address from, address to, uint256 _tokenId, bytes memory data)
        public
        override(ERC721, IERC721)
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, _tokenId, data);
    }

    function pause() public onlyRole(PAUSER_ROLE)
    {
        _pause();
    }
    function unpause() public onlyRole(PAUSER_ROLE)
    {
        _unpause();
    }
    function paused() public view virtual returns (bool) {
        return _paused;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"currentTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint16","name":"step","type":"uint16"}],"name":"isWhiteListed","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":"uint16","name":"step","type":"uint16"},{"internalType":"uint8","name":"amount","type":"uint8"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"","type":"address"}],"name":"mintLogs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleInfoNum","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"saleInfos","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"perTx","type":"uint256"},{"internalType":"uint256","name":"perWallet","type":"uint256"},{"internalType":"uint256","name":"maxLimit","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadataUri","type":"string"},{"internalType":"string","name":"_metadataSuffix","type":"string"},{"internalType":"bool","name":"_isReveal","type":"bool"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"},{"internalType":"uint64[]","name":"startTimes","type":"uint64[]"},{"internalType":"uint64[]","name":"endTimes","type":"uint64[]"},{"internalType":"uint256[]","name":"startIds","type":"uint256[]"},{"internalType":"bytes32[]","name":"merkleRoots","type":"bytes32[]"},{"internalType":"uint256[]","name":"perTxs","type":"uint256[]"},{"internalType":"uint256[]","name":"perWallets","type":"uint256[]"},{"internalType":"uint256[]","name":"maxLimits","type":"uint256[]"},{"internalType":"uint16","name":"startIdx","type":"uint16"}],"name":"setSaleInfoList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405260006080908152600f906200001a9082620003a9565b506017805462ffffff191690553480156200003457600080fd5b50604051620043e3380380620043e3833981016040819052620000579162000524565b733cc6cdda760b79bafa08df41ecfa224f810dceb66001848460006200007e8382620003a9565b5060016200008d8282620003a9565b5050506daaeb6d7670e522a718067333cd4e3b15620001d55780156200012357604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200010457600080fd5b505af115801562000119573d6000803e3d6000fd5b50505050620001d5565b6001600160a01b03821615620001745760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000e9565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001bb57600080fd5b505af1158015620001d0573d6000803e3d6000fd5b505050505b50620001e590506000336200025f565b620002117f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336200025f565b6200023d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200025f565b60016012556011555050601380546001600160a01b0319163317905562000597565b6000828152600b602090815260408083206001600160a01b038516845290915290205460ff1662000300576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620002bf3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200032f57607f821691505b6020821081036200035057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a457600081815260208120601f850160051c810160208610156200037f5750805b601f850160051c820191505b81811015620003a0578281556001016200038b565b5050505b505050565b81516001600160401b03811115620003c557620003c562000304565b620003dd81620003d684546200031a565b8462000356565b602080601f831160018114620004155760008415620003fc5750858301515b600019600386901b1c1916600185901b178555620003a0565b600085815260208120601f198616915b82811015620004465788860151825594840194600190910190840162000425565b5085821015620004655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f8301126200048757600080fd5b81516001600160401b0380821115620004a457620004a462000304565b604051601f8301601f19908116603f01168101908282118183101715620004cf57620004cf62000304565b81604052838152602092508683858801011115620004ec57600080fd5b600091505b83821015620005105785820183015181830184015290820190620004f1565b600093810190920192909252949350505050565b6000806000606084860312156200053a57600080fd5b83516001600160401b03808211156200055257600080fd5b620005608783880162000475565b945060208601519150808211156200057757600080fd5b50620005868682870162000475565b925050604084015190509250925092565b613e3c80620005a76000396000f3fe6080604052600436106102935760003560e01c80636f8b44b01161015a578063bbd04845116100c1578063d5abeb011161007a578063d5abeb01146108cf578063e63ab1e9146108e5578063e8a3d48514610907578063e985e9c51461091c578063f2fde38b14610965578063f3ee5cb81461098557600080fd5b8063bbd0484514610827578063bfdf0ca71461083a578063c87b56dd1461085a578063d18e81b31461087a578063d53913931461088d578063d547741f146108af57600080fd5b80638da5cb5b116101135780638da5cb5b1461077d57806391d148541461079d57806395d89b41146107bd578063a217fddf146107d2578063a22cb465146107e7578063b88d4fde1461080757600080fd5b80636f8b44b0146106ae57806370a08231146106ce5780638456cb59146106ee5780638462151c146107035780638b58c569146107305780638ba4cc3c1461075d57600080fd5b80632e1a7d4d116101fe57806342842e0e116101b757806342842e0e1461054e57806342966c681461056e5780634f6ccce71461058e5780635c975abb146105ae5780636352211e146105c65780636dc0055a146105e657600080fd5b80632e1a7d4d146104975780632f2ff15d146104b75780632f745c59146104d757806336568abe146104f75780633f4ba83a1461051757806341f434341461052c57600080fd5b806317d70f7c1161025057806317d70f7c1461039757806318160ddd146103bb578063227d33e6146103d057806323b872dd14610408578063248a9ca3146104285780632a55205a1461045857600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b3146103275780630d0163121461034957806311f105a914610369575b600080fd5b3480156102a457600080fd5b506102b86102b3366004613130565b6109a5565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e26109b6565b6040516102c4919061319d565b3480156102fb57600080fd5b5061030f61030a3660046131b0565b610a48565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506103476103423660046131e5565b610a6f565b005b34801561035557600080fd5b506102b86103643660046132f5565b610a88565b34801561037557600080fd5b506017546103849061ffff1681565b60405161ffff90911681526020016102c4565b3480156103a357600080fd5b506103ad60125481565b6040519081526020016102c4565b3480156103c757600080fd5b506008546103ad565b3480156103dc57600080fd5b506103ad6103eb366004613352565b601660209081526000928352604080842090915290825290205481565b34801561041457600080fd5b50610347610423366004613385565b610b13565b34801561043457600080fd5b506103ad6104433660046131b0565b6000908152600b602052604090206001015490565b34801561046457600080fd5b506104786104733660046133c1565b610b3e565b604080516001600160a01b0390931683526020830191909152016102c4565b3480156104a357600080fd5b506103476104b23660046131b0565b610bec565b3480156104c357600080fd5b506103476104d23660046133e3565b610c24565b3480156104e357600080fd5b506103ad6104f23660046131e5565b610c49565b34801561050357600080fd5b506103476105123660046133e3565b610ce4565b34801561052357600080fd5b50610347610d62565b34801561053857600080fd5b5061030f6daaeb6d7670e522a718067333cd4e81565b34801561055a57600080fd5b50610347610569366004613385565b610d85565b34801561057a57600080fd5b506103476105893660046131b0565b610daa565b34801561059a57600080fd5b506103ad6105a93660046131b0565b610dda565b3480156105ba57600080fd5b5060105460ff166102b8565b3480156105d257600080fd5b5061030f6105e13660046131b0565b610e6d565b3480156105f257600080fd5b50610658610601366004613406565b601560205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600890980154969795966001600160401b0380871697600160401b9097041695908a565b604080519a8b5260208b01999099526001600160401b03978816988a0198909852959094166060880152608087019290925260a086015260c085015260e0840152610100830152610120820152610140016102c4565b3480156106ba57600080fd5b506103476106c93660046131b0565b610ecd565b3480156106da57600080fd5b506103ad6106e9366004613421565b610eeb565b3480156106fa57600080fd5b50610347610f71565b34801561070f57600080fd5b5061072361071e366004613421565b610f91565b6040516102c4919061343c565b34801561073c57600080fd5b506103ad61074b3660046131b0565b60146020526000908152604090205481565b34801561076957600080fd5b506103476107783660046131e5565b611032565b34801561078957600080fd5b5060135461030f906001600160a01b031681565b3480156107a957600080fd5b506102b86107b83660046133e3565b6110f4565b3480156107c957600080fd5b506102e261111f565b3480156107de57600080fd5b506103ad600081565b3480156107f357600080fd5b5061034761080236600461348e565b61112e565b34801561081357600080fd5b506103476108223660046134c5565b611142565b610347610835366004613584565b61116f565b34801561084657600080fd5b5061034761085536600461362a565b6112cb565b34801561086657600080fd5b506102e26108753660046131b0565b611320565b34801561088657600080fd5b50426103ad565b34801561089957600080fd5b506103ad600080516020613de783398151915281565b3480156108bb57600080fd5b506103476108ca3660046133e3565b6113f9565b3480156108db57600080fd5b506103ad60115481565b3480156108f157600080fd5b506103ad600080516020613dc783398151915281565b34801561091357600080fd5b506102e261141e565b34801561092857600080fd5b506102b86109373660046136ad565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561097157600080fd5b50610347610980366004613421565b611449565b34801561099157600080fd5b506103476109a036600461373a565b6114ed565b60006109b08261180a565b92915050565b6060600080546109c5906138b0565b80601f01602080910402602001604051908101604052809291908181526020018280546109f1906138b0565b8015610a3e5780601f10610a1357610100808354040283529160200191610a3e565b820191906000526020600020905b815481529060010190602001808311610a2157829003601f168201915b5050505050905090565b6000610a538261182f565b506000908152600460205260409020546001600160a01b031690565b81610a798161188e565b610a838383611947565b505050565b61ffff81166000908152601560205260408120600401541580610b0b575061ffff8216600090815260156020526040902060040154610b0b908490610b06876040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b611a57565b949350505050565b826001600160a01b0381163314610b2d57610b2d3361188e565b610b38848484611a6d565b50505050565b6000828152600d602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610bb3575060408051808201909152600c546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610bd2906001600160601b031687613900565b610bdc9190613917565b91519350909150505b9250929050565b6000610bf781611a9d565b604051339083156108fc029084906000818181858888f19350505050158015610a83573d6000803e3d6000fd5b6000828152600b6020526040902060010154610c3f81611a9d565b610a838383611aa7565b6000610c5483610eeb565b8210610cbb5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084015b60405180910390fd5b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610d545760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610cb2565b610d5e8282611b2d565b5050565b600080516020613dc7833981519152610d7a81611a9d565b610d82611b94565b50565b826001600160a01b0381163314610d9f57610d9f3361188e565b610b38848484611bde565b610db5335b82611bf9565b610dd15760405162461bcd60e51b8152600401610cb290613939565b610d8281611c77565b6000610de560085490565b8210610e485760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610cb2565b60088281548110610e5b57610e5b613986565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806109b05760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610cb2565b600080516020613de7833981519152610ee581611a9d565b50601155565b60006001600160a01b038216610f555760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610cb2565b506001600160a01b031660009081526003602052604090205490565b600080516020613dc7833981519152610f8981611a9d565b610d82611c80565b60606000610f9e83610eeb565b90506000816001600160401b03811115610fba57610fba61320f565b604051908082528060200260200182016040528015610fe3578160200160208202803683370190505b50905060005b8281101561102a57610ffb8582610c49565b82828151811061100d5761100d613986565b6020908102919091010152806110228161399c565b915050610fe9565b509392505050565b600080516020613de783398151915261104a81611a9d565b60115460018360125461105d91906139b5565b61106791906139c8565b11156110b55760405162461bcd60e51b815260206004820152601760248201527f536f6c64206f757420666f72206d617820737570706c790000000000000000006044820152606401610cb2565b60005b82811015610b38576110cc84601254611cb5565b601280549060006110dc8361399c565b919050555080806110ec9061399c565b9150506110b8565b6000918252600b602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600180546109c5906138b0565b816111388161188e565b610a838383611ccf565b836001600160a01b038116331461115c5761115c3361188e565b61116885858585611cda565b5050505050565b61ffff83166000908152601560209081526040918290208251610140810184528154815260018201549281019290925260028101546001600160401b0380821694840194909452600160401b9004909216606082015260038201546080820152600482015460a0820152600582015460c0820152600682015460e08201526007820154610100820152600890910154610120820152611212338560ff8616611d0c565b5061121e338386610a88565b61125d5760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b6044820152606401610cb2565b60005b8360ff168110156112bc576112943382846101200151856080015161128591906139b5565b61128f91906139b5565b611cb5565b601280549060006112a48361399c565b919050555080806112b49061399c565b915050611260565b50610b3833858560ff166121a8565b600080516020613de78339815191526112e381611a9d565b600e6112f0868883613a29565b50600f6112fe848683613a29565b505060178054911515620100000262ff00001990921691909117905550505050565b6000818152600260205260409020546060906001600160a01b031661139f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610cb2565b60175462010000900460ff166113da57600e600f6040516020016113c4929190613b5b565b6040516020818303038152906040529050919050565b600e6113e583612214565b600f6040516020016113c493929190613b70565b6000828152600b602052604090206001015461141481611a9d565b610a838383611b2d565b6060600e600f604051602001611435929190613ba3565b604051602081830303815290604052905090565b600061145481611a9d565b61145f600083611aa7565b611477600080516020613dc783398151915283611aa7565b61148f600080516020613de783398151915283611aa7565b6114a7600080516020613dc783398151915233611b2d565b6114bf600080516020613de783398151915233611b2d565b6114ca600033611b2d565b50601380546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020613de783398151915261150581611a9d565b60175461ffff908116908316111561155f5760405162461bcd60e51b815260206004820152601860248201527f7374617274496478206973206f7574206f662072616e676500000000000000006044820152606401610cb2565b60005b8b518161ffff1610156117bb576040518061014001604052808d8361ffff168151811061159157611591613986565b602002602001015181526020018c8361ffff16815181106115b4576115b4613986565b602002602001015181526020018b8361ffff16815181106115d7576115d7613986565b60200260200101516001600160401b031681526020018a8361ffff168151811061160357611603613986565b60200260200101516001600160401b03168152602001898361ffff168151811061162f5761162f613986565b60200260200101518152602001888361ffff168151811061165257611652613986565b60200260200101518152602001878361ffff168151811061167557611675613986565b60200260200101518152602001868361ffff168151811061169857611698613986565b60200260200101518152602001858361ffff16815181106116bb576116bb613986565b602002602001015181526020016015600086856116d89190613bd3565b61ffff1661ffff168152602001908152602001600020600801548152506015600085846117059190613bd3565b61ffff16815260208082019290925260409081016000208351815591830151600183015582015160028201805460608501516001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff199092169316929092179190911790556080820151600382015560a0820151600482015560c0820151600582015560e08201516006820155610100820151600782015561012090910151600890910155806117b381613bf5565b915050611562565b506017548b5161ffff918216916117d4919085166139b5565b11156117fd578a516117e69083613bd3565b6017805461ffff191661ffff929092169190911790555b5050505050505050505050565b60006001600160e01b0319821663152a902d60e11b14806109b057506109b0826122a6565b6000818152600260205260409020546001600160a01b0316610d825760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610cb2565b6daaeb6d7670e522a718067333cd4e3b15610d8257604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156118fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191f9190613c16565b610d8257604051633b79c77360e21b81526001600160a01b0382166004820152602401610cb2565b600061195282610e6d565b9050806001600160a01b0316836001600160a01b0316036119bf5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610cb2565b336001600160a01b03821614806119db57506119db8133610937565b611a4d5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610cb2565b610a8383836122cb565b600082611a648584612339565b14949350505050565b611a7633610daf565b611a925760405162461bcd60e51b8152600401610cb290613939565b610a8383838361237e565b610d8281336124ef565b611ab182826110f4565b610d5e576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611ae93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611b3782826110f4565b15610d5e576000828152600b602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6010805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610a8383838360405180602001604052806000815250611142565b600080611c0583610e6d565b9050806001600160a01b0316846001600160a01b03161480611c4c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610b0b5750836001600160a01b0316611c6584610a48565b6001600160a01b031614949350505050565b610d8281612548565b6010805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611bc13390565b610d5e828260405180602001604052806000815250612588565b610d5e3383836125bb565b611ce43383611bf9565b611d005760405162461bcd60e51b8152600401610cb290613939565b610b3884848484612689565b60175460009061ffff90811690841610611d5e5760405162461bcd60e51b815260206004820152601360248201527204e6f74206578697374206d696e74207374657606c1b6044820152606401610cb2565b61ffff83166000908152601560209081526040918290208251610140810184528154815260018201549281019290925260028101546001600160401b03808216948401859052600160401b90910416606083015260038101546080830152600481015460a0830152600581015460c0830152600681015460e083015260078101546101008301526008015461012082015290421015611e3f5760405162461bcd60e51b815260206004820152601a60248201527f4d696e74696e67206861736e27742073746172746564207965740000000000006044820152606401610cb2565b80606001516001600160401b0316421115611e905760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a185cc8195b991959607a1b6044820152606401610cb2565b82816101200151611ea191906139b5565b81511015611ee95760405162461bcd60e51b81526020600482015260156024820152740536f6c64206f757420696e2074686973207374657605c1b6044820152606401610cb2565b601154600184601254611efc91906139b5565b611f0691906139c8565b1115611f545760405162461bcd60e51b815260206004820152601960248201527f536f6c64206f757420666f7220746f74616c20737570706c79000000000000006044820152606401610cb2565b61010081015115801590611f855750806101000151600184601254611f7991906139b5565b611f8391906139c8565b115b15611fcb5760405162461bcd60e51b815260206004820152601660248201527514dbdb19081bdd5d08199bdc881b585e081b1a5b5a5d60521b6044820152606401610cb2565b60c081015115801590611fe15750828160c00151105b1561204a5760405162461bcd60e51b815260206004820152603360248201527f4578636565647320746865206d6178696d756d206e756d626572206f66206d69604482015272373a39903832b9103a3930b739b0b1ba34b7b760691b6064820152608401610cb2565b60e081015115801590612092575061ffff841660009081526016602090815260408083206001600160a01b038916845290915290205461208b9084906139b5565b8160e00151105b156120f65760405162461bcd60e51b815260206004820152602e60248201527f4578636565647320746865206d6178696d756d206e756d626572206f66206d6960448201526d1b9d1cc81c195c881dd85b1b195d60921b6064820152608401610cb2565b826000036121395760405162461bcd60e51b815260206004820152601060248201526f496e76616c6964207175616e7469747960801b6044820152606401610cb2565b336001600160a01b038616148015612160575082816020015161215c9190613900565b3414155b1561219d5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b6044820152606401610cb2565b506001949350505050565b61ffff821660009081526016602090815260408083206001600160a01b0387168452909152812080548392906121df9084906139b5565b909155505061ffff82166000908152601560205260408120600801805483929061220a9084906139b5565b9091555050505050565b60606000612221836126bc565b60010190506000816001600160401b038111156122405761224061320f565b6040519080825280601f01601f19166020018201604052801561226a576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461227457509392505050565b60006001600160e01b03198216637965db0b60e01b14806109b057506109b082612794565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061230082610e6d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815b845181101561102a5761236a8286838151811061235d5761235d613986565b60200260200101516127b9565b9150806123768161399c565b91505061233e565b826001600160a01b031661239182610e6d565b6001600160a01b0316146123b75760405162461bcd60e51b8152600401610cb290613c33565b6001600160a01b0382166124195760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610cb2565b61242683838360016127eb565b826001600160a01b031661243982610e6d565b6001600160a01b03161461245f5760405162461bcd60e51b8152600401610cb290613c33565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6124f982826110f4565b610d5e576125068161284c565b61251183602061285e565b604051602001612522929190613c78565b60408051601f198184030181529082905262461bcd60e51b8252610cb29160040161319d565b612551816129f9565b6000818152600a60205260409020805461256a906138b0565b159050610d82576000818152600a60205260408120610d82916130cc565b6125928383612a9c565b61259f6000848484612c35565b610a835760405162461bcd60e51b8152600401610cb290613ced565b816001600160a01b0316836001600160a01b03160361261c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610cb2565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61269484848461237e565b6126a084848484612c35565b610b385760405162461bcd60e51b8152600401610cb290613ced565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106126fb5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612727576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061274557662386f26fc10000830492506010015b6305f5e100831061275d576305f5e100830492506008015b612710831061277157612710830492506004015b60648310612783576064830492506002015b600a83106109b05760010192915050565b60006001600160e01b0319821663780e9d6360e01b14806109b057506109b082612d2b565b60008183106127d55760008281526020849052604090206127e4565b60008381526020839052604090205b9392505050565b60105460ff16158061280457506001600160a01b038416155b1561281a5761281584848484612d7b565b610b38565b60405162461bcd60e51b815260206004820152600760248201526614185cdd5cd95960ca1b6044820152606401610cb2565b60606109b06001600160a01b03831660145b6060600061286d836002613900565b6128789060026139b5565b6001600160401b0381111561288f5761288f61320f565b6040519080825280601f01601f1916602001820160405280156128b9576020820181803683370190505b509050600360fc1b816000815181106128d4576128d4613986565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061290357612903613986565b60200101906001600160f81b031916908160001a9053506000612927846002613900565b6129329060016139b5565b90505b60018111156129aa576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061296657612966613986565b1a60f81b82828151811061297c5761297c613986565b60200101906001600160f81b031916908160001a90535060049490941c936129a381613d3f565b9050612935565b5083156127e45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610cb2565b6000612a0482610e6d565b9050612a148160008460016127eb565b612a1d82610e6d565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038216612af25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cb2565b6000818152600260205260409020546001600160a01b031615612b575760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cb2565b612b656000838360016127eb565b6000818152600260205260409020546001600160a01b031615612bca5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cb2565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561219d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c79903390899088908890600401613d56565b6020604051808303816000875af1925050508015612cb4575060408051601f3d908101601f19168201909252612cb191810190613d93565b60015b612d11573d808015612ce2576040519150601f19603f3d011682016040523d82523d6000602084013e612ce7565b606091505b508051600003612d095760405162461bcd60e51b8152600401610cb290613ced565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610b0b565b60006001600160e01b031982166380ac58cd60e01b1480612d5c57506001600160e01b03198216635b5e139f60e01b145b806109b057506301ffc9a760e01b6001600160e01b03198316146109b0565b612d8784848484612eb4565b6001811115612df65760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610cb2565b816001600160a01b038516612e5257612e4d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612e75565b836001600160a01b0316856001600160a01b031614612e7557612e758582612f3c565b6001600160a01b038416612e9157612e8c81612fd9565b611168565b846001600160a01b0316846001600160a01b031614611168576111688482613088565b6001811115610b38576001600160a01b03841615612efa576001600160a01b03841660009081526003602052604081208054839290612ef49084906139c8565b90915550505b6001600160a01b03831615610b38576001600160a01b03831660009081526003602052604081208054839290612f319084906139b5565b909155505050505050565b60006001612f4984610eeb565b612f5391906139c8565b600083815260076020526040902054909150808214612fa6576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612feb906001906139c8565b6000838152600960205260408120546008805493945090928490811061301357613013613986565b90600052602060002001549050806008838154811061303457613034613986565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061306c5761306c613db0565b6001900381819060005260206000200160009055905550505050565b600061309383610eeb565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b5080546130d8906138b0565b6000825580601f106130e8575050565b601f016020900490600052602060002090810190610d8291905b808211156131165760008155600101613102565b5090565b6001600160e01b031981168114610d8257600080fd5b60006020828403121561314257600080fd5b81356127e48161311a565b60005b83811015613168578181015183820152602001613150565b50506000910152565b6000815180845261318981602086016020860161314d565b601f01601f19169290920160200192915050565b6020815260006127e46020830184613171565b6000602082840312156131c257600080fd5b5035919050565b80356001600160a01b03811681146131e057600080fd5b919050565b600080604083850312156131f857600080fd5b613201836131c9565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561324d5761324d61320f565b604052919050565b60006001600160401b0382111561326e5761326e61320f565b5060051b60200190565b600082601f83011261328957600080fd5b8135602061329e61329983613255565b613225565b82815260059290921b840181019181810190868411156132bd57600080fd5b8286015b848110156132d857803583529183019183016132c1565b509695505050505050565b803561ffff811681146131e057600080fd5b60008060006060848603121561330a57600080fd5b613313846131c9565b925060208401356001600160401b0381111561332e57600080fd5b61333a86828701613278565b925050613349604085016132e3565b90509250925092565b6000806040838503121561336557600080fd5b61336e836132e3565b915061337c602084016131c9565b90509250929050565b60008060006060848603121561339a57600080fd5b6133a3846131c9565b92506133b1602085016131c9565b9150604084013590509250925092565b600080604083850312156133d457600080fd5b50508035926020909101359150565b600080604083850312156133f657600080fd5b8235915061337c602084016131c9565b60006020828403121561341857600080fd5b6127e4826132e3565b60006020828403121561343357600080fd5b6127e4826131c9565b6020808252825182820181905260009190848201906040850190845b8181101561347457835183529284019291840191600101613458565b50909695505050505050565b8015158114610d8257600080fd5b600080604083850312156134a157600080fd5b6134aa836131c9565b915060208301356134ba81613480565b809150509250929050565b600080600080608085870312156134db57600080fd5b6134e4856131c9565b935060206134f38187016131c9565b93506040860135925060608601356001600160401b038082111561351657600080fd5b818801915088601f83011261352a57600080fd5b81358181111561353c5761353c61320f565b61354e601f8201601f19168501613225565b9150808252898482850101111561356457600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060006060848603121561359957600080fd5b6135a2846132e3565b9250602084013560ff811681146135b857600080fd5b915060408401356001600160401b038111156135d357600080fd5b6135df86828701613278565b9150509250925092565b60008083601f8401126135fb57600080fd5b5081356001600160401b0381111561361257600080fd5b602083019150836020828501011115610be557600080fd5b60008060008060006060868803121561364257600080fd5b85356001600160401b038082111561365957600080fd5b61366589838a016135e9565b9097509550602088013591508082111561367e57600080fd5b5061368b888289016135e9565b909450925050604086013561369f81613480565b809150509295509295909350565b600080604083850312156136c057600080fd5b61336e836131c9565b600082601f8301126136da57600080fd5b813560206136ea61329983613255565b82815260059290921b8401810191818101908684111561370957600080fd5b8286015b848110156132d85780356001600160401b038116811461372d5760008081fd5b835291830191830161370d565b6000806000806000806000806000806101408b8d03121561375a57600080fd5b8a356001600160401b038082111561377157600080fd5b61377d8e838f01613278565b9b5060208d013591508082111561379357600080fd5b61379f8e838f01613278565b9a5060408d01359150808211156137b557600080fd5b6137c18e838f016136c9565b995060608d01359150808211156137d757600080fd5b6137e38e838f016136c9565b985060808d01359150808211156137f957600080fd5b6138058e838f01613278565b975060a08d013591508082111561381b57600080fd5b6138278e838f01613278565b965060c08d013591508082111561383d57600080fd5b6138498e838f01613278565b955060e08d013591508082111561385f57600080fd5b61386b8e838f01613278565b94506101008d013591508082111561388257600080fd5b5061388f8d828e01613278565b92505061389f6101208c016132e3565b90509295989b9194979a5092959850565b600181811c908216806138c457607f821691505b6020821081036138e457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109b0576109b06138ea565b60008261393457634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000600182016139ae576139ae6138ea565b5060010190565b808201808211156109b0576109b06138ea565b818103818111156109b0576109b06138ea565b601f821115610a8357600081815260208120601f850160051c81016020861015613a025750805b601f850160051c820191505b81811015613a2157828155600101613a0e565b505050505050565b6001600160401b03831115613a4057613a4061320f565b613a5483613a4e83546138b0565b836139db565b6000601f841160018114613a885760008515613a705750838201355b600019600387901b1c1916600186901b178355611168565b600083815260209020601f19861690835b82811015613ab95786850135825560209485019460019092019101613a99565b5086821015613ad65760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008154613af5816138b0565b60018281168015613b0d5760018114613b2257613b51565b60ff1984168752821515830287019450613b51565b8560005260208060002060005b85811015613b485781548a820152908401908201613b2f565b50505082870194505b5050505092915050565b6000610b0b613b6a8386613ae8565b84613ae8565b6000613b7c8286613ae8565b8451613b8c81836020890161314d565b613b9881830186613ae8565b979650505050505050565b6000613baf8285613ae8565b6718dbdb9d1c9858dd60c21b8152613bca6008820185613ae8565b95945050505050565b61ffff818116838216019080821115613bee57613bee6138ea565b5092915050565b600061ffff808316818103613c0c57613c0c6138ea565b6001019392505050565b600060208284031215613c2857600080fd5b81516127e481613480565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613cb081601785016020880161314d565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613ce181602884016020880161314d565b01602801949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081613d4e57613d4e6138ea565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d8990830184613171565b9695505050505050565b600060208284031215613da557600080fd5b81516127e48161311a565b634e487b7160e01b600052603160045260246000fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a2646970667358221220a100bb874d036e52d53aa251c32495a8e57552d1f58b4c7750fe7871e91a93cd64736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000094d6974617665727365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d49544100000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102935760003560e01c80636f8b44b01161015a578063bbd04845116100c1578063d5abeb011161007a578063d5abeb01146108cf578063e63ab1e9146108e5578063e8a3d48514610907578063e985e9c51461091c578063f2fde38b14610965578063f3ee5cb81461098557600080fd5b8063bbd0484514610827578063bfdf0ca71461083a578063c87b56dd1461085a578063d18e81b31461087a578063d53913931461088d578063d547741f146108af57600080fd5b80638da5cb5b116101135780638da5cb5b1461077d57806391d148541461079d57806395d89b41146107bd578063a217fddf146107d2578063a22cb465146107e7578063b88d4fde1461080757600080fd5b80636f8b44b0146106ae57806370a08231146106ce5780638456cb59146106ee5780638462151c146107035780638b58c569146107305780638ba4cc3c1461075d57600080fd5b80632e1a7d4d116101fe57806342842e0e116101b757806342842e0e1461054e57806342966c681461056e5780634f6ccce71461058e5780635c975abb146105ae5780636352211e146105c65780636dc0055a146105e657600080fd5b80632e1a7d4d146104975780632f2ff15d146104b75780632f745c59146104d757806336568abe146104f75780633f4ba83a1461051757806341f434341461052c57600080fd5b806317d70f7c1161025057806317d70f7c1461039757806318160ddd146103bb578063227d33e6146103d057806323b872dd14610408578063248a9ca3146104285780632a55205a1461045857600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b3146103275780630d0163121461034957806311f105a914610369575b600080fd5b3480156102a457600080fd5b506102b86102b3366004613130565b6109a5565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e26109b6565b6040516102c4919061319d565b3480156102fb57600080fd5b5061030f61030a3660046131b0565b610a48565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506103476103423660046131e5565b610a6f565b005b34801561035557600080fd5b506102b86103643660046132f5565b610a88565b34801561037557600080fd5b506017546103849061ffff1681565b60405161ffff90911681526020016102c4565b3480156103a357600080fd5b506103ad60125481565b6040519081526020016102c4565b3480156103c757600080fd5b506008546103ad565b3480156103dc57600080fd5b506103ad6103eb366004613352565b601660209081526000928352604080842090915290825290205481565b34801561041457600080fd5b50610347610423366004613385565b610b13565b34801561043457600080fd5b506103ad6104433660046131b0565b6000908152600b602052604090206001015490565b34801561046457600080fd5b506104786104733660046133c1565b610b3e565b604080516001600160a01b0390931683526020830191909152016102c4565b3480156104a357600080fd5b506103476104b23660046131b0565b610bec565b3480156104c357600080fd5b506103476104d23660046133e3565b610c24565b3480156104e357600080fd5b506103ad6104f23660046131e5565b610c49565b34801561050357600080fd5b506103476105123660046133e3565b610ce4565b34801561052357600080fd5b50610347610d62565b34801561053857600080fd5b5061030f6daaeb6d7670e522a718067333cd4e81565b34801561055a57600080fd5b50610347610569366004613385565b610d85565b34801561057a57600080fd5b506103476105893660046131b0565b610daa565b34801561059a57600080fd5b506103ad6105a93660046131b0565b610dda565b3480156105ba57600080fd5b5060105460ff166102b8565b3480156105d257600080fd5b5061030f6105e13660046131b0565b610e6d565b3480156105f257600080fd5b50610658610601366004613406565b601560205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600890980154969795966001600160401b0380871697600160401b9097041695908a565b604080519a8b5260208b01999099526001600160401b03978816988a0198909852959094166060880152608087019290925260a086015260c085015260e0840152610100830152610120820152610140016102c4565b3480156106ba57600080fd5b506103476106c93660046131b0565b610ecd565b3480156106da57600080fd5b506103ad6106e9366004613421565b610eeb565b3480156106fa57600080fd5b50610347610f71565b34801561070f57600080fd5b5061072361071e366004613421565b610f91565b6040516102c4919061343c565b34801561073c57600080fd5b506103ad61074b3660046131b0565b60146020526000908152604090205481565b34801561076957600080fd5b506103476107783660046131e5565b611032565b34801561078957600080fd5b5060135461030f906001600160a01b031681565b3480156107a957600080fd5b506102b86107b83660046133e3565b6110f4565b3480156107c957600080fd5b506102e261111f565b3480156107de57600080fd5b506103ad600081565b3480156107f357600080fd5b5061034761080236600461348e565b61112e565b34801561081357600080fd5b506103476108223660046134c5565b611142565b610347610835366004613584565b61116f565b34801561084657600080fd5b5061034761085536600461362a565b6112cb565b34801561086657600080fd5b506102e26108753660046131b0565b611320565b34801561088657600080fd5b50426103ad565b34801561089957600080fd5b506103ad600080516020613de783398151915281565b3480156108bb57600080fd5b506103476108ca3660046133e3565b6113f9565b3480156108db57600080fd5b506103ad60115481565b3480156108f157600080fd5b506103ad600080516020613dc783398151915281565b34801561091357600080fd5b506102e261141e565b34801561092857600080fd5b506102b86109373660046136ad565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561097157600080fd5b50610347610980366004613421565b611449565b34801561099157600080fd5b506103476109a036600461373a565b6114ed565b60006109b08261180a565b92915050565b6060600080546109c5906138b0565b80601f01602080910402602001604051908101604052809291908181526020018280546109f1906138b0565b8015610a3e5780601f10610a1357610100808354040283529160200191610a3e565b820191906000526020600020905b815481529060010190602001808311610a2157829003601f168201915b5050505050905090565b6000610a538261182f565b506000908152600460205260409020546001600160a01b031690565b81610a798161188e565b610a838383611947565b505050565b61ffff81166000908152601560205260408120600401541580610b0b575061ffff8216600090815260156020526040902060040154610b0b908490610b06876040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b611a57565b949350505050565b826001600160a01b0381163314610b2d57610b2d3361188e565b610b38848484611a6d565b50505050565b6000828152600d602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610bb3575060408051808201909152600c546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610bd2906001600160601b031687613900565b610bdc9190613917565b91519350909150505b9250929050565b6000610bf781611a9d565b604051339083156108fc029084906000818181858888f19350505050158015610a83573d6000803e3d6000fd5b6000828152600b6020526040902060010154610c3f81611a9d565b610a838383611aa7565b6000610c5483610eeb565b8210610cbb5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084015b60405180910390fd5b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610d545760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610cb2565b610d5e8282611b2d565b5050565b600080516020613dc7833981519152610d7a81611a9d565b610d82611b94565b50565b826001600160a01b0381163314610d9f57610d9f3361188e565b610b38848484611bde565b610db5335b82611bf9565b610dd15760405162461bcd60e51b8152600401610cb290613939565b610d8281611c77565b6000610de560085490565b8210610e485760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610cb2565b60088281548110610e5b57610e5b613986565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806109b05760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610cb2565b600080516020613de7833981519152610ee581611a9d565b50601155565b60006001600160a01b038216610f555760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610cb2565b506001600160a01b031660009081526003602052604090205490565b600080516020613dc7833981519152610f8981611a9d565b610d82611c80565b60606000610f9e83610eeb565b90506000816001600160401b03811115610fba57610fba61320f565b604051908082528060200260200182016040528015610fe3578160200160208202803683370190505b50905060005b8281101561102a57610ffb8582610c49565b82828151811061100d5761100d613986565b6020908102919091010152806110228161399c565b915050610fe9565b509392505050565b600080516020613de783398151915261104a81611a9d565b60115460018360125461105d91906139b5565b61106791906139c8565b11156110b55760405162461bcd60e51b815260206004820152601760248201527f536f6c64206f757420666f72206d617820737570706c790000000000000000006044820152606401610cb2565b60005b82811015610b38576110cc84601254611cb5565b601280549060006110dc8361399c565b919050555080806110ec9061399c565b9150506110b8565b6000918252600b602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600180546109c5906138b0565b816111388161188e565b610a838383611ccf565b836001600160a01b038116331461115c5761115c3361188e565b61116885858585611cda565b5050505050565b61ffff83166000908152601560209081526040918290208251610140810184528154815260018201549281019290925260028101546001600160401b0380821694840194909452600160401b9004909216606082015260038201546080820152600482015460a0820152600582015460c0820152600682015460e08201526007820154610100820152600890910154610120820152611212338560ff8616611d0c565b5061121e338386610a88565b61125d5760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b6044820152606401610cb2565b60005b8360ff168110156112bc576112943382846101200151856080015161128591906139b5565b61128f91906139b5565b611cb5565b601280549060006112a48361399c565b919050555080806112b49061399c565b915050611260565b50610b3833858560ff166121a8565b600080516020613de78339815191526112e381611a9d565b600e6112f0868883613a29565b50600f6112fe848683613a29565b505060178054911515620100000262ff00001990921691909117905550505050565b6000818152600260205260409020546060906001600160a01b031661139f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610cb2565b60175462010000900460ff166113da57600e600f6040516020016113c4929190613b5b565b6040516020818303038152906040529050919050565b600e6113e583612214565b600f6040516020016113c493929190613b70565b6000828152600b602052604090206001015461141481611a9d565b610a838383611b2d565b6060600e600f604051602001611435929190613ba3565b604051602081830303815290604052905090565b600061145481611a9d565b61145f600083611aa7565b611477600080516020613dc783398151915283611aa7565b61148f600080516020613de783398151915283611aa7565b6114a7600080516020613dc783398151915233611b2d565b6114bf600080516020613de783398151915233611b2d565b6114ca600033611b2d565b50601380546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020613de783398151915261150581611a9d565b60175461ffff908116908316111561155f5760405162461bcd60e51b815260206004820152601860248201527f7374617274496478206973206f7574206f662072616e676500000000000000006044820152606401610cb2565b60005b8b518161ffff1610156117bb576040518061014001604052808d8361ffff168151811061159157611591613986565b602002602001015181526020018c8361ffff16815181106115b4576115b4613986565b602002602001015181526020018b8361ffff16815181106115d7576115d7613986565b60200260200101516001600160401b031681526020018a8361ffff168151811061160357611603613986565b60200260200101516001600160401b03168152602001898361ffff168151811061162f5761162f613986565b60200260200101518152602001888361ffff168151811061165257611652613986565b60200260200101518152602001878361ffff168151811061167557611675613986565b60200260200101518152602001868361ffff168151811061169857611698613986565b60200260200101518152602001858361ffff16815181106116bb576116bb613986565b602002602001015181526020016015600086856116d89190613bd3565b61ffff1661ffff168152602001908152602001600020600801548152506015600085846117059190613bd3565b61ffff16815260208082019290925260409081016000208351815591830151600183015582015160028201805460608501516001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff199092169316929092179190911790556080820151600382015560a0820151600482015560c0820151600582015560e08201516006820155610100820151600782015561012090910151600890910155806117b381613bf5565b915050611562565b506017548b5161ffff918216916117d4919085166139b5565b11156117fd578a516117e69083613bd3565b6017805461ffff191661ffff929092169190911790555b5050505050505050505050565b60006001600160e01b0319821663152a902d60e11b14806109b057506109b0826122a6565b6000818152600260205260409020546001600160a01b0316610d825760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610cb2565b6daaeb6d7670e522a718067333cd4e3b15610d8257604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156118fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191f9190613c16565b610d8257604051633b79c77360e21b81526001600160a01b0382166004820152602401610cb2565b600061195282610e6d565b9050806001600160a01b0316836001600160a01b0316036119bf5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610cb2565b336001600160a01b03821614806119db57506119db8133610937565b611a4d5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610cb2565b610a8383836122cb565b600082611a648584612339565b14949350505050565b611a7633610daf565b611a925760405162461bcd60e51b8152600401610cb290613939565b610a8383838361237e565b610d8281336124ef565b611ab182826110f4565b610d5e576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611ae93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611b3782826110f4565b15610d5e576000828152600b602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6010805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610a8383838360405180602001604052806000815250611142565b600080611c0583610e6d565b9050806001600160a01b0316846001600160a01b03161480611c4c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610b0b5750836001600160a01b0316611c6584610a48565b6001600160a01b031614949350505050565b610d8281612548565b6010805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611bc13390565b610d5e828260405180602001604052806000815250612588565b610d5e3383836125bb565b611ce43383611bf9565b611d005760405162461bcd60e51b8152600401610cb290613939565b610b3884848484612689565b60175460009061ffff90811690841610611d5e5760405162461bcd60e51b815260206004820152601360248201527204e6f74206578697374206d696e74207374657606c1b6044820152606401610cb2565b61ffff83166000908152601560209081526040918290208251610140810184528154815260018201549281019290925260028101546001600160401b03808216948401859052600160401b90910416606083015260038101546080830152600481015460a0830152600581015460c0830152600681015460e083015260078101546101008301526008015461012082015290421015611e3f5760405162461bcd60e51b815260206004820152601a60248201527f4d696e74696e67206861736e27742073746172746564207965740000000000006044820152606401610cb2565b80606001516001600160401b0316421115611e905760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a185cc8195b991959607a1b6044820152606401610cb2565b82816101200151611ea191906139b5565b81511015611ee95760405162461bcd60e51b81526020600482015260156024820152740536f6c64206f757420696e2074686973207374657605c1b6044820152606401610cb2565b601154600184601254611efc91906139b5565b611f0691906139c8565b1115611f545760405162461bcd60e51b815260206004820152601960248201527f536f6c64206f757420666f7220746f74616c20737570706c79000000000000006044820152606401610cb2565b61010081015115801590611f855750806101000151600184601254611f7991906139b5565b611f8391906139c8565b115b15611fcb5760405162461bcd60e51b815260206004820152601660248201527514dbdb19081bdd5d08199bdc881b585e081b1a5b5a5d60521b6044820152606401610cb2565b60c081015115801590611fe15750828160c00151105b1561204a5760405162461bcd60e51b815260206004820152603360248201527f4578636565647320746865206d6178696d756d206e756d626572206f66206d69604482015272373a39903832b9103a3930b739b0b1ba34b7b760691b6064820152608401610cb2565b60e081015115801590612092575061ffff841660009081526016602090815260408083206001600160a01b038916845290915290205461208b9084906139b5565b8160e00151105b156120f65760405162461bcd60e51b815260206004820152602e60248201527f4578636565647320746865206d6178696d756d206e756d626572206f66206d6960448201526d1b9d1cc81c195c881dd85b1b195d60921b6064820152608401610cb2565b826000036121395760405162461bcd60e51b815260206004820152601060248201526f496e76616c6964207175616e7469747960801b6044820152606401610cb2565b336001600160a01b038616148015612160575082816020015161215c9190613900565b3414155b1561219d5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b6044820152606401610cb2565b506001949350505050565b61ffff821660009081526016602090815260408083206001600160a01b0387168452909152812080548392906121df9084906139b5565b909155505061ffff82166000908152601560205260408120600801805483929061220a9084906139b5565b9091555050505050565b60606000612221836126bc565b60010190506000816001600160401b038111156122405761224061320f565b6040519080825280601f01601f19166020018201604052801561226a576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461227457509392505050565b60006001600160e01b03198216637965db0b60e01b14806109b057506109b082612794565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061230082610e6d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815b845181101561102a5761236a8286838151811061235d5761235d613986565b60200260200101516127b9565b9150806123768161399c565b91505061233e565b826001600160a01b031661239182610e6d565b6001600160a01b0316146123b75760405162461bcd60e51b8152600401610cb290613c33565b6001600160a01b0382166124195760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610cb2565b61242683838360016127eb565b826001600160a01b031661243982610e6d565b6001600160a01b03161461245f5760405162461bcd60e51b8152600401610cb290613c33565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6124f982826110f4565b610d5e576125068161284c565b61251183602061285e565b604051602001612522929190613c78565b60408051601f198184030181529082905262461bcd60e51b8252610cb29160040161319d565b612551816129f9565b6000818152600a60205260409020805461256a906138b0565b159050610d82576000818152600a60205260408120610d82916130cc565b6125928383612a9c565b61259f6000848484612c35565b610a835760405162461bcd60e51b8152600401610cb290613ced565b816001600160a01b0316836001600160a01b03160361261c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610cb2565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61269484848461237e565b6126a084848484612c35565b610b385760405162461bcd60e51b8152600401610cb290613ced565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106126fb5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612727576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061274557662386f26fc10000830492506010015b6305f5e100831061275d576305f5e100830492506008015b612710831061277157612710830492506004015b60648310612783576064830492506002015b600a83106109b05760010192915050565b60006001600160e01b0319821663780e9d6360e01b14806109b057506109b082612d2b565b60008183106127d55760008281526020849052604090206127e4565b60008381526020839052604090205b9392505050565b60105460ff16158061280457506001600160a01b038416155b1561281a5761281584848484612d7b565b610b38565b60405162461bcd60e51b815260206004820152600760248201526614185cdd5cd95960ca1b6044820152606401610cb2565b60606109b06001600160a01b03831660145b6060600061286d836002613900565b6128789060026139b5565b6001600160401b0381111561288f5761288f61320f565b6040519080825280601f01601f1916602001820160405280156128b9576020820181803683370190505b509050600360fc1b816000815181106128d4576128d4613986565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061290357612903613986565b60200101906001600160f81b031916908160001a9053506000612927846002613900565b6129329060016139b5565b90505b60018111156129aa576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061296657612966613986565b1a60f81b82828151811061297c5761297c613986565b60200101906001600160f81b031916908160001a90535060049490941c936129a381613d3f565b9050612935565b5083156127e45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610cb2565b6000612a0482610e6d565b9050612a148160008460016127eb565b612a1d82610e6d565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038216612af25760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cb2565b6000818152600260205260409020546001600160a01b031615612b575760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cb2565b612b656000838360016127eb565b6000818152600260205260409020546001600160a01b031615612bca5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cb2565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561219d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c79903390899088908890600401613d56565b6020604051808303816000875af1925050508015612cb4575060408051601f3d908101601f19168201909252612cb191810190613d93565b60015b612d11573d808015612ce2576040519150601f19603f3d011682016040523d82523d6000602084013e612ce7565b606091505b508051600003612d095760405162461bcd60e51b8152600401610cb290613ced565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610b0b565b60006001600160e01b031982166380ac58cd60e01b1480612d5c57506001600160e01b03198216635b5e139f60e01b145b806109b057506301ffc9a760e01b6001600160e01b03198316146109b0565b612d8784848484612eb4565b6001811115612df65760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610cb2565b816001600160a01b038516612e5257612e4d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612e75565b836001600160a01b0316856001600160a01b031614612e7557612e758582612f3c565b6001600160a01b038416612e9157612e8c81612fd9565b611168565b846001600160a01b0316846001600160a01b031614611168576111688482613088565b6001811115610b38576001600160a01b03841615612efa576001600160a01b03841660009081526003602052604081208054839290612ef49084906139c8565b90915550505b6001600160a01b03831615610b38576001600160a01b03831660009081526003602052604081208054839290612f319084906139b5565b909155505050505050565b60006001612f4984610eeb565b612f5391906139c8565b600083815260076020526040902054909150808214612fa6576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612feb906001906139c8565b6000838152600960205260408120546008805493945090928490811061301357613013613986565b90600052602060002001549050806008838154811061303457613034613986565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061306c5761306c613db0565b6001900381819060005260206000200160009055905550505050565b600061309383610eeb565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b5080546130d8906138b0565b6000825580601f106130e8575050565b601f016020900490600052602060002090810190610d8291905b808211156131165760008155600101613102565b5090565b6001600160e01b031981168114610d8257600080fd5b60006020828403121561314257600080fd5b81356127e48161311a565b60005b83811015613168578181015183820152602001613150565b50506000910152565b6000815180845261318981602086016020860161314d565b601f01601f19169290920160200192915050565b6020815260006127e46020830184613171565b6000602082840312156131c257600080fd5b5035919050565b80356001600160a01b03811681146131e057600080fd5b919050565b600080604083850312156131f857600080fd5b613201836131c9565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561324d5761324d61320f565b604052919050565b60006001600160401b0382111561326e5761326e61320f565b5060051b60200190565b600082601f83011261328957600080fd5b8135602061329e61329983613255565b613225565b82815260059290921b840181019181810190868411156132bd57600080fd5b8286015b848110156132d857803583529183019183016132c1565b509695505050505050565b803561ffff811681146131e057600080fd5b60008060006060848603121561330a57600080fd5b613313846131c9565b925060208401356001600160401b0381111561332e57600080fd5b61333a86828701613278565b925050613349604085016132e3565b90509250925092565b6000806040838503121561336557600080fd5b61336e836132e3565b915061337c602084016131c9565b90509250929050565b60008060006060848603121561339a57600080fd5b6133a3846131c9565b92506133b1602085016131c9565b9150604084013590509250925092565b600080604083850312156133d457600080fd5b50508035926020909101359150565b600080604083850312156133f657600080fd5b8235915061337c602084016131c9565b60006020828403121561341857600080fd5b6127e4826132e3565b60006020828403121561343357600080fd5b6127e4826131c9565b6020808252825182820181905260009190848201906040850190845b8181101561347457835183529284019291840191600101613458565b50909695505050505050565b8015158114610d8257600080fd5b600080604083850312156134a157600080fd5b6134aa836131c9565b915060208301356134ba81613480565b809150509250929050565b600080600080608085870312156134db57600080fd5b6134e4856131c9565b935060206134f38187016131c9565b93506040860135925060608601356001600160401b038082111561351657600080fd5b818801915088601f83011261352a57600080fd5b81358181111561353c5761353c61320f565b61354e601f8201601f19168501613225565b9150808252898482850101111561356457600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060006060848603121561359957600080fd5b6135a2846132e3565b9250602084013560ff811681146135b857600080fd5b915060408401356001600160401b038111156135d357600080fd5b6135df86828701613278565b9150509250925092565b60008083601f8401126135fb57600080fd5b5081356001600160401b0381111561361257600080fd5b602083019150836020828501011115610be557600080fd5b60008060008060006060868803121561364257600080fd5b85356001600160401b038082111561365957600080fd5b61366589838a016135e9565b9097509550602088013591508082111561367e57600080fd5b5061368b888289016135e9565b909450925050604086013561369f81613480565b809150509295509295909350565b600080604083850312156136c057600080fd5b61336e836131c9565b600082601f8301126136da57600080fd5b813560206136ea61329983613255565b82815260059290921b8401810191818101908684111561370957600080fd5b8286015b848110156132d85780356001600160401b038116811461372d5760008081fd5b835291830191830161370d565b6000806000806000806000806000806101408b8d03121561375a57600080fd5b8a356001600160401b038082111561377157600080fd5b61377d8e838f01613278565b9b5060208d013591508082111561379357600080fd5b61379f8e838f01613278565b9a5060408d01359150808211156137b557600080fd5b6137c18e838f016136c9565b995060608d01359150808211156137d757600080fd5b6137e38e838f016136c9565b985060808d01359150808211156137f957600080fd5b6138058e838f01613278565b975060a08d013591508082111561381b57600080fd5b6138278e838f01613278565b965060c08d013591508082111561383d57600080fd5b6138498e838f01613278565b955060e08d013591508082111561385f57600080fd5b61386b8e838f01613278565b94506101008d013591508082111561388257600080fd5b5061388f8d828e01613278565b92505061389f6101208c016132e3565b90509295989b9194979a5092959850565b600181811c908216806138c457607f821691505b6020821081036138e457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176109b0576109b06138ea565b60008261393457634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000600182016139ae576139ae6138ea565b5060010190565b808201808211156109b0576109b06138ea565b818103818111156109b0576109b06138ea565b601f821115610a8357600081815260208120601f850160051c81016020861015613a025750805b601f850160051c820191505b81811015613a2157828155600101613a0e565b505050505050565b6001600160401b03831115613a4057613a4061320f565b613a5483613a4e83546138b0565b836139db565b6000601f841160018114613a885760008515613a705750838201355b600019600387901b1c1916600186901b178355611168565b600083815260209020601f19861690835b82811015613ab95786850135825560209485019460019092019101613a99565b5086821015613ad65760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008154613af5816138b0565b60018281168015613b0d5760018114613b2257613b51565b60ff1984168752821515830287019450613b51565b8560005260208060002060005b85811015613b485781548a820152908401908201613b2f565b50505082870194505b5050505092915050565b6000610b0b613b6a8386613ae8565b84613ae8565b6000613b7c8286613ae8565b8451613b8c81836020890161314d565b613b9881830186613ae8565b979650505050505050565b6000613baf8285613ae8565b6718dbdb9d1c9858dd60c21b8152613bca6008820185613ae8565b95945050505050565b61ffff818116838216019080821115613bee57613bee6138ea565b5092915050565b600061ffff808316818103613c0c57613c0c6138ea565b6001019392505050565b600060208284031215613c2857600080fd5b81516127e481613480565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613cb081601785016020880161314d565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613ce181602884016020880161314d565b01602801949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081613d4e57613d4e6138ea565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613d8990830184613171565b9695505050505050565b600060208284031215613da557600080fd5b81516127e48161311a565b634e487b7160e01b600052603160045260246000fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a2646970667358221220a100bb874d036e52d53aa251c32495a8e57552d1f58b4c7750fe7871e91a93cd64736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000094d6974617665727365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d49544100000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Mitaverse
Arg [1] : symbol (string): MITA
Arg [2] : _maxSupply (uint256): 5000

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [4] : 4d69746176657273650000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 4d49544100000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

99655:10621:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108057:220;;;;;;;;;;-1:-1:-1;108057:220:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;108057:220:0;;;;;;;;69854:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;71366:171::-;;;;;;;;;;-1:-1:-1;71366:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;71366:171:0;1533:203:1;108655:176:0;;;;;;;;;;-1:-1:-1;108655:176:0;;;;;:::i;:::-;;:::i;:::-;;105802:286;;;;;;;;;;-1:-1:-1;105802:286:0;;;;;:::i;:::-;;:::i;100584:29::-;;;;;;;;;;-1:-1:-1;100584:29:0;;;;;;;;;;;4282:6:1;4270:19;;;4252:38;;4240:2;4225:18;100584:29:0;4108:188:1;100066:22:0;;;;;;;;;;;;;;;;;;;4447:25:1;;;4435:2;4420:18;100066:22:0;4301:177:1;89198:113:0;;;;;;;;;;-1:-1:-1;89286:10:0;:17;89198:113;;100513:62;;;;;;;;;;-1:-1:-1;100513:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;109014:182;;;;;;;;;;-1:-1:-1;109014:182:0;;;;;:::i;:::-;;:::i;63667:131::-;;;;;;;;;;-1:-1:-1;63667:131:0;;;;;:::i;:::-;63741:7;63768:12;;;:6;:12;;;;;:22;;;;63667:131;97059:442;;;;;;;;;;-1:-1:-1;97059:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5891:32:1;;;5873:51;;5955:2;5940:18;;5933:34;;;;5846:18;97059:442:0;5699:274:1;106227:136:0;;;;;;;;;;-1:-1:-1;106227:136:0;;;;;:::i;:::-;;:::i;64108:147::-;;;;;;;;;;-1:-1:-1;64108:147:0;;;;;:::i;:::-;;:::i;88866:256::-;;;;;;;;;;-1:-1:-1;88866:256:0;;;;;:::i;:::-;;:::i;65252:218::-;;;;;;;;;;-1:-1:-1;65252:218:0;;;;;:::i;:::-;;:::i;110099:82::-;;;;;;;;;;;;;:::i;7726:143::-;;;;;;;;;;;;148:42;7726:143;;109383:190;;;;;;;;;;-1:-1:-1;109383:190:0;;;;;:::i;:::-;;:::i;85310:242::-;;;;;;;;;;-1:-1:-1;85310:242:0;;;;;:::i;:::-;;:::i;89388:233::-;;;;;;;;;;-1:-1:-1;89388:233:0;;;;;:::i;:::-;;:::i;110187:86::-;;;;;;;;;;-1:-1:-1;110258:7:0;;;;110187:86;;69564:223;;;;;;;;;;-1:-1:-1;69564:223:0;;;;;:::i;:::-;;:::i;100462:44::-;;;;;;;;;;-1:-1:-1;100462:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;100462:44:0;;;;-1:-1:-1;;;100462:44:0;;;;;;;;;;;;7060:25:1;;;7116:2;7101:18;;7094:34;;;;-1:-1:-1;;;;;7201:15:1;;;7181:18;;;7174:43;;;;7253:15;;;;7248:2;7233:18;;7226:43;7300:3;7285:19;;7278:35;;;;7344:3;7329:19;;7322:35;7388:3;7373:19;;7366:35;7432:3;7417:19;;7410:35;7476:3;7461:19;;7454:35;7520:3;7505:19;;7498:35;7047:3;7032:19;100462:44:0;6665:874:1;107067:121:0;;;;;;;;;;-1:-1:-1;107067:121:0;;;;;:::i;:::-;;:::i;69295:207::-;;;;;;;;;;-1:-1:-1;69295:207:0;;;;;:::i;:::-;;:::i;110015:78::-;;;;;;;;;;;;;:::i;106678:381::-;;;;;;;;;;-1:-1:-1;106678:381:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;100122:41::-;;;;;;;;;;-1:-1:-1;100122:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;103938:296;;;;;;;;;;-1:-1:-1;103938:296:0;;;;;:::i;:::-;;:::i;100095:20::-;;;;;;;;;;-1:-1:-1;100095:20:0;;;;-1:-1:-1;;;;;100095:20:0;;;62140:147;;;;;;;;;;-1:-1:-1;62140:147:0;;;;;:::i;:::-;;:::i;70023:104::-;;;;;;;;;;;;;:::i;61245:49::-;;;;;;;;;;-1:-1:-1;61245:49:0;61290:4;61245:49;;108284:193;;;;;;;;;;-1:-1:-1;108284:193:0;;;;;:::i;:::-;;:::i;109760:247::-;;;;;;;;;;-1:-1:-1;109760:247:0;;;;;:::i;:::-;;:::i;104242:507::-;;;;;;:::i;:::-;;:::i;107784:267::-;;;;;;;;;;-1:-1:-1;107784:267:0;;;;;:::i;:::-;;:::i;107194:408::-;;;;;;;;;;-1:-1:-1;107194:408:0;;;;;:::i;:::-;;:::i;106369:114::-;;;;;;;;;;-1:-1:-1;106460:15:0;106369:114;;99861:62;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;99861:62:0;;64548:149;;;;;;;;;;-1:-1:-1;64548:149:0;;;;;:::i;:::-;;:::i;100035:24::-;;;;;;;;;;;;;;;;99792:62;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;99792:62:0;;107608:170;;;;;;;;;;;;;:::i;71835:164::-;;;;;;;;;;-1:-1:-1;71835:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;71956:25:0;;;71932:4;71956:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;71835:164;103113:403;;;;;;;;;;-1:-1:-1;103113:403:0;;;;;:::i;:::-;;:::i;104761:1035::-;;;;;;;;;;-1:-1:-1;104761:1035:0;;;;;:::i;:::-;;:::i;108057:220::-;108204:4;108233:36;108257:11;108233:23;:36::i;:::-;108226:43;108057:220;-1:-1:-1;;108057:220:0:o;69854:100::-;69908:13;69941:5;69934:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69854:100;:::o;71366:171::-;71442:7;71462:23;71477:7;71462:14;:23::i;:::-;-1:-1:-1;71505:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;71505:24:0;;71366:171::o;108655:176::-;108769:8;9508:30;9529:8;9508:20;:30::i;:::-;108790:33:::1;108804:8;108814;108790:13;:33::i;:::-;108655:176:::0;;;:::o;105802:286::-;105973:15;;;105936:4;105973:15;;;:9;:15;;;;;:26;;;:33;;:107;;-1:-1:-1;106037:15:0;;;;;;;:9;:15;;;;;:26;;;106010:70;;106029:6;;106065:14;106070:8;106186:26;;-1:-1:-1;;26990:2:1;26986:15;;;26982:53;106186:26:0;;;26970:66:1;106149:7:0;;27052:12:1;;106186:26:0;;;;;;;;;;;;106176:37;;;;;;106169:44;;106094:127;;;;106065:14;106010:18;:70::i;:::-;105953:127;105802:286;-1:-1:-1;;;;105802:286:0:o;109014:182::-;109133:4;-1:-1:-1;;;;;9234:18:0;;9242:10;9234:18;9230:83;;9269:32;9290:10;9269:20;:32::i;:::-;109150:38:::1;109169:4;109175:2;109179:8;109150:18;:38::i;:::-;109014:182:::0;;;;:::o;97059:442::-;97156:7;97214:27;;;:17;:27;;;;;;;;97185:56;;;;;;;;;-1:-1:-1;;;;;97185:56:0;;;;;-1:-1:-1;;;97185:56:0;;;-1:-1:-1;;;;;97185:56:0;;;;;;;;97156:7;;97254:92;;-1:-1:-1;97305:29:0;;;;;;;;;97315:19;97305:29;-1:-1:-1;;;;;97305:29:0;;;;-1:-1:-1;;;97305:29:0;;-1:-1:-1;;;;;97305:29:0;;;;;97254:92;97396:23;;;;97358:21;;97867:5;;97383:36;;-1:-1:-1;;;;;97383:36:0;:10;:36;:::i;:::-;97382:58;;;;:::i;:::-;97461:16;;;-1:-1:-1;97358:82:0;;-1:-1:-1;;97059:442:0;;;;;;:::o;106227:136::-;61290:4;61736:16;61290:4;61736:10;:16::i;:::-;106319:36:::1;::::0;106327:10:::1;::::0;106319:36;::::1;;;::::0;106348:6;;106319:36:::1;::::0;;;106348:6;106327:10;106319:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;64108:147:::0;63741:7;63768:12;;;:6;:12;;;;;:22;;;61736:16;61747:4;61736:10;:16::i;:::-;64222:25:::1;64233:4;64239:7;64222:10;:25::i;88866:256::-:0;88963:7;88999:23;89016:5;88999:16;:23::i;:::-;88991:5;:31;88983:87;;;;-1:-1:-1;;;88983:87:0;;16874:2:1;88983:87:0;;;16856:21:1;16913:2;16893:18;;;16886:30;16952:34;16932:18;;;16925:62;-1:-1:-1;;;17003:18:1;;;16996:41;17054:19;;88983:87:0;;;;;;;;;-1:-1:-1;;;;;;89088:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;88866:256::o;65252:218::-;-1:-1:-1;;;;;65348:23:0;;39660:10;65348:23;65340:83;;;;-1:-1:-1;;;65340:83:0;;17286:2:1;65340:83:0;;;17268:21:1;17325:2;17305:18;;;17298:30;17364:34;17344:18;;;17337:62;-1:-1:-1;;;17415:18:1;;;17408:45;17470:19;;65340:83:0;17084:411:1;65340:83:0;65436:26;65448:4;65454:7;65436:11;:26::i;:::-;65252:218;;:::o;110099:82::-;-1:-1:-1;;;;;;;;;;;61736:16:0;61747:4;61736:10;:16::i;:::-;110163:10:::1;:8;:10::i;:::-;110099:82:::0;:::o;109383:190::-;109506:4;-1:-1:-1;;;;;9234:18:0;;9242:10;9234:18;9230:83;;9269:32;9290:10;9269:20;:32::i;:::-;109523:42:::1;109546:4;109552:2;109556:8;109523:22;:42::i;85310:242::-:0;85428:41;39660:10;85447:12;85461:7;85428:18;:41::i;:::-;85420:99;;;;-1:-1:-1;;;85420:99:0;;;;;;;:::i;:::-;85530:14;85536:7;85530:5;:14::i;89388:233::-;89463:7;89499:30;89286:10;:17;;89198:113;89499:30;89491:5;:38;89483:95;;;;-1:-1:-1;;;89483:95:0;;18116:2:1;89483:95:0;;;18098:21:1;18155:2;18135:18;;;18128:30;18194:34;18174:18;;;18167:62;-1:-1:-1;;;18245:18:1;;;18238:42;18297:19;;89483:95:0;17914:408:1;89483:95:0;89596:10;89607:5;89596:17;;;;;;;;:::i;:::-;;;;;;;;;89589:24;;89388:233;;;:::o;69564:223::-;69636:7;74451:16;;;:7;:16;;;;;;-1:-1:-1;;;;;74451:16:0;;69700:56;;;;-1:-1:-1;;;69700:56:0;;18661:2:1;69700:56:0;;;18643:21:1;18700:2;18680:18;;;18673:30;-1:-1:-1;;;18719:18:1;;;18712:54;18783:18;;69700:56:0;18459:348:1;107067:121:0;-1:-1:-1;;;;;;;;;;;61736:16:0;61747:4;61736:10;:16::i;:::-;-1:-1:-1;107161:9:0::1;:19:::0;107067:121::o;69295:207::-;69367:7;-1:-1:-1;;;;;69395:19:0;;69387:73;;;;-1:-1:-1;;;69387:73:0;;19014:2:1;69387:73:0;;;18996:21:1;19053:2;19033:18;;;19026:30;19092:34;19072:18;;;19065:62;-1:-1:-1;;;19143:18:1;;;19136:39;19192:19;;69387:73:0;18812:405:1;69387:73:0;-1:-1:-1;;;;;;69478:16:0;;;;;:9;:16;;;;;;;69295:207::o;110015:78::-;-1:-1:-1;;;;;;;;;;;61736:16:0;61747:4;61736:10;:16::i;:::-;110077:8:::1;:6;:8::i;106678:381::-:0;106782:16;106816:15;106834:17;106844:6;106834:9;:17::i;:::-;106816:35;;106862:23;106902:7;-1:-1:-1;;;;;106888:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;106888:22:0;;106862:48;;106926:9;106921:107;106945:7;106941:1;:11;106921:107;;;106986:30;107006:6;107014:1;106986:19;:30::i;:::-;106974:6;106981:1;106974:9;;;;;;;;:::i;:::-;;;;;;;;;;:42;106954:3;;;;:::i;:::-;;;;106921:107;;;-1:-1:-1;107045:6:0;106678:381;-1:-1:-1;;;106678:381:0:o;103938:296::-;-1:-1:-1;;;;;;;;;;;61736:16:0;61747:4;61736:10;:16::i;:::-;104072:9:::1;;104068:1;104059:6;104049:7;;:16;;;;:::i;:::-;:20;;;;:::i;:::-;:32;104046:70;;;104083:33;::::0;-1:-1:-1;;;104083:33:0;;19827:2:1;104083:33:0::1;::::0;::::1;19809:21:1::0;19866:2;19846:18;;;19839:30;19905:25;19885:18;;;19878:53;19948:18;;104083:33:0::1;19625:347:1::0;104046:70:0::1;104130:9;104126:101;104149:6;104145:1;:10;104126:101;;;104173:22;104183:2;104187:7;;104173:9;:22::i;:::-;104206:7;:9:::0;;;:7:::1;:9;::::0;::::1;:::i;:::-;;;;;;104157:3;;;;;:::i;:::-;;;;104126:101;;62140:147:::0;62226:4;62250:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;62250:29:0;;;;;;;;;;;;;;;62140:147::o;70023:104::-;70079:13;70112:7;70105:14;;;;;:::i;108284:193::-;108405:8;9508:30;9529:8;9508:20;:30::i;:::-;108426:43:::1;108450:8;108460;108426:23;:43::i;109760:247::-:0;109929:4;-1:-1:-1;;;;;9234:18:0;;9242:10;9234:18;9230:83;;9269:32;9290:10;9269:20;:32::i;:::-;109951:48:::1;109974:4;109980:2;109984:8;109994:4;109951:22;:48::i;:::-;109760:247:::0;;;;;:::o;104242:507::-;104396:15;;;104369:24;104396:15;;;:9;:15;;;;;;;;;104369:42;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;104369:42:0;;;;;;;;;;-1:-1:-1;;;104369:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104422;104439:10;104406:4;104422:42;;;:16;:42::i;:::-;;104480:38;104494:10;104506:5;104513:4;104480:13;:38::i;:::-;104475:71;;104520:26;;-1:-1:-1;;;104520:26:0;;20179:2:1;104520:26:0;;;20161:21:1;20218:2;20198:18;;;20191:30;-1:-1:-1;;;20237:18:1;;;20230:46;20293:18;;104520:26:0;19977:340:1;104475:71:0;104561:9;104557:140;104580:6;104576:10;;:1;:10;104557:140;;;104604:61;104614:10;104663:1;104645:8;:15;;;104626:8;:16;;;:34;;;;:::i;:::-;:38;;;;:::i;:::-;104604:9;:61::i;:::-;104676:7;:9;;;:7;:9;;;:::i;:::-;;;;;;104588:3;;;;;:::i;:::-;;;;104557:140;;;;104707:34;104716:10;104728:4;104734:6;104707:34;;:8;:34::i;107784:267::-;-1:-1:-1;;;;;;;;;;;61736:16:0;61747:4;61736:10;:16::i;:::-;107941:11:::1;:26;107955:12:::0;;107941:11;:26:::1;:::i;:::-;-1:-1:-1::0;107978:14:0::1;:32;107995:15:::0;;107978:14;:32:::1;:::i;:::-;-1:-1:-1::0;;108021:10:0::1;:22:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;108021:22:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;107784:267:0:o;107194:408::-;74853:4;74451:16;;;:7;:16;;;;;;107299:13;;-1:-1:-1;;;;;74451:16:0;107330:77;;;;-1:-1:-1;;;107330:77:0;;22582:2:1;107330:77:0;;;22564:21:1;22621:2;22601:18;;;22594:30;22660:34;22640:18;;;22633:62;-1:-1:-1;;;22711:18:1;;;22704:45;22766:19;;107330:77:0;22380:411:1;107330:77:0;107423:10;;;;;;;107418:77;;107466:11;107479:14;107449:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;107435:60;;107194:408;;;:::o;107418:77::-;107537:11;107550:26;107567:8;107550:16;:26::i;:::-;107578:14;107520:73;;;;;;;;;;:::i;64548:149::-;63741:7;63768:12;;;:6;:12;;;;;:22;;;61736:16;61747:4;61736:10;:16::i;:::-;64663:26:::1;64675:4;64681:7;64663:11;:26::i;107608:170::-:0;107667:13;107729:11;107754:14;107712:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;107698:72;;107608:170;:::o;103113:403::-;61290:4;61736:16;61290:4;61736:10;:16::i;:::-;103205:40:::1;61290:4;103236:8:::0;103205:10:::1;:40::i;:::-;103256:33;-1:-1:-1::0;;;;;;;;;;;103280:8:0::1;103256:10;:33::i;:::-;103300;-1:-1:-1::0;;;;;;;;;;;103324:8:0::1;103300:10;:33::i;:::-;103344:36;-1:-1:-1::0;;;;;;;;;;;103369:10:0::1;103344:11;:36::i;:::-;103391;-1:-1:-1::0;;;;;;;;;;;103416:10:0::1;103391:11;:36::i;:::-;103438:43;61290:4;103470:10;103438:11;:43::i;:::-;-1:-1:-1::0;103492:5:0::1;:16:::0;;-1:-1:-1;;;;;;103492:16:0::1;-1:-1:-1::0;;;;;103492:16:0;;;::::1;::::0;;;::::1;::::0;;103113:403::o;104761:1035::-;-1:-1:-1;;;;;;;;;;;61736:16:0;61747:4;61736:10;:16::i;:::-;105206:11:::1;::::0;::::1;::::0;;::::1;105194:23:::0;;::::1;;;105186:60;;;::::0;-1:-1:-1;;;105186:60:0;;24924:2:1;105186:60:0::1;::::0;::::1;24906:21:1::0;24963:2;24943:18;;;24936:30;25002:26;24982:18;;;24975:54;25046:18;;105186:60:0::1;24722:348:1::0;105186:60:0::1;105262:8;105257:428;105280:7;:14;105276:1;:18;;;105257:428;;;105340:345;;;;;;;;105367:7;105375:1;105367:10;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105396:6;105403:1;105396:9;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105424:10;105435:1;105424:13;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;105340:345:0::1;;;;;105456:8;105465:1;105456:11;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;105340:345:0::1;;;;;105486:8;105495:1;105486:11;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105516:11;105528:1;105516:14;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105549:6;105556:1;105549:9;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105577:10;105588:1;105577:13;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105609:9;105619:1;105609:12;;;;;;;;;;:::i;:::-;;;;;;;105340:345;;;;105640:9;:23;105654:8;105650:1;:12;;;;:::i;:::-;105640:23;;;;;;;;;;;;;;;:30;;;105340:345;;::::0;105314:9:::1;:23;105328:8;105324:1;:12;;;;:::i;:::-;105314:23;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;105314:23:0;:371;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;105314:371:0;;::::1;-1:-1:-1::0;;;105314:371:0::1;-1:-1:-1::0;;105314:371:0;;;;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;105296:3;::::1;::::0;::::1;:::i;:::-;;;;105257:428;;;-1:-1:-1::0;105728:11:0::1;::::0;105711:14;;105728:11:::1;::::0;;::::1;::::0;105700:25:::1;::::0;105711:14;105700:25;::::1;;:::i;:::-;:39;105696:92;;;105773:14:::0;;105755:33:::1;::::0;:8;:33:::1;:::i;:::-;105741:11;:47:::0;;-1:-1:-1;;105741:47:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;105696:92:::1;104761:1035:::0;;;;;;;;;;;:::o;96789:215::-;96891:4;-1:-1:-1;;;;;;96915:41:0;;-1:-1:-1;;;96915:41:0;;:81;;;96960:36;96984:11;96960:23;:36::i;81185:135::-;74853:4;74451:16;;;:7;:16;;;;;;-1:-1:-1;;;;;74451:16:0;81259:53;;;;-1:-1:-1;;;81259:53:0;;18661:2:1;81259:53:0;;;18643:21:1;18700:2;18680:18;;;18673:30;-1:-1:-1;;;18719:18:1;;;18712:54;18783:18;;81259:53:0;18459:348:1;9651:647:0;148:42;9842:45;:49;9838:453;;10141:67;;-1:-1:-1;;;10141:67:0;;10192:4;10141:67;;;25662:34:1;-1:-1:-1;;;;;25732:15:1;;25712:18;;;25705:43;148:42:0;;10141;;25597:18:1;;10141:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10136:144;;10236:28;;-1:-1:-1;;;10236:28:0;;-1:-1:-1;;;;;1697:32:1;;10236:28:0;;;1679:51:1;1652:18;;10236:28:0;1533:203:1;70884:416:0;70965:13;70981:23;70996:7;70981:14;:23::i;:::-;70965:39;;71029:5;-1:-1:-1;;;;;71023:11:0;:2;-1:-1:-1;;;;;71023:11:0;;71015:57;;;;-1:-1:-1;;;71015:57:0;;26211:2:1;71015:57:0;;;26193:21:1;26250:2;26230:18;;;26223:30;26289:34;26269:18;;;26262:62;-1:-1:-1;;;26340:18:1;;;26333:31;26381:19;;71015:57:0;26009:397:1;71015:57:0;39660:10;-1:-1:-1;;;;;71107:21:0;;;;:62;;-1:-1:-1;71132:37:0;71149:5;39660:10;71835:164;:::i;71132:37::-;71085:173;;;;-1:-1:-1;;;71085:173:0;;26613:2:1;71085:173:0;;;26595:21:1;26652:2;26632:18;;;26625:30;26691:34;26671:18;;;26664:62;26762:31;26742:18;;;26735:59;26811:19;;71085:173:0;26411:425:1;71085:173:0;71271:21;71280:2;71284:7;71271:8;:21::i;12298:190::-;12423:4;12476;12447:25;12460:5;12467:4;12447:12;:25::i;:::-;:33;;12298:190;-1:-1:-1;;;;12298:190:0:o;72066:335::-;72261:41;39660:10;72280:12;39580:98;72261:41;72253:99;;;;-1:-1:-1;;;72253:99:0;;;;;;;:::i;:::-;72365:28;72375:4;72381:2;72385:7;72365:9;:28::i;62591:105::-;62658:30;62669:4;39660:10;62658;:30::i;66849:238::-;66933:22;66941:4;66947:7;66933;:22::i;:::-;66928:152;;66972:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;66972:29:0;;;;;;;;;:36;;-1:-1:-1;;66972:36:0;67004:4;66972:36;;;67055:12;39660:10;;39580:98;67055:12;-1:-1:-1;;;;;67028:40:0;67046:7;-1:-1:-1;;;;;67028:40:0;67040:4;67028:40;;;;;;;;;;66849:238;;:::o;67267:239::-;67351:22;67359:4;67365:7;67351;:22::i;:::-;67347:152;;;67422:5;67390:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;67390:29:0;;;;;;;;;;:37;;-1:-1:-1;;67390:37:0;;;67447:40;39660:10;;67390:12;;67447:40;;67422:5;67447:40;67267:239;;:::o;103635:109::-;103683:7;:15;;-1:-1:-1;;103683:15:0;;;103714:22;39660:10;103723:12;103714:22;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;103714:22:0;;;;;;;103635:109::o;72472:185::-;72610:39;72627:4;72633:2;72637:7;72610:39;;;;;;;;;;;;:16;:39::i;75083:264::-;75176:4;75193:13;75209:23;75224:7;75209:14;:23::i;:::-;75193:39;;75262:5;-1:-1:-1;;;;;75251:16:0;:7;-1:-1:-1;;;;;75251:16:0;;:52;;;-1:-1:-1;;;;;;71956:25:0;;;71932:4;71956:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;75271:32;75251:87;;;;75331:7;-1:-1:-1;;;;;75307:31:0;:20;75319:7;75307:11;:20::i;:::-;-1:-1:-1;;;;;75307:31:0;;75243:96;75083:264;-1:-1:-1;;;;75083:264:0:o;102984:123::-;103078:21;103090:8;103078:11;:21::i;103523:104::-;103569:7;:14;;-1:-1:-1;;103569:14:0;103579:4;103569:14;;;103599:20;103606:12;39660:10;;39580:98;75689:110;75765:26;75775:2;75779:7;75765:26;;;;;;;;;;;;:9;:26::i;71609:155::-;71704:52;39660:10;71737:8;71747;71704:18;:52::i;72728:322::-;72902:41;39660:10;72935:7;72902:18;:41::i;:::-;72894:99;;;;-1:-1:-1;;;72894:99:0;;;;;;;:::i;:::-;73004:38;73018:4;73024:2;73028:7;73037:4;73004:13;:38::i;101484:1183::-;101620:11;;101585:4;;101620:11;;;;101612:19;;;;101608:54;;101633:29;;-1:-1:-1;;;101633:29:0;;27277:2:1;101633:29:0;;;27259:21:1;27316:2;27296:18;;;27289:30;-1:-1:-1;;;27335:18:1;;;27328:49;27394:18;;101633:29:0;27075:343:1;101608:54:0;101700:15;;;101673:24;101700:15;;;:9;:15;;;;;;;;;101673:42;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;101673:42:0;;;;;;;;;-1:-1:-1;;;101673:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101730:15;:36;101726:78;;;101768:36;;-1:-1:-1;;;101768:36:0;;27625:2:1;101768:36:0;;;27607:21:1;27664:2;27644:18;;;27637:30;27703:28;27683:18;;;27676:56;27749:18;;101768:36:0;27423:350:1;101726:78:0;101837:8;:16;;;-1:-1:-1;;;;;101819:34:0;:15;:34;101815:67;;;101855:27;;-1:-1:-1;;;101855:27:0;;27980:2:1;101855:27:0;;;27962:21:1;28019:2;27999:18;;;27992:30;-1:-1:-1;;;28038:18:1;;;28031:47;28095:18;;101855:27:0;27778:341:1;101815:67:0;101933:8;101915;:15;;;:26;;;;:::i;:::-;101897:15;;:44;101893:81;;;101943:31;;-1:-1:-1;;;101943:31:0;;28326:2:1;101943:31:0;;;28308:21:1;28365:2;28345:18;;;28338:30;-1:-1:-1;;;28384:18:1;;;28377:51;28445:18;;101943:31:0;28124:345:1;101893:81:0;102014:9;;102010:1;101999:8;101989:7;;:18;;;;:::i;:::-;:22;;;;:::i;:::-;:34;101985:75;;;102025:35;;-1:-1:-1;;;102025:35:0;;28676:2:1;102025:35:0;;;28658:21:1;28715:2;28695:18;;;28688:30;28754:27;28734:18;;;28727:55;28799:18;;102025:35:0;28474:349:1;101985:75:0;102075:17;;;;:22;;;;:68;;;102126:8;:17;;;102122:1;102111:8;102101:7;;:18;;;;:::i;:::-;:22;;;;:::i;:::-;:42;102075:68;102071:106;;;102145:32;;-1:-1:-1;;;102145:32:0;;29030:2:1;102145:32:0;;;29012:21:1;29069:2;29049:18;;;29042:30;-1:-1:-1;;;29088:18:1;;;29081:52;29150:18;;102145:32:0;28828:346:1;102071:106:0;102192:14;;;;:19;;;;:48;;;102232:8;102215;:14;;;:25;102192:48;102188:128;;;102255:61;;-1:-1:-1;;;102255:61:0;;29381:2:1;102255:61:0;;;29363:21:1;29420:2;29400:18;;;29393:30;29459:34;29439:18;;;29432:62;-1:-1:-1;;;29510:18:1;;;29503:49;29569:19;;102255:61:0;29179:415:1;102188:128:0;102331:18;;;;:23;;;;:79;;-1:-1:-1;102379:14:0;;;;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;102379:20:0;;;;;;;;;;:31;;102402:8;;102379:31;:::i;:::-;102358:8;:18;;;:52;102331:79;102327:154;;;102425:56;;-1:-1:-1;;;102425:56:0;;29801:2:1;102425:56:0;;;29783:21:1;29840:2;29820:18;;;29813:30;29879:34;29859:18;;;29852:62;-1:-1:-1;;;29930:18:1;;;29923:44;29984:19;;102425:56:0;29599:410:1;102327:154:0;102496:8;102508:1;102496:13;102492:45;;102511:26;;-1:-1:-1;;;102511:26:0;;30216:2:1;102511:26:0;;;30198:21:1;30255:2;30235:18;;;30228:30;-1:-1:-1;;;30274:18:1;;;30267:46;30330:18;;102511:26:0;30014:340:1;102492:45:0;102552:10;-1:-1:-1;;;;;102552:18:0;;;:60;;;;;102604:8;102587;:14;;;:25;;;;:::i;:::-;102574:9;:38;;102552:60;102548:89;;;102614:23;;-1:-1:-1;;;102614:23:0;;30561:2:1;102614:23:0;;;30543:21:1;30600:2;30580:18;;;30573:30;-1:-1:-1;;;30619:18:1;;;30612:43;30672:18;;102614:23:0;30359:337:1;102548:89:0;-1:-1:-1;102655:4:0;;101484:1183;-1:-1:-1;;;;101484:1183:0:o;101300:178::-;101393:14;;;;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;101393:20:0;;;;;;;;;:32;;101417:8;;101393:14;:32;;101417:8;;101393:32;:::i;:::-;;;;-1:-1:-1;;101436:15:0;;;;;;;:9;:15;;;;;:22;;:34;;101462:8;;101436:15;:34;;101462:8;;101436:34;:::i;:::-;;;;-1:-1:-1;;;;;101300:178:0:o;37001:716::-;37057:13;37108:14;37125:17;37136:5;37125:10;:17::i;:::-;37145:1;37125:21;37108:38;;37161:20;37195:6;-1:-1:-1;;;;;37184:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37184:18:0;-1:-1:-1;37161:41:0;-1:-1:-1;37326:28:0;;;37342:2;37326:28;37383:288;-1:-1:-1;;37415:5:0;-1:-1:-1;;;37552:2:0;37541:14;;37536:30;37415:5;37523:44;37613:2;37604:11;;;-1:-1:-1;37634:21:0;37383:288;37634:21;-1:-1:-1;37692:6:0;37001:716;-1:-1:-1;;;37001:716:0:o;61844:204::-;61929:4;-1:-1:-1;;;;;;61953:47:0;;-1:-1:-1;;;61953:47:0;;:87;;;62004:36;62028:11;62004:23;:36::i;80464:174::-;80539:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;80539:29:0;-1:-1:-1;;;;;80539:29:0;;;;;;;;:24;;80593:23;80539:24;80593:14;:23::i;:::-;-1:-1:-1;;;;;80584:46:0;;;;;;;;;;;80464:174;;:::o;13165:296::-;13248:7;13291:4;13248:7;13306:118;13330:5;:12;13326:1;:16;13306:118;;;13379:33;13389:12;13403:5;13409:1;13403:8;;;;;;;;:::i;:::-;;;;;;;13379:9;:33::i;:::-;13364:48;-1:-1:-1;13344:3:0;;;;:::i;:::-;;;;13306:118;;79082:1263;79241:4;-1:-1:-1;;;;;79214:31:0;:23;79229:7;79214:14;:23::i;:::-;-1:-1:-1;;;;;79214:31:0;;79206:81;;;;-1:-1:-1;;;79206:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;79306:16:0;;79298:65;;;;-1:-1:-1;;;79298:65:0;;31309:2:1;79298:65:0;;;31291:21:1;31348:2;31328:18;;;31321:30;31387:34;31367:18;;;31360:62;-1:-1:-1;;;31438:18:1;;;31431:34;31482:19;;79298:65:0;31107:400:1;79298:65:0;79376:42;79397:4;79403:2;79407:7;79416:1;79376:20;:42::i;:::-;79548:4;-1:-1:-1;;;;;79521:31:0;:23;79536:7;79521:14;:23::i;:::-;-1:-1:-1;;;;;79521:31:0;;79513:81;;;;-1:-1:-1;;;79513:81:0;;;;;;;:::i;:::-;79666:24;;;;:15;:24;;;;;;;;79659:31;;-1:-1:-1;;;;;;79659:31:0;;;;;;-1:-1:-1;;;;;80142:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;80142:20:0;;;80177:13;;;;;;;;;:18;;79659:31;80177:18;;;80217:16;;;:7;:16;;;;;;:21;;;;;;;;;;80256:27;;79682:7;;80256:27;;;108655:176;;;:::o;62986:492::-;63075:22;63083:4;63089:7;63075;:22::i;:::-;63070:401;;63263:28;63283:7;63263:19;:28::i;:::-;63364:38;63392:4;63399:2;63364:19;:38::i;:::-;63168:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;63168:257:0;;;;;;;;;;-1:-1:-1;;;63114:345:0;;;;;;;:::i;87313:206::-;87382:20;87394:7;87382:11;:20::i;:::-;87425:19;;;;:10;:19;;;;;87419:33;;;;;:::i;:::-;:38;;-1:-1:-1;87415:97:0;;87481:19;;;;:10;:19;;;;;87474:26;;;:::i;76026:319::-;76155:18;76161:2;76165:7;76155:5;:18::i;:::-;76206:53;76237:1;76241:2;76245:7;76254:4;76206:22;:53::i;:::-;76184:153;;;;-1:-1:-1;;;76184:153:0;;;;;;;:::i;80781:315::-;80936:8;-1:-1:-1;;;;;80927:17:0;:5;-1:-1:-1;;;;;80927:17:0;;80919:55;;;;-1:-1:-1;;;80919:55:0;;32950:2:1;80919:55:0;;;32932:21:1;32989:2;32969:18;;;32962:30;33028:27;33008:18;;;33001:55;33073:18;;80919:55:0;32748:349:1;80919:55:0;-1:-1:-1;;;;;80985:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;80985:46:0;;;;;;;;;;81047:41;;540::1;;;81047::0;;513:18:1;81047:41:0;;;;;;;80781:315;;;:::o;73931:313::-;74087:28;74097:4;74103:2;74107:7;74087:9;:28::i;:::-;74134:47;74157:4;74163:2;74167:7;74176:4;74134:22;:47::i;:::-;74126:110;;;;-1:-1:-1;;;74126:110:0;;;;;;;:::i;33861:922::-;33914:7;;-1:-1:-1;;;33992:15:0;;33988:102;;-1:-1:-1;;;34028:15:0;;;-1:-1:-1;34072:2:0;34062:12;33988:102;34117:6;34108:5;:15;34104:102;;34153:6;34144:15;;;-1:-1:-1;34188:2:0;34178:12;34104:102;34233:6;34224:5;:15;34220:102;;34269:6;34260:15;;;-1:-1:-1;34304:2:0;34294:12;34220:102;34349:5;34340;:14;34336:99;;34384:5;34375:14;;;-1:-1:-1;34418:1:0;34408:11;34336:99;34462:5;34453;:14;34449:99;;34497:5;34488:14;;;-1:-1:-1;34531:1:0;34521:11;34449:99;34575:5;34566;:14;34562:99;;34610:5;34601:14;;;-1:-1:-1;34644:1:0;34634:11;34562:99;34688:5;34679;:14;34675:66;;34724:1;34714:11;34769:6;33861:922;-1:-1:-1;;33861:922:0:o;88558:224::-;88660:4;-1:-1:-1;;;;;;88684:50:0;;-1:-1:-1;;;88684:50:0;;:90;;;88738:36;88762:11;88738:23;:36::i;20205:149::-;20268:7;20299:1;20295;:5;:51;;20430:13;20524:15;;;20560:4;20553:15;;;20607:4;20591:21;;20295:51;;;20430:13;20524:15;;;20560:4;20553:15;;;20607:4;20591:21;;20303:20;20288:58;20205:149;-1:-1:-1;;;20205:149:0:o;102673:305::-;110258:7;;;;102847:9;:31;;;-1:-1:-1;;;;;;102860:18:0;;;102847:31;102844:126;;;102880:57;102907:4;102913:2;102917:8;102927:9;102880:26;:57::i;:::-;102844:126;;;102953:17;;-1:-1:-1;;;102953:17:0;;33304:2:1;102953:17:0;;;33286:21:1;33343:1;33323:18;;;33316:29;-1:-1:-1;;;33361:18:1;;;33354:37;33408:18;;102953:17:0;33102:330:1;38737:151:0;38795:13;38828:52;-1:-1:-1;;;;;38840:22:0;;36892:2;38133:447;38208:13;38234:19;38266:10;38270:6;38266:1;:10;:::i;:::-;:14;;38279:1;38266:14;:::i;:::-;-1:-1:-1;;;;;38256:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38256:25:0;;38234:47;;-1:-1:-1;;;38292:6:0;38299:1;38292:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;38292:15:0;;;;;;;;;-1:-1:-1;;;38318:6:0;38325:1;38318:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;38318:15:0;;;;;;;;-1:-1:-1;38349:9:0;38361:10;38365:6;38361:1;:10;:::i;:::-;:14;;38374:1;38361:14;:::i;:::-;38349:26;;38344:131;38381:1;38377;:5;38344:131;;;-1:-1:-1;;;38425:5:0;38433:3;38425:11;38416:21;;;;;;;:::i;:::-;;;;38404:6;38411:1;38404:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;38404:33:0;;;;;;;;-1:-1:-1;38462:1:0;38452:11;;;;;38384:3;;;:::i;:::-;;;38344:131;;;-1:-1:-1;38493:10:0;;38485:55;;;;-1:-1:-1;;;38485:55:0;;33780:2:1;38485:55:0;;;33762:21:1;;;33799:18;;;33792:30;33858:34;33838:18;;;33831:62;33910:18;;38485:55:0;33578:356:1;77962:783:0;78022:13;78038:23;78053:7;78038:14;:23::i;:::-;78022:39;;78074:51;78095:5;78110:1;78114:7;78123:1;78074:20;:51::i;:::-;78238:23;78253:7;78238:14;:23::i;:::-;78309:24;;;;:15;:24;;;;;;;;78302:31;;-1:-1:-1;;;;;;78302:31:0;;;;;;-1:-1:-1;;;;;78554:16:0;;;;;:9;:16;;;;;:21;;-1:-1:-1;;78554:21:0;;;78604:16;;;:7;:16;;;;;;78597:23;;;;;;;78638:36;78230:31;;-1:-1:-1;78325:7:0;;78638:36;;78309:24;;78638:36;65252:218;;:::o;76681:942::-;-1:-1:-1;;;;;76761:16:0;;76753:61;;;;-1:-1:-1;;;76753:61:0;;34141:2:1;76753:61:0;;;34123:21:1;;;34160:18;;;34153:30;34219:34;34199:18;;;34192:62;34271:18;;76753:61:0;33939:356:1;76753:61:0;74853:4;74451:16;;;:7;:16;;;;;;-1:-1:-1;;;;;74451:16:0;74877:31;76825:58;;;;-1:-1:-1;;;76825:58:0;;34502:2:1;76825:58:0;;;34484:21:1;34541:2;34521:18;;;34514:30;34580;34560:18;;;34553:58;34628:18;;76825:58:0;34300:352:1;76825:58:0;76896:48;76925:1;76929:2;76933:7;76942:1;76896:20;:48::i;:::-;74853:4;74451:16;;;:7;:16;;;;;;-1:-1:-1;;;;;74451:16:0;74877:31;77034:58;;;;-1:-1:-1;;;77034:58:0;;34502:2:1;77034:58:0;;;34484:21:1;34541:2;34521:18;;;34514:30;34580;34560:18;;;34553:58;34628:18;;77034:58:0;34300:352:1;77034:58:0;-1:-1:-1;;;;;77441:13:0;;;;;;:9;:13;;;;;;;;:18;;77458:1;77441:18;;;77483:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;77483:21:0;;;;;77522:33;77491:7;;77441:13;;77522:33;;77441:13;;77522:33;65252:218;;:::o;81884:853::-;82038:4;-1:-1:-1;;;;;82059:13:0;;41328:19;:23;82055:675;;82095:71;;-1:-1:-1;;;82095:71:0;;-1:-1:-1;;;;;82095:36:0;;;;;:71;;39660:10;;82146:4;;82152:7;;82161:4;;82095:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;82095:71:0;;;;;;;;-1:-1:-1;;82095:71:0;;;;;;;;;;;;:::i;:::-;;;82091:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82336:6;:13;82353:1;82336:18;82332:328;;82379:60;;-1:-1:-1;;;82379:60:0;;;;;;;:::i;82332:328::-;82610:6;82604:13;82595:6;82591:2;82587:15;82580:38;82091:584;-1:-1:-1;;;;;;82217:51:0;-1:-1:-1;;;82217:51:0;;-1:-1:-1;82210:58:0;;68926:305;69028:4;-1:-1:-1;;;;;;69065:40:0;;-1:-1:-1;;;69065:40:0;;:105;;-1:-1:-1;;;;;;;69122:48:0;;-1:-1:-1;;;69122:48:0;69065:105;:158;;;-1:-1:-1;;;;;;;;;;59206:40:0;;;69187:36;59097:157;89695:915;89872:61;89899:4;89905:2;89909:12;89923:9;89872:26;:61::i;:::-;89962:1;89950:9;:13;89946:222;;;90093:63;;-1:-1:-1;;;90093:63:0;;35607:2:1;90093:63:0;;;35589:21:1;35646:2;35626:18;;;35619:30;35685:34;35665:18;;;35658:62;-1:-1:-1;;;35736:18:1;;;35729:51;35797:19;;90093:63:0;35405:417:1;89946:222:0;90198:12;-1:-1:-1;;;;;90227:18:0;;90223:187;;90262:40;90294:7;91437:10;:17;;91410:24;;;;:15;:24;;;;;:44;;;91465:24;;;;;;;;;;;;91333:164;90262:40;90223:187;;;90332:2;-1:-1:-1;;;;;90324:10:0;:4;-1:-1:-1;;;;;90324:10:0;;90320:90;;90351:47;90384:4;90390:7;90351:32;:47::i;:::-;-1:-1:-1;;;;;90424:16:0;;90420:183;;90457:45;90494:7;90457:36;:45::i;:::-;90420:183;;;90530:4;-1:-1:-1;;;;;90524:10:0;:2;-1:-1:-1;;;;;90524:10:0;;90520:83;;90551:40;90579:2;90583:7;90551:27;:40::i;83469:410::-;83659:1;83647:9;:13;83643:229;;;-1:-1:-1;;;;;83681:18:0;;;83677:87;;-1:-1:-1;;;;;83720:15:0;;;;;;:9;:15;;;;;:28;;83739:9;;83720:15;:28;;83739:9;;83720:28;:::i;:::-;;;;-1:-1:-1;;83677:87:0;-1:-1:-1;;;;;83782:16:0;;;83778:83;;-1:-1:-1;;;;;83819:13:0;;;;;;:9;:13;;;;;:26;;83836:9;;83819:13;:26;;83836:9;;83819:26;:::i;:::-;;;;-1:-1:-1;;83469:410:0;;;;:::o;92124:988::-;92390:22;92440:1;92415:22;92432:4;92415:16;:22::i;:::-;:26;;;;:::i;:::-;92452:18;92473:26;;;:17;:26;;;;;;92390:51;;-1:-1:-1;92606:28:0;;;92602:328;;-1:-1:-1;;;;;92673:18:0;;92651:19;92673:18;;;:12;:18;;;;;;;;:34;;;;;;;;;92724:30;;;;;;:44;;;92841:30;;:17;:30;;;;;:43;;;92602:328;-1:-1:-1;93026:26:0;;;;:17;:26;;;;;;;;93019:33;;;-1:-1:-1;;;;;93070:18:0;;;;;:12;:18;;;;;:34;;;;;;;93063:41;92124:988::o;93407:1079::-;93685:10;:17;93660:22;;93685:21;;93705:1;;93685:21;:::i;:::-;93717:18;93738:24;;;:15;:24;;;;;;94111:10;:26;;93660:46;;-1:-1:-1;93738:24:0;;93660:46;;94111:26;;;;;;:::i;:::-;;;;;;;;;94089:48;;94175:11;94150:10;94161;94150:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;94255:28;;;:15;:28;;;;;;;:41;;;94427:24;;;;;94420:31;94462:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;93478:1008;;;93407:1079;:::o;90911:221::-;90996:14;91013:20;91030:2;91013:16;:20::i;:::-;-1:-1:-1;;;;;91044:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;91089:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;90911:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:127::-;2239:10;2234:3;2230:20;2227:1;2220:31;2270:4;2267:1;2260:15;2294:4;2291:1;2284:15;2310:275;2381:2;2375:9;2446:2;2427:13;;-1:-1:-1;;2423:27:1;2411:40;;-1:-1:-1;;;;;2466:34:1;;2502:22;;;2463:62;2460:88;;;2528:18;;:::i;:::-;2564:2;2557:22;2310:275;;-1:-1:-1;2310:275:1:o;2590:183::-;2650:4;-1:-1:-1;;;;;2675:6:1;2672:30;2669:56;;;2705:18;;:::i;:::-;-1:-1:-1;2750:1:1;2746:14;2762:4;2742:25;;2590:183::o;2778:662::-;2832:5;2885:3;2878:4;2870:6;2866:17;2862:27;2852:55;;2903:1;2900;2893:12;2852:55;2939:6;2926:20;2965:4;2989:60;3005:43;3045:2;3005:43;:::i;:::-;2989:60;:::i;:::-;3083:15;;;3169:1;3165:10;;;;3153:23;;3149:32;;;3114:12;;;;3193:15;;;3190:35;;;3221:1;3218;3211:12;3190:35;3257:2;3249:6;3245:15;3269:142;3285:6;3280:3;3277:15;3269:142;;;3351:17;;3339:30;;3389:12;;;;3302;;3269:142;;;-1:-1:-1;3429:5:1;2778:662;-1:-1:-1;;;;;;2778:662:1:o;3445:159::-;3512:20;;3572:6;3561:18;;3551:29;;3541:57;;3594:1;3591;3584:12;3609:494;3710:6;3718;3726;3779:2;3767:9;3758:7;3754:23;3750:32;3747:52;;;3795:1;3792;3785:12;3747:52;3818:29;3837:9;3818:29;:::i;:::-;3808:39;;3898:2;3887:9;3883:18;3870:32;-1:-1:-1;;;;;3917:6:1;3914:30;3911:50;;;3957:1;3954;3947:12;3911:50;3980:61;4033:7;4024:6;4013:9;4009:22;3980:61;:::i;:::-;3970:71;;;4060:37;4093:2;4082:9;4078:18;4060:37;:::i;:::-;4050:47;;3609:494;;;;;:::o;4483:258::-;4550:6;4558;4611:2;4599:9;4590:7;4586:23;4582:32;4579:52;;;4627:1;4624;4617:12;4579:52;4650:28;4668:9;4650:28;:::i;:::-;4640:38;;4697;4731:2;4720:9;4716:18;4697:38;:::i;:::-;4687:48;;4483:258;;;;;:::o;4746:328::-;4823:6;4831;4839;4892:2;4880:9;4871:7;4867:23;4863:32;4860:52;;;4908:1;4905;4898:12;4860:52;4931:29;4950:9;4931:29;:::i;:::-;4921:39;;4979:38;5013:2;5002:9;4998:18;4979:38;:::i;:::-;4969:48;;5064:2;5053:9;5049:18;5036:32;5026:42;;4746:328;;;;;:::o;5446:248::-;5514:6;5522;5575:2;5563:9;5554:7;5550:23;5546:32;5543:52;;;5591:1;5588;5581:12;5543:52;-1:-1:-1;;5614:23:1;;;5684:2;5669:18;;;5656:32;;-1:-1:-1;5446:248:1:o;5978:254::-;6046:6;6054;6107:2;6095:9;6086:7;6082:23;6078:32;6075:52;;;6123:1;6120;6113:12;6075:52;6159:9;6146:23;6136:33;;6188:38;6222:2;6211:9;6207:18;6188:38;:::i;6476:184::-;6534:6;6587:2;6575:9;6566:7;6562:23;6558:32;6555:52;;;6603:1;6600;6593:12;6555:52;6626:28;6644:9;6626:28;:::i;7544:186::-;7603:6;7656:2;7644:9;7635:7;7631:23;7627:32;7624:52;;;7672:1;7669;7662:12;7624:52;7695:29;7714:9;7695:29;:::i;7735:632::-;7906:2;7958:21;;;8028:13;;7931:18;;;8050:22;;;7877:4;;7906:2;8129:15;;;;8103:2;8088:18;;;7877:4;8172:169;8186:6;8183:1;8180:13;8172:169;;;8247:13;;8235:26;;8316:15;;;;8281:12;;;;8208:1;8201:9;8172:169;;;-1:-1:-1;8358:3:1;;7735:632;-1:-1:-1;;;;;;7735:632:1:o;8372:118::-;8458:5;8451:13;8444:21;8437:5;8434:32;8424:60;;8480:1;8477;8470:12;8495:315;8560:6;8568;8621:2;8609:9;8600:7;8596:23;8592:32;8589:52;;;8637:1;8634;8627:12;8589:52;8660:29;8679:9;8660:29;:::i;:::-;8650:39;;8739:2;8728:9;8724:18;8711:32;8752:28;8774:5;8752:28;:::i;:::-;8799:5;8789:15;;;8495:315;;;;;:::o;8815:980::-;8910:6;8918;8926;8934;8987:3;8975:9;8966:7;8962:23;8958:33;8955:53;;;9004:1;9001;8994:12;8955:53;9027:29;9046:9;9027:29;:::i;:::-;9017:39;;9075:2;9096:38;9130:2;9119:9;9115:18;9096:38;:::i;:::-;9086:48;;9181:2;9170:9;9166:18;9153:32;9143:42;;9236:2;9225:9;9221:18;9208:32;-1:-1:-1;;;;;9300:2:1;9292:6;9289:14;9286:34;;;9316:1;9313;9306:12;9286:34;9354:6;9343:9;9339:22;9329:32;;9399:7;9392:4;9388:2;9384:13;9380:27;9370:55;;9421:1;9418;9411:12;9370:55;9457:2;9444:16;9479:2;9475;9472:10;9469:36;;;9485:18;;:::i;:::-;9527:53;9570:2;9551:13;;-1:-1:-1;;9547:27:1;9543:36;;9527:53;:::i;:::-;9514:66;;9603:2;9596:5;9589:17;9643:7;9638:2;9633;9629;9625:11;9621:20;9618:33;9615:53;;;9664:1;9661;9654:12;9615:53;9719:2;9714;9710;9706:11;9701:2;9694:5;9690:14;9677:45;9763:1;9758:2;9753;9746:5;9742:14;9738:23;9731:34;;9784:5;9774:15;;;;;8815:980;;;;;;;:::o;9800:577::-;9899:6;9907;9915;9968:2;9956:9;9947:7;9943:23;9939:32;9936:52;;;9984:1;9981;9974:12;9936:52;10007:28;10025:9;10007:28;:::i;:::-;9997:38;;10085:2;10074:9;10070:18;10057:32;10129:4;10122:5;10118:16;10111:5;10108:27;10098:55;;10149:1;10146;10139:12;10098:55;10172:5;-1:-1:-1;10228:2:1;10213:18;;10200:32;-1:-1:-1;;;;;10244:30:1;;10241:50;;;10287:1;10284;10277:12;10241:50;10310:61;10363:7;10354:6;10343:9;10339:22;10310:61;:::i;:::-;10300:71;;;9800:577;;;;;:::o;10382:348::-;10434:8;10444:6;10498:3;10491:4;10483:6;10479:17;10475:27;10465:55;;10516:1;10513;10506:12;10465:55;-1:-1:-1;10539:20:1;;-1:-1:-1;;;;;10571:30:1;;10568:50;;;10614:1;10611;10604:12;10568:50;10651:4;10643:6;10639:17;10627:29;;10703:3;10696:4;10687:6;10679;10675:19;10671:30;10668:39;10665:59;;;10720:1;10717;10710:12;10735:850;10833:6;10841;10849;10857;10865;10918:2;10906:9;10897:7;10893:23;10889:32;10886:52;;;10934:1;10931;10924:12;10886:52;10974:9;10961:23;-1:-1:-1;;;;;11044:2:1;11036:6;11033:14;11030:34;;;11060:1;11057;11050:12;11030:34;11099:59;11150:7;11141:6;11130:9;11126:22;11099:59;:::i;:::-;11177:8;;-1:-1:-1;11073:85:1;-1:-1:-1;11265:2:1;11250:18;;11237:32;;-1:-1:-1;11281:16:1;;;11278:36;;;11310:1;11307;11300:12;11278:36;;11349:61;11402:7;11391:8;11380:9;11376:24;11349:61;:::i;:::-;11429:8;;-1:-1:-1;11323:87:1;-1:-1:-1;;11514:2:1;11499:18;;11486:32;11527:28;11486:32;11527:28;:::i;:::-;11574:5;11564:15;;;10735:850;;;;;;;;:::o;11590:260::-;11658:6;11666;11719:2;11707:9;11698:7;11694:23;11690:32;11687:52;;;11735:1;11732;11725:12;11687:52;11758:29;11777:9;11758:29;:::i;12522:844::-;12575:5;12628:3;12621:4;12613:6;12609:17;12605:27;12595:55;;12646:1;12643;12636:12;12595:55;12682:6;12669:20;12708:4;12732:60;12748:43;12788:2;12748:43;:::i;12732:60::-;12826:15;;;12912:1;12908:10;;;;12896:23;;12892:32;;;12857:12;;;;12936:15;;;12933:35;;;12964:1;12961;12954:12;12933:35;13000:2;12992:6;12988:15;13012:325;13028:6;13023:3;13020:15;13012:325;;;13108:3;13095:17;-1:-1:-1;;;;;13149:5:1;13145:30;13138:5;13135:41;13125:139;;13218:1;13247:2;13243;13236:14;13125:139;13277:18;;13315:12;;;;13045;;13012:325;;13371:2252;13733:6;13741;13749;13757;13765;13773;13781;13789;13797;13805;13858:3;13846:9;13837:7;13833:23;13829:33;13826:53;;;13875:1;13872;13865:12;13826:53;13915:9;13902:23;-1:-1:-1;;;;;13985:2:1;13977:6;13974:14;13971:34;;;14001:1;13998;13991:12;13971:34;14024:61;14077:7;14068:6;14057:9;14053:22;14024:61;:::i;:::-;14014:71;;14138:2;14127:9;14123:18;14110:32;14094:48;;14167:2;14157:8;14154:16;14151:36;;;14183:1;14180;14173:12;14151:36;14206:63;14261:7;14250:8;14239:9;14235:24;14206:63;:::i;:::-;14196:73;;14322:2;14311:9;14307:18;14294:32;14278:48;;14351:2;14341:8;14338:16;14335:36;;;14367:1;14364;14357:12;14335:36;14390:62;14444:7;14433:8;14422:9;14418:24;14390:62;:::i;:::-;14380:72;;14505:2;14494:9;14490:18;14477:32;14461:48;;14534:2;14524:8;14521:16;14518:36;;;14550:1;14547;14540:12;14518:36;14573:62;14627:7;14616:8;14605:9;14601:24;14573:62;:::i;:::-;14563:72;;14688:3;14677:9;14673:19;14660:33;14644:49;;14718:2;14708:8;14705:16;14702:36;;;14734:1;14731;14724:12;14702:36;14757:63;14812:7;14801:8;14790:9;14786:24;14757:63;:::i;:::-;14747:73;;14873:3;14862:9;14858:19;14845:33;14829:49;;14903:2;14893:8;14890:16;14887:36;;;14919:1;14916;14909:12;14887:36;14942:63;14997:7;14986:8;14975:9;14971:24;14942:63;:::i;:::-;14932:73;;15058:3;15047:9;15043:19;15030:33;15014:49;;15088:2;15078:8;15075:16;15072:36;;;15104:1;15101;15094:12;15072:36;15127:63;15182:7;15171:8;15160:9;15156:24;15127:63;:::i;:::-;15117:73;;15243:3;15232:9;15228:19;15215:33;15199:49;;15273:2;15263:8;15260:16;15257:36;;;15289:1;15286;15279:12;15257:36;15312:63;15367:7;15356:8;15345:9;15341:24;15312:63;:::i;:::-;15302:73;;15428:3;15417:9;15413:19;15400:33;15384:49;;15458:2;15448:8;15445:16;15442:36;;;15474:1;15471;15464:12;15442:36;;15497:63;15552:7;15541:8;15530:9;15526:24;15497:63;:::i;:::-;15487:73;;;15579:38;15612:3;15601:9;15597:19;15579:38;:::i;:::-;15569:48;;13371:2252;;;;;;;;;;;;;:::o;15628:380::-;15707:1;15703:12;;;;15750;;;15771:61;;15825:4;15817:6;15813:17;15803:27;;15771:61;15878:2;15870:6;15867:14;15847:18;15844:38;15841:161;;15924:10;15919:3;15915:20;15912:1;15905:31;15959:4;15956:1;15949:15;15987:4;15984:1;15977:15;15841:161;;15628:380;;;:::o;16013:127::-;16074:10;16069:3;16065:20;16062:1;16055:31;16105:4;16102:1;16095:15;16129:4;16126:1;16119:15;16145:168;16218:9;;;16249;;16266:15;;;16260:22;;16246:37;16236:71;;16287:18;;:::i;16450:217::-;16490:1;16516;16506:132;;16560:10;16555:3;16551:20;16548:1;16541:31;16595:4;16592:1;16585:15;16623:4;16620:1;16613:15;16506:132;-1:-1:-1;16652:9:1;;16450:217::o;17500:409::-;17702:2;17684:21;;;17741:2;17721:18;;;17714:30;17780:34;17775:2;17760:18;;17753:62;-1:-1:-1;;;17846:2:1;17831:18;;17824:43;17899:3;17884:19;;17500:409::o;18327:127::-;18388:10;18383:3;18379:20;18376:1;18369:31;18419:4;18416:1;18409:15;18443:4;18440:1;18433:15;19222:135;19261:3;19282:17;;;19279:43;;19302:18;;:::i;:::-;-1:-1:-1;19349:1:1;19338:13;;19222:135::o;19362:125::-;19427:9;;;19448:10;;;19445:36;;;19461:18;;:::i;19492:128::-;19559:9;;;19580:11;;;19577:37;;;19594:18;;:::i;20448:545::-;20550:2;20545:3;20542:11;20539:448;;;20586:1;20611:5;20607:2;20600:17;20656:4;20652:2;20642:19;20726:2;20714:10;20710:19;20707:1;20703:27;20697:4;20693:38;20762:4;20750:10;20747:20;20744:47;;;-1:-1:-1;20785:4:1;20744:47;20840:2;20835:3;20831:12;20828:1;20824:20;20818:4;20814:31;20804:41;;20895:82;20913:2;20906:5;20903:13;20895:82;;;20958:17;;;20939:1;20928:13;20895:82;;;20899:3;;;20448:545;;;:::o;21169:1206::-;-1:-1:-1;;;;;21288:3:1;21285:27;21282:53;;;21315:18;;:::i;:::-;21344:94;21434:3;21394:38;21426:4;21420:11;21394:38;:::i;:::-;21388:4;21344:94;:::i;:::-;21464:1;21489:2;21484:3;21481:11;21506:1;21501:616;;;;22161:1;22178:3;22175:93;;;-1:-1:-1;22234:19:1;;;22221:33;22175:93;-1:-1:-1;;21126:1:1;21122:11;;;21118:24;21114:29;21104:40;21150:1;21146:11;;;21101:57;22281:78;;21474:895;;21501:616;20395:1;20388:14;;;20432:4;20419:18;;-1:-1:-1;;21537:17:1;;;21638:9;21660:229;21674:7;21671:1;21668:14;21660:229;;;21763:19;;;21750:33;21735:49;;21870:4;21855:20;;;;21823:1;21811:14;;;;21690:12;21660:229;;;21664:3;21917;21908:7;21905:16;21902:159;;;22041:1;22037:6;22031:3;22025;22022:1;22018:11;22014:21;22010:34;22006:39;21993:9;21988:3;21984:19;21971:33;21967:79;21959:6;21952:95;21902:159;;;22104:1;22098:3;22095:1;22091:11;22087:19;22081:4;22074:33;21474:895;;21169:1206;;;:::o;22796:722::-;22846:3;22887:5;22881:12;22916:36;22942:9;22916:36;:::i;:::-;22971:1;22988:18;;;23015:133;;;;23162:1;23157:355;;;;22981:531;;23015:133;-1:-1:-1;;23048:24:1;;23036:37;;23121:14;;23114:22;23102:35;;23093:45;;;-1:-1:-1;23015:133:1;;23157:355;23188:5;23185:1;23178:16;23217:4;23262:2;23259:1;23249:16;23287:1;23301:165;23315:6;23312:1;23309:13;23301:165;;;23393:14;;23380:11;;;23373:35;23436:16;;;;23330:10;;23301:165;;;23305:3;;;23495:6;23490:3;23486:16;23479:23;;22981:531;;;;;22796:722;;;;:::o;23523:277::-;23696:3;23721:73;23755:38;23789:3;23781:6;23755:38;:::i;:::-;23747:6;23721:73;:::i;23805:469::-;24026:3;24054:38;24088:3;24080:6;24054:38;:::i;:::-;24121:6;24115:13;24137:65;24195:6;24191:2;24184:4;24176:6;24172:17;24137:65;:::i;:::-;24218:50;24260:6;24256:2;24252:15;24244:6;24218:50;:::i;:::-;24211:57;23805:469;-1:-1:-1;;;;;;;23805:469:1:o;24279:438::-;24553:3;24581:38;24615:3;24607:6;24581:38;:::i;:::-;-1:-1:-1;;;24635:2:1;24628:22;24666:45;24708:1;24704:2;24700:10;24692:6;24666:45;:::i;:::-;24659:52;24279:438;-1:-1:-1;;;;;24279:438:1:o;25075:168::-;25142:6;25168:10;;;25180;;;25164:27;;25203:11;;;25200:37;;;25217:18;;:::i;:::-;25200:37;25075:168;;;;:::o;25248:197::-;25286:3;25314:6;25355:2;25348:5;25344:14;25382:2;25373:7;25370:15;25367:41;;25388:18;;:::i;:::-;25437:1;25424:15;;25248:197;-1:-1:-1;;;25248:197:1:o;25759:245::-;25826:6;25879:2;25867:9;25858:7;25854:23;25850:32;25847:52;;;25895:1;25892;25885:12;25847:52;25927:9;25921:16;25946:28;25968:5;25946:28;:::i;30701:401::-;30903:2;30885:21;;;30942:2;30922:18;;;30915:30;30981:34;30976:2;30961:18;;30954:62;-1:-1:-1;;;31047:2:1;31032:18;;31025:35;31092:3;31077:19;;30701:401::o;31512:812::-;31923:25;31918:3;31911:38;31893:3;31978:6;31972:13;31994:75;32062:6;32057:2;32052:3;32048:12;32041:4;32033:6;32029:17;31994:75;:::i;:::-;-1:-1:-1;;;32128:2:1;32088:16;;;32120:11;;;32113:40;32178:13;;32200:76;32178:13;32262:2;32254:11;;32247:4;32235:17;;32200:76;:::i;:::-;32296:17;32315:2;32292:26;;31512:812;-1:-1:-1;;;;31512:812:1:o;32329:414::-;32531:2;32513:21;;;32570:2;32550:18;;;32543:30;32609:34;32604:2;32589:18;;32582:62;-1:-1:-1;;;32675:2:1;32660:18;;32653:48;32733:3;32718:19;;32329:414::o;33437:136::-;33476:3;33504:5;33494:39;;33513:18;;:::i;:::-;-1:-1:-1;;;33549:18:1;;33437:136::o;34657:489::-;-1:-1:-1;;;;;34926:15:1;;;34908:34;;34978:15;;34973:2;34958:18;;34951:43;35025:2;35010:18;;35003:34;;;35073:3;35068:2;35053:18;;35046:31;;;34851:4;;35094:46;;35120:19;;35112:6;35094:46;:::i;:::-;35086:54;34657:489;-1:-1:-1;;;;;;34657:489:1:o;35151:249::-;35220:6;35273:2;35261:9;35252:7;35248:23;35244:32;35241:52;;;35289:1;35286;35279:12;35241:52;35321:9;35315:16;35340:30;35364:5;35340:30;:::i;35827:127::-;35888:10;35883:3;35879:20;35876:1;35869:31;35919:4;35916:1;35909:15;35943:4;35940:1;35933:15

Swarm Source

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