ETH Price: $2,442.98 (+1.24%)

Token

0xGU (0xGU)
 

Overview

Max Total Supply

258 0xGU

Holders

59

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 0xGU
0x0d357eb9a87e35df6a3a8d05a6bdc105b4a8facd
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:
xGU

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-17
*/

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// 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/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/ERC721A.sol



pragma solidity ^0.8.0;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

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

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

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

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

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

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

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

    revert("ERC721A: unable to determine the owner of token");
  }

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

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

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

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

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

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

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

    require(
      _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
      "ERC721A: approve caller is not owner nor approved for all"
    );

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: approve to caller");

    _operatorApprovals[_msgSender()][operator] = approved;
    emit ApprovalForAll(_msgSender(), operator, approved);
  }

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

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

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: 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`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

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

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

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

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

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

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

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
   * transferred to `to`.
   * - When `from` is zero, `tokenId` will be minted for `to`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

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



// Created by HashLips
// The Nerdy Coder Clones

pragma solidity ^0.8.0;







contract xGU is ERC721A, IERC2981, Ownable, ReentrancyGuard {
    using Strings for uint256;
    using ECDSA for bytes32;

    string public baseURI;
    string public notRevealedUri;
    string public baseExtension = ".json";
    uint256 public mintCost = 0.005 ether;
    uint256 public maxSupply = 10000;
    uint256 public maxMint = 10;
    uint256 public freeMint = 1;
    uint256 public revealTokenId = 0;
    uint256 public currentToken = 0;
    bool public paused = false;
    uint256 public publicStartTime = 1660000000;
    address public royaltyAddress;
    uint256 public royaltyPercent;
    mapping(uint256 => bool) public staked;

    constructor(
    ) ERC721A("0xGU", "0xGU", 200, maxSupply) {
        royaltyAddress = 0x2934577327E1219A51b60C269a2892D03bD5c28B;
        royaltyPercent = 10;
        setBaseURI("");
        setNotRevealedURI(
            "ipfs://QmS59Jpr5Jy9krKvC5qy6eVhULV7Xo2sxuY2gTt4BGttgq/hidden.json"
        );
    }

    
    modifier eoaOnly() {
        require(tx.origin == msg.sender, "EOA Only");
        _;
    }

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

    // public
    function mint(uint256 _mintAmt) public payable nonReentrant eoaOnly {
        uint256 supply = totalSupply();
        require(!paused, "Mint Paused");
        require(block.timestamp >= publicStartTime, "Mint Not Open Yet");
        require(_mintAmt > 0, "Wrong Mint Amount");
        require(_mintAmt <= maxMint, "Dont Greedy");
        require(numberMinted(msg.sender) < 1 ,"Minted Before");
        require(supply + _mintAmt <= maxSupply, "Finishhhh");

        if (msg.sender != owner()) {
            require(msg.value >= mintCost * (_mintAmt - freeMint), "Value Not Match");
        }

        _safeMint(msg.sender, _mintAmt);
        currentToken = currentToken + _mintAmt;
    }

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

        if (tokenId >= revealTokenId) {
            return notRevealedUri;
        }

        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        baseExtension
                    )
                )
                : "";
    }
  
    function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }

    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        require(_exists(tokenId), "Non-existent token");
        return (royaltyAddress, (salePrice * royaltyPercent) / 100);
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

 

    function stake(uint256 tokenId) public virtual {
        require(ownerOf(tokenId) == msg.sender, "You do not own the NFT");
        require(staked[tokenId] == false, "NFT is Staked");
        staked[tokenId] = true;
    }

    function unstake(uint256 tokenId) public virtual {
        require(ownerOf(tokenId) == msg.sender, "You do not own the NFT");
        require(staked[tokenId] == true, "NFT is Not Staked");
        staked[tokenId] = false;
    }

    function _beforeTokenTransfers(
        address,
        address,
        uint256 startTokenId,
        uint256 quantity
    ) internal view override {
        uint256 tokenId = startTokenId;
        for (uint256 end = tokenId + quantity; tokenId < end; ++tokenId) {
            require(staked[tokenId] == false, "Nft Staked");
        }
    }

    //only owner
    function teamMint(uint256 _mintAmt) public onlyOwner {
        require(_mintAmt > 0, "Invalid Mint Amount");
        require(totalSupply() + _mintAmt <= maxSupply, "Not Enough NFT Left");
        _safeMint(msg.sender, _mintAmt);
        currentToken = currentToken + _mintAmt;
    }

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

    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

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

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

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

    function setRevealTokenId(uint256 _revealTokenId) public onlyOwner {
        revealTokenId = _revealTokenId;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }


    function setpublicStartTime(uint256 _publicStartTime) external onlyOwner {
        publicStartTime = _publicStartTime;
    }

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

    function withdrawAll() public payable onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");

        require(success, "Transfer failed.");
    }

    function setRoyaltyReceiver(address royaltyReceiver) public onlyOwner {
        royaltyAddress = royaltyReceiver;
    }

    function setRoyaltyPercentage(uint256 royaltyPercentage) public onlyOwner {
        royaltyPercent = royaltyPercentage;
    }

    function serverNow() public view returns (uint256 currenttimeStamp) {
        return block.timestamp;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","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":"maxMint","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":"_mintAmt","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCost","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":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"serverNow","outputs":[{"internalType":"uint256","name":"currenttimeStamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_revealTokenId","type":"uint256"}],"name":"setRevealTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"royaltyPercentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyReceiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicStartTime","type":"uint256"}],"name":"setpublicStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"staked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_mintAmt","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","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":"payable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

6000808055600755610100604052600560c081905264173539b7b760d91b60e09081526200003191600c91906200032e565b506611c37937e08000600d55612710600e55600a600f556001601055600060118190556012556013805460ff191690556362f197006014553480156200007657600080fd5b50604051806040016040528060048152602001633078475560e01b815250604051806040016040528060048152602001633078475560e01b81525060c8600e5460008111620001235760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620001855760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b60648201526084016200011a565b83516200019a9060019060208701906200032e565b508251620001b09060029060208601906200032e565b5060a09190915260805250620001c89050336200023c565b6001600955601580546001600160a01b031916732934577327e1219a51b60c269a2892d03bd5c28b179055600a60165560408051602081019091526000815262000212906200028e565b620002366040518060800160405280604181526020016200326f60419139620002b1565b62000411565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62000298620002d0565b8051620002ad90600a9060208401906200032e565b5050565b620002bb620002d0565b8051620002ad90600b9060208401906200032e565b6008546001600160a01b031633146200032c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200011a565b565b8280546200033c90620003d4565b90600052602060002090601f016020900481019282620003605760008555620003ab565b82601f106200037b57805160ff1916838001178555620003ab565b82800160010185558215620003ab579182015b82811115620003ab5782518255916020019190600101906200038e565b50620003b9929150620003bd565b5090565b5b80821115620003b95760008155600101620003be565b600181811c90821680620003e957607f821691505b602082108114156200040b57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051612e2d6200044260003960008181611f5c01528181611f8601526124c0015260005050612e2d6000f3fe6080604052600436106103355760003560e01c80636c0360eb116101ab578063a694fc3a116100f7578063d5abeb0111610095578063dc33e6811161006f578063dc33e68114610903578063e985e9c514610923578063f2c4ce1e1461096c578063f2fde38b1461098c57600080fd5b8063d5abeb01146108b7578063d7224ba0146108cd578063da3ef23f146108e357600080fd5b8063b88d4fde116100d1578063b88d4fde1461084c578063bdb4b8481461086c578063c668286214610882578063c87b56dd1461089757600080fd5b8063a694fc3a146107ec578063a85b99051461080c578063ad2f852a1461082c57600080fd5b8063853828b61161016457806395d89b411161013e57806395d89b411461078e5780639f67756d146107a3578063a0712d68146107b9578063a22cb465146107cc57600080fd5b8063853828b6146107485780638da5cb5b146107505780638dc251e31461076e57600080fd5b80636c0360eb146106b25780636f8b44b0146106c757806370a08231146106e7578063715018a6146107075780637501f7411461071c578063836c081d1461073257600080fd5b80633ccfd60b116102855780635b70ea9f116102235780635fd1bbc4116101fd5780635fd1bbc41461064957806361ba27da1461065f5780636352211e1461067f5780636b3416a21461069f57600080fd5b80635b70ea9f146105e95780635c975abb146105ff5780635e1bef321461061957600080fd5b806344a0d68a1161025f57806344a0d68a146105695780634c739afe146105895780634f6ccce7146105a957806355f804b3146105c957600080fd5b80633ccfd60b1461051457806342842e0e1461051c578063438b63001461053c57600080fd5b806318160ddd116102f25780632a55205a116102cc5780632a55205a146104755780632e17de78146104b45780632f745c59146104d45780632fbba115146104f457600080fd5b806318160ddd1461042057806323b872dd1461043f5780632a3a19251461045f57600080fd5b806301ffc9a71461033a57806302329a291461036f57806306fdde0314610391578063081812fc146103b3578063081c8c44146103eb578063095ea7b314610400575b600080fd5b34801561034657600080fd5b5061035a610355366004612992565b6109ac565b60405190151581526020015b60405180910390f35b34801561037b57600080fd5b5061038f61038a366004612977565b610a19565b005b34801561039d57600080fd5b506103a6610a34565b6040516103669190612bc1565b3480156103bf57600080fd5b506103d36103ce366004612a15565b610ac6565b6040516001600160a01b039091168152602001610366565b3480156103f757600080fd5b506103a6610b56565b34801561040c57600080fd5b5061038f61041b36600461294d565b610be4565b34801561042c57600080fd5b506000545b604051908152602001610366565b34801561044b57600080fd5b5061038f61045a36600461286b565b610cfc565b34801561046b57600080fd5b5061043160115481565b34801561048157600080fd5b50610495610490366004612a2e565b610d07565b604080516001600160a01b039093168352602083019190915201610366565b3480156104c057600080fd5b5061038f6104cf366004612a15565b610d8a565b3480156104e057600080fd5b506104316104ef36600461294d565b610e52565b34801561050057600080fd5b5061038f61050f366004612a15565b610fc0565b61038f611087565b34801561052857600080fd5b5061038f61053736600461286b565b6110b5565b34801561054857600080fd5b5061055c61055736600461281d565b6110d0565b6040516103669190612b7d565b34801561057557600080fd5b5061038f610584366004612a15565b611172565b34801561059557600080fd5b5061038f6105a4366004612a15565b61117f565b3480156105b557600080fd5b506104316105c4366004612a15565b61118c565b3480156105d557600080fd5b5061038f6105e43660046129cc565b6111ee565b3480156105f557600080fd5b5061043160105481565b34801561060b57600080fd5b5060135461035a9060ff1681565b34801561062557600080fd5b5061035a610634366004612a15565b60176020526000908152604090205460ff1681565b34801561065557600080fd5b5061043160145481565b34801561066b57600080fd5b5061038f61067a366004612a15565b61120d565b34801561068b57600080fd5b506103d361069a366004612a15565b61121a565b3480156106ab57600080fd5b5042610431565b3480156106be57600080fd5b506103a661122c565b3480156106d357600080fd5b5061038f6106e2366004612a15565b611239565b3480156106f357600080fd5b5061043161070236600461281d565b611246565b34801561071357600080fd5b5061038f6112d7565b34801561072857600080fd5b50610431600f5481565b34801561073e57600080fd5b5061043160125481565b61038f6112e9565b34801561075c57600080fd5b506008546001600160a01b03166103d3565b34801561077a57600080fd5b5061038f61078936600461281d565b61137f565b34801561079a57600080fd5b506103a66113a9565b3480156107af57600080fd5b5061043160165481565b61038f6107c7366004612a15565b6113b8565b3480156107d857600080fd5b5061038f6107e7366004612923565b611678565b3480156107f857600080fd5b5061038f610807366004612a15565b61173d565b34801561081857600080fd5b5061038f610827366004612a15565b611800565b34801561083857600080fd5b506015546103d3906001600160a01b031681565b34801561085857600080fd5b5061038f6108673660046128a7565b61180d565b34801561087857600080fd5b50610431600d5481565b34801561088e57600080fd5b506103a6611846565b3480156108a357600080fd5b506103a66108b2366004612a15565b611853565b3480156108c357600080fd5b50610431600e5481565b3480156108d957600080fd5b5061043160075481565b3480156108ef57600080fd5b5061038f6108fe3660046129cc565b6119be565b34801561090f57600080fd5b5061043161091e36600461281d565b6119d9565b34801561092f57600080fd5b5061035a61093e366004612838565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561097857600080fd5b5061038f6109873660046129cc565b6119e4565b34801561099857600080fd5b5061038f6109a736600461281d565b6119ff565b60006001600160e01b031982166380ac58cd60e01b14806109dd57506001600160e01b03198216635b5e139f60e01b145b806109f857506001600160e01b0319821663780e9d6360e01b145b80610a1357506301ffc9a760e01b6001600160e01b03198316145b92915050565b610a21611a75565b6013805460ff1916911515919091179055565b606060018054610a4390612d1f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6f90612d1f565b8015610abc5780601f10610a9157610100808354040283529160200191610abc565b820191906000526020600020905b815481529060010190602001808311610a9f57829003601f168201915b5050505050905090565b6000610ad3826000541190565b610b3a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600b8054610b6390612d1f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8f90612d1f565b8015610bdc5780601f10610bb157610100808354040283529160200191610bdc565b820191906000526020600020905b815481529060010190602001808311610bbf57829003601f168201915b505050505081565b6000610bef8261121a565b9050806001600160a01b0316836001600160a01b03161415610c5e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610b31565b336001600160a01b0382161480610c7a5750610c7a813361093e565b610cec5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610b31565b610cf7838383611acf565b505050565b610cf7838383611b2b565b600080610d15846000541190565b610d565760405162461bcd60e51b81526020600482015260126024820152712737b716b2bc34b9ba32b73a103a37b5b2b760711b6044820152606401610b31565b6015546016546001600160a01b0390911690606490610d759086612c7e565b610d7f9190612c6a565b915091509250929050565b33610d948261121a565b6001600160a01b031614610de35760405162461bcd60e51b8152602060048201526016602482015275165bdd48191bc81b9bdd081bdddb881d1a194813919560521b6044820152606401610b31565b60008181526017602052604090205460ff161515600114610e3a5760405162461bcd60e51b8152602060048201526011602482015270139195081a5cc8139bdd0814dd185ad959607a1b6044820152606401610b31565b6000908152601760205260409020805460ff19169055565b6000610e5d83611246565b8210610eb65760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610b31565b600080549080805b83811015610f60576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610f1157805192505b876001600160a01b0316836001600160a01b03161415610f4d5786841415610f3f57509350610a1392505050565b83610f4981612d5a565b9450505b5080610f5881612d5a565b915050610ebe565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610b31565b610fc8611a75565b6000811161100e5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a5908135a5b9d08105b5bdd5b9d606a1b6044820152606401610b31565b600e548161101b60005490565b6110259190612c52565b11156110695760405162461bcd60e51b8152602060048201526013602482015272139bdd08115b9bdd59da08139195081319599d606a1b6044820152606401610b31565b6110733382611ec0565b806012546110819190612c52565b60125550565b61108f611a75565b60405133904780156108fc02916000818181858888f193505050506110b357600080fd5b565b610cf78383836040518060200160405280600081525061180d565b606060006110dd83611246565b905060008167ffffffffffffffff8111156110fa576110fa612dcb565b604051908082528060200260200182016040528015611123578160200160208202803683370190505b50905060005b8281101561116a5761113b8582610e52565b82828151811061114d5761114d612db5565b60209081029190910101528061116281612d5a565b915050611129565b509392505050565b61117a611a75565b600d55565b611187611a75565b601455565b6000805482106111ea5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610b31565b5090565b6111f6611a75565b805161120990600a9060208401906126eb565b5050565b611215611a75565b601655565b600061122582611eda565b5192915050565b600a8054610b6390612d1f565b611241611a75565b600e55565b60006001600160a01b0382166112b25760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610b31565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6112df611a75565b6110b36000612084565b6112f1611a75565b604051600090339047908381818185875af1925050503d8060008114611333576040519150601f19603f3d011682016040523d82523d6000602084013e611338565b606091505b505090508061137c5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610b31565b50565b611387611a75565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b606060028054610a4390612d1f565b6002600954141561140b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b31565b600260095532331461144a5760405162461bcd60e51b8152602060048201526008602482015267454f41204f6e6c7960c01b6044820152606401610b31565b60005460135460ff161561148e5760405162461bcd60e51b815260206004820152600b60248201526a135a5b9d0814185d5cd95960aa1b6044820152606401610b31565b6014544210156114d45760405162461bcd60e51b8152602060048201526011602482015270135a5b9d08139bdd0813dc195b8816595d607a1b6044820152606401610b31565b600082116115185760405162461bcd60e51b815260206004820152601160248201527015dc9bdb99c8135a5b9d08105b5bdd5b9d607a1b6044820152606401610b31565b600f548211156115585760405162461bcd60e51b815260206004820152600b60248201526a446f6e742047726565647960a81b6044820152606401610b31565b6001611563336119d9565b106115a05760405162461bcd60e51b815260206004820152600d60248201526c4d696e746564204265666f726560981b6044820152606401610b31565b600e546115ad8383612c52565b11156115e75760405162461bcd60e51b815260206004820152600960248201526808cd2dcd2e6d0d0d0d60bb1b6044820152606401610b31565b6008546001600160a01b03163314611654576010546116069083612cc5565b600d546116139190612c7e565b3410156116545760405162461bcd60e51b815260206004820152600f60248201526e0acc2d8eaca409cdee8409ac2e8c6d608b1b6044820152606401610b31565b61165e3383611ec0565b8160125461166c9190612c52565b60125550506001600955565b6001600160a01b0382163314156116d15760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610b31565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336117478261121a565b6001600160a01b0316146117965760405162461bcd60e51b8152602060048201526016602482015275165bdd48191bc81b9bdd081bdddb881d1a194813919560521b6044820152606401610b31565b60008181526017602052604090205460ff16156117e55760405162461bcd60e51b815260206004820152600d60248201526c139195081a5cc814dd185ad959609a1b6044820152606401610b31565b6000908152601760205260409020805460ff19166001179055565b611808611a75565b601155565b611818848484611b2b565b611824848484846120d6565b6118405760405162461bcd60e51b8152600401610b3190612bd4565b50505050565b600c8054610b6390612d1f565b6060611860826000541190565b6118c45760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b31565b601154821061195f57600b80546118da90612d1f565b80601f016020809104026020016040519081016040528092919081815260200182805461190690612d1f565b80156119535780601f1061192857610100808354040283529160200191611953565b820191906000526020600020905b81548152906001019060200180831161193657829003601f168201915b50505050509050919050565b60006119696121e4565b9050600081511161198957604051806020016040528060008152506119b7565b80611993846121f3565b600c6040516020016119a793929190612a7c565b6040516020818303038152906040525b9392505050565b6119c6611a75565b805161120990600c9060208401906126eb565b6000610a13826122f1565b6119ec611a75565b805161120990600b9060208401906126eb565b611a07611a75565b6001600160a01b038116611a6c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b31565b61137c81612084565b6008546001600160a01b031633146110b35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b31565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b3682611eda565b80519091506000906001600160a01b0316336001600160a01b03161480611b6d575033611b6284610ac6565b6001600160a01b0316145b80611b7f57508151611b7f903361093e565b905080611be95760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b31565b846001600160a01b031682600001516001600160a01b031614611c5d5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b31565b6001600160a01b038416611cc15760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b31565b611cce858585600161238f565b611cde6000848460000151611acf565b6001600160a01b0385166000908152600460205260408120805460019290611d109084906001600160801b0316612c9d565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092611d5c91859116612c27565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611de4846001612c52565b6000818152600360205260409020549091506001600160a01b0316611e7657611e0e816000541190565b15611e765760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b611209828260405180602001604052806000815250612403565b6040805180820190915260008082526020820152611ef9826000541190565b611f585760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610b31565b60007f00000000000000000000000000000000000000000000000000000000000000008310611fb957611fab7f000000000000000000000000000000000000000000000000000000000000000084612cc5565b611fb6906001612c52565b90505b825b818110612023576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561201057949350505050565b508061201b81612d08565b915050611fbb565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610b31565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156121d857604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061211a903390899088908890600401612b40565b602060405180830381600087803b15801561213457600080fd5b505af1925050508015612164575060408051601f3d908101601f19168201909252612161918101906129af565b60015b6121be573d808015612192576040519150601f19603f3d011682016040523d82523d6000602084013e612197565b606091505b5080516121b65760405162461bcd60e51b8152600401610b3190612bd4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506121dc565b5060015b949350505050565b6060600a8054610a4390612d1f565b6060816122175750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612241578061222b81612d5a565b915061223a9050600a83612c6a565b915061221b565b60008167ffffffffffffffff81111561225c5761225c612dcb565b6040519080825280601f01601f191660200182016040528015612286576020820181803683370190505b5090505b84156121dc5761229b600183612cc5565b91506122a8600a86612d75565b6122b3906030612c52565b60f81b8183815181106122c8576122c8612db5565b60200101906001600160f81b031916908160001a9053506122ea600a86612c6a565b945061228a565b60006001600160a01b0382166123635760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610b31565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b81600061239c8383612c52565b90505b80821015611eb85760008281526017602052604090205460ff16156123f35760405162461bcd60e51b815260206004820152600a60248201526913999d0814dd185ad95960b21b6044820152606401610b31565b6123fc82612d5a565b915061239f565b6000546001600160a01b0384166124665760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b31565b612471816000541190565b156124be5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610b31565b7f00000000000000000000000000000000000000000000000000000000000000008311156125395760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610b31565b612546600085838661238f565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906125a2908790612c27565b6001600160801b031681526020018583602001516125c09190612c27565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156126e05760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46126a460008884886120d6565b6126c05760405162461bcd60e51b8152600401610b3190612bd4565b816126ca81612d5a565b92505080806126d890612d5a565b915050612657565b506000819055611eb8565b8280546126f790612d1f565b90600052602060002090601f016020900481019282612719576000855561275f565b82601f1061273257805160ff191683800117855561275f565b8280016001018555821561275f579182015b8281111561275f578251825591602001919060010190612744565b506111ea9291505b808211156111ea5760008155600101612767565b600067ffffffffffffffff8084111561279657612796612dcb565b604051601f8501601f19908116603f011681019082821181831017156127be576127be612dcb565b816040528093508581528686860111156127d757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461280857600080fd5b919050565b8035801515811461280857600080fd5b60006020828403121561282f57600080fd5b6119b7826127f1565b6000806040838503121561284b57600080fd5b612854836127f1565b9150612862602084016127f1565b90509250929050565b60008060006060848603121561288057600080fd5b612889846127f1565b9250612897602085016127f1565b9150604084013590509250925092565b600080600080608085870312156128bd57600080fd5b6128c6856127f1565b93506128d4602086016127f1565b925060408501359150606085013567ffffffffffffffff8111156128f757600080fd5b8501601f8101871361290857600080fd5b6129178782356020840161277b565b91505092959194509250565b6000806040838503121561293657600080fd5b61293f836127f1565b91506128626020840161280d565b6000806040838503121561296057600080fd5b612969836127f1565b946020939093013593505050565b60006020828403121561298957600080fd5b6119b78261280d565b6000602082840312156129a457600080fd5b81356119b781612de1565b6000602082840312156129c157600080fd5b81516119b781612de1565b6000602082840312156129de57600080fd5b813567ffffffffffffffff8111156129f557600080fd5b8201601f81018413612a0657600080fd5b6121dc8482356020840161277b565b600060208284031215612a2757600080fd5b5035919050565b60008060408385031215612a4157600080fd5b50508035926020909101359150565b60008151808452612a68816020860160208601612cdc565b601f01601f19169290920160200192915050565b600084516020612a8f8285838a01612cdc565b855191840191612aa28184848a01612cdc565b8554920191600090600181811c9080831680612abf57607f831692505b858310811415612add57634e487b7160e01b85526022600452602485fd5b808015612af15760018114612b0257612b2f565b60ff19851688528388019550612b2f565b60008b81526020902060005b85811015612b275781548a820152908401908801612b0e565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b7390830184612a50565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612bb557835183529284019291840191600101612b99565b50909695505050505050565b6020815260006119b76020830184612a50565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60006001600160801b03808316818516808303821115612c4957612c49612d89565b01949350505050565b60008219821115612c6557612c65612d89565b500190565b600082612c7957612c79612d9f565b500490565b6000816000190483118215151615612c9857612c98612d89565b500290565b60006001600160801b0383811690831681811015612cbd57612cbd612d89565b039392505050565b600082821015612cd757612cd7612d89565b500390565b60005b83811015612cf7578181015183820152602001612cdf565b838111156118405750506000910152565b600081612d1757612d17612d89565b506000190190565b600181811c90821680612d3357607f821691505b60208210811415612d5457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d6e57612d6e612d89565b5060010190565b600082612d8457612d84612d9f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461137c57600080fdfea2646970667358221220cef783ed3638f30b026945962eb5c920f1253f676a79c5d9d0398d5d4235556e64736f6c63430008070033697066733a2f2f516d5335394a7072354a79396b724b764335717936655668554c5637586f327378755932675474344247747467712f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106103355760003560e01c80636c0360eb116101ab578063a694fc3a116100f7578063d5abeb0111610095578063dc33e6811161006f578063dc33e68114610903578063e985e9c514610923578063f2c4ce1e1461096c578063f2fde38b1461098c57600080fd5b8063d5abeb01146108b7578063d7224ba0146108cd578063da3ef23f146108e357600080fd5b8063b88d4fde116100d1578063b88d4fde1461084c578063bdb4b8481461086c578063c668286214610882578063c87b56dd1461089757600080fd5b8063a694fc3a146107ec578063a85b99051461080c578063ad2f852a1461082c57600080fd5b8063853828b61161016457806395d89b411161013e57806395d89b411461078e5780639f67756d146107a3578063a0712d68146107b9578063a22cb465146107cc57600080fd5b8063853828b6146107485780638da5cb5b146107505780638dc251e31461076e57600080fd5b80636c0360eb146106b25780636f8b44b0146106c757806370a08231146106e7578063715018a6146107075780637501f7411461071c578063836c081d1461073257600080fd5b80633ccfd60b116102855780635b70ea9f116102235780635fd1bbc4116101fd5780635fd1bbc41461064957806361ba27da1461065f5780636352211e1461067f5780636b3416a21461069f57600080fd5b80635b70ea9f146105e95780635c975abb146105ff5780635e1bef321461061957600080fd5b806344a0d68a1161025f57806344a0d68a146105695780634c739afe146105895780634f6ccce7146105a957806355f804b3146105c957600080fd5b80633ccfd60b1461051457806342842e0e1461051c578063438b63001461053c57600080fd5b806318160ddd116102f25780632a55205a116102cc5780632a55205a146104755780632e17de78146104b45780632f745c59146104d45780632fbba115146104f457600080fd5b806318160ddd1461042057806323b872dd1461043f5780632a3a19251461045f57600080fd5b806301ffc9a71461033a57806302329a291461036f57806306fdde0314610391578063081812fc146103b3578063081c8c44146103eb578063095ea7b314610400575b600080fd5b34801561034657600080fd5b5061035a610355366004612992565b6109ac565b60405190151581526020015b60405180910390f35b34801561037b57600080fd5b5061038f61038a366004612977565b610a19565b005b34801561039d57600080fd5b506103a6610a34565b6040516103669190612bc1565b3480156103bf57600080fd5b506103d36103ce366004612a15565b610ac6565b6040516001600160a01b039091168152602001610366565b3480156103f757600080fd5b506103a6610b56565b34801561040c57600080fd5b5061038f61041b36600461294d565b610be4565b34801561042c57600080fd5b506000545b604051908152602001610366565b34801561044b57600080fd5b5061038f61045a36600461286b565b610cfc565b34801561046b57600080fd5b5061043160115481565b34801561048157600080fd5b50610495610490366004612a2e565b610d07565b604080516001600160a01b039093168352602083019190915201610366565b3480156104c057600080fd5b5061038f6104cf366004612a15565b610d8a565b3480156104e057600080fd5b506104316104ef36600461294d565b610e52565b34801561050057600080fd5b5061038f61050f366004612a15565b610fc0565b61038f611087565b34801561052857600080fd5b5061038f61053736600461286b565b6110b5565b34801561054857600080fd5b5061055c61055736600461281d565b6110d0565b6040516103669190612b7d565b34801561057557600080fd5b5061038f610584366004612a15565b611172565b34801561059557600080fd5b5061038f6105a4366004612a15565b61117f565b3480156105b557600080fd5b506104316105c4366004612a15565b61118c565b3480156105d557600080fd5b5061038f6105e43660046129cc565b6111ee565b3480156105f557600080fd5b5061043160105481565b34801561060b57600080fd5b5060135461035a9060ff1681565b34801561062557600080fd5b5061035a610634366004612a15565b60176020526000908152604090205460ff1681565b34801561065557600080fd5b5061043160145481565b34801561066b57600080fd5b5061038f61067a366004612a15565b61120d565b34801561068b57600080fd5b506103d361069a366004612a15565b61121a565b3480156106ab57600080fd5b5042610431565b3480156106be57600080fd5b506103a661122c565b3480156106d357600080fd5b5061038f6106e2366004612a15565b611239565b3480156106f357600080fd5b5061043161070236600461281d565b611246565b34801561071357600080fd5b5061038f6112d7565b34801561072857600080fd5b50610431600f5481565b34801561073e57600080fd5b5061043160125481565b61038f6112e9565b34801561075c57600080fd5b506008546001600160a01b03166103d3565b34801561077a57600080fd5b5061038f61078936600461281d565b61137f565b34801561079a57600080fd5b506103a66113a9565b3480156107af57600080fd5b5061043160165481565b61038f6107c7366004612a15565b6113b8565b3480156107d857600080fd5b5061038f6107e7366004612923565b611678565b3480156107f857600080fd5b5061038f610807366004612a15565b61173d565b34801561081857600080fd5b5061038f610827366004612a15565b611800565b34801561083857600080fd5b506015546103d3906001600160a01b031681565b34801561085857600080fd5b5061038f6108673660046128a7565b61180d565b34801561087857600080fd5b50610431600d5481565b34801561088e57600080fd5b506103a6611846565b3480156108a357600080fd5b506103a66108b2366004612a15565b611853565b3480156108c357600080fd5b50610431600e5481565b3480156108d957600080fd5b5061043160075481565b3480156108ef57600080fd5b5061038f6108fe3660046129cc565b6119be565b34801561090f57600080fd5b5061043161091e36600461281d565b6119d9565b34801561092f57600080fd5b5061035a61093e366004612838565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561097857600080fd5b5061038f6109873660046129cc565b6119e4565b34801561099857600080fd5b5061038f6109a736600461281d565b6119ff565b60006001600160e01b031982166380ac58cd60e01b14806109dd57506001600160e01b03198216635b5e139f60e01b145b806109f857506001600160e01b0319821663780e9d6360e01b145b80610a1357506301ffc9a760e01b6001600160e01b03198316145b92915050565b610a21611a75565b6013805460ff1916911515919091179055565b606060018054610a4390612d1f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6f90612d1f565b8015610abc5780601f10610a9157610100808354040283529160200191610abc565b820191906000526020600020905b815481529060010190602001808311610a9f57829003601f168201915b5050505050905090565b6000610ad3826000541190565b610b3a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600b8054610b6390612d1f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8f90612d1f565b8015610bdc5780601f10610bb157610100808354040283529160200191610bdc565b820191906000526020600020905b815481529060010190602001808311610bbf57829003601f168201915b505050505081565b6000610bef8261121a565b9050806001600160a01b0316836001600160a01b03161415610c5e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610b31565b336001600160a01b0382161480610c7a5750610c7a813361093e565b610cec5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610b31565b610cf7838383611acf565b505050565b610cf7838383611b2b565b600080610d15846000541190565b610d565760405162461bcd60e51b81526020600482015260126024820152712737b716b2bc34b9ba32b73a103a37b5b2b760711b6044820152606401610b31565b6015546016546001600160a01b0390911690606490610d759086612c7e565b610d7f9190612c6a565b915091509250929050565b33610d948261121a565b6001600160a01b031614610de35760405162461bcd60e51b8152602060048201526016602482015275165bdd48191bc81b9bdd081bdddb881d1a194813919560521b6044820152606401610b31565b60008181526017602052604090205460ff161515600114610e3a5760405162461bcd60e51b8152602060048201526011602482015270139195081a5cc8139bdd0814dd185ad959607a1b6044820152606401610b31565b6000908152601760205260409020805460ff19169055565b6000610e5d83611246565b8210610eb65760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610b31565b600080549080805b83811015610f60576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610f1157805192505b876001600160a01b0316836001600160a01b03161415610f4d5786841415610f3f57509350610a1392505050565b83610f4981612d5a565b9450505b5080610f5881612d5a565b915050610ebe565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610b31565b610fc8611a75565b6000811161100e5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a5908135a5b9d08105b5bdd5b9d606a1b6044820152606401610b31565b600e548161101b60005490565b6110259190612c52565b11156110695760405162461bcd60e51b8152602060048201526013602482015272139bdd08115b9bdd59da08139195081319599d606a1b6044820152606401610b31565b6110733382611ec0565b806012546110819190612c52565b60125550565b61108f611a75565b60405133904780156108fc02916000818181858888f193505050506110b357600080fd5b565b610cf78383836040518060200160405280600081525061180d565b606060006110dd83611246565b905060008167ffffffffffffffff8111156110fa576110fa612dcb565b604051908082528060200260200182016040528015611123578160200160208202803683370190505b50905060005b8281101561116a5761113b8582610e52565b82828151811061114d5761114d612db5565b60209081029190910101528061116281612d5a565b915050611129565b509392505050565b61117a611a75565b600d55565b611187611a75565b601455565b6000805482106111ea5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610b31565b5090565b6111f6611a75565b805161120990600a9060208401906126eb565b5050565b611215611a75565b601655565b600061122582611eda565b5192915050565b600a8054610b6390612d1f565b611241611a75565b600e55565b60006001600160a01b0382166112b25760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610b31565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6112df611a75565b6110b36000612084565b6112f1611a75565b604051600090339047908381818185875af1925050503d8060008114611333576040519150601f19603f3d011682016040523d82523d6000602084013e611338565b606091505b505090508061137c5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610b31565b50565b611387611a75565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b606060028054610a4390612d1f565b6002600954141561140b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b31565b600260095532331461144a5760405162461bcd60e51b8152602060048201526008602482015267454f41204f6e6c7960c01b6044820152606401610b31565b60005460135460ff161561148e5760405162461bcd60e51b815260206004820152600b60248201526a135a5b9d0814185d5cd95960aa1b6044820152606401610b31565b6014544210156114d45760405162461bcd60e51b8152602060048201526011602482015270135a5b9d08139bdd0813dc195b8816595d607a1b6044820152606401610b31565b600082116115185760405162461bcd60e51b815260206004820152601160248201527015dc9bdb99c8135a5b9d08105b5bdd5b9d607a1b6044820152606401610b31565b600f548211156115585760405162461bcd60e51b815260206004820152600b60248201526a446f6e742047726565647960a81b6044820152606401610b31565b6001611563336119d9565b106115a05760405162461bcd60e51b815260206004820152600d60248201526c4d696e746564204265666f726560981b6044820152606401610b31565b600e546115ad8383612c52565b11156115e75760405162461bcd60e51b815260206004820152600960248201526808cd2dcd2e6d0d0d0d60bb1b6044820152606401610b31565b6008546001600160a01b03163314611654576010546116069083612cc5565b600d546116139190612c7e565b3410156116545760405162461bcd60e51b815260206004820152600f60248201526e0acc2d8eaca409cdee8409ac2e8c6d608b1b6044820152606401610b31565b61165e3383611ec0565b8160125461166c9190612c52565b60125550506001600955565b6001600160a01b0382163314156116d15760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610b31565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336117478261121a565b6001600160a01b0316146117965760405162461bcd60e51b8152602060048201526016602482015275165bdd48191bc81b9bdd081bdddb881d1a194813919560521b6044820152606401610b31565b60008181526017602052604090205460ff16156117e55760405162461bcd60e51b815260206004820152600d60248201526c139195081a5cc814dd185ad959609a1b6044820152606401610b31565b6000908152601760205260409020805460ff19166001179055565b611808611a75565b601155565b611818848484611b2b565b611824848484846120d6565b6118405760405162461bcd60e51b8152600401610b3190612bd4565b50505050565b600c8054610b6390612d1f565b6060611860826000541190565b6118c45760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b31565b601154821061195f57600b80546118da90612d1f565b80601f016020809104026020016040519081016040528092919081815260200182805461190690612d1f565b80156119535780601f1061192857610100808354040283529160200191611953565b820191906000526020600020905b81548152906001019060200180831161193657829003601f168201915b50505050509050919050565b60006119696121e4565b9050600081511161198957604051806020016040528060008152506119b7565b80611993846121f3565b600c6040516020016119a793929190612a7c565b6040516020818303038152906040525b9392505050565b6119c6611a75565b805161120990600c9060208401906126eb565b6000610a13826122f1565b6119ec611a75565b805161120990600b9060208401906126eb565b611a07611a75565b6001600160a01b038116611a6c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b31565b61137c81612084565b6008546001600160a01b031633146110b35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b31565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b3682611eda565b80519091506000906001600160a01b0316336001600160a01b03161480611b6d575033611b6284610ac6565b6001600160a01b0316145b80611b7f57508151611b7f903361093e565b905080611be95760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b31565b846001600160a01b031682600001516001600160a01b031614611c5d5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b31565b6001600160a01b038416611cc15760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b31565b611cce858585600161238f565b611cde6000848460000151611acf565b6001600160a01b0385166000908152600460205260408120805460019290611d109084906001600160801b0316612c9d565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092611d5c91859116612c27565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611de4846001612c52565b6000818152600360205260409020549091506001600160a01b0316611e7657611e0e816000541190565b15611e765760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b611209828260405180602001604052806000815250612403565b6040805180820190915260008082526020820152611ef9826000541190565b611f585760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610b31565b60007f00000000000000000000000000000000000000000000000000000000000000c88310611fb957611fab7f00000000000000000000000000000000000000000000000000000000000000c884612cc5565b611fb6906001612c52565b90505b825b818110612023576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561201057949350505050565b508061201b81612d08565b915050611fbb565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610b31565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156121d857604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061211a903390899088908890600401612b40565b602060405180830381600087803b15801561213457600080fd5b505af1925050508015612164575060408051601f3d908101601f19168201909252612161918101906129af565b60015b6121be573d808015612192576040519150601f19603f3d011682016040523d82523d6000602084013e612197565b606091505b5080516121b65760405162461bcd60e51b8152600401610b3190612bd4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506121dc565b5060015b949350505050565b6060600a8054610a4390612d1f565b6060816122175750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612241578061222b81612d5a565b915061223a9050600a83612c6a565b915061221b565b60008167ffffffffffffffff81111561225c5761225c612dcb565b6040519080825280601f01601f191660200182016040528015612286576020820181803683370190505b5090505b84156121dc5761229b600183612cc5565b91506122a8600a86612d75565b6122b3906030612c52565b60f81b8183815181106122c8576122c8612db5565b60200101906001600160f81b031916908160001a9053506122ea600a86612c6a565b945061228a565b60006001600160a01b0382166123635760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610b31565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b81600061239c8383612c52565b90505b80821015611eb85760008281526017602052604090205460ff16156123f35760405162461bcd60e51b815260206004820152600a60248201526913999d0814dd185ad95960b21b6044820152606401610b31565b6123fc82612d5a565b915061239f565b6000546001600160a01b0384166124665760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b31565b612471816000541190565b156124be5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610b31565b7f00000000000000000000000000000000000000000000000000000000000000c88311156125395760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610b31565b612546600085838661238f565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906125a2908790612c27565b6001600160801b031681526020018583602001516125c09190612c27565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156126e05760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46126a460008884886120d6565b6126c05760405162461bcd60e51b8152600401610b3190612bd4565b816126ca81612d5a565b92505080806126d890612d5a565b915050612657565b506000819055611eb8565b8280546126f790612d1f565b90600052602060002090601f016020900481019282612719576000855561275f565b82601f1061273257805160ff191683800117855561275f565b8280016001018555821561275f579182015b8281111561275f578251825591602001919060010190612744565b506111ea9291505b808211156111ea5760008155600101612767565b600067ffffffffffffffff8084111561279657612796612dcb565b604051601f8501601f19908116603f011681019082821181831017156127be576127be612dcb565b816040528093508581528686860111156127d757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461280857600080fd5b919050565b8035801515811461280857600080fd5b60006020828403121561282f57600080fd5b6119b7826127f1565b6000806040838503121561284b57600080fd5b612854836127f1565b9150612862602084016127f1565b90509250929050565b60008060006060848603121561288057600080fd5b612889846127f1565b9250612897602085016127f1565b9150604084013590509250925092565b600080600080608085870312156128bd57600080fd5b6128c6856127f1565b93506128d4602086016127f1565b925060408501359150606085013567ffffffffffffffff8111156128f757600080fd5b8501601f8101871361290857600080fd5b6129178782356020840161277b565b91505092959194509250565b6000806040838503121561293657600080fd5b61293f836127f1565b91506128626020840161280d565b6000806040838503121561296057600080fd5b612969836127f1565b946020939093013593505050565b60006020828403121561298957600080fd5b6119b78261280d565b6000602082840312156129a457600080fd5b81356119b781612de1565b6000602082840312156129c157600080fd5b81516119b781612de1565b6000602082840312156129de57600080fd5b813567ffffffffffffffff8111156129f557600080fd5b8201601f81018413612a0657600080fd5b6121dc8482356020840161277b565b600060208284031215612a2757600080fd5b5035919050565b60008060408385031215612a4157600080fd5b50508035926020909101359150565b60008151808452612a68816020860160208601612cdc565b601f01601f19169290920160200192915050565b600084516020612a8f8285838a01612cdc565b855191840191612aa28184848a01612cdc565b8554920191600090600181811c9080831680612abf57607f831692505b858310811415612add57634e487b7160e01b85526022600452602485fd5b808015612af15760018114612b0257612b2f565b60ff19851688528388019550612b2f565b60008b81526020902060005b85811015612b275781548a820152908401908801612b0e565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b7390830184612a50565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612bb557835183529284019291840191600101612b99565b50909695505050505050565b6020815260006119b76020830184612a50565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60006001600160801b03808316818516808303821115612c4957612c49612d89565b01949350505050565b60008219821115612c6557612c65612d89565b500190565b600082612c7957612c79612d9f565b500490565b6000816000190483118215151615612c9857612c98612d89565b500290565b60006001600160801b0383811690831681811015612cbd57612cbd612d89565b039392505050565b600082821015612cd757612cd7612d89565b500390565b60005b83811015612cf7578181015183820152602001612cdf565b838111156118405750506000910152565b600081612d1757612d17612d89565b506000190190565b600181811c90821680612d3357607f821691505b60208210811415612d5457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d6e57612d6e612d89565b5060010190565b600082612d8457612d84612d9f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461137c57600080fdfea2646970667358221220cef783ed3638f30b026945962eb5c920f1253f676a79c5d9d0398d5d4235556e64736f6c63430008070033

Deployed Bytecode Sourcemap

61836:6330:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49398:370;;;;;;;;;;-1:-1:-1;49398:370:0;;;;;:::i;:::-;;:::i;:::-;;;8339:14:1;;8332:22;8314:41;;8302:2;8287:18;49398:370:0;;;;;;;;67247:79;;;;;;;;;;-1:-1:-1;67247:79:0;;;;;:::i;:::-;;:::i;:::-;;51124:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;52649:204::-;;;;;;;;;;-1:-1:-1;52649:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6721:32:1;;;6703:51;;6691:2;6676:18;52649:204:0;6557:203:1;61995:28:0;;;;;;;;;;;;;:::i;52212:379::-;;;;;;;;;;-1:-1:-1;52212:379:0;;;;;:::i;:::-;;:::i;47959:94::-;;;;;;;;;;-1:-1:-1;48012:7:0;48035:12;47959:94;;;23069:25:1;;;23057:2;23042:18;47959:94:0;22923:177:1;53499:142:0;;;;;;;;;;-1:-1:-1;53499:142:0;;;;;:::i;:::-;;:::i;62225:32::-;;;;;;;;;;;;;;;;64648:307;;;;;;;;;;-1:-1:-1;64648:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7450:32:1;;;7432:51;;7514:2;7499:18;;7492:34;;;;7405:18;64648:307:0;7258:274:1;65599:231:0;;;;;;;;;;-1:-1:-1;65599:231:0;;;;;:::i;:::-;;:::i;48590:744::-;;;;;;;;;;-1:-1:-1;48590:744:0;;;;;:::i;:::-;;:::i;66217:287::-;;;;;;;;;;-1:-1:-1;66217:287:0;;;;;:::i;:::-;;:::i;67470:120::-;;;:::i;53704:157::-;;;;;;;;;;-1:-1:-1;53704:157:0;;;;;:::i;:::-;;:::i;64963:390::-;;;;;;;;;;-1:-1:-1;64963:390:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66512:90::-;;;;;;;;;;-1:-1:-1;66512:90:0;;;;;:::i;:::-;;:::i;67336:126::-;;;;;;;;;;-1:-1:-1;67336:126:0;;;;;:::i;:::-;;:::i;48122:177::-;;;;;;;;;;-1:-1:-1;48122:177:0;;;;;:::i;:::-;;:::i;66718:104::-;;;;;;;;;;-1:-1:-1;66718:104:0;;;;;:::i;:::-;;:::i;62191:27::-;;;;;;;;;;;;;;;;62302:26;;;;;;;;;;-1:-1:-1;62302:26:0;;;;;;;;62457:38;;;;;;;;;;-1:-1:-1;62457:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;62335:43;;;;;;;;;;;;;;;;67919:127;;;;;;;;;;-1:-1:-1;67919:127:0;;;;;:::i;:::-;;:::i;50947:118::-;;;;;;;;;;-1:-1:-1;50947:118:0;;;;;:::i;:::-;;:::i;68054:109::-;;;;;;;;;;-1:-1:-1;68140:15:0;68054:109;;61967:21;;;;;;;;;;;;;:::i;66610:100::-;;;;;;;;;;-1:-1:-1;66610:100:0;;;;;:::i;:::-;;:::i;49824:211::-;;;;;;;;;;-1:-1:-1;49824:211:0;;;;;:::i;:::-;;:::i;25608:103::-;;;;;;;;;;;;;:::i;62157:27::-;;;;;;;;;;;;;;;;62264:31;;;;;;;;;;;;;;;;67598:184;;;:::i;24960:87::-;;;;;;;;;;-1:-1:-1;25033:6:0;;-1:-1:-1;;;;;25033:6:0;24960:87;;67790:121;;;;;;;;;;-1:-1:-1;67790:121:0;;;;;:::i;:::-;;:::i;51279:98::-;;;;;;;;;;;;;:::i;62421:29::-;;;;;;;;;;;;;;;;63082:701;;;;;;:::i;:::-;;:::i;52917:274::-;;;;;;;;;;-1:-1:-1;52917:274:0;;;;;:::i;:::-;;:::i;65366:225::-;;;;;;;;;;-1:-1:-1;65366:225:0;;;;;:::i;:::-;;:::i;67123:116::-;;;;;;;;;;-1:-1:-1;67123:116:0;;;;;:::i;:::-;;:::i;62385:29::-;;;;;;;;;;-1:-1:-1;62385:29:0;;;;-1:-1:-1;;;;;62385:29:0;;;53924:311;;;;;;;;;;-1:-1:-1;53924:311:0;;;;;:::i;:::-;;:::i;62074:37::-;;;;;;;;;;;;;;;;62030;;;;;;;;;;;;;:::i;63791:732::-;;;;;;;;;;-1:-1:-1;63791:732:0;;;;;:::i;:::-;;:::i;62118:32::-;;;;;;;;;;;;;;;;58339:43;;;;;;;;;;;;;;;;66964:151;;;;;;;;;;-1:-1:-1;66964:151:0;;;;;:::i;:::-;;:::i;64533:107::-;;;;;;;;;;-1:-1:-1;64533:107:0;;;;;:::i;:::-;;:::i;53254:186::-;;;;;;;;;;-1:-1:-1;53254:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;53399:25:0;;;53376:4;53399:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;53254:186;66830:126;;;;;;;;;;-1:-1:-1;66830:126:0;;;;;:::i;:::-;;:::i;25866:201::-;;;;;;;;;;-1:-1:-1;25866:201:0;;;;;:::i;:::-;;:::i;49398:370::-;49525:4;-1:-1:-1;;;;;;49555:40:0;;-1:-1:-1;;;49555:40:0;;:99;;-1:-1:-1;;;;;;;49606:48:0;;-1:-1:-1;;;49606:48:0;49555:99;:160;;;-1:-1:-1;;;;;;;49665:50:0;;-1:-1:-1;;;49665:50:0;49555:160;:207;;;-1:-1:-1;;;;;;;;;;38821:40:0;;;49726:36;49541:221;49398:370;-1:-1:-1;;49398:370:0:o;67247:79::-;24846:13;:11;:13::i;:::-;67303:6:::1;:15:::0;;-1:-1:-1;;67303:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67247:79::o;51124:94::-;51178:13;51207:5;51200:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51124:94;:::o;52649:204::-;52717:7;52741:16;52749:7;54531:4;54561:12;-1:-1:-1;54551:22:0;54474:105;52741:16;52733:74;;;;-1:-1:-1;;;52733:74:0;;22308:2:1;52733:74:0;;;22290:21:1;22347:2;22327:18;;;22320:30;22386:34;22366:18;;;22359:62;-1:-1:-1;;;22437:18:1;;;22430:43;22490:19;;52733:74:0;;;;;;;;;-1:-1:-1;52823:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;52823:24:0;;52649:204::o;61995:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52212:379::-;52281:13;52297:24;52313:7;52297:15;:24::i;:::-;52281:40;;52342:5;-1:-1:-1;;;;;52336:11:0;:2;-1:-1:-1;;;;;52336:11:0;;;52328:58;;;;-1:-1:-1;;;52328:58:0;;18838:2:1;52328:58:0;;;18820:21:1;18877:2;18857:18;;;18850:30;18916:34;18896:18;;;18889:62;-1:-1:-1;;;18967:18:1;;;18960:32;19009:19;;52328:58:0;18636:398:1;52328:58:0;23591:10;-1:-1:-1;;;;;52411:21:0;;;;:62;;-1:-1:-1;52436:37:0;52453:5;23591:10;53254:186;:::i;52436:37::-;52395:153;;;;-1:-1:-1;;;52395:153:0;;15016:2:1;52395:153:0;;;14998:21:1;15055:2;15035:18;;;15028:30;15094:34;15074:18;;;15067:62;15165:27;15145:18;;;15138:55;15210:19;;52395:153:0;14814:421:1;52395:153:0;52557:28;52566:2;52570:7;52579:5;52557:8;:28::i;:::-;52274:317;52212:379;;:::o;53499:142::-;53607:28;53617:4;53623:2;53627:7;53607:9;:28::i;64648:307::-;64773:16;64791:21;64838:16;64846:7;54531:4;54561:12;-1:-1:-1;54551:22:0;54474:105;64838:16;64830:47;;;;-1:-1:-1;;;64830:47:0;;15442:2:1;64830:47:0;;;15424:21:1;15481:2;15461:18;;;15454:30;-1:-1:-1;;;15500:18:1;;;15493:48;15558:18;;64830:47:0;15240:342:1;64830:47:0;64896:14;;64925;;-1:-1:-1;;;;;64896:14:0;;;;64943:3;;64913:26;;:9;:26;:::i;:::-;64912:34;;;;:::i;:::-;64888:59;;;;64648:307;;;;;:::o;65599:231::-;65687:10;65667:16;65675:7;65667;:16::i;:::-;-1:-1:-1;;;;;65667:30:0;;65659:65;;;;-1:-1:-1;;;65659:65:0;;20006:2:1;65659:65:0;;;19988:21:1;20045:2;20025:18;;;20018:30;-1:-1:-1;;;20064:18:1;;;20057:52;20126:18;;65659:65:0;19804:346:1;65659:65:0;65743:15;;;;:6;:15;;;;;;;;:23;;:15;:23;65735:53;;;;-1:-1:-1;;;65735:53:0;;9881:2:1;65735:53:0;;;9863:21:1;9920:2;9900:18;;;9893:30;-1:-1:-1;;;9939:18:1;;;9932:47;9996:18;;65735:53:0;9679:341:1;65735:53:0;65817:5;65799:15;;;:6;:15;;;;;:23;;-1:-1:-1;;65799:23:0;;;65599:231::o;48590:744::-;48699:7;48734:16;48744:5;48734:9;:16::i;:::-;48726:5;:24;48718:71;;;;-1:-1:-1;;;48718:71:0;;8792:2:1;48718:71:0;;;8774:21:1;8831:2;8811:18;;;8804:30;8870:34;8850:18;;;8843:62;-1:-1:-1;;;8921:18:1;;;8914:32;8963:19;;48718:71:0;8590:398:1;48718:71:0;48796:22;48035:12;;;48796:22;;48916:350;48940:14;48936:1;:18;48916:350;;;48970:31;49004:14;;;:11;:14;;;;;;;;;48970:48;;;;;;;;;-1:-1:-1;;;;;48970:48:0;;;;;-1:-1:-1;;;48970:48:0;;;;;;;;;;;;49031:28;49027:89;;49092:14;;;-1:-1:-1;49027:89:0;49149:5;-1:-1:-1;;;;;49128:26:0;:17;-1:-1:-1;;;;;49128:26:0;;49124:135;;;49186:5;49171:11;:20;49167:59;;;-1:-1:-1;49213:1:0;-1:-1:-1;49206:8:0;;-1:-1:-1;;;49206:8:0;49167:59;49236:13;;;;:::i;:::-;;;;49124:135;-1:-1:-1;48956:3:0;;;;:::i;:::-;;;;48916:350;;;-1:-1:-1;49272:56:0;;-1:-1:-1;;;49272:56:0;;21117:2:1;49272:56:0;;;21099:21:1;21156:2;21136:18;;;21129:30;21195:34;21175:18;;;21168:62;-1:-1:-1;;;21246:18:1;;;21239:44;21300:19;;49272:56:0;20915:410:1;66217:287:0;24846:13;:11;:13::i;:::-;66300:1:::1;66289:8;:12;66281:44;;;::::0;-1:-1:-1;;;66281:44:0;;12957:2:1;66281:44:0::1;::::0;::::1;12939:21:1::0;12996:2;12976:18;;;12969:30;-1:-1:-1;;;13015:18:1;;;13008:49;13074:18;;66281:44:0::1;12755:343:1::0;66281:44:0::1;66372:9;;66360:8;66344:13;48012:7:::0;48035:12;;47959:94;66344:13:::1;:24;;;;:::i;:::-;:37;;66336:69;;;::::0;-1:-1:-1;;;66336:69:0;;13641:2:1;66336:69:0::1;::::0;::::1;13623:21:1::0;13680:2;13660:18;;;13653:30;-1:-1:-1;;;13699:18:1;;;13692:49;13758:18;;66336:69:0::1;13439:343:1::0;66336:69:0::1;66416:31;66426:10;66438:8;66416:9;:31::i;:::-;66488:8;66473:12;;:23;;;;:::i;:::-;66458:12;:38:::0;-1:-1:-1;66217:287:0:o;67470:120::-;24846:13;:11;:13::i;:::-;67534:47:::1;::::0;67542:10:::1;::::0;67559:21:::1;67534:47:::0;::::1;;;::::0;::::1;::::0;;;67559:21;67542:10;67534:47;::::1;;;;;;67526:56;;;::::0;::::1;;67470:120::o:0;53704:157::-;53816:39;53833:4;53839:2;53843:7;53816:39;;;;;;;;;;;;:16;:39::i;64963:390::-;65050:16;65084:23;65110:17;65120:6;65110:9;:17::i;:::-;65084:43;;65138:25;65180:15;65166:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65166:30:0;;65138:58;;65212:9;65207:113;65227:15;65223:1;:19;65207:113;;;65278:30;65298:6;65306:1;65278:19;:30::i;:::-;65264:8;65273:1;65264:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;65244:3;;;;:::i;:::-;;;;65207:113;;;-1:-1:-1;65337:8:0;64963:390;-1:-1:-1;;;64963:390:0:o;66512:90::-;24846:13;:11;:13::i;:::-;66575:8:::1;:19:::0;66512:90::o;67336:126::-;24846:13;:11;:13::i;:::-;67420:15:::1;:34:::0;67336:126::o;48122:177::-;48189:7;48035:12;;48213:5;:21;48205:69;;;;-1:-1:-1;;;48205:69:0;;11729:2:1;48205:69:0;;;11711:21:1;11768:2;11748:18;;;11741:30;11807:34;11787:18;;;11780:62;-1:-1:-1;;;11858:18:1;;;11851:33;11901:19;;48205:69:0;11527:399:1;48205:69:0;-1:-1:-1;48288:5:0;48122:177::o;66718:104::-;24846:13;:11;:13::i;:::-;66793:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;66718:104:::0;:::o;67919:127::-;24846:13;:11;:13::i;:::-;68004:14:::1;:34:::0;67919:127::o;50947:118::-;51011:7;51034:20;51046:7;51034:11;:20::i;:::-;:25;;50947:118;-1:-1:-1;;50947:118:0:o;61967:21::-;;;;;;;:::i;66610:100::-;24846:13;:11;:13::i;:::-;66680:9:::1;:22:::0;66610:100::o;49824:211::-;49888:7;-1:-1:-1;;;;;49912:19:0;;49904:75;;;;-1:-1:-1;;;49904:75:0;;15789:2:1;49904:75:0;;;15771:21:1;15828:2;15808:18;;;15801:30;15867:34;15847:18;;;15840:62;-1:-1:-1;;;15918:18:1;;;15911:41;15969:19;;49904:75:0;15587:407:1;49904:75:0;-1:-1:-1;;;;;;50001:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;50001:27:0;;49824:211::o;25608:103::-;24846:13;:11;:13::i;:::-;25673:30:::1;25700:1;25673:18;:30::i;67598:184::-:0;24846:13;:11;:13::i;:::-;67676:49:::1;::::0;67658:12:::1;::::0;67676:10:::1;::::0;67699:21:::1;::::0;67658:12;67676:49;67658:12;67676:49;67699:21;67676:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67657:68;;;67746:7;67738:36;;;::::0;-1:-1:-1;;;67738:36:0;;19241:2:1;67738:36:0::1;::::0;::::1;19223:21:1::0;19280:2;19260:18;;;19253:30;-1:-1:-1;;;19299:18:1;;;19292:46;19355:18;;67738:36:0::1;19039:340:1::0;67738:36:0::1;67646:136;67598:184::o:0;67790:121::-;24846:13;:11;:13::i;:::-;67871:14:::1;:32:::0;;-1:-1:-1;;;;;;67871:32:0::1;-1:-1:-1::0;;;;;67871:32:0;;;::::1;::::0;;;::::1;::::0;;67790:121::o;51279:98::-;51335:13;51364:7;51357:14;;;;;:::i;63082:701::-;10415:1;11013:7;;:19;;11005:63;;;;-1:-1:-1;;;11005:63:0;;21532:2:1;11005:63:0;;;21514:21:1;21571:2;21551:18;;;21544:30;21610:33;21590:18;;;21583:61;21661:18;;11005:63:0;21330:355:1;11005:63:0;10415:1;11146:7;:18;62870:9:::1;62883:10;62870:23;62862:44;;;::::0;-1:-1:-1;;;62862:44:0;;13305:2:1;62862:44:0::1;::::0;::::1;13287:21:1::0;13344:1;13324:18;;;13317:29;-1:-1:-1;;;13362:18:1;;;13355:38;13410:18;;62862:44:0::1;13103:331:1::0;62862:44:0::1;63161:14:::2;48035:12:::0;63211:6:::2;::::0;::::2;;63210:7;63202:31;;;::::0;-1:-1:-1;;;63202:31:0;;9195:2:1;63202:31:0::2;::::0;::::2;9177:21:1::0;9234:2;9214:18;;;9207:30;-1:-1:-1;;;9253:18:1;;;9246:41;9304:18;;63202:31:0::2;8993:335:1::0;63202:31:0::2;63271:15;;63252;:34;;63244:64;;;::::0;-1:-1:-1;;;63244:64:0;;14670:2:1;63244:64:0::2;::::0;::::2;14652:21:1::0;14709:2;14689:18;;;14682:30;-1:-1:-1;;;14728:18:1;;;14721:47;14785:18;;63244:64:0::2;14468:341:1::0;63244:64:0::2;63338:1;63327:8;:12;63319:42;;;::::0;-1:-1:-1;;;63319:42:0;;9535:2:1;63319:42:0::2;::::0;::::2;9517:21:1::0;9574:2;9554:18;;;9547:30;-1:-1:-1;;;9593:18:1;;;9586:47;9650:18;;63319:42:0::2;9333:341:1::0;63319:42:0::2;63392:7;;63380:8;:19;;63372:43;;;::::0;-1:-1:-1;;;63372:43:0;;10571:2:1;63372:43:0::2;::::0;::::2;10553:21:1::0;10610:2;10590:18;;;10583:30;-1:-1:-1;;;10629:18:1;;;10622:41;10680:18;;63372:43:0::2;10369:335:1::0;63372:43:0::2;63461:1;63434:24;63447:10;63434:12;:24::i;:::-;:28;63426:54;;;::::0;-1:-1:-1;;;63426:54:0;;13989:2:1;63426:54:0::2;::::0;::::2;13971:21:1::0;14028:2;14008:18;;;14001:30;-1:-1:-1;;;14047:18:1;;;14040:43;14100:18;;63426:54:0::2;13787:337:1::0;63426:54:0::2;63520:9;::::0;63499:17:::2;63508:8:::0;63499:6;:17:::2;:::i;:::-;:30;;63491:52;;;::::0;-1:-1:-1;;;63491:52:0;;16201:2:1;63491:52:0::2;::::0;::::2;16183:21:1::0;16240:1;16220:18;;;16213:29;-1:-1:-1;;;16258:18:1;;;16251:39;16307:18;;63491:52:0::2;15999:332:1::0;63491:52:0::2;25033:6:::0;;-1:-1:-1;;;;;25033:6:0;63560:10:::2;:21;63556:127;;63642:8;::::0;63631:19:::2;::::0;:8;:19:::2;:::i;:::-;63619:8;;:32;;;;:::i;:::-;63606:9;:45;;63598:73;;;::::0;-1:-1:-1;;;63598:73:0;;10227:2:1;63598:73:0::2;::::0;::::2;10209:21:1::0;10266:2;10246:18;;;10239:30;-1:-1:-1;;;10285:18:1;;;10278:45;10340:18;;63598:73:0::2;10025:339:1::0;63598:73:0::2;63695:31;63705:10;63717:8;63695:9;:31::i;:::-;63767:8;63752:12;;:23;;;;:::i;:::-;63737:12;:38:::0;-1:-1:-1;;10371:1:0;11325:7;:22;63082:701::o;52917:274::-;-1:-1:-1;;;;;53008:24:0;;23591:10;53008:24;;53000:63;;;;-1:-1:-1;;;53000:63:0;;17722:2:1;53000:63:0;;;17704:21:1;17761:2;17741:18;;;17734:30;17800:28;17780:18;;;17773:56;17846:18;;53000:63:0;17520:350:1;53000:63:0;23591:10;53072:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;53072:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;53072:53:0;;;;;;;;;;53137:48;;8314:41:1;;;53072:42:0;;23591:10;53137:48;;8287:18:1;53137:48:0;;;;;;;52917:274;;:::o;65366:225::-;65452:10;65432:16;65440:7;65432;:16::i;:::-;-1:-1:-1;;;;;65432:30:0;;65424:65;;;;-1:-1:-1;;;65424:65:0;;20006:2:1;65424:65:0;;;19988:21:1;20045:2;20025:18;;;20018:30;-1:-1:-1;;;20064:18:1;;;20057:52;20126:18;;65424:65:0;19804:346:1;65424:65:0;65508:15;;;;:6;:15;;;;;;;;:24;65500:50;;;;-1:-1:-1;;;65500:50:0;;18496:2:1;65500:50:0;;;18478:21:1;18535:2;18515:18;;;18508:30;-1:-1:-1;;;18554:18:1;;;18547:43;18607:18;;65500:50:0;18294:337:1;65500:50:0;65561:15;;;;:6;:15;;;;;:22;;-1:-1:-1;;65561:22:0;65579:4;65561:22;;;65366:225::o;67123:116::-;24846:13;:11;:13::i;:::-;67201::::1;:30:::0;67123:116::o;53924:311::-;54061:28;54071:4;54077:2;54081:7;54061:9;:28::i;:::-;54112:48;54135:4;54141:2;54145:7;54154:5;54112:22;:48::i;:::-;54096:133;;;;-1:-1:-1;;;54096:133:0;;;;;;;:::i;:::-;53924:311;;;;:::o;62030:37::-;;;;;;;:::i;63791:732::-;63909:13;63962:16;63970:7;54531:4;54561:12;-1:-1:-1;54551:22:0;54474:105;63962:16;63940:113;;;;-1:-1:-1;;;63940:113:0;;17306:2:1;63940:113:0;;;17288:21:1;17345:2;17325:18;;;17318:30;17384:34;17364:18;;;17357:62;-1:-1:-1;;;17435:18:1;;;17428:45;17490:19;;63940:113:0;17104:411:1;63940:113:0;64081:13;;64070:7;:24;64066:78;;64118:14;64111:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63791:732;;;:::o;64066:78::-;64156:28;64187:10;:8;:10::i;:::-;64156:41;;64259:1;64234:14;64228:28;:32;:287;;;;;;;;;;;;;;;;;64352:14;64393:18;:7;:16;:18::i;:::-;64438:13;64309:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64228:287;64208:307;63791:732;-1:-1:-1;;;63791:732:0:o;66964:151::-;24846:13;:11;:13::i;:::-;67074:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;64533:107::-:0;64591:7;64614:20;64628:5;64614:13;:20::i;66830:126::-;24846:13;:11;:13::i;:::-;66916:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;25866:201::-:0;24846:13;:11;:13::i;:::-;-1:-1:-1;;;;;25955:22:0;::::1;25947:73;;;::::0;-1:-1:-1;;;25947:73:0;;10911:2:1;25947:73:0::1;::::0;::::1;10893:21:1::0;10950:2;10930:18;;;10923:30;10989:34;10969:18;;;10962:62;-1:-1:-1;;;11040:18:1;;;11033:36;11086:19;;25947:73:0::1;10709:402:1::0;25947:73:0::1;26031:28;26050:8;26031:18;:28::i;25125:132::-:0;25033:6;;-1:-1:-1;;;;;25033:6:0;23591:10;25189:23;25181:68;;;;-1:-1:-1;;;25181:68:0;;16945:2:1;25181:68:0;;;16927:21:1;;;16964:18;;;16957:30;17023:34;17003:18;;;16996:62;17075:18;;25181:68:0;16743:356:1;58161:172:0;58258:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;58258:29:0;-1:-1:-1;;;;;58258:29:0;;;;;;;;;58299:28;;58258:24;;58299:28;;;;;;;58161:172;;;:::o;56526:1529::-;56623:35;56661:20;56673:7;56661:11;:20::i;:::-;56732:18;;56623:58;;-1:-1:-1;56690:22:0;;-1:-1:-1;;;;;56716:34:0;23591:10;-1:-1:-1;;;;;56716:34:0;;:81;;;-1:-1:-1;23591:10:0;56761:20;56773:7;56761:11;:20::i;:::-;-1:-1:-1;;;;;56761:36:0;;56716:81;:142;;;-1:-1:-1;56825:18:0;;56808:50;;23591:10;53254:186;:::i;56808:50::-;56690:169;;56884:17;56868:101;;;;-1:-1:-1;;;56868:101:0;;18077:2:1;56868:101:0;;;18059:21:1;18116:2;18096:18;;;18089:30;18155:34;18135:18;;;18128:62;-1:-1:-1;;;18206:18:1;;;18199:48;18264:19;;56868:101:0;17875:414:1;56868:101:0;57016:4;-1:-1:-1;;;;;56994:26:0;:13;:18;;;-1:-1:-1;;;;;56994:26:0;;56978:98;;;;-1:-1:-1;;;56978:98:0;;16538:2:1;56978:98:0;;;16520:21:1;16577:2;16557:18;;;16550:30;16616:34;16596:18;;;16589:62;-1:-1:-1;;;16667:18:1;;;16660:36;16713:19;;56978:98:0;16336:402:1;56978:98:0;-1:-1:-1;;;;;57091:16:0;;57083:66;;;;-1:-1:-1;;;57083:66:0;;12133:2:1;57083:66:0;;;12115:21:1;12172:2;12152:18;;;12145:30;12211:34;12191:18;;;12184:62;-1:-1:-1;;;12262:18:1;;;12255:35;12307:19;;57083:66:0;11931:401:1;57083:66:0;57158:43;57180:4;57186:2;57190:7;57199:1;57158:21;:43::i;:::-;57258:49;57275:1;57279:7;57288:13;:18;;;57258:8;:49::i;:::-;-1:-1:-1;;;;;57316:18:0;;;;;;:12;:18;;;;;:31;;57346:1;;57316:18;:31;;57346:1;;-1:-1:-1;;;;;57316:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;57316:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;57354:16:0;;-1:-1:-1;57354:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;57354:16:0;;:29;;-1:-1:-1;;57354:29:0;;:::i;:::-;;;-1:-1:-1;;;;;57354:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57413:43:0;;;;;;;;-1:-1:-1;;;;;57413:43:0;;;;;;57439:15;57413:43;;;;;;;;;-1:-1:-1;57390:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;57390:66:0;-1:-1:-1;;;;;;57390:66:0;;;;;;;;;;;57706:11;57402:7;-1:-1:-1;57706:11:0;:::i;:::-;57769:1;57728:24;;;:11;:24;;;;;:29;57684:33;;-1:-1:-1;;;;;;57728:29:0;57724:236;;57786:20;57794:11;54531:4;54561:12;-1:-1:-1;54551:22:0;54474:105;57786:20;57782:171;;;57846:97;;;;;;;;57873:18;;-1:-1:-1;;;;;57846:97:0;;;;;;57904:28;;;;57846:97;;;;;;;;;;-1:-1:-1;57819:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;57819:124:0;-1:-1:-1;;;;;;57819:124:0;;;;;;;;;;;;57782:171;57992:7;57988:2;-1:-1:-1;;;;;57973:27:0;57982:4;-1:-1:-1;;;;;57973:27:0;;;;;;;;;;;58007:42;56616:1439;;;56526:1529;;;:::o;54585:98::-;54650:27;54660:2;54664:8;54650:27;;;;;;;;;;;;:9;:27::i;50287:606::-;-1:-1:-1;;;;;;;;;;;;;;;;;50404:16:0;50412:7;54531:4;54561:12;-1:-1:-1;54551:22:0;54474:105;50404:16;50396:71;;;;-1:-1:-1;;;50396:71:0;;11318:2:1;50396:71:0;;;11300:21:1;11357:2;11337:18;;;11330:30;11396:34;11376:18;;;11369:62;-1:-1:-1;;;11447:18:1;;;11440:40;11497:19;;50396:71:0;11116:406:1;50396:71:0;50476:26;50524:12;50513:7;:23;50509:93;;50568:22;50578:12;50568:7;:22;:::i;:::-;:26;;50593:1;50568:26;:::i;:::-;50547:47;;50509:93;50630:7;50610:212;50647:18;50639:4;:26;50610:212;;50684:31;50718:17;;;:11;:17;;;;;;;;;50684:51;;;;;;;;;-1:-1:-1;;;;;50684:51:0;;;;;-1:-1:-1;;;50684:51:0;;;;;;;;;;;;50748:28;50744:71;;50796:9;50287:606;-1:-1:-1;;;;50287:606:0:o;50744:71::-;-1:-1:-1;50667:6:0;;;;:::i;:::-;;;;50610:212;;;-1:-1:-1;50830:57:0;;-1:-1:-1;;;50830:57:0;;21892:2:1;50830:57:0;;;21874:21:1;21931:2;21911:18;;;21904:30;21970:34;21950:18;;;21943:62;-1:-1:-1;;;22021:18:1;;;22014:45;22076:19;;50830:57:0;21690:411:1;26227:191:0;26320:6;;;-1:-1:-1;;;;;26337:17:0;;;-1:-1:-1;;;;;;26337:17:0;;;;;;;26370:40;;26320:6;;;26337:17;26320:6;;26370:40;;26301:16;;26370:40;26290:128;26227:191;:::o;59876:690::-;60013:4;-1:-1:-1;;;;;60030:13:0;;27953:19;:23;60026:535;;60069:72;;-1:-1:-1;;;60069:72:0;;-1:-1:-1;;;;;60069:36:0;;;;;:72;;23591:10;;60120:4;;60126:7;;60135:5;;60069:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60069:72:0;;;;;;;;-1:-1:-1;;60069:72:0;;;;;;;;;;;;:::i;:::-;;;60056:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60300:13:0;;60296:215;;60333:61;;-1:-1:-1;;;60333:61:0;;;;;;;:::i;60296:215::-;60479:6;60473:13;60464:6;60460:2;60456:15;60449:38;60056:464;-1:-1:-1;;;;;;60191:55:0;-1:-1:-1;;;60191:55:0;;-1:-1:-1;60184:62:0;;60026:535;-1:-1:-1;60549:4:0;60026:535;59876:690;;;;;;:::o;62951:108::-;63011:13;63044:7;63037:14;;;;;:::i;11792:723::-;11848:13;12069:10;12065:53;;-1:-1:-1;;12096:10:0;;;;;;;;;;;;-1:-1:-1;;;12096:10:0;;;;;11792:723::o;12065:53::-;12143:5;12128:12;12184:78;12191:9;;12184:78;;12217:8;;;;:::i;:::-;;-1:-1:-1;12240:10:0;;-1:-1:-1;12248:2:0;12240:10;;:::i;:::-;;;12184:78;;;12272:19;12304:6;12294:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12294:17:0;;12272:39;;12322:154;12329:10;;12322:154;;12356:11;12366:1;12356:11;;:::i;:::-;;-1:-1:-1;12425:10:0;12433:2;12425:5;:10;:::i;:::-;12412:24;;:2;:24;:::i;:::-;12399:39;;12382:6;12389;12382:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;12382:56:0;;;;;;;;-1:-1:-1;12453:11:0;12462:2;12453:11;;:::i;:::-;;;12322:154;;50041:240;50102:7;-1:-1:-1;;;;;50134:19:0;;50118:102;;;;-1:-1:-1;;;50118:102:0;;12539:2:1;50118:102:0;;;12521:21:1;12578:2;12558:18;;;12551:30;12617:34;12597:18;;;12590:62;-1:-1:-1;;;12668:18:1;;;12661:47;12725:19;;50118:102:0;12337:413:1;50118:102:0;-1:-1:-1;;;;;;50242:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;50242:32:0;;-1:-1:-1;;;;;50242:32:0;;50041:240::o;65838:353::-;66022:12;66004:15;66064:18;66074:8;66022:12;66064:18;:::i;:::-;66050:32;;66045:139;66094:3;66084:7;:13;66045:139;;;66133:15;;;;:6;:15;;;;;;;;:24;66125:47;;;;-1:-1:-1;;;66125:47:0;;14331:2:1;66125:47:0;;;14313:21:1;14370:2;14350:18;;;14343:30;-1:-1:-1;;;14389:18:1;;;14382:40;14439:18;;66125:47:0;14129:334:1;66125:47:0;66099:9;;;:::i;:::-;;;66045:139;;55022:1272;55127:20;55150:12;-1:-1:-1;;;;;55177:16:0;;55169:62;;;;-1:-1:-1;;;55169:62:0;;20715:2:1;55169:62:0;;;20697:21:1;20754:2;20734:18;;;20727:30;20793:34;20773:18;;;20766:62;-1:-1:-1;;;20844:18:1;;;20837:31;20885:19;;55169:62:0;20513:397:1;55169:62:0;55368:21;55376:12;54531:4;54561:12;-1:-1:-1;54551:22:0;54474:105;55368:21;55367:22;55359:64;;;;-1:-1:-1;;;55359:64:0;;20357:2:1;55359:64:0;;;20339:21:1;20396:2;20376:18;;;20369:30;20435:31;20415:18;;;20408:59;20484:18;;55359:64:0;20155:353:1;55359:64:0;55450:12;55438:8;:24;;55430:71;;;;-1:-1:-1;;;55430:71:0;;22722:2:1;55430:71:0;;;22704:21:1;22761:2;22741:18;;;22734:30;22800:34;22780:18;;;22773:62;-1:-1:-1;;;22851:18:1;;;22844:32;22893:19;;55430:71:0;22520:398:1;55430:71:0;55510:61;55540:1;55544:2;55548:12;55562:8;55510:21;:61::i;:::-;-1:-1:-1;;;;;55613:16:0;;55580:30;55613:16;;;:12;:16;;;;;;;;;55580:49;;;;;;;;;-1:-1:-1;;;;;55580:49:0;;;;;-1:-1:-1;;;55580:49:0;;;;;;;;;;;55655:119;;;;;;;;55675:19;;55580:49;;55655:119;;;55675:39;;55705:8;;55675:39;:::i;:::-;-1:-1:-1;;;;;55655:119:0;;;;;55758:8;55723:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;55655:119:0;;;;;;-1:-1:-1;;;;;55636:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;55636:138:0;;;;;;;;;;;;55809:43;;;;;;;;;;;55835:15;55809:43;;;;;;;;55781:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;55781:71:0;-1:-1:-1;;;;;;55781:71:0;;;;;;;;;;;;;;;;;;55793:12;;55905:281;55929:8;55925:1;:12;55905:281;;;55958:38;;55983:12;;-1:-1:-1;;;;;55958:38:0;;;55975:1;;55958:38;;55975:1;;55958:38;56023:59;56054:1;56058:2;56062:12;56076:5;56023:22;:59::i;:::-;56005:150;;;;-1:-1:-1;;;56005:150:0;;;;;;;:::i;:::-;56164:14;;;;:::i;:::-;;;;55939:3;;;;;:::i;:::-;;;;55905:281;;;-1:-1:-1;56194:12:0;:27;;;56228:60;53924:311;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:186;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1144:29;1163:9;1144:29;:::i;1184:260::-;1252:6;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1352:29;1371:9;1352:29;:::i;:::-;1342:39;;1400:38;1434:2;1423:9;1419:18;1400:38;:::i;:::-;1390:48;;1184:260;;;;;:::o;1449:328::-;1526:6;1534;1542;1595:2;1583:9;1574:7;1570:23;1566:32;1563:52;;;1611:1;1608;1601:12;1563:52;1634:29;1653:9;1634:29;:::i;:::-;1624:39;;1682:38;1716:2;1705:9;1701:18;1682:38;:::i;:::-;1672:48;;1767:2;1756:9;1752:18;1739:32;1729:42;;1449:328;;;;;:::o;1782:666::-;1877:6;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;1994:29;2013:9;1994:29;:::i;:::-;1984:39;;2042:38;2076:2;2065:9;2061:18;2042:38;:::i;:::-;2032:48;;2127:2;2116:9;2112:18;2099:32;2089:42;;2182:2;2171:9;2167:18;2154:32;2209:18;2201:6;2198:30;2195:50;;;2241:1;2238;2231:12;2195:50;2264:22;;2317:4;2309:13;;2305:27;-1:-1:-1;2295:55:1;;2346:1;2343;2336:12;2295:55;2369:73;2434:7;2429:2;2416:16;2411:2;2407;2403:11;2369:73;:::i;:::-;2359:83;;;1782:666;;;;;;;:::o;2453:254::-;2518:6;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2618:29;2637:9;2618:29;:::i;:::-;2608:39;;2666:35;2697:2;2686:9;2682:18;2666:35;:::i;2712:254::-;2780:6;2788;2841:2;2829:9;2820:7;2816:23;2812:32;2809:52;;;2857:1;2854;2847:12;2809:52;2880:29;2899:9;2880:29;:::i;:::-;2870:39;2956:2;2941:18;;;;2928:32;;-1:-1:-1;;;2712:254:1:o;2971:180::-;3027:6;3080:2;3068:9;3059:7;3055:23;3051:32;3048:52;;;3096:1;3093;3086:12;3048:52;3119:26;3135:9;3119:26;:::i;3156:245::-;3214:6;3267:2;3255:9;3246:7;3242:23;3238:32;3235:52;;;3283:1;3280;3273:12;3235:52;3322:9;3309:23;3341:30;3365:5;3341:30;:::i;3406:249::-;3475:6;3528:2;3516:9;3507:7;3503:23;3499:32;3496:52;;;3544:1;3541;3534:12;3496:52;3576:9;3570:16;3595:30;3619:5;3595:30;:::i;3660:450::-;3729:6;3782:2;3770:9;3761:7;3757:23;3753:32;3750:52;;;3798:1;3795;3788:12;3750:52;3838:9;3825:23;3871:18;3863:6;3860:30;3857:50;;;3903:1;3900;3893:12;3857:50;3926:22;;3979:4;3971:13;;3967:27;-1:-1:-1;3957:55:1;;4008:1;4005;3998:12;3957:55;4031:73;4096:7;4091:2;4078:16;4073:2;4069;4065:11;4031:73;:::i;4115:180::-;4174:6;4227:2;4215:9;4206:7;4202:23;4198:32;4195:52;;;4243:1;4240;4233:12;4195:52;-1:-1:-1;4266:23:1;;4115:180;-1:-1:-1;4115:180:1:o;4300:248::-;4368:6;4376;4429:2;4417:9;4408:7;4404:23;4400:32;4397:52;;;4445:1;4442;4435:12;4397:52;-1:-1:-1;;4468:23:1;;;4538:2;4523:18;;;4510:32;;-1:-1:-1;4300:248:1:o;4553:257::-;4594:3;4632:5;4626:12;4659:6;4654:3;4647:19;4675:63;4731:6;4724:4;4719:3;4715:14;4708:4;4701:5;4697:16;4675:63;:::i;:::-;4792:2;4771:15;-1:-1:-1;;4767:29:1;4758:39;;;;4799:4;4754:50;;4553:257;-1:-1:-1;;4553:257:1:o;4815:1527::-;5039:3;5077:6;5071:13;5103:4;5116:51;5160:6;5155:3;5150:2;5142:6;5138:15;5116:51;:::i;:::-;5230:13;;5189:16;;;;5252:55;5230:13;5189:16;5274:15;;;5252:55;:::i;:::-;5396:13;;5329:20;;;5369:1;;5456;5478:18;;;;5531;;;;5558:93;;5636:4;5626:8;5622:19;5610:31;;5558:93;5699:2;5689:8;5686:16;5666:18;5663:40;5660:167;;;-1:-1:-1;;;5726:33:1;;5782:4;5779:1;5772:15;5812:4;5733:3;5800:17;5660:167;5843:18;5870:110;;;;5994:1;5989:328;;;;5836:481;;5870:110;-1:-1:-1;;5905:24:1;;5891:39;;5950:20;;;;-1:-1:-1;5870:110:1;;5989:328;23178:1;23171:14;;;23215:4;23202:18;;6084:1;6098:169;6112:8;6109:1;6106:15;6098:169;;;6194:14;;6179:13;;;6172:37;6237:16;;;;6129:10;;6098:169;;;6102:3;;6298:8;6291:5;6287:20;6280:27;;5836:481;-1:-1:-1;6333:3:1;;4815:1527;-1:-1:-1;;;;;;;;;;;4815:1527:1:o;6765:488::-;-1:-1:-1;;;;;7034:15:1;;;7016:34;;7086:15;;7081:2;7066:18;;7059:43;7133:2;7118:18;;7111:34;;;7181:3;7176:2;7161:18;;7154:31;;;6959:4;;7202:45;;7227:19;;7219:6;7202:45;:::i;:::-;7194:53;6765:488;-1:-1:-1;;;;;;6765:488:1:o;7537:632::-;7708:2;7760:21;;;7830:13;;7733:18;;;7852:22;;;7679:4;;7708:2;7931:15;;;;7905:2;7890:18;;;7679:4;7974:169;7988:6;7985:1;7982:13;7974:169;;;8049:13;;8037:26;;8118:15;;;;8083:12;;;;8010:1;8003:9;7974:169;;;-1:-1:-1;8160:3:1;;7537:632;-1:-1:-1;;;;;;7537:632:1:o;8366:219::-;8515:2;8504:9;8497:21;8478:4;8535:44;8575:2;8564:9;8560:18;8552:6;8535:44;:::i;19384:415::-;19586:2;19568:21;;;19625:2;19605:18;;;19598:30;19664:34;19659:2;19644:18;;19637:62;-1:-1:-1;;;19730:2:1;19715:18;;19708:49;19789:3;19774:19;;19384:415::o;23231:253::-;23271:3;-1:-1:-1;;;;;23360:2:1;23357:1;23353:10;23390:2;23387:1;23383:10;23421:3;23417:2;23413:12;23408:3;23405:21;23402:47;;;23429:18;;:::i;:::-;23465:13;;23231:253;-1:-1:-1;;;;23231:253:1:o;23489:128::-;23529:3;23560:1;23556:6;23553:1;23550:13;23547:39;;;23566:18;;:::i;:::-;-1:-1:-1;23602:9:1;;23489:128::o;23622:120::-;23662:1;23688;23678:35;;23693:18;;:::i;:::-;-1:-1:-1;23727:9:1;;23622:120::o;23747:168::-;23787:7;23853:1;23849;23845:6;23841:14;23838:1;23835:21;23830:1;23823:9;23816:17;23812:45;23809:71;;;23860:18;;:::i;:::-;-1:-1:-1;23900:9:1;;23747:168::o;23920:246::-;23960:4;-1:-1:-1;;;;;24073:10:1;;;;24043;;24095:12;;;24092:38;;;24110:18;;:::i;:::-;24147:13;;23920:246;-1:-1:-1;;;23920:246:1:o;24171:125::-;24211:4;24239:1;24236;24233:8;24230:34;;;24244:18;;:::i;:::-;-1:-1:-1;24281:9:1;;24171:125::o;24301:258::-;24373:1;24383:113;24397:6;24394:1;24391:13;24383:113;;;24473:11;;;24467:18;24454:11;;;24447:39;24419:2;24412:10;24383:113;;;24514:6;24511:1;24508:13;24505:48;;;-1:-1:-1;;24549:1:1;24531:16;;24524:27;24301:258::o;24564:136::-;24603:3;24631:5;24621:39;;24640:18;;:::i;:::-;-1:-1:-1;;;24676:18:1;;24564:136::o;24705:380::-;24784:1;24780:12;;;;24827;;;24848:61;;24902:4;24894:6;24890:17;24880:27;;24848:61;24955:2;24947:6;24944:14;24924:18;24921:38;24918:161;;;25001:10;24996:3;24992:20;24989:1;24982:31;25036:4;25033:1;25026:15;25064:4;25061:1;25054:15;24918:161;;24705:380;;;:::o;25090:135::-;25129:3;-1:-1:-1;;25150:17:1;;25147:43;;;25170:18;;:::i;:::-;-1:-1:-1;25217:1:1;25206:13;;25090:135::o;25230:112::-;25262:1;25288;25278:35;;25293:18;;:::i;:::-;-1:-1:-1;25327:9:1;;25230:112::o;25347:127::-;25408:10;25403:3;25399:20;25396:1;25389:31;25439:4;25436:1;25429:15;25463:4;25460:1;25453:15;25479:127;25540:10;25535:3;25531:20;25528:1;25521:31;25571:4;25568:1;25561:15;25595:4;25592:1;25585:15;25611:127;25672:10;25667:3;25663:20;25660:1;25653:31;25703:4;25700:1;25693:15;25727:4;25724:1;25717:15;25743:127;25804:10;25799:3;25795:20;25792:1;25785:31;25835:4;25832:1;25825:15;25859:4;25856:1;25849:15;25875:131;-1:-1:-1;;;;;;25949:32:1;;25939:43;;25929:71;;25996:1;25993;25986:12

Swarm Source

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