ETH Price: $3,099.55 (+0.52%)
Gas: 5 Gwei

Token

NFT_Utility (NU)
 

Overview

Max Total Supply

750 NU

Holders

601

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 NU
0xcfe97c0ca9ba5f0eda5c4eae90ef249407b3a689
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:
NFT_Utility

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-11
*/

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


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/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/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.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 = _owners[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 nor 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 nor approved");

        _transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        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);

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @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.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/goblin V2.sol


/*
            .-'''-.                                                                          
           '   _    \            .---.               .---.                     _______       
         /   /` '.   \ /|        |   |.--.   _..._   |   |             _..._   \  ___ `'.    
  .--./).   |     \  ' ||        |   ||__| .'     '. |   |           .'     '.  ' |--.\  \   
 /.''\\ |   '      |  '||        |   |.--..   .-.   .|   |          .   .-.   . | |    \  '  
| |  | |\    \     / / ||  __    |   ||  ||  '   '  ||   |    __    |  '   '  | | |     |  ' 
 \`-' /  `.   ` ..' /  ||/'__ '. |   ||  ||  |   |  ||   | .:--.'.  |  |   |  | | |     |  | 
 /("'`      '-...-'`   |:/`  '. '|   ||  ||  |   |  ||   |/ |   \ | |  |   |  | | |     ' .' 
 \ '---.               ||     | ||   ||  ||  |   |  ||   |`" __ | | |  |   |  | | |___.' /'  
  /'""'.\              ||\    / '|   ||__||  |   |  ||   | .'.''| | |  |   |  |/_______.'/   
 ||     ||             |/\'..' / '---'    |  |   |  |'---'/ /   | |_|  |   |  |\_______|/    
 \'. __//              '  `'-'`           |  |   |  |     \ \._,\ '/|  |   |  |              
  `'---'                                  '--'   '--'      `--'  `" '--'   '--'//By Elfoly
**/

pragma solidity >=0.7.0 <0.9.0;






contract NFT_Utility is ERC721, ERC2981, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "ipfs://bafybeigj3s5h55bfinlzhhi2nlljmamdxllsj3mdydysheo5o4p7g5rxn4/";
  string public uriSuffix = ".json";
  string public contractURI;
  uint256 public maxSupply = 5000;
  uint256 public maxMintAmountPerWallet = 1;
  uint256 public cost = 0.01 ether;
  bytes32 public root;
  


  mapping(address => uint256) public mintedWallets;

  bool public isWhitelistMintPaused = true;
  bool public isPublicMintpaused = true;


 constructor(uint96 _royaltyFeesInBips, string memory _contractURI, bytes32 _root) ERC721("NFT_Utility", "NU") {
   setRoyaltyInfo(msg.sender, _royaltyFeesInBips);
   contractURI = _contractURI;
   root = _root ;
  }
  

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }

//mint functions
  function WhitelistMint(bytes32[] memory proof) public {
    uint256 _mintAmount = 1;
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
    require(!isWhitelistMintPaused, " whitelist mint is not open yet!");
    require(isValid(proof, keccak256(abi.encodePacked(msg.sender))), "Not whitlisted");
    require(mintedWallets[msg.sender] < 1, "Only one per wallet !");
    mintedWallets[msg.sender]++;

    _mintLoop(msg.sender, _mintAmount);
  }

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


  function PublicMint(uint256 _mintAmount) public payable {
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
    require(!isPublicMintpaused, " mint is not open !");
    require(msg.value >= cost * _mintAmount , "Insufficient funds!");

    _mintLoop(msg.sender, _mintAmount);
  }

  function mintForOwner(uint256 _mintAmount, address _receiver) public onlyOwner {
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");

    _mintLoop(_receiver, _mintAmount);
  }
//
  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

  

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

  

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }



  function setisWhitelistMintPaused(bool _state) public onlyOwner {
    isWhitelistMintPaused = _state;
  }
  
  function setisPublicMintpaused(bool _state) public onlyOwner {
    isPublicMintpaused = _state;
  }



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

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

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

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

    function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) public onlyOwner {
      _setDefaultRoyalty(_receiver, _royaltyFeesInBips);
    }

    function setContractURI(string calldata _contractURI) public onlyOwner {
      contractURI = _contractURI;
    }

    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"},{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"PublicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"WhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMintpaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistMintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedWallets","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setisPublicMintpaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setisWhitelistMintPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060800160405280604381526020016200531760439139600a9080519060200190620000359291906200055b565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b9080519060200190620000839291906200055b565b50611388600d556001600e55662386f26fc10000600f556001601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff021916908315150217905550348015620000dd57600080fd5b506040516200535a3803806200535a8339818101604052810190620001039190620006b7565b6040518060400160405280600b81526020017f4e46545f5574696c6974790000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4e550000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001879291906200055b565b508060019080519060200190620001a09291906200055b565b505050620001c3620001b7620001fe60201b60201c565b6200020660201b60201c565b620001d53384620002cc60201b60201c565b81600c9080519060200190620001ed9291906200055b565b508060108190555050505062000a99565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002dc620002f260201b60201c565b620002ee82826200038360201b60201c565b5050565b62000302620001fe60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003286200052760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000381576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037890620007a7565b60405180910390fd5b565b620003936200055160201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620003f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003eb90620007c9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000467576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200045e90620007eb565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600660008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612710905090565b8280546200056990620008d5565b90600052602060002090601f0160209004810192826200058d5760008555620005d9565b82601f10620005a857805160ff1916838001178555620005d9565b82800160010185558215620005d9579182015b82811115620005d8578251825591602001919060010190620005bb565b5b509050620005e89190620005ec565b5090565b5b8082111562000607576000816000905550600101620005ed565b5090565b6000620006226200061c8462000836565b6200080d565b905082815260208101848484011115620006415762000640620009a4565b5b6200064e8482856200089f565b509392505050565b600081519050620006678162000a65565b92915050565b600082601f8301126200068557620006846200099f565b5b8151620006978482602086016200060b565b91505092915050565b600081519050620006b18162000a7f565b92915050565b600080600060608486031215620006d357620006d2620009ae565b5b6000620006e386828701620006a0565b935050602084015167ffffffffffffffff811115620007075762000706620009a9565b5b62000715868287016200066d565b9250506040620007288682870162000656565b9150509250925092565b6000620007416020836200086c565b91506200074e82620009c4565b602082019050919050565b600062000768602a836200086c565b91506200077582620009ed565b604082019050919050565b60006200078f6019836200086c565b91506200079c8262000a3c565b602082019050919050565b60006020820190508181036000830152620007c28162000732565b9050919050565b60006020820190508181036000830152620007e48162000759565b9050919050565b60006020820190508181036000830152620008068162000780565b9050919050565b6000620008196200082c565b90506200082782826200090b565b919050565b6000604051905090565b600067ffffffffffffffff82111562000854576200085362000970565b5b6200085f82620009b3565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b60005b83811015620008bf578082015181840152602081019050620008a2565b83811115620008cf576000848401525b50505050565b60006002820490506001821680620008ee57607f821691505b6020821081141562000905576200090462000941565b5b50919050565b6200091682620009b3565b810181811067ffffffffffffffff8211171562000938576200093762000970565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b62000a70816200087d565b811462000a7c57600080fd5b50565b62000a8a8162000887565b811462000a9657600080fd5b50565b61486e8062000aa96000396000f3fe6080604052600436106102305760003560e01c806370a082311161012e578063b88d4fde116100ab578063d5abeb011161006f578063d5abeb011461083f578063e8a3d4851461086a578063e985e9c514610895578063ebf0c717146108d2578063f2fde38b146108fd57610230565b8063b88d4fde14610748578063b8a20ed014610771578063bc951b91146107ae578063bce1e037146107d9578063c87b56dd1461080257610230565b8063938e3d7b116100f2578063938e3d7b1461067257806395d89b411461069b5780639fb17e34146106c6578063a22cb465146106e2578063ada7c4ed1461070b57610230565b806370a082311461059f578063715018a6146105dc57806375280fcb146105f35780637ec4a6591461061e5780638da5cb5b1461064757610230565b8063267b3d74116101bc57806342842e0e1161018057806342842e0e146104a6578063438b6300146104cf5780635503a0e81461050c57806362b99ad4146105375780636352211e1461056257610230565b8063267b3d74146103d45780632a55205a146103ff578063312553da1461043d5780633ccfd60b146104665780633fcf79dc1461047d57610230565b8063095ea7b311610203578063095ea7b31461030357806313faede61461032c57806318160ddd146103575780631a93d43e1461038257806323b872dd146103ab57610230565b806301ffc9a71461023557806302fa7c471461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613243565b610926565b6040516102699190613a12565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190613131565b610938565b005b3480156102a757600080fd5b506102b061094e565b6040516102bd9190613a48565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e89190613333565b6109e0565b6040516102fa9190613960565b60405180910390f35b34801561030f57600080fd5b5061032a600480360381019061032591906130f1565b610a26565b005b34801561033857600080fd5b50610341610b3e565b60405161034e9190613d2a565b60405180910390f35b34801561036357600080fd5b5061036c610b44565b6040516103799190613d2a565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a49190613216565b610b55565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190612fdb565b610b7a565b005b3480156103e057600080fd5b506103e9610bda565b6040516103f69190613a12565b60405180910390f35b34801561040b57600080fd5b50610426600480360381019061042191906133a0565b610bed565b6040516104349291906139c7565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190613216565b610dd8565b005b34801561047257600080fd5b5061047b610dfd565b005b34801561048957600080fd5b506104a4600480360381019061049f9190613360565b610e85565b005b3480156104b257600080fd5b506104cd60048036038101906104c89190612fdb565b610ef4565b005b3480156104db57600080fd5b506104f660048036038101906104f19190612f6e565b610f14565b60405161050391906139f0565b60405180910390f35b34801561051857600080fd5b5061052161101f565b60405161052e9190613a48565b60405180910390f35b34801561054357600080fd5b5061054c6110ad565b6040516105599190613a48565b60405180910390f35b34801561056e57600080fd5b5061058960048036038101906105849190613333565b61113b565b6040516105969190613960565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190612f6e565b6111ed565b6040516105d39190613d2a565b60405180910390f35b3480156105e857600080fd5b506105f16112a5565b005b3480156105ff57600080fd5b506106086112b9565b6040516106159190613a12565b60405180910390f35b34801561062a57600080fd5b50610645600480360381019061064091906132ea565b6112cc565b005b34801561065357600080fd5b5061065c6112ee565b6040516106699190613960565b60405180910390f35b34801561067e57600080fd5b506106996004803603810190610694919061329d565b611318565b005b3480156106a757600080fd5b506106b0611336565b6040516106bd9190613a48565b60405180910390f35b6106e060048036038101906106db9190613333565b6113c8565b005b3480156106ee57600080fd5b50610709600480360381019061070491906130b1565b6114ce565b005b34801561071757600080fd5b50610732600480360381019061072d9190612f6e565b6114e4565b60405161073f9190613d2a565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a919061302e565b6114fc565b005b34801561077d57600080fd5b50610798600480360381019061079391906131ba565b61155e565b6040516107a59190613a12565b60405180910390f35b3480156107ba57600080fd5b506107c3611575565b6040516107d09190613d2a565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb9190613171565b61157b565b005b34801561080e57600080fd5b5061082960048036038101906108249190613333565b61177e565b6040516108369190613a48565b60405180910390f35b34801561084b57600080fd5b50610854611828565b6040516108619190613d2a565b60405180910390f35b34801561087657600080fd5b5061087f61182e565b60405161088c9190613a48565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b79190612f9b565b6118bc565b6040516108c99190613a12565b60405180910390f35b3480156108de57600080fd5b506108e7611950565b6040516108f49190613a2d565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190612f6e565b611956565b005b6000610931826119da565b9050919050565b610940611a54565b61094a8282611ad2565b5050565b60606000805461095d90614081565b80601f016020809104026020016040519081016040528092919081815260200182805461098990614081565b80156109d65780601f106109ab576101008083540402835291602001916109d6565b820191906000526020600020905b8154815290600101906020018083116109b957829003601f168201915b5050505050905090565b60006109eb82611c68565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a318261113b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9990613c6a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac1611cb3565b73ffffffffffffffffffffffffffffffffffffffff161480610af05750610aef81610aea611cb3565b6118bc565b5b610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690613baa565b60405180910390fd5b610b398383611cbb565b505050565b600f5481565b6000610b506009611d74565b905090565b610b5d611a54565b80601260006101000a81548160ff02191690831515021790555050565b610b8b610b85611cb3565b82611d82565b610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc190613cca565b60405180910390fd5b610bd5838383611e17565b505050565b601260019054906101000a900460ff1681565b6000806000600760008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610d835760066040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610d8d61207e565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610db99190613f1b565b610dc39190613eea565b90508160000151819350935050509250929050565b610de0611a54565b80601260016101000a81548160ff02191690831515021790555050565b610e05611a54565b6000610e0f6112ee565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e329061394b565b60006040518083038185875af1925050503d8060008114610e6f576040519150601f19603f3d011682016040523d82523d6000602084013e610e74565b606091505b5050905080610e8257600080fd5b50565b610e8d611a54565b600d5482610e9b6009611d74565b610ea59190613e94565b1115610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90613c8a565b60405180910390fd5b610ef08183612088565b5050565b610f0f838383604051806020016040528060008152506114fc565b505050565b60606000610f21836111ed565b905060008167ffffffffffffffff811115610f3f57610f3e61423e565b5b604051908082528060200260200182016040528015610f6d5781602001602082028036833780820191505090505b50905060006001905060005b8381108015610f8a5750600d548211155b15611013576000610f9a8361113b565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fff5782848381518110610fe457610fe361420f565b5b6020026020010181815250508180610ffb906140e4565b9250505b828061100a906140e4565b93505050610f79565b82945050505050919050565b600b805461102c90614081565b80601f016020809104026020016040519081016040528092919081815260200182805461105890614081565b80156110a55780601f1061107a576101008083540402835291602001916110a5565b820191906000526020600020905b81548152906001019060200180831161108857829003601f168201915b505050505081565b600a80546110ba90614081565b80601f01602080910402602001604051908101604052809291908181526020018280546110e690614081565b80156111335780601f1061110857610100808354040283529160200191611133565b820191906000526020600020905b81548152906001019060200180831161111657829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111db90613c4a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613b8a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112ad611a54565b6112b760006120c8565b565b601260009054906101000a900460ff1681565b6112d4611a54565b80600a90805190602001906112ea929190612bde565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611320611a54565b8181600c9190611331929190612c64565b505050565b60606001805461134590614081565b80601f016020809104026020016040519081016040528092919081815260200182805461137190614081565b80156113be5780601f10611393576101008083540402835291602001916113be565b820191906000526020600020905b8154815290600101906020018083116113a157829003601f168201915b5050505050905090565b600d54816113d66009611d74565b6113e09190613e94565b1115611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890613c8a565b60405180910390fd5b601260019054906101000a900460ff1615611471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146890613b6a565b60405180910390fd5b80600f5461147f9190613f1b565b3410156114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b890613d0a565b60405180910390fd5b6114cb3382612088565b50565b6114e06114d9611cb3565b838361218e565b5050565b60116020528060005260406000206000915090505481565b61150d611507611cb3565b83611d82565b61154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390613cca565b60405180910390fd5b611558848484846122fb565b50505050565b600061156d8360105484612357565b905092915050565b600e5481565b600060019050600d548161158f6009611d74565b6115999190613e94565b11156115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190613c8a565b60405180910390fd5b601260009054906101000a900460ff161561162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190613a8a565b60405180910390fd5b61165a823360405160200161163f91906138ff565b6040516020818303038152906040528051906020012061155e565b611699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169090613c0a565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290613b4a565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061176b906140e4565b919050555061177a3382612088565b5050565b60606117898261236e565b6117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90613c2a565b60405180910390fd5b60006117d26123da565b905060008151116117f25760405180602001604052806000815250611820565b806117fc8461246c565b600b6040516020016118109392919061391a565b6040516020818303038152906040525b915050919050565b600d5481565b600c805461183b90614081565b80601f016020809104026020016040519081016040528092919081815260200182805461186790614081565b80156118b45780601f10611889576101008083540402835291602001916118b4565b820191906000526020600020905b81548152906001019060200180831161189757829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60105481565b61195e611a54565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c590613aaa565b60405180910390fd5b6119d7816120c8565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a4d5750611a4c826125cd565b5b9050919050565b611a5c611cb3565b73ffffffffffffffffffffffffffffffffffffffff16611a7a6112ee565b73ffffffffffffffffffffffffffffffffffffffff1614611ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac790613bea565b60405180910390fd5b565b611ada61207e565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f90613caa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f90613cea565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600660008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b611c718161236e565b611cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca790613c4a565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d2e8361113b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080611d8e8361113b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611dd05750611dcf81856118bc565b5b80611e0e57508373ffffffffffffffffffffffffffffffffffffffff16611df6846109e0565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e378261113b565b73ffffffffffffffffffffffffffffffffffffffff1614611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490613aca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490613b0a565b60405180910390fd5b611f088383836126af565b611f13600082611cbb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f639190613f75565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fba9190613e94565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120798383836126b4565b505050565b6000612710905090565b60005b818110156120c35761209d60096126b9565b6120b0836120ab6009611d74565b6126cf565b80806120bb906140e4565b91505061208b565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f490613b2a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122ee9190613a12565b60405180910390a3505050565b612306848484611e17565b612312848484846126ed565b612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234890613a6a565b60405180910390fd5b50505050565b6000826123648584612884565b1490509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600a80546123e990614081565b80601f016020809104026020016040519081016040528092919081815260200182805461241590614081565b80156124625780601f1061243757610100808354040283529160200191612462565b820191906000526020600020905b81548152906001019060200180831161244557829003601f168201915b5050505050905090565b606060008214156124b4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125c8565b600082905060005b600082146124e65780806124cf906140e4565b915050600a826124df9190613eea565b91506124bc565b60008167ffffffffffffffff8111156125025761250161423e565b5b6040519080825280601f01601f1916602001820160405280156125345781602001600182028036833780820191505090505b5090505b600085146125c15760018261254d9190613f75565b9150600a8561255c9190614151565b60306125689190613e94565b60f81b81838151811061257e5761257d61420f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125ba9190613eea565b9450612538565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061269857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126a857506126a7826128da565b5b9050919050565b505050565b505050565b6001816000016000828254019250508190555050565b6126e9828260405180602001604052806000815250612944565b5050565b600061270e8473ffffffffffffffffffffffffffffffffffffffff1661299f565b15612877578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612737611cb3565b8786866040518563ffffffff1660e01b8152600401612759949392919061397b565b602060405180830381600087803b15801561277357600080fd5b505af19250505080156127a457506040513d601f19601f820116820180604052508101906127a19190613270565b60015b612827573d80600081146127d4576040519150601f19603f3d011682016040523d82523d6000602084013e6127d9565b606091505b5060008151141561281f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281690613a6a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061287c565b600190505b949350505050565b60008082905060005b84518110156128cf576128ba828683815181106128ad576128ac61420f565b5b60200260200101516129c2565b915080806128c7906140e4565b91505061288d565b508091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61294e83836129ed565b61295b60008484846126ed565b61299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299190613a6a565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008183106129da576129d58284612bc7565b6129e5565b6129e48383612bc7565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5490613bca565b60405180910390fd5b612a668161236e565b15612aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9d90613aea565b60405180910390fd5b612ab2600083836126af565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b029190613e94565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bc3600083836126b4565b5050565b600082600052816020526040600020905092915050565b828054612bea90614081565b90600052602060002090601f016020900481019282612c0c5760008555612c53565b82601f10612c2557805160ff1916838001178555612c53565b82800160010185558215612c53579182015b82811115612c52578251825591602001919060010190612c37565b5b509050612c609190612cea565b5090565b828054612c7090614081565b90600052602060002090601f016020900481019282612c925760008555612cd9565b82601f10612cab57803560ff1916838001178555612cd9565b82800160010185558215612cd9579182015b82811115612cd8578235825591602001919060010190612cbd565b5b509050612ce69190612cea565b5090565b5b80821115612d03576000816000905550600101612ceb565b5090565b6000612d1a612d1584613d6a565b613d45565b90508083825260208201905082856020860282011115612d3d57612d3c614277565b5b60005b85811015612d6d5781612d538882612e53565b845260208401935060208301925050600181019050612d40565b5050509392505050565b6000612d8a612d8584613d96565b613d45565b905082815260208101848484011115612da657612da561427c565b5b612db184828561403f565b509392505050565b6000612dcc612dc784613dc7565b613d45565b905082815260208101848484011115612de857612de761427c565b5b612df384828561403f565b509392505050565b600081359050612e0a816147ae565b92915050565b600082601f830112612e2557612e24614272565b5b8135612e35848260208601612d07565b91505092915050565b600081359050612e4d816147c5565b92915050565b600081359050612e62816147dc565b92915050565b600081359050612e77816147f3565b92915050565b600081519050612e8c816147f3565b92915050565b600082601f830112612ea757612ea6614272565b5b8135612eb7848260208601612d77565b91505092915050565b60008083601f840112612ed657612ed5614272565b5b8235905067ffffffffffffffff811115612ef357612ef261426d565b5b602083019150836001820283011115612f0f57612f0e614277565b5b9250929050565b600082601f830112612f2b57612f2a614272565b5b8135612f3b848260208601612db9565b91505092915050565b600081359050612f538161480a565b92915050565b600081359050612f6881614821565b92915050565b600060208284031215612f8457612f83614286565b5b6000612f9284828501612dfb565b91505092915050565b60008060408385031215612fb257612fb1614286565b5b6000612fc085828601612dfb565b9250506020612fd185828601612dfb565b9150509250929050565b600080600060608486031215612ff457612ff3614286565b5b600061300286828701612dfb565b935050602061301386828701612dfb565b925050604061302486828701612f44565b9150509250925092565b6000806000806080858703121561304857613047614286565b5b600061305687828801612dfb565b945050602061306787828801612dfb565b935050604061307887828801612f44565b925050606085013567ffffffffffffffff81111561309957613098614281565b5b6130a587828801612e92565b91505092959194509250565b600080604083850312156130c8576130c7614286565b5b60006130d685828601612dfb565b92505060206130e785828601612e3e565b9150509250929050565b6000806040838503121561310857613107614286565b5b600061311685828601612dfb565b925050602061312785828601612f44565b9150509250929050565b6000806040838503121561314857613147614286565b5b600061315685828601612dfb565b925050602061316785828601612f59565b9150509250929050565b60006020828403121561318757613186614286565b5b600082013567ffffffffffffffff8111156131a5576131a4614281565b5b6131b184828501612e10565b91505092915050565b600080604083850312156131d1576131d0614286565b5b600083013567ffffffffffffffff8111156131ef576131ee614281565b5b6131fb85828601612e10565b925050602061320c85828601612e53565b9150509250929050565b60006020828403121561322c5761322b614286565b5b600061323a84828501612e3e565b91505092915050565b60006020828403121561325957613258614286565b5b600061326784828501612e68565b91505092915050565b60006020828403121561328657613285614286565b5b600061329484828501612e7d565b91505092915050565b600080602083850312156132b4576132b3614286565b5b600083013567ffffffffffffffff8111156132d2576132d1614281565b5b6132de85828601612ec0565b92509250509250929050565b600060208284031215613300576132ff614286565b5b600082013567ffffffffffffffff81111561331e5761331d614281565b5b61332a84828501612f16565b91505092915050565b60006020828403121561334957613348614286565b5b600061335784828501612f44565b91505092915050565b6000806040838503121561337757613376614286565b5b600061338585828601612f44565b925050602061339685828601612dfb565b9150509250929050565b600080604083850312156133b7576133b6614286565b5b60006133c585828601612f44565b92505060206133d685828601612f44565b9150509250929050565b60006133ec83836138e1565b60208301905092915050565b61340181613fa9565b82525050565b61341861341382613fa9565b61412d565b82525050565b600061342982613e1d565b6134338185613e4b565b935061343e83613df8565b8060005b8381101561346f57815161345688826133e0565b975061346183613e3e565b925050600181019050613442565b5085935050505092915050565b61348581613fbb565b82525050565b61349481613fc7565b82525050565b60006134a582613e28565b6134af8185613e5c565b93506134bf81856020860161404e565b6134c88161428b565b840191505092915050565b60006134de82613e33565b6134e88185613e78565b93506134f881856020860161404e565b6135018161428b565b840191505092915050565b600061351782613e33565b6135218185613e89565b935061353181856020860161404e565b80840191505092915050565b6000815461354a81614081565b6135548186613e89565b9450600182166000811461356f5760018114613580576135b3565b60ff198316865281860193506135b3565b61358985613e08565b60005b838110156135ab5781548189015260018201915060208101905061358c565b838801955050505b50505092915050565b60006135c9603283613e78565b91506135d4826142a9565b604082019050919050565b60006135ec602083613e78565b91506135f7826142f8565b602082019050919050565b600061360f602683613e78565b915061361a82614321565b604082019050919050565b6000613632602583613e78565b915061363d82614370565b604082019050919050565b6000613655601c83613e78565b9150613660826143bf565b602082019050919050565b6000613678602483613e78565b9150613683826143e8565b604082019050919050565b600061369b601983613e78565b91506136a682614437565b602082019050919050565b60006136be601583613e78565b91506136c982614460565b602082019050919050565b60006136e1601383613e78565b91506136ec82614489565b602082019050919050565b6000613704602983613e78565b915061370f826144b2565b604082019050919050565b6000613727603e83613e78565b915061373282614501565b604082019050919050565b600061374a602083613e78565b915061375582614550565b602082019050919050565b600061376d602083613e78565b915061377882614579565b602082019050919050565b6000613790600e83613e78565b915061379b826145a2565b602082019050919050565b60006137b3602f83613e78565b91506137be826145cb565b604082019050919050565b60006137d6601883613e78565b91506137e18261461a565b602082019050919050565b60006137f9602183613e78565b915061380482614643565b604082019050919050565b600061381c600083613e6d565b915061382782614692565b600082019050919050565b600061383f601483613e78565b915061384a82614695565b602082019050919050565b6000613862602a83613e78565b915061386d826146be565b604082019050919050565b6000613885602e83613e78565b91506138908261470d565b604082019050919050565b60006138a8601983613e78565b91506138b38261475c565b602082019050919050565b60006138cb601383613e78565b91506138d682614785565b602082019050919050565b6138ea8161401d565b82525050565b6138f98161401d565b82525050565b600061390b8284613407565b60148201915081905092915050565b6000613926828661350c565b9150613932828561350c565b915061393e828461353d565b9150819050949350505050565b60006139568261380f565b9150819050919050565b600060208201905061397560008301846133f8565b92915050565b600060808201905061399060008301876133f8565b61399d60208301866133f8565b6139aa60408301856138f0565b81810360608301526139bc818461349a565b905095945050505050565b60006040820190506139dc60008301856133f8565b6139e960208301846138f0565b9392505050565b60006020820190508181036000830152613a0a818461341e565b905092915050565b6000602082019050613a27600083018461347c565b92915050565b6000602082019050613a42600083018461348b565b92915050565b60006020820190508181036000830152613a6281846134d3565b905092915050565b60006020820190508181036000830152613a83816135bc565b9050919050565b60006020820190508181036000830152613aa3816135df565b9050919050565b60006020820190508181036000830152613ac381613602565b9050919050565b60006020820190508181036000830152613ae381613625565b9050919050565b60006020820190508181036000830152613b0381613648565b9050919050565b60006020820190508181036000830152613b238161366b565b9050919050565b60006020820190508181036000830152613b438161368e565b9050919050565b60006020820190508181036000830152613b63816136b1565b9050919050565b60006020820190508181036000830152613b83816136d4565b9050919050565b60006020820190508181036000830152613ba3816136f7565b9050919050565b60006020820190508181036000830152613bc38161371a565b9050919050565b60006020820190508181036000830152613be38161373d565b9050919050565b60006020820190508181036000830152613c0381613760565b9050919050565b60006020820190508181036000830152613c2381613783565b9050919050565b60006020820190508181036000830152613c43816137a6565b9050919050565b60006020820190508181036000830152613c63816137c9565b9050919050565b60006020820190508181036000830152613c83816137ec565b9050919050565b60006020820190508181036000830152613ca381613832565b9050919050565b60006020820190508181036000830152613cc381613855565b9050919050565b60006020820190508181036000830152613ce381613878565b9050919050565b60006020820190508181036000830152613d038161389b565b9050919050565b60006020820190508181036000830152613d23816138be565b9050919050565b6000602082019050613d3f60008301846138f0565b92915050565b6000613d4f613d60565b9050613d5b82826140b3565b919050565b6000604051905090565b600067ffffffffffffffff821115613d8557613d8461423e565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613db157613db061423e565b5b613dba8261428b565b9050602081019050919050565b600067ffffffffffffffff821115613de257613de161423e565b5b613deb8261428b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e9f8261401d565b9150613eaa8361401d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613edf57613ede614182565b5b828201905092915050565b6000613ef58261401d565b9150613f008361401d565b925082613f1057613f0f6141b1565b5b828204905092915050565b6000613f268261401d565b9150613f318361401d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f6a57613f69614182565b5b828202905092915050565b6000613f808261401d565b9150613f8b8361401d565b925082821015613f9e57613f9d614182565b5b828203905092915050565b6000613fb482613ffd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561406c578082015181840152602081019050614051565b8381111561407b576000848401525b50505050565b6000600282049050600182168061409957607f821691505b602082108114156140ad576140ac6141e0565b5b50919050565b6140bc8261428b565b810181811067ffffffffffffffff821117156140db576140da61423e565b5b80604052505050565b60006140ef8261401d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561412257614121614182565b5b600182019050919050565b60006141388261413f565b9050919050565b600061414a8261429c565b9050919050565b600061415c8261401d565b91506141678361401d565b925082614177576141766141b1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f2077686974656c697374206d696e74206973206e6f74206f70656e2079657421600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f6e6c79206f6e65207065722077616c6c657420210000000000000000000000600082015250565b7f206d696e74206973206e6f74206f70656e202100000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420776869746c6973746564000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6147b781613fa9565b81146147c257600080fd5b50565b6147ce81613fbb565b81146147d957600080fd5b50565b6147e581613fc7565b81146147f057600080fd5b50565b6147fc81613fd1565b811461480757600080fd5b50565b6148138161401d565b811461481e57600080fd5b50565b61482a81614027565b811461483557600080fd5b5056fea2646970667358221220d48ed77f5b1439ca142b6a8d82739a30eec33c570651053091ef81d52470f23064736f6c63430008070033697066733a2f2f62616679626569676a3373356835356266696e6c7a686869326e6c6c6a6d616d64786c6c736a336d647964797368656f356f347037673572786e342f00000000000000000000000000000000000000000000000000000000000002ee0000000000000000000000000000000000000000000000000000000000000060ea8d324e980000ba1e51d33ee347d48f7260e116453b7a2462628ba8479ebd1a000000000000000000000000000000000000000000000000000000000000006268747470733a2f2f62616679626569626d766475787633757374616679647a646975653477696170616e6c73767065696c37376b6166777063696d363576356735366d2e697066732e6e667473746f726167652e6c696e6b2f6d6574612e6a736f6e000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102305760003560e01c806370a082311161012e578063b88d4fde116100ab578063d5abeb011161006f578063d5abeb011461083f578063e8a3d4851461086a578063e985e9c514610895578063ebf0c717146108d2578063f2fde38b146108fd57610230565b8063b88d4fde14610748578063b8a20ed014610771578063bc951b91146107ae578063bce1e037146107d9578063c87b56dd1461080257610230565b8063938e3d7b116100f2578063938e3d7b1461067257806395d89b411461069b5780639fb17e34146106c6578063a22cb465146106e2578063ada7c4ed1461070b57610230565b806370a082311461059f578063715018a6146105dc57806375280fcb146105f35780637ec4a6591461061e5780638da5cb5b1461064757610230565b8063267b3d74116101bc57806342842e0e1161018057806342842e0e146104a6578063438b6300146104cf5780635503a0e81461050c57806362b99ad4146105375780636352211e1461056257610230565b8063267b3d74146103d45780632a55205a146103ff578063312553da1461043d5780633ccfd60b146104665780633fcf79dc1461047d57610230565b8063095ea7b311610203578063095ea7b31461030357806313faede61461032c57806318160ddd146103575780631a93d43e1461038257806323b872dd146103ab57610230565b806301ffc9a71461023557806302fa7c471461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613243565b610926565b6040516102699190613a12565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190613131565b610938565b005b3480156102a757600080fd5b506102b061094e565b6040516102bd9190613a48565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e89190613333565b6109e0565b6040516102fa9190613960565b60405180910390f35b34801561030f57600080fd5b5061032a600480360381019061032591906130f1565b610a26565b005b34801561033857600080fd5b50610341610b3e565b60405161034e9190613d2a565b60405180910390f35b34801561036357600080fd5b5061036c610b44565b6040516103799190613d2a565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a49190613216565b610b55565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190612fdb565b610b7a565b005b3480156103e057600080fd5b506103e9610bda565b6040516103f69190613a12565b60405180910390f35b34801561040b57600080fd5b50610426600480360381019061042191906133a0565b610bed565b6040516104349291906139c7565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190613216565b610dd8565b005b34801561047257600080fd5b5061047b610dfd565b005b34801561048957600080fd5b506104a4600480360381019061049f9190613360565b610e85565b005b3480156104b257600080fd5b506104cd60048036038101906104c89190612fdb565b610ef4565b005b3480156104db57600080fd5b506104f660048036038101906104f19190612f6e565b610f14565b60405161050391906139f0565b60405180910390f35b34801561051857600080fd5b5061052161101f565b60405161052e9190613a48565b60405180910390f35b34801561054357600080fd5b5061054c6110ad565b6040516105599190613a48565b60405180910390f35b34801561056e57600080fd5b5061058960048036038101906105849190613333565b61113b565b6040516105969190613960565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190612f6e565b6111ed565b6040516105d39190613d2a565b60405180910390f35b3480156105e857600080fd5b506105f16112a5565b005b3480156105ff57600080fd5b506106086112b9565b6040516106159190613a12565b60405180910390f35b34801561062a57600080fd5b50610645600480360381019061064091906132ea565b6112cc565b005b34801561065357600080fd5b5061065c6112ee565b6040516106699190613960565b60405180910390f35b34801561067e57600080fd5b506106996004803603810190610694919061329d565b611318565b005b3480156106a757600080fd5b506106b0611336565b6040516106bd9190613a48565b60405180910390f35b6106e060048036038101906106db9190613333565b6113c8565b005b3480156106ee57600080fd5b50610709600480360381019061070491906130b1565b6114ce565b005b34801561071757600080fd5b50610732600480360381019061072d9190612f6e565b6114e4565b60405161073f9190613d2a565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a919061302e565b6114fc565b005b34801561077d57600080fd5b50610798600480360381019061079391906131ba565b61155e565b6040516107a59190613a12565b60405180910390f35b3480156107ba57600080fd5b506107c3611575565b6040516107d09190613d2a565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb9190613171565b61157b565b005b34801561080e57600080fd5b5061082960048036038101906108249190613333565b61177e565b6040516108369190613a48565b60405180910390f35b34801561084b57600080fd5b50610854611828565b6040516108619190613d2a565b60405180910390f35b34801561087657600080fd5b5061087f61182e565b60405161088c9190613a48565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b79190612f9b565b6118bc565b6040516108c99190613a12565b60405180910390f35b3480156108de57600080fd5b506108e7611950565b6040516108f49190613a2d565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f9190612f6e565b611956565b005b6000610931826119da565b9050919050565b610940611a54565b61094a8282611ad2565b5050565b60606000805461095d90614081565b80601f016020809104026020016040519081016040528092919081815260200182805461098990614081565b80156109d65780601f106109ab576101008083540402835291602001916109d6565b820191906000526020600020905b8154815290600101906020018083116109b957829003601f168201915b5050505050905090565b60006109eb82611c68565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a318261113b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9990613c6a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac1611cb3565b73ffffffffffffffffffffffffffffffffffffffff161480610af05750610aef81610aea611cb3565b6118bc565b5b610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690613baa565b60405180910390fd5b610b398383611cbb565b505050565b600f5481565b6000610b506009611d74565b905090565b610b5d611a54565b80601260006101000a81548160ff02191690831515021790555050565b610b8b610b85611cb3565b82611d82565b610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc190613cca565b60405180910390fd5b610bd5838383611e17565b505050565b601260019054906101000a900460ff1681565b6000806000600760008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610d835760066040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610d8d61207e565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610db99190613f1b565b610dc39190613eea565b90508160000151819350935050509250929050565b610de0611a54565b80601260016101000a81548160ff02191690831515021790555050565b610e05611a54565b6000610e0f6112ee565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e329061394b565b60006040518083038185875af1925050503d8060008114610e6f576040519150601f19603f3d011682016040523d82523d6000602084013e610e74565b606091505b5050905080610e8257600080fd5b50565b610e8d611a54565b600d5482610e9b6009611d74565b610ea59190613e94565b1115610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90613c8a565b60405180910390fd5b610ef08183612088565b5050565b610f0f838383604051806020016040528060008152506114fc565b505050565b60606000610f21836111ed565b905060008167ffffffffffffffff811115610f3f57610f3e61423e565b5b604051908082528060200260200182016040528015610f6d5781602001602082028036833780820191505090505b50905060006001905060005b8381108015610f8a5750600d548211155b15611013576000610f9a8361113b565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fff5782848381518110610fe457610fe361420f565b5b6020026020010181815250508180610ffb906140e4565b9250505b828061100a906140e4565b93505050610f79565b82945050505050919050565b600b805461102c90614081565b80601f016020809104026020016040519081016040528092919081815260200182805461105890614081565b80156110a55780601f1061107a576101008083540402835291602001916110a5565b820191906000526020600020905b81548152906001019060200180831161108857829003601f168201915b505050505081565b600a80546110ba90614081565b80601f01602080910402602001604051908101604052809291908181526020018280546110e690614081565b80156111335780601f1061110857610100808354040283529160200191611133565b820191906000526020600020905b81548152906001019060200180831161111657829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111db90613c4a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613b8a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112ad611a54565b6112b760006120c8565b565b601260009054906101000a900460ff1681565b6112d4611a54565b80600a90805190602001906112ea929190612bde565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611320611a54565b8181600c9190611331929190612c64565b505050565b60606001805461134590614081565b80601f016020809104026020016040519081016040528092919081815260200182805461137190614081565b80156113be5780601f10611393576101008083540402835291602001916113be565b820191906000526020600020905b8154815290600101906020018083116113a157829003601f168201915b5050505050905090565b600d54816113d66009611d74565b6113e09190613e94565b1115611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890613c8a565b60405180910390fd5b601260019054906101000a900460ff1615611471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146890613b6a565b60405180910390fd5b80600f5461147f9190613f1b565b3410156114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b890613d0a565b60405180910390fd5b6114cb3382612088565b50565b6114e06114d9611cb3565b838361218e565b5050565b60116020528060005260406000206000915090505481565b61150d611507611cb3565b83611d82565b61154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390613cca565b60405180910390fd5b611558848484846122fb565b50505050565b600061156d8360105484612357565b905092915050565b600e5481565b600060019050600d548161158f6009611d74565b6115999190613e94565b11156115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190613c8a565b60405180910390fd5b601260009054906101000a900460ff161561162a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162190613a8a565b60405180910390fd5b61165a823360405160200161163f91906138ff565b6040516020818303038152906040528051906020012061155e565b611699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169090613c0a565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290613b4a565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061176b906140e4565b919050555061177a3382612088565b5050565b60606117898261236e565b6117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90613c2a565b60405180910390fd5b60006117d26123da565b905060008151116117f25760405180602001604052806000815250611820565b806117fc8461246c565b600b6040516020016118109392919061391a565b6040516020818303038152906040525b915050919050565b600d5481565b600c805461183b90614081565b80601f016020809104026020016040519081016040528092919081815260200182805461186790614081565b80156118b45780601f10611889576101008083540402835291602001916118b4565b820191906000526020600020905b81548152906001019060200180831161189757829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60105481565b61195e611a54565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c590613aaa565b60405180910390fd5b6119d7816120c8565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a4d5750611a4c826125cd565b5b9050919050565b611a5c611cb3565b73ffffffffffffffffffffffffffffffffffffffff16611a7a6112ee565b73ffffffffffffffffffffffffffffffffffffffff1614611ad0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac790613bea565b60405180910390fd5b565b611ada61207e565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f90613caa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f90613cea565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600660008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b611c718161236e565b611cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca790613c4a565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d2e8361113b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600080611d8e8361113b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611dd05750611dcf81856118bc565b5b80611e0e57508373ffffffffffffffffffffffffffffffffffffffff16611df6846109e0565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e378261113b565b73ffffffffffffffffffffffffffffffffffffffff1614611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490613aca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef490613b0a565b60405180910390fd5b611f088383836126af565b611f13600082611cbb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f639190613f75565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fba9190613e94565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120798383836126b4565b505050565b6000612710905090565b60005b818110156120c35761209d60096126b9565b6120b0836120ab6009611d74565b6126cf565b80806120bb906140e4565b91505061208b565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f490613b2a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122ee9190613a12565b60405180910390a3505050565b612306848484611e17565b612312848484846126ed565b612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234890613a6a565b60405180910390fd5b50505050565b6000826123648584612884565b1490509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600a80546123e990614081565b80601f016020809104026020016040519081016040528092919081815260200182805461241590614081565b80156124625780601f1061243757610100808354040283529160200191612462565b820191906000526020600020905b81548152906001019060200180831161244557829003601f168201915b5050505050905090565b606060008214156124b4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125c8565b600082905060005b600082146124e65780806124cf906140e4565b915050600a826124df9190613eea565b91506124bc565b60008167ffffffffffffffff8111156125025761250161423e565b5b6040519080825280601f01601f1916602001820160405280156125345781602001600182028036833780820191505090505b5090505b600085146125c15760018261254d9190613f75565b9150600a8561255c9190614151565b60306125689190613e94565b60f81b81838151811061257e5761257d61420f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125ba9190613eea565b9450612538565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061269857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126a857506126a7826128da565b5b9050919050565b505050565b505050565b6001816000016000828254019250508190555050565b6126e9828260405180602001604052806000815250612944565b5050565b600061270e8473ffffffffffffffffffffffffffffffffffffffff1661299f565b15612877578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612737611cb3565b8786866040518563ffffffff1660e01b8152600401612759949392919061397b565b602060405180830381600087803b15801561277357600080fd5b505af19250505080156127a457506040513d601f19601f820116820180604052508101906127a19190613270565b60015b612827573d80600081146127d4576040519150601f19603f3d011682016040523d82523d6000602084013e6127d9565b606091505b5060008151141561281f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281690613a6a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061287c565b600190505b949350505050565b60008082905060005b84518110156128cf576128ba828683815181106128ad576128ac61420f565b5b60200260200101516129c2565b915080806128c7906140e4565b91505061288d565b508091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61294e83836129ed565b61295b60008484846126ed565b61299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299190613a6a565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008183106129da576129d58284612bc7565b6129e5565b6129e48383612bc7565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5490613bca565b60405180910390fd5b612a668161236e565b15612aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9d90613aea565b60405180910390fd5b612ab2600083836126af565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b029190613e94565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bc3600083836126b4565b5050565b600082600052816020526040600020905092915050565b828054612bea90614081565b90600052602060002090601f016020900481019282612c0c5760008555612c53565b82601f10612c2557805160ff1916838001178555612c53565b82800160010185558215612c53579182015b82811115612c52578251825591602001919060010190612c37565b5b509050612c609190612cea565b5090565b828054612c7090614081565b90600052602060002090601f016020900481019282612c925760008555612cd9565b82601f10612cab57803560ff1916838001178555612cd9565b82800160010185558215612cd9579182015b82811115612cd8578235825591602001919060010190612cbd565b5b509050612ce69190612cea565b5090565b5b80821115612d03576000816000905550600101612ceb565b5090565b6000612d1a612d1584613d6a565b613d45565b90508083825260208201905082856020860282011115612d3d57612d3c614277565b5b60005b85811015612d6d5781612d538882612e53565b845260208401935060208301925050600181019050612d40565b5050509392505050565b6000612d8a612d8584613d96565b613d45565b905082815260208101848484011115612da657612da561427c565b5b612db184828561403f565b509392505050565b6000612dcc612dc784613dc7565b613d45565b905082815260208101848484011115612de857612de761427c565b5b612df384828561403f565b509392505050565b600081359050612e0a816147ae565b92915050565b600082601f830112612e2557612e24614272565b5b8135612e35848260208601612d07565b91505092915050565b600081359050612e4d816147c5565b92915050565b600081359050612e62816147dc565b92915050565b600081359050612e77816147f3565b92915050565b600081519050612e8c816147f3565b92915050565b600082601f830112612ea757612ea6614272565b5b8135612eb7848260208601612d77565b91505092915050565b60008083601f840112612ed657612ed5614272565b5b8235905067ffffffffffffffff811115612ef357612ef261426d565b5b602083019150836001820283011115612f0f57612f0e614277565b5b9250929050565b600082601f830112612f2b57612f2a614272565b5b8135612f3b848260208601612db9565b91505092915050565b600081359050612f538161480a565b92915050565b600081359050612f6881614821565b92915050565b600060208284031215612f8457612f83614286565b5b6000612f9284828501612dfb565b91505092915050565b60008060408385031215612fb257612fb1614286565b5b6000612fc085828601612dfb565b9250506020612fd185828601612dfb565b9150509250929050565b600080600060608486031215612ff457612ff3614286565b5b600061300286828701612dfb565b935050602061301386828701612dfb565b925050604061302486828701612f44565b9150509250925092565b6000806000806080858703121561304857613047614286565b5b600061305687828801612dfb565b945050602061306787828801612dfb565b935050604061307887828801612f44565b925050606085013567ffffffffffffffff81111561309957613098614281565b5b6130a587828801612e92565b91505092959194509250565b600080604083850312156130c8576130c7614286565b5b60006130d685828601612dfb565b92505060206130e785828601612e3e565b9150509250929050565b6000806040838503121561310857613107614286565b5b600061311685828601612dfb565b925050602061312785828601612f44565b9150509250929050565b6000806040838503121561314857613147614286565b5b600061315685828601612dfb565b925050602061316785828601612f59565b9150509250929050565b60006020828403121561318757613186614286565b5b600082013567ffffffffffffffff8111156131a5576131a4614281565b5b6131b184828501612e10565b91505092915050565b600080604083850312156131d1576131d0614286565b5b600083013567ffffffffffffffff8111156131ef576131ee614281565b5b6131fb85828601612e10565b925050602061320c85828601612e53565b9150509250929050565b60006020828403121561322c5761322b614286565b5b600061323a84828501612e3e565b91505092915050565b60006020828403121561325957613258614286565b5b600061326784828501612e68565b91505092915050565b60006020828403121561328657613285614286565b5b600061329484828501612e7d565b91505092915050565b600080602083850312156132b4576132b3614286565b5b600083013567ffffffffffffffff8111156132d2576132d1614281565b5b6132de85828601612ec0565b92509250509250929050565b600060208284031215613300576132ff614286565b5b600082013567ffffffffffffffff81111561331e5761331d614281565b5b61332a84828501612f16565b91505092915050565b60006020828403121561334957613348614286565b5b600061335784828501612f44565b91505092915050565b6000806040838503121561337757613376614286565b5b600061338585828601612f44565b925050602061339685828601612dfb565b9150509250929050565b600080604083850312156133b7576133b6614286565b5b60006133c585828601612f44565b92505060206133d685828601612f44565b9150509250929050565b60006133ec83836138e1565b60208301905092915050565b61340181613fa9565b82525050565b61341861341382613fa9565b61412d565b82525050565b600061342982613e1d565b6134338185613e4b565b935061343e83613df8565b8060005b8381101561346f57815161345688826133e0565b975061346183613e3e565b925050600181019050613442565b5085935050505092915050565b61348581613fbb565b82525050565b61349481613fc7565b82525050565b60006134a582613e28565b6134af8185613e5c565b93506134bf81856020860161404e565b6134c88161428b565b840191505092915050565b60006134de82613e33565b6134e88185613e78565b93506134f881856020860161404e565b6135018161428b565b840191505092915050565b600061351782613e33565b6135218185613e89565b935061353181856020860161404e565b80840191505092915050565b6000815461354a81614081565b6135548186613e89565b9450600182166000811461356f5760018114613580576135b3565b60ff198316865281860193506135b3565b61358985613e08565b60005b838110156135ab5781548189015260018201915060208101905061358c565b838801955050505b50505092915050565b60006135c9603283613e78565b91506135d4826142a9565b604082019050919050565b60006135ec602083613e78565b91506135f7826142f8565b602082019050919050565b600061360f602683613e78565b915061361a82614321565b604082019050919050565b6000613632602583613e78565b915061363d82614370565b604082019050919050565b6000613655601c83613e78565b9150613660826143bf565b602082019050919050565b6000613678602483613e78565b9150613683826143e8565b604082019050919050565b600061369b601983613e78565b91506136a682614437565b602082019050919050565b60006136be601583613e78565b91506136c982614460565b602082019050919050565b60006136e1601383613e78565b91506136ec82614489565b602082019050919050565b6000613704602983613e78565b915061370f826144b2565b604082019050919050565b6000613727603e83613e78565b915061373282614501565b604082019050919050565b600061374a602083613e78565b915061375582614550565b602082019050919050565b600061376d602083613e78565b915061377882614579565b602082019050919050565b6000613790600e83613e78565b915061379b826145a2565b602082019050919050565b60006137b3602f83613e78565b91506137be826145cb565b604082019050919050565b60006137d6601883613e78565b91506137e18261461a565b602082019050919050565b60006137f9602183613e78565b915061380482614643565b604082019050919050565b600061381c600083613e6d565b915061382782614692565b600082019050919050565b600061383f601483613e78565b915061384a82614695565b602082019050919050565b6000613862602a83613e78565b915061386d826146be565b604082019050919050565b6000613885602e83613e78565b91506138908261470d565b604082019050919050565b60006138a8601983613e78565b91506138b38261475c565b602082019050919050565b60006138cb601383613e78565b91506138d682614785565b602082019050919050565b6138ea8161401d565b82525050565b6138f98161401d565b82525050565b600061390b8284613407565b60148201915081905092915050565b6000613926828661350c565b9150613932828561350c565b915061393e828461353d565b9150819050949350505050565b60006139568261380f565b9150819050919050565b600060208201905061397560008301846133f8565b92915050565b600060808201905061399060008301876133f8565b61399d60208301866133f8565b6139aa60408301856138f0565b81810360608301526139bc818461349a565b905095945050505050565b60006040820190506139dc60008301856133f8565b6139e960208301846138f0565b9392505050565b60006020820190508181036000830152613a0a818461341e565b905092915050565b6000602082019050613a27600083018461347c565b92915050565b6000602082019050613a42600083018461348b565b92915050565b60006020820190508181036000830152613a6281846134d3565b905092915050565b60006020820190508181036000830152613a83816135bc565b9050919050565b60006020820190508181036000830152613aa3816135df565b9050919050565b60006020820190508181036000830152613ac381613602565b9050919050565b60006020820190508181036000830152613ae381613625565b9050919050565b60006020820190508181036000830152613b0381613648565b9050919050565b60006020820190508181036000830152613b238161366b565b9050919050565b60006020820190508181036000830152613b438161368e565b9050919050565b60006020820190508181036000830152613b63816136b1565b9050919050565b60006020820190508181036000830152613b83816136d4565b9050919050565b60006020820190508181036000830152613ba3816136f7565b9050919050565b60006020820190508181036000830152613bc38161371a565b9050919050565b60006020820190508181036000830152613be38161373d565b9050919050565b60006020820190508181036000830152613c0381613760565b9050919050565b60006020820190508181036000830152613c2381613783565b9050919050565b60006020820190508181036000830152613c43816137a6565b9050919050565b60006020820190508181036000830152613c63816137c9565b9050919050565b60006020820190508181036000830152613c83816137ec565b9050919050565b60006020820190508181036000830152613ca381613832565b9050919050565b60006020820190508181036000830152613cc381613855565b9050919050565b60006020820190508181036000830152613ce381613878565b9050919050565b60006020820190508181036000830152613d038161389b565b9050919050565b60006020820190508181036000830152613d23816138be565b9050919050565b6000602082019050613d3f60008301846138f0565b92915050565b6000613d4f613d60565b9050613d5b82826140b3565b919050565b6000604051905090565b600067ffffffffffffffff821115613d8557613d8461423e565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613db157613db061423e565b5b613dba8261428b565b9050602081019050919050565b600067ffffffffffffffff821115613de257613de161423e565b5b613deb8261428b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e9f8261401d565b9150613eaa8361401d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613edf57613ede614182565b5b828201905092915050565b6000613ef58261401d565b9150613f008361401d565b925082613f1057613f0f6141b1565b5b828204905092915050565b6000613f268261401d565b9150613f318361401d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f6a57613f69614182565b5b828202905092915050565b6000613f808261401d565b9150613f8b8361401d565b925082821015613f9e57613f9d614182565b5b828203905092915050565b6000613fb482613ffd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561406c578082015181840152602081019050614051565b8381111561407b576000848401525b50505050565b6000600282049050600182168061409957607f821691505b602082108114156140ad576140ac6141e0565b5b50919050565b6140bc8261428b565b810181811067ffffffffffffffff821117156140db576140da61423e565b5b80604052505050565b60006140ef8261401d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561412257614121614182565b5b600182019050919050565b60006141388261413f565b9050919050565b600061414a8261429c565b9050919050565b600061415c8261401d565b91506141678361401d565b925082614177576141766141b1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f2077686974656c697374206d696e74206973206e6f74206f70656e2079657421600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f6e6c79206f6e65207065722077616c6c657420210000000000000000000000600082015250565b7f206d696e74206973206e6f74206f70656e202100000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420776869746c6973746564000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6147b781613fa9565b81146147c257600080fd5b50565b6147ce81613fbb565b81146147d957600080fd5b50565b6147e581613fc7565b81146147f057600080fd5b50565b6147fc81613fd1565b811461480757600080fd5b50565b6148138161401d565b811461481e57600080fd5b50565b61482a81614027565b811461483557600080fd5b5056fea2646970667358221220d48ed77f5b1439ca142b6a8d82739a30eec33c570651053091ef81d52470f23064736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000002ee0000000000000000000000000000000000000000000000000000000000000060ea8d324e980000ba1e51d33ee347d48f7260e116453b7a2462628ba8479ebd1a000000000000000000000000000000000000000000000000000000000000006268747470733a2f2f62616679626569626d766475787633757374616679647a646975653477696170616e6c73767065696c37376b6166777063696d363576356735366d2e697066732e6e667473746f726167652e6c696e6b2f6d6574612e6a736f6e000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _royaltyFeesInBips (uint96): 750
Arg [1] : _contractURI (string): https://bafybeibmvduxv3ustafydzdiue4wiapanlsvpeil77kafwpcim65v5g56m.ipfs.nftstorage.link/meta.json
Arg [2] : _root (bytes32): 0xea8d324e980000ba1e51d33ee347d48f7260e116453b7a2462628ba8479ebd1a

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000002ee
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : ea8d324e980000ba1e51d33ee347d48f7260e116453b7a2462628ba8479ebd1a
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000062
Arg [4] : 68747470733a2f2f62616679626569626d766475787633757374616679647a64
Arg [5] : 6975653477696170616e6c73767065696c37376b6166777063696d3635763567
Arg [6] : 35366d2e697066732e6e667473746f726167652e6c696e6b2f6d6574612e6a73
Arg [7] : 6f6e000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

54519:4493:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58546:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58726:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40938:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42451:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41968:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54933:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55376:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57857:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43151:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55102:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30420:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;57972:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58083:137;;;;;;;;;;;;;:::i;:::-;;56448:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43558:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56666:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54783:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54683:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40649:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40380:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15496:103;;;;;;;;;;;;;:::i;:::-;;55057:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57747:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14848:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58887:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41107:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56125:317;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42694:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55002:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43814:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55978:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54887:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55489:483;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57307:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54851:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54821:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42920:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54970:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15754:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58546:172;58653:4;58676:36;58700:11;58676:23;:36::i;:::-;58669:43;;58546:172;;;:::o;58726:153::-;14734:13;:11;:13::i;:::-;58822:49:::1;58841:9;58852:18;58822;:49::i;:::-;58726:153:::0;;:::o;40938:100::-;40992:13;41025:5;41018:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40938:100;:::o;42451:171::-;42527:7;42547:23;42562:7;42547:14;:23::i;:::-;42590:15;:24;42606:7;42590:24;;;;;;;;;;;;;;;;;;;;;42583:31;;42451:171;;;:::o;41968:417::-;42049:13;42065:23;42080:7;42065:14;:23::i;:::-;42049:39;;42113:5;42107:11;;:2;:11;;;;42099:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42207:5;42191:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42216:37;42233:5;42240:12;:10;:12::i;:::-;42216:16;:37::i;:::-;42191:62;42169:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;42356:21;42365:2;42369:7;42356:8;:21::i;:::-;42038:347;41968:417;;:::o;54933:32::-;;;;:::o;55376:89::-;55420:7;55443:16;:6;:14;:16::i;:::-;55436:23;;55376:89;:::o;57857:107::-;14734:13;:11;:13::i;:::-;57952:6:::1;57928:21;;:30;;;;;;;;;;;;;;;;;;57857:107:::0;:::o;43151:336::-;43346:41;43365:12;:10;:12::i;:::-;43379:7;43346:18;:41::i;:::-;43338:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;43451:28;43461:4;43467:2;43471:7;43451:9;:28::i;:::-;43151:336;;;:::o;55102:37::-;;;;;;;;;;;;;:::o;30420:442::-;30517:7;30526;30546:26;30575:17;:27;30593:8;30575:27;;;;;;;;;;;30546:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30647:1;30619:30;;:7;:16;;;:30;;;30615:92;;;30676:19;30666:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30615:92;30719:21;30784:17;:15;:17::i;:::-;30743:58;;30757:7;:23;;;30744:36;;:10;:36;;;;:::i;:::-;30743:58;;;;:::i;:::-;30719:82;;30822:7;:16;;;30840:13;30814:40;;;;;;30420:442;;;;;:::o;57972:101::-;14734:13;:11;:13::i;:::-;58061:6:::1;58040:18;;:27;;;;;;;;;;;;;;;;;;57972:101:::0;:::o;58083:137::-;14734:13;:11;:13::i;:::-;58128:7:::1;58149;:5;:7::i;:::-;58141:21;;58170;58141:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58127:69;;;58211:2;58203:11;;;::::0;::::1;;58120:100;58083:137::o:0;56448:210::-;14734:13;:11;:13::i;:::-;56576:9:::1;;56561:11;56542:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;56534:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56619:33;56629:9;56640:11;56619:9;:33::i;:::-;56448:210:::0;;:::o;43558:185::-;43696:39;43713:4;43719:2;43723:7;43696:39;;;;;;;;;;;;:16;:39::i;:::-;43558:185;;;:::o;56666:635::-;56741:16;56769:23;56795:17;56805:6;56795:9;:17::i;:::-;56769:43;;56819:30;56866:15;56852:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56819:63;;56889:22;56914:1;56889:26;;56922:23;56958:309;56983:15;56965;:33;:64;;;;;57020:9;;57002:14;:27;;56965:64;56958:309;;;57040:25;57068:23;57076:14;57068:7;:23::i;:::-;57040:51;;57127:6;57106:27;;:17;:27;;;57102:131;;;57179:14;57146:13;57160:15;57146:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;57206:17;;;;;:::i;:::-;;;;57102:131;57243:16;;;;;:::i;:::-;;;;57031:236;56958:309;;;57282:13;57275:20;;;;;;56666:635;;;:::o;54783:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54683:95::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40649:222::-;40721:7;40741:13;40757:7;:16;40765:7;40757:16;;;;;;;;;;;;;;;;;;;;;40741:32;;40809:1;40792:19;;:5;:19;;;;40784:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;40858:5;40851:12;;;40649:222;;;:::o;40380:207::-;40452:7;40497:1;40480:19;;:5;:19;;;;40472:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40563:9;:16;40573:5;40563:16;;;;;;;;;;;;;;;;40556:23;;40380:207;;;:::o;15496:103::-;14734:13;:11;:13::i;:::-;15561:30:::1;15588:1;15561:18;:30::i;:::-;15496:103::o:0;55057:40::-;;;;;;;;;;;;;:::o;57747:100::-;14734:13;:11;:13::i;:::-;57831:10:::1;57819:9;:22;;;;;;;;;;;;:::i;:::-;;57747:100:::0;:::o;14848:87::-;14894:7;14921:6;;;;;;;;;;;14914:13;;14848:87;:::o;58887:114::-;14734:13;:11;:13::i;:::-;58981:12:::1;;58967:11;:26;;;;;;;:::i;:::-;;58887:114:::0;;:::o;41107:104::-;41163:13;41196:7;41189:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41107:104;:::o;56125:317::-;56230:9;;56215:11;56196:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;56188:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56280:18;;;;;;;;;;;56279:19;56271:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;56357:11;56350:4;;:18;;;;:::i;:::-;56337:9;:31;;56329:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56402:34;56412:10;56424:11;56402:9;:34::i;:::-;56125:317;:::o;42694:155::-;42789:52;42808:12;:10;:12::i;:::-;42822:8;42832;42789:18;:52::i;:::-;42694:155;;:::o;55002:48::-;;;;;;;;;;;;;;;;;:::o;43814:323::-;43988:41;44007:12;:10;:12::i;:::-;44021:7;43988:18;:41::i;:::-;43980:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;44091:38;44105:4;44111:2;44115:7;44124:4;44091:13;:38::i;:::-;43814:323;;;;:::o;55978:139::-;56054:4;56074:37;56093:5;56100:4;;56106;56074:18;:37::i;:::-;56067:44;;55978:139;;;;:::o;54887:41::-;;;;:::o;55489:483::-;55550:19;55572:1;55550:23;;55622:9;;55607:11;55588:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;55580:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55672:21;;;;;;;;;;;55671:22;55663:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;55745:55;55753:5;55787:10;55770:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;55760:39;;;;;;55745:7;:55::i;:::-;55737:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;55862:1;55834:13;:25;55848:10;55834:25;;;;;;;;;;;;;;;;:29;55826:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55896:13;:25;55910:10;55896:25;;;;;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;55932:34;55942:10;55954:11;55932:9;:34::i;:::-;55543:429;55489:483;:::o;57307:428::-;57406:13;57447:17;57455:8;57447:7;:17::i;:::-;57431:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;57544:28;57575:10;:8;:10::i;:::-;57544:41;;57630:1;57605:14;57599:28;:32;:130;;;;;;;;;;;;;;;;;57667:14;57683:19;:8;:17;:19::i;:::-;57704:9;57650:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57599:130;57592:137;;;57307:428;;;:::o;54851:31::-;;;;:::o;54821:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42920:164::-;43017:4;43041:18;:25;43060:5;43041:25;;;;;;;;;;;;;;;:35;43067:8;43041:35;;;;;;;;;;;;;;;;;;;;;;;;;43034:42;;42920:164;;;;:::o;54970:19::-;;;;:::o;15754:201::-;14734:13;:11;:13::i;:::-;15863:1:::1;15843:22;;:8;:22;;;;15835:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15919:28;15938:8;15919:18;:28::i;:::-;15754:201:::0;:::o;30150:215::-;30252:4;30291:26;30276:41;;;:11;:41;;;;:81;;;;30321:36;30345:11;30321:23;:36::i;:::-;30276:81;30269:88;;30150:215;;;:::o;15013:132::-;15088:12;:10;:12::i;:::-;15077:23;;:7;:5;:7::i;:::-;:23;;;15069:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15013:132::o;31512:332::-;31631:17;:15;:17::i;:::-;31615:33;;:12;:33;;;;31607:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;31734:1;31714:22;;:8;:22;;;;31706:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;31801:35;;;;;;;;31813:8;31801:35;;;;;;31823:12;31801:35;;;;;31779:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31512:332;;:::o;50426:135::-;50508:16;50516:7;50508;:16::i;:::-;50500:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50426:135;:::o;13399:98::-;13452:7;13479:10;13472:17;;13399:98;:::o;49705:174::-;49807:2;49780:15;:24;49796:7;49780:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49863:7;49859:2;49825:46;;49834:23;49849:7;49834:14;:23::i;:::-;49825:46;;;;;;;;;;;;49705:174;;:::o;9630:114::-;9695:7;9722;:14;;;9715:21;;9630:114;;;:::o;45938:264::-;46031:4;46048:13;46064:23;46079:7;46064:14;:23::i;:::-;46048:39;;46117:5;46106:16;;:7;:16;;;:52;;;;46126:32;46143:5;46150:7;46126:16;:32::i;:::-;46106:52;:87;;;;46186:7;46162:31;;:20;46174:7;46162:11;:20::i;:::-;:31;;;46106:87;46098:96;;;45938:264;;;;:::o;48961:625::-;49120:4;49093:31;;:23;49108:7;49093:14;:23::i;:::-;:31;;;49085:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;49199:1;49185:16;;:2;:16;;;;49177:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49255:39;49276:4;49282:2;49286:7;49255:20;:39::i;:::-;49359:29;49376:1;49380:7;49359:8;:29::i;:::-;49420:1;49401:9;:15;49411:4;49401:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;49449:1;49432:9;:13;49442:2;49432:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;49480:2;49461:7;:16;49469:7;49461:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49519:7;49515:2;49500:27;;49509:4;49500:27;;;;;;;;;;;;49540:38;49560:4;49566:2;49570:7;49540:19;:38::i;:::-;48961:625;;;:::o;31144:97::-;31202:6;31228:5;31221:12;;31144:97;:::o;58226:204::-;58306:9;58301:124;58325:11;58321:1;:15;58301:124;;;58352:18;:6;:16;:18::i;:::-;58379:38;58389:9;58400:16;:6;:14;:16::i;:::-;58379:9;:38::i;:::-;58338:3;;;;;:::i;:::-;;;;58301:124;;;;58226:204;;:::o;16115:191::-;16189:16;16208:6;;;;;;;;;;;16189:25;;16234:8;16225:6;;:17;;;;;;;;;;;;;;;;;;16289:8;16258:40;;16279:8;16258:40;;;;;;;;;;;;16178:128;16115:191;:::o;50022:315::-;50177:8;50168:17;;:5;:17;;;;50160:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;50264:8;50226:18;:25;50245:5;50226:25;;;;;;;;;;;;;;;:35;50252:8;50226:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;50310:8;50288:41;;50303:5;50288:41;;;50320:8;50288:41;;;;;;:::i;:::-;;;;;;;;50022:315;;;:::o;45018:313::-;45174:28;45184:4;45190:2;45194:7;45174:9;:28::i;:::-;45221:47;45244:4;45250:2;45254:7;45263:4;45221:22;:47::i;:::-;45213:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45018:313;;;;:::o;1252:190::-;1377:4;1430;1401:25;1414:5;1421:4;1401:12;:25::i;:::-;:33;1394:40;;1252:190;;;;;:::o;45644:127::-;45709:4;45761:1;45733:30;;:7;:16;45741:7;45733:16;;;;;;;;;;;;;;;;;;;;;:30;;;;45726:37;;45644:127;;;:::o;58436:104::-;58496:13;58525:9;58518:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58436:104;:::o;10653:723::-;10709:13;10939:1;10930:5;:10;10926:53;;;10957:10;;;;;;;;;;;;;;;;;;;;;10926:53;10989:12;11004:5;10989:20;;11020:14;11045:78;11060:1;11052:4;:9;11045:78;;11078:8;;;;;:::i;:::-;;;;11109:2;11101:10;;;;;:::i;:::-;;;11045:78;;;11133:19;11165:6;11155:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11133:39;;11183:154;11199:1;11190:5;:10;11183:154;;11227:1;11217:11;;;;;:::i;:::-;;;11294:2;11286:5;:10;;;;:::i;:::-;11273:2;:24;;;;:::i;:::-;11260:39;;11243:6;11250;11243:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11323:2;11314:11;;;;;:::i;:::-;;;11183:154;;;11361:6;11347:21;;;;;10653:723;;;;:::o;40011:305::-;40113:4;40165:25;40150:40;;;:11;:40;;;;:105;;;;40222:33;40207:48;;;:11;:48;;;;40150:105;:158;;;;40272:36;40296:11;40272:23;:36::i;:::-;40150:158;40130:178;;40011:305;;;:::o;52550:126::-;;;;:::o;53061:125::-;;;;:::o;9752:127::-;9859:1;9841:7;:14;;;:19;;;;;;;;;;;9752:127;:::o;46544:110::-;46620:26;46630:2;46634:7;46620:26;;;;;;;;;;;;:9;:26::i;:::-;46544:110;;:::o;51125:853::-;51279:4;51300:15;:2;:13;;;:15::i;:::-;51296:675;;;51352:2;51336:36;;;51373:12;:10;:12::i;:::-;51387:4;51393:7;51402:4;51336:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51332:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51594:1;51577:6;:13;:18;51573:328;;;51620:60;;;;;;;;;;:::i;:::-;;;;;;;;51573:328;51851:6;51845:13;51836:6;51832:2;51828:15;51821:38;51332:584;51468:41;;;51458:51;;;:6;:51;;;;51451:58;;;;;51296:675;51955:4;51948:11;;51125:853;;;;;;;:::o;2119:296::-;2202:7;2222:20;2245:4;2222:27;;2265:9;2260:118;2284:5;:12;2280:1;:16;2260:118;;;2333:33;2343:12;2357:5;2363:1;2357:8;;;;;;;;:::i;:::-;;;;;;;;2333:9;:33::i;:::-;2318:48;;2298:3;;;;;:::i;:::-;;;;2260:118;;;;2395:12;2388:19;;;2119:296;;;;:::o;28600:157::-;28685:4;28724:25;28709:40;;;:11;:40;;;;28702:47;;28600:157;;;:::o;46881:319::-;47010:18;47016:2;47020:7;47010:5;:18::i;:::-;47061:53;47092:1;47096:2;47100:7;47109:4;47061:22;:53::i;:::-;47039:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;46881:319;;;:::o;17546:326::-;17606:4;17863:1;17841:7;:19;;;:23;17834:30;;17546:326;;;:::o;8326:149::-;8389:7;8420:1;8416;:5;:51;;8447:20;8462:1;8465;8447:14;:20::i;:::-;8416:51;;;8424:20;8439:1;8442;8424:14;:20::i;:::-;8416:51;8409:58;;8326:149;;;;:::o;47536:439::-;47630:1;47616:16;;:2;:16;;;;47608:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47689:16;47697:7;47689;:16::i;:::-;47688:17;47680:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47751:45;47780:1;47784:2;47788:7;47751:20;:45::i;:::-;47826:1;47809:9;:13;47819:2;47809:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;47857:2;47838:7;:16;47846:7;47838:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47902:7;47898:2;47877:33;;47894:1;47877:33;;;;;;;;;;;;47923:44;47951:1;47955:2;47959:7;47923:19;:44::i;:::-;47536:439;;:::o;8483:268::-;8551:13;8658:1;8652:4;8645:15;8687:1;8681:4;8674:15;8728:4;8722;8712:21;8703:30;;8483:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:139::-;2309:5;2347:6;2334:20;2325:29;;2363:33;2390:5;2363:33;:::i;:::-;2263:139;;;;:::o;2408:137::-;2453:5;2491:6;2478:20;2469:29;;2507:32;2533:5;2507:32;:::i;:::-;2408:137;;;;:::o;2551:141::-;2607:5;2638:6;2632:13;2623:22;;2654:32;2680:5;2654:32;:::i;:::-;2551:141;;;;:::o;2711:338::-;2766:5;2815:3;2808:4;2800:6;2796:17;2792:27;2782:122;;2823:79;;:::i;:::-;2782:122;2940:6;2927:20;2965:78;3039:3;3031:6;3024:4;3016:6;3012:17;2965:78;:::i;:::-;2956:87;;2772:277;2711:338;;;;:::o;3069:553::-;3127:8;3137:6;3187:3;3180:4;3172:6;3168:17;3164:27;3154:122;;3195:79;;:::i;:::-;3154:122;3308:6;3295:20;3285:30;;3338:18;3330:6;3327:30;3324:117;;;3360:79;;:::i;:::-;3324:117;3474:4;3466:6;3462:17;3450:29;;3528:3;3520:4;3512:6;3508:17;3498:8;3494:32;3491:41;3488:128;;;3535:79;;:::i;:::-;3488:128;3069:553;;;;;:::o;3642:340::-;3698:5;3747:3;3740:4;3732:6;3728:17;3724:27;3714:122;;3755:79;;:::i;:::-;3714:122;3872:6;3859:20;3897:79;3972:3;3964:6;3957:4;3949:6;3945:17;3897:79;:::i;:::-;3888:88;;3704:278;3642:340;;;;:::o;3988:139::-;4034:5;4072:6;4059:20;4050:29;;4088:33;4115:5;4088:33;:::i;:::-;3988:139;;;;:::o;4133:137::-;4178:5;4216:6;4203:20;4194:29;;4232:32;4258:5;4232:32;:::i;:::-;4133:137;;;;:::o;4276:329::-;4335:6;4384:2;4372:9;4363:7;4359:23;4355:32;4352:119;;;4390:79;;:::i;:::-;4352:119;4510:1;4535:53;4580:7;4571:6;4560:9;4556:22;4535:53;:::i;:::-;4525:63;;4481:117;4276:329;;;;:::o;4611:474::-;4679:6;4687;4736:2;4724:9;4715:7;4711:23;4707:32;4704:119;;;4742:79;;:::i;:::-;4704:119;4862:1;4887:53;4932:7;4923:6;4912:9;4908:22;4887:53;:::i;:::-;4877:63;;4833:117;4989:2;5015:53;5060:7;5051:6;5040:9;5036:22;5015:53;:::i;:::-;5005:63;;4960:118;4611:474;;;;;:::o;5091:619::-;5168:6;5176;5184;5233:2;5221:9;5212:7;5208:23;5204:32;5201:119;;;5239:79;;:::i;:::-;5201:119;5359:1;5384:53;5429:7;5420:6;5409:9;5405:22;5384:53;:::i;:::-;5374:63;;5330:117;5486:2;5512:53;5557:7;5548:6;5537:9;5533:22;5512:53;:::i;:::-;5502:63;;5457:118;5614:2;5640:53;5685:7;5676:6;5665:9;5661:22;5640:53;:::i;:::-;5630:63;;5585:118;5091:619;;;;;:::o;5716:943::-;5811:6;5819;5827;5835;5884:3;5872:9;5863:7;5859:23;5855:33;5852:120;;;5891:79;;:::i;:::-;5852:120;6011:1;6036:53;6081:7;6072:6;6061:9;6057:22;6036:53;:::i;:::-;6026:63;;5982:117;6138:2;6164:53;6209:7;6200:6;6189:9;6185:22;6164:53;:::i;:::-;6154:63;;6109:118;6266:2;6292:53;6337:7;6328:6;6317:9;6313:22;6292:53;:::i;:::-;6282:63;;6237:118;6422:2;6411:9;6407:18;6394:32;6453:18;6445:6;6442:30;6439:117;;;6475:79;;:::i;:::-;6439:117;6580:62;6634:7;6625:6;6614:9;6610:22;6580:62;:::i;:::-;6570:72;;6365:287;5716:943;;;;;;;:::o;6665:468::-;6730:6;6738;6787:2;6775:9;6766:7;6762:23;6758:32;6755:119;;;6793:79;;:::i;:::-;6755:119;6913:1;6938:53;6983:7;6974:6;6963:9;6959:22;6938:53;:::i;:::-;6928:63;;6884:117;7040:2;7066:50;7108:7;7099:6;7088:9;7084:22;7066:50;:::i;:::-;7056:60;;7011:115;6665:468;;;;;:::o;7139:474::-;7207:6;7215;7264:2;7252:9;7243:7;7239:23;7235:32;7232:119;;;7270:79;;:::i;:::-;7232:119;7390:1;7415:53;7460:7;7451:6;7440:9;7436:22;7415:53;:::i;:::-;7405:63;;7361:117;7517:2;7543:53;7588:7;7579:6;7568:9;7564:22;7543:53;:::i;:::-;7533:63;;7488:118;7139:474;;;;;:::o;7619:472::-;7686:6;7694;7743:2;7731:9;7722:7;7718:23;7714:32;7711:119;;;7749:79;;:::i;:::-;7711:119;7869:1;7894:53;7939:7;7930:6;7919:9;7915:22;7894:53;:::i;:::-;7884:63;;7840:117;7996:2;8022:52;8066:7;8057:6;8046:9;8042:22;8022:52;:::i;:::-;8012:62;;7967:117;7619:472;;;;;:::o;8097:539::-;8181:6;8230:2;8218:9;8209:7;8205:23;8201:32;8198:119;;;8236:79;;:::i;:::-;8198:119;8384:1;8373:9;8369:17;8356:31;8414:18;8406:6;8403:30;8400:117;;;8436:79;;:::i;:::-;8400:117;8541:78;8611:7;8602:6;8591:9;8587:22;8541:78;:::i;:::-;8531:88;;8327:302;8097:539;;;;:::o;8642:684::-;8735:6;8743;8792:2;8780:9;8771:7;8767:23;8763:32;8760:119;;;8798:79;;:::i;:::-;8760:119;8946:1;8935:9;8931:17;8918:31;8976:18;8968:6;8965:30;8962:117;;;8998:79;;:::i;:::-;8962:117;9103:78;9173:7;9164:6;9153:9;9149:22;9103:78;:::i;:::-;9093:88;;8889:302;9230:2;9256:53;9301:7;9292:6;9281:9;9277:22;9256:53;:::i;:::-;9246:63;;9201:118;8642:684;;;;;:::o;9332:323::-;9388:6;9437:2;9425:9;9416:7;9412:23;9408:32;9405:119;;;9443:79;;:::i;:::-;9405:119;9563:1;9588:50;9630:7;9621:6;9610:9;9606:22;9588:50;:::i;:::-;9578:60;;9534:114;9332:323;;;;:::o;9661:327::-;9719:6;9768:2;9756:9;9747:7;9743:23;9739:32;9736:119;;;9774:79;;:::i;:::-;9736:119;9894:1;9919:52;9963:7;9954:6;9943:9;9939:22;9919:52;:::i;:::-;9909:62;;9865:116;9661:327;;;;:::o;9994:349::-;10063:6;10112:2;10100:9;10091:7;10087:23;10083:32;10080:119;;;10118:79;;:::i;:::-;10080:119;10238:1;10263:63;10318:7;10309:6;10298:9;10294:22;10263:63;:::i;:::-;10253:73;;10209:127;9994:349;;;;:::o;10349:529::-;10420:6;10428;10477:2;10465:9;10456:7;10452:23;10448:32;10445:119;;;10483:79;;:::i;:::-;10445:119;10631:1;10620:9;10616:17;10603:31;10661:18;10653:6;10650:30;10647:117;;;10683:79;;:::i;:::-;10647:117;10796:65;10853:7;10844:6;10833:9;10829:22;10796:65;:::i;:::-;10778:83;;;;10574:297;10349:529;;;;;:::o;10884:509::-;10953:6;11002:2;10990:9;10981:7;10977:23;10973:32;10970:119;;;11008:79;;:::i;:::-;10970:119;11156:1;11145:9;11141:17;11128:31;11186:18;11178:6;11175:30;11172:117;;;11208:79;;:::i;:::-;11172:117;11313:63;11368:7;11359:6;11348:9;11344:22;11313:63;:::i;:::-;11303:73;;11099:287;10884:509;;;;:::o;11399:329::-;11458:6;11507:2;11495:9;11486:7;11482:23;11478:32;11475:119;;;11513:79;;:::i;:::-;11475:119;11633:1;11658:53;11703:7;11694:6;11683:9;11679:22;11658:53;:::i;:::-;11648:63;;11604:117;11399:329;;;;:::o;11734:474::-;11802:6;11810;11859:2;11847:9;11838:7;11834:23;11830:32;11827:119;;;11865:79;;:::i;:::-;11827:119;11985:1;12010:53;12055:7;12046:6;12035:9;12031:22;12010:53;:::i;:::-;12000:63;;11956:117;12112:2;12138:53;12183:7;12174:6;12163:9;12159:22;12138:53;:::i;:::-;12128:63;;12083:118;11734:474;;;;;:::o;12214:::-;12282:6;12290;12339:2;12327:9;12318:7;12314:23;12310:32;12307:119;;;12345:79;;:::i;:::-;12307:119;12465:1;12490:53;12535:7;12526:6;12515:9;12511:22;12490:53;:::i;:::-;12480:63;;12436:117;12592:2;12618:53;12663:7;12654:6;12643:9;12639:22;12618:53;:::i;:::-;12608:63;;12563:118;12214:474;;;;;:::o;12694:179::-;12763:10;12784:46;12826:3;12818:6;12784:46;:::i;:::-;12862:4;12857:3;12853:14;12839:28;;12694:179;;;;:::o;12879:118::-;12966:24;12984:5;12966:24;:::i;:::-;12961:3;12954:37;12879:118;;:::o;13003:157::-;13108:45;13128:24;13146:5;13128:24;:::i;:::-;13108:45;:::i;:::-;13103:3;13096:58;13003:157;;:::o;13196:732::-;13315:3;13344:54;13392:5;13344:54;:::i;:::-;13414:86;13493:6;13488:3;13414:86;:::i;:::-;13407:93;;13524:56;13574:5;13524:56;:::i;:::-;13603:7;13634:1;13619:284;13644:6;13641:1;13638:13;13619:284;;;13720:6;13714:13;13747:63;13806:3;13791:13;13747:63;:::i;:::-;13740:70;;13833:60;13886:6;13833:60;:::i;:::-;13823:70;;13679:224;13666:1;13663;13659:9;13654:14;;13619:284;;;13623:14;13919:3;13912:10;;13320:608;;;13196:732;;;;:::o;13934:109::-;14015:21;14030:5;14015:21;:::i;:::-;14010:3;14003:34;13934:109;;:::o;14049:118::-;14136:24;14154:5;14136:24;:::i;:::-;14131:3;14124:37;14049:118;;:::o;14173:360::-;14259:3;14287:38;14319:5;14287:38;:::i;:::-;14341:70;14404:6;14399:3;14341:70;:::i;:::-;14334:77;;14420:52;14465:6;14460:3;14453:4;14446:5;14442:16;14420:52;:::i;:::-;14497:29;14519:6;14497:29;:::i;:::-;14492:3;14488:39;14481:46;;14263:270;14173:360;;;;:::o;14539:364::-;14627:3;14655:39;14688:5;14655:39;:::i;:::-;14710:71;14774:6;14769:3;14710:71;:::i;:::-;14703:78;;14790:52;14835:6;14830:3;14823:4;14816:5;14812:16;14790:52;:::i;:::-;14867:29;14889:6;14867:29;:::i;:::-;14862:3;14858:39;14851:46;;14631:272;14539:364;;;;:::o;14909:377::-;15015:3;15043:39;15076:5;15043:39;:::i;:::-;15098:89;15180:6;15175:3;15098:89;:::i;:::-;15091:96;;15196:52;15241:6;15236:3;15229:4;15222:5;15218:16;15196:52;:::i;:::-;15273:6;15268:3;15264:16;15257:23;;15019:267;14909:377;;;;:::o;15316:845::-;15419:3;15456:5;15450:12;15485:36;15511:9;15485:36;:::i;:::-;15537:89;15619:6;15614:3;15537:89;:::i;:::-;15530:96;;15657:1;15646:9;15642:17;15673:1;15668:137;;;;15819:1;15814:341;;;;15635:520;;15668:137;15752:4;15748:9;15737;15733:25;15728:3;15721:38;15788:6;15783:3;15779:16;15772:23;;15668:137;;15814:341;15881:38;15913:5;15881:38;:::i;:::-;15941:1;15955:154;15969:6;15966:1;15963:13;15955:154;;;16043:7;16037:14;16033:1;16028:3;16024:11;16017:35;16093:1;16084:7;16080:15;16069:26;;15991:4;15988:1;15984:12;15979:17;;15955:154;;;16138:6;16133:3;16129:16;16122:23;;15821:334;;15635:520;;15423:738;;15316:845;;;;:::o;16167:366::-;16309:3;16330:67;16394:2;16389:3;16330:67;:::i;:::-;16323:74;;16406:93;16495:3;16406:93;:::i;:::-;16524:2;16519:3;16515:12;16508:19;;16167:366;;;:::o;16539:::-;16681:3;16702:67;16766:2;16761:3;16702:67;:::i;:::-;16695:74;;16778:93;16867:3;16778:93;:::i;:::-;16896:2;16891:3;16887:12;16880:19;;16539:366;;;:::o;16911:::-;17053:3;17074:67;17138:2;17133:3;17074:67;:::i;:::-;17067:74;;17150:93;17239:3;17150:93;:::i;:::-;17268:2;17263:3;17259:12;17252:19;;16911:366;;;:::o;17283:::-;17425:3;17446:67;17510:2;17505:3;17446:67;:::i;:::-;17439:74;;17522:93;17611:3;17522:93;:::i;:::-;17640:2;17635:3;17631:12;17624:19;;17283:366;;;:::o;17655:::-;17797:3;17818:67;17882:2;17877:3;17818:67;:::i;:::-;17811:74;;17894:93;17983:3;17894:93;:::i;:::-;18012:2;18007:3;18003:12;17996:19;;17655:366;;;:::o;18027:::-;18169:3;18190:67;18254:2;18249:3;18190:67;:::i;:::-;18183:74;;18266:93;18355:3;18266:93;:::i;:::-;18384:2;18379:3;18375:12;18368:19;;18027:366;;;:::o;18399:::-;18541:3;18562:67;18626:2;18621:3;18562:67;:::i;:::-;18555:74;;18638:93;18727:3;18638:93;:::i;:::-;18756:2;18751:3;18747:12;18740:19;;18399:366;;;:::o;18771:::-;18913:3;18934:67;18998:2;18993:3;18934:67;:::i;:::-;18927:74;;19010:93;19099:3;19010:93;:::i;:::-;19128:2;19123:3;19119:12;19112:19;;18771:366;;;:::o;19143:::-;19285:3;19306:67;19370:2;19365:3;19306:67;:::i;:::-;19299:74;;19382:93;19471:3;19382:93;:::i;:::-;19500:2;19495:3;19491:12;19484:19;;19143:366;;;:::o;19515:::-;19657:3;19678:67;19742:2;19737:3;19678:67;:::i;:::-;19671:74;;19754:93;19843:3;19754:93;:::i;:::-;19872:2;19867:3;19863:12;19856:19;;19515:366;;;:::o;19887:::-;20029:3;20050:67;20114:2;20109:3;20050:67;:::i;:::-;20043:74;;20126:93;20215:3;20126:93;:::i;:::-;20244:2;20239:3;20235:12;20228:19;;19887:366;;;:::o;20259:::-;20401:3;20422:67;20486:2;20481:3;20422:67;:::i;:::-;20415:74;;20498:93;20587:3;20498:93;:::i;:::-;20616:2;20611:3;20607:12;20600:19;;20259:366;;;:::o;20631:::-;20773:3;20794:67;20858:2;20853:3;20794:67;:::i;:::-;20787:74;;20870:93;20959:3;20870:93;:::i;:::-;20988:2;20983:3;20979:12;20972:19;;20631:366;;;:::o;21003:::-;21145:3;21166:67;21230:2;21225:3;21166:67;:::i;:::-;21159:74;;21242:93;21331:3;21242:93;:::i;:::-;21360:2;21355:3;21351:12;21344:19;;21003:366;;;:::o;21375:::-;21517:3;21538:67;21602:2;21597:3;21538:67;:::i;:::-;21531:74;;21614:93;21703:3;21614:93;:::i;:::-;21732:2;21727:3;21723:12;21716:19;;21375:366;;;:::o;21747:::-;21889:3;21910:67;21974:2;21969:3;21910:67;:::i;:::-;21903:74;;21986:93;22075:3;21986:93;:::i;:::-;22104:2;22099:3;22095:12;22088:19;;21747:366;;;:::o;22119:::-;22261:3;22282:67;22346:2;22341:3;22282:67;:::i;:::-;22275:74;;22358:93;22447:3;22358:93;:::i;:::-;22476:2;22471:3;22467:12;22460:19;;22119:366;;;:::o;22491:398::-;22650:3;22671:83;22752:1;22747:3;22671:83;:::i;:::-;22664:90;;22763:93;22852:3;22763:93;:::i;:::-;22881:1;22876:3;22872:11;22865:18;;22491:398;;;:::o;22895:366::-;23037:3;23058:67;23122:2;23117:3;23058:67;:::i;:::-;23051:74;;23134:93;23223:3;23134:93;:::i;:::-;23252:2;23247:3;23243:12;23236:19;;22895:366;;;:::o;23267:::-;23409:3;23430:67;23494:2;23489:3;23430:67;:::i;:::-;23423:74;;23506:93;23595:3;23506:93;:::i;:::-;23624:2;23619:3;23615:12;23608:19;;23267:366;;;:::o;23639:::-;23781:3;23802:67;23866:2;23861:3;23802:67;:::i;:::-;23795:74;;23878:93;23967:3;23878:93;:::i;:::-;23996:2;23991:3;23987:12;23980:19;;23639:366;;;:::o;24011:::-;24153:3;24174:67;24238:2;24233:3;24174:67;:::i;:::-;24167:74;;24250:93;24339:3;24250:93;:::i;:::-;24368:2;24363:3;24359:12;24352:19;;24011:366;;;:::o;24383:::-;24525:3;24546:67;24610:2;24605:3;24546:67;:::i;:::-;24539:74;;24622:93;24711:3;24622:93;:::i;:::-;24740:2;24735:3;24731:12;24724:19;;24383:366;;;:::o;24755:108::-;24832:24;24850:5;24832:24;:::i;:::-;24827:3;24820:37;24755:108;;:::o;24869:118::-;24956:24;24974:5;24956:24;:::i;:::-;24951:3;24944:37;24869:118;;:::o;24993:256::-;25105:3;25120:75;25191:3;25182:6;25120:75;:::i;:::-;25220:2;25215:3;25211:12;25204:19;;25240:3;25233:10;;24993:256;;;;:::o;25255:589::-;25480:3;25502:95;25593:3;25584:6;25502:95;:::i;:::-;25495:102;;25614:95;25705:3;25696:6;25614:95;:::i;:::-;25607:102;;25726:92;25814:3;25805:6;25726:92;:::i;:::-;25719:99;;25835:3;25828:10;;25255:589;;;;;;:::o;25850:379::-;26034:3;26056:147;26199:3;26056:147;:::i;:::-;26049:154;;26220:3;26213:10;;25850:379;;;:::o;26235:222::-;26328:4;26366:2;26355:9;26351:18;26343:26;;26379:71;26447:1;26436:9;26432:17;26423:6;26379:71;:::i;:::-;26235:222;;;;:::o;26463:640::-;26658:4;26696:3;26685:9;26681:19;26673:27;;26710:71;26778:1;26767:9;26763:17;26754:6;26710:71;:::i;:::-;26791:72;26859:2;26848:9;26844:18;26835:6;26791:72;:::i;:::-;26873;26941:2;26930:9;26926:18;26917:6;26873:72;:::i;:::-;26992:9;26986:4;26982:20;26977:2;26966:9;26962:18;26955:48;27020:76;27091:4;27082:6;27020:76;:::i;:::-;27012:84;;26463:640;;;;;;;:::o;27109:332::-;27230:4;27268:2;27257:9;27253:18;27245:26;;27281:71;27349:1;27338:9;27334:17;27325:6;27281:71;:::i;:::-;27362:72;27430:2;27419:9;27415:18;27406:6;27362:72;:::i;:::-;27109:332;;;;;:::o;27447:373::-;27590:4;27628:2;27617:9;27613:18;27605:26;;27677:9;27671:4;27667:20;27663:1;27652:9;27648:17;27641:47;27705:108;27808:4;27799:6;27705:108;:::i;:::-;27697:116;;27447:373;;;;:::o;27826:210::-;27913:4;27951:2;27940:9;27936:18;27928:26;;27964:65;28026:1;28015:9;28011:17;28002:6;27964:65;:::i;:::-;27826:210;;;;:::o;28042:222::-;28135:4;28173:2;28162:9;28158:18;28150:26;;28186:71;28254:1;28243:9;28239:17;28230:6;28186:71;:::i;:::-;28042:222;;;;:::o;28270:313::-;28383:4;28421:2;28410:9;28406:18;28398:26;;28470:9;28464:4;28460:20;28456:1;28445:9;28441:17;28434:47;28498:78;28571:4;28562:6;28498:78;:::i;:::-;28490:86;;28270:313;;;;:::o;28589:419::-;28755:4;28793:2;28782:9;28778:18;28770:26;;28842:9;28836:4;28832:20;28828:1;28817:9;28813:17;28806:47;28870:131;28996:4;28870:131;:::i;:::-;28862:139;;28589:419;;;:::o;29014:::-;29180:4;29218:2;29207:9;29203:18;29195:26;;29267:9;29261:4;29257:20;29253:1;29242:9;29238:17;29231:47;29295:131;29421:4;29295:131;:::i;:::-;29287:139;;29014:419;;;:::o;29439:::-;29605:4;29643:2;29632:9;29628:18;29620:26;;29692:9;29686:4;29682:20;29678:1;29667:9;29663:17;29656:47;29720:131;29846:4;29720:131;:::i;:::-;29712:139;;29439:419;;;:::o;29864:::-;30030:4;30068:2;30057:9;30053:18;30045:26;;30117:9;30111:4;30107:20;30103:1;30092:9;30088:17;30081:47;30145:131;30271:4;30145:131;:::i;:::-;30137:139;;29864:419;;;:::o;30289:::-;30455:4;30493:2;30482:9;30478:18;30470:26;;30542:9;30536:4;30532:20;30528:1;30517:9;30513:17;30506:47;30570:131;30696:4;30570:131;:::i;:::-;30562:139;;30289:419;;;:::o;30714:::-;30880:4;30918:2;30907:9;30903:18;30895:26;;30967:9;30961:4;30957:20;30953:1;30942:9;30938:17;30931:47;30995:131;31121:4;30995:131;:::i;:::-;30987:139;;30714:419;;;:::o;31139:::-;31305:4;31343:2;31332:9;31328:18;31320:26;;31392:9;31386:4;31382:20;31378:1;31367:9;31363:17;31356:47;31420:131;31546:4;31420:131;:::i;:::-;31412:139;;31139:419;;;:::o;31564:::-;31730:4;31768:2;31757:9;31753:18;31745:26;;31817:9;31811:4;31807:20;31803:1;31792:9;31788:17;31781:47;31845:131;31971:4;31845:131;:::i;:::-;31837:139;;31564:419;;;:::o;31989:::-;32155:4;32193:2;32182:9;32178:18;32170:26;;32242:9;32236:4;32232:20;32228:1;32217:9;32213:17;32206:47;32270:131;32396:4;32270:131;:::i;:::-;32262:139;;31989:419;;;:::o;32414:::-;32580:4;32618:2;32607:9;32603:18;32595:26;;32667:9;32661:4;32657:20;32653:1;32642:9;32638:17;32631:47;32695:131;32821:4;32695:131;:::i;:::-;32687:139;;32414:419;;;:::o;32839:::-;33005:4;33043:2;33032:9;33028:18;33020:26;;33092:9;33086:4;33082:20;33078:1;33067:9;33063:17;33056:47;33120:131;33246:4;33120:131;:::i;:::-;33112:139;;32839:419;;;:::o;33264:::-;33430:4;33468:2;33457:9;33453:18;33445:26;;33517:9;33511:4;33507:20;33503:1;33492:9;33488:17;33481:47;33545:131;33671:4;33545:131;:::i;:::-;33537:139;;33264:419;;;:::o;33689:::-;33855:4;33893:2;33882:9;33878:18;33870:26;;33942:9;33936:4;33932:20;33928:1;33917:9;33913:17;33906:47;33970:131;34096:4;33970:131;:::i;:::-;33962:139;;33689:419;;;:::o;34114:::-;34280:4;34318:2;34307:9;34303:18;34295:26;;34367:9;34361:4;34357:20;34353:1;34342:9;34338:17;34331:47;34395:131;34521:4;34395:131;:::i;:::-;34387:139;;34114:419;;;:::o;34539:::-;34705:4;34743:2;34732:9;34728:18;34720:26;;34792:9;34786:4;34782:20;34778:1;34767:9;34763:17;34756:47;34820:131;34946:4;34820:131;:::i;:::-;34812:139;;34539:419;;;:::o;34964:::-;35130:4;35168:2;35157:9;35153:18;35145:26;;35217:9;35211:4;35207:20;35203:1;35192:9;35188:17;35181:47;35245:131;35371:4;35245:131;:::i;:::-;35237:139;;34964:419;;;:::o;35389:::-;35555:4;35593:2;35582:9;35578:18;35570:26;;35642:9;35636:4;35632:20;35628:1;35617:9;35613:17;35606:47;35670:131;35796:4;35670:131;:::i;:::-;35662:139;;35389:419;;;:::o;35814:::-;35980:4;36018:2;36007:9;36003:18;35995:26;;36067:9;36061:4;36057:20;36053:1;36042:9;36038:17;36031:47;36095:131;36221:4;36095:131;:::i;:::-;36087:139;;35814:419;;;:::o;36239:::-;36405:4;36443:2;36432:9;36428:18;36420:26;;36492:9;36486:4;36482:20;36478:1;36467:9;36463:17;36456:47;36520:131;36646:4;36520:131;:::i;:::-;36512:139;;36239:419;;;:::o;36664:::-;36830:4;36868:2;36857:9;36853:18;36845:26;;36917:9;36911:4;36907:20;36903:1;36892:9;36888:17;36881:47;36945:131;37071:4;36945:131;:::i;:::-;36937:139;;36664:419;;;:::o;37089:::-;37255:4;37293:2;37282:9;37278:18;37270:26;;37342:9;37336:4;37332:20;37328:1;37317:9;37313:17;37306:47;37370:131;37496:4;37370:131;:::i;:::-;37362:139;;37089:419;;;:::o;37514:::-;37680:4;37718:2;37707:9;37703:18;37695:26;;37767:9;37761:4;37757:20;37753:1;37742:9;37738:17;37731:47;37795:131;37921:4;37795:131;:::i;:::-;37787:139;;37514:419;;;:::o;37939:222::-;38032:4;38070:2;38059:9;38055:18;38047:26;;38083:71;38151:1;38140:9;38136:17;38127:6;38083:71;:::i;:::-;37939:222;;;;:::o;38167:129::-;38201:6;38228:20;;:::i;:::-;38218:30;;38257:33;38285:4;38277:6;38257:33;:::i;:::-;38167:129;;;:::o;38302:75::-;38335:6;38368:2;38362:9;38352:19;;38302:75;:::o;38383:311::-;38460:4;38550:18;38542:6;38539:30;38536:56;;;38572:18;;:::i;:::-;38536:56;38622:4;38614:6;38610:17;38602:25;;38682:4;38676;38672:15;38664:23;;38383:311;;;:::o;38700:307::-;38761:4;38851:18;38843:6;38840:30;38837:56;;;38873:18;;:::i;:::-;38837:56;38911:29;38933:6;38911:29;:::i;:::-;38903:37;;38995:4;38989;38985:15;38977:23;;38700:307;;;:::o;39013:308::-;39075:4;39165:18;39157:6;39154:30;39151:56;;;39187:18;;:::i;:::-;39151:56;39225:29;39247:6;39225:29;:::i;:::-;39217:37;;39309:4;39303;39299:15;39291:23;;39013:308;;;:::o;39327:132::-;39394:4;39417:3;39409:11;;39447:4;39442:3;39438:14;39430:22;;39327:132;;;:::o;39465:141::-;39514:4;39537:3;39529:11;;39560:3;39557:1;39550:14;39594:4;39591:1;39581:18;39573:26;;39465:141;;;:::o;39612:114::-;39679:6;39713:5;39707:12;39697:22;;39612:114;;;:::o;39732:98::-;39783:6;39817:5;39811:12;39801:22;;39732:98;;;:::o;39836:99::-;39888:6;39922:5;39916:12;39906:22;;39836:99;;;:::o;39941:113::-;40011:4;40043;40038:3;40034:14;40026:22;;39941:113;;;:::o;40060:184::-;40159:11;40193:6;40188:3;40181:19;40233:4;40228:3;40224:14;40209:29;;40060:184;;;;:::o;40250:168::-;40333:11;40367:6;40362:3;40355:19;40407:4;40402:3;40398:14;40383:29;;40250:168;;;;:::o;40424:147::-;40525:11;40562:3;40547:18;;40424:147;;;;:::o;40577:169::-;40661:11;40695:6;40690:3;40683:19;40735:4;40730:3;40726:14;40711:29;;40577:169;;;;:::o;40752:148::-;40854:11;40891:3;40876:18;;40752:148;;;;:::o;40906:305::-;40946:3;40965:20;40983:1;40965:20;:::i;:::-;40960:25;;40999:20;41017:1;40999:20;:::i;:::-;40994:25;;41153:1;41085:66;41081:74;41078:1;41075:81;41072:107;;;41159:18;;:::i;:::-;41072:107;41203:1;41200;41196:9;41189:16;;40906:305;;;;:::o;41217:185::-;41257:1;41274:20;41292:1;41274:20;:::i;:::-;41269:25;;41308:20;41326:1;41308:20;:::i;:::-;41303:25;;41347:1;41337:35;;41352:18;;:::i;:::-;41337:35;41394:1;41391;41387:9;41382:14;;41217:185;;;;:::o;41408:348::-;41448:7;41471:20;41489:1;41471:20;:::i;:::-;41466:25;;41505:20;41523:1;41505:20;:::i;:::-;41500:25;;41693:1;41625:66;41621:74;41618:1;41615:81;41610:1;41603:9;41596:17;41592:105;41589:131;;;41700:18;;:::i;:::-;41589:131;41748:1;41745;41741:9;41730:20;;41408:348;;;;:::o;41762:191::-;41802:4;41822:20;41840:1;41822:20;:::i;:::-;41817:25;;41856:20;41874:1;41856:20;:::i;:::-;41851:25;;41895:1;41892;41889:8;41886:34;;;41900:18;;:::i;:::-;41886:34;41945:1;41942;41938:9;41930:17;;41762:191;;;;:::o;41959:96::-;41996:7;42025:24;42043:5;42025:24;:::i;:::-;42014:35;;41959:96;;;:::o;42061:90::-;42095:7;42138:5;42131:13;42124:21;42113:32;;42061:90;;;:::o;42157:77::-;42194:7;42223:5;42212:16;;42157:77;;;:::o;42240:149::-;42276:7;42316:66;42309:5;42305:78;42294:89;;42240:149;;;:::o;42395:126::-;42432:7;42472:42;42465:5;42461:54;42450:65;;42395:126;;;:::o;42527:77::-;42564:7;42593:5;42582:16;;42527:77;;;:::o;42610:109::-;42646:7;42686:26;42679:5;42675:38;42664:49;;42610:109;;;:::o;42725:154::-;42809:6;42804:3;42799;42786:30;42871:1;42862:6;42857:3;42853:16;42846:27;42725:154;;;:::o;42885:307::-;42953:1;42963:113;42977:6;42974:1;42971:13;42963:113;;;43062:1;43057:3;43053:11;43047:18;43043:1;43038:3;43034:11;43027:39;42999:2;42996:1;42992:10;42987:15;;42963:113;;;43094:6;43091:1;43088:13;43085:101;;;43174:1;43165:6;43160:3;43156:16;43149:27;43085:101;42934:258;42885:307;;;:::o;43198:320::-;43242:6;43279:1;43273:4;43269:12;43259:22;;43326:1;43320:4;43316:12;43347:18;43337:81;;43403:4;43395:6;43391:17;43381:27;;43337:81;43465:2;43457:6;43454:14;43434:18;43431:38;43428:84;;;43484:18;;:::i;:::-;43428:84;43249:269;43198:320;;;:::o;43524:281::-;43607:27;43629:4;43607:27;:::i;:::-;43599:6;43595:40;43737:6;43725:10;43722:22;43701:18;43689:10;43686:34;43683:62;43680:88;;;43748:18;;:::i;:::-;43680:88;43788:10;43784:2;43777:22;43567:238;43524:281;;:::o;43811:233::-;43850:3;43873:24;43891:5;43873:24;:::i;:::-;43864:33;;43919:66;43912:5;43909:77;43906:103;;;43989:18;;:::i;:::-;43906:103;44036:1;44029:5;44025:13;44018:20;;43811:233;;;:::o;44050:100::-;44089:7;44118:26;44138:5;44118:26;:::i;:::-;44107:37;;44050:100;;;:::o;44156:94::-;44195:7;44224:20;44238:5;44224:20;:::i;:::-;44213:31;;44156:94;;;:::o;44256:176::-;44288:1;44305:20;44323:1;44305:20;:::i;:::-;44300:25;;44339:20;44357:1;44339:20;:::i;:::-;44334:25;;44378:1;44368:35;;44383:18;;:::i;:::-;44368:35;44424:1;44421;44417:9;44412:14;;44256:176;;;;:::o;44438:180::-;44486:77;44483:1;44476:88;44583:4;44580:1;44573:15;44607:4;44604:1;44597:15;44624:180;44672:77;44669:1;44662:88;44769:4;44766:1;44759:15;44793:4;44790:1;44783:15;44810:180;44858:77;44855:1;44848:88;44955:4;44952:1;44945:15;44979:4;44976:1;44969:15;44996:180;45044:77;45041:1;45034:88;45141:4;45138:1;45131:15;45165:4;45162:1;45155:15;45182:180;45230:77;45227:1;45220:88;45327:4;45324:1;45317:15;45351:4;45348:1;45341:15;45368:117;45477:1;45474;45467:12;45491:117;45600:1;45597;45590:12;45614:117;45723:1;45720;45713:12;45737:117;45846:1;45843;45836:12;45860:117;45969:1;45966;45959:12;45983:117;46092:1;46089;46082:12;46106:102;46147:6;46198:2;46194:7;46189:2;46182:5;46178:14;46174:28;46164:38;;46106:102;;;:::o;46214:94::-;46247:8;46295:5;46291:2;46287:14;46266:35;;46214:94;;;:::o;46314:237::-;46454:34;46450:1;46442:6;46438:14;46431:58;46523:20;46518:2;46510:6;46506:15;46499:45;46314:237;:::o;46557:182::-;46697:34;46693:1;46685:6;46681:14;46674:58;46557:182;:::o;46745:225::-;46885:34;46881:1;46873:6;46869:14;46862:58;46954:8;46949:2;46941:6;46937:15;46930:33;46745:225;:::o;46976:224::-;47116:34;47112:1;47104:6;47100:14;47093:58;47185:7;47180:2;47172:6;47168:15;47161:32;46976:224;:::o;47206:178::-;47346:30;47342:1;47334:6;47330:14;47323:54;47206:178;:::o;47390:223::-;47530:34;47526:1;47518:6;47514:14;47507:58;47599:6;47594:2;47586:6;47582:15;47575:31;47390:223;:::o;47619:175::-;47759:27;47755:1;47747:6;47743:14;47736:51;47619:175;:::o;47800:171::-;47940:23;47936:1;47928:6;47924:14;47917:47;47800:171;:::o;47977:169::-;48117:21;48113:1;48105:6;48101:14;48094:45;47977:169;:::o;48152:228::-;48292:34;48288:1;48280:6;48276:14;48269:58;48361:11;48356:2;48348:6;48344:15;48337:36;48152:228;:::o;48386:249::-;48526:34;48522:1;48514:6;48510:14;48503:58;48595:32;48590:2;48582:6;48578:15;48571:57;48386:249;:::o;48641:182::-;48781:34;48777:1;48769:6;48765:14;48758:58;48641:182;:::o;48829:::-;48969:34;48965:1;48957:6;48953:14;48946:58;48829:182;:::o;49017:164::-;49157:16;49153:1;49145:6;49141:14;49134:40;49017:164;:::o;49187:234::-;49327:34;49323:1;49315:6;49311:14;49304:58;49396:17;49391:2;49383:6;49379:15;49372:42;49187:234;:::o;49427:174::-;49567:26;49563:1;49555:6;49551:14;49544:50;49427:174;:::o;49607:220::-;49747:34;49743:1;49735:6;49731:14;49724:58;49816:3;49811:2;49803:6;49799:15;49792:28;49607:220;:::o;49833:114::-;;:::o;49953:170::-;50093:22;50089:1;50081:6;50077:14;50070:46;49953:170;:::o;50129:229::-;50269:34;50265:1;50257:6;50253:14;50246:58;50338:12;50333:2;50325:6;50321:15;50314:37;50129:229;:::o;50364:233::-;50504:34;50500:1;50492:6;50488:14;50481:58;50573:16;50568:2;50560:6;50556:15;50549:41;50364:233;:::o;50603:175::-;50743:27;50739:1;50731:6;50727:14;50720:51;50603:175;:::o;50784:169::-;50924:21;50920:1;50912:6;50908:14;50901:45;50784:169;:::o;50959:122::-;51032:24;51050:5;51032:24;:::i;:::-;51025:5;51022:35;51012:63;;51071:1;51068;51061:12;51012:63;50959:122;:::o;51087:116::-;51157:21;51172:5;51157:21;:::i;:::-;51150:5;51147:32;51137:60;;51193:1;51190;51183:12;51137:60;51087:116;:::o;51209:122::-;51282:24;51300:5;51282:24;:::i;:::-;51275:5;51272:35;51262:63;;51321:1;51318;51311:12;51262:63;51209:122;:::o;51337:120::-;51409:23;51426:5;51409:23;:::i;:::-;51402:5;51399:34;51389:62;;51447:1;51444;51437:12;51389:62;51337:120;:::o;51463:122::-;51536:24;51554:5;51536:24;:::i;:::-;51529:5;51526:35;51516:63;;51575:1;51572;51565:12;51516:63;51463:122;:::o;51591:120::-;51663:23;51680:5;51663:23;:::i;:::-;51656:5;51653:34;51643:62;;51701:1;51698;51691:12;51643:62;51591:120;:::o

Swarm Source

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