ETH Price: $2,344.27 (+0.06%)
Gas: 4.34 Gwei

Token

Crypto Bozos NFT (CB)
 

Overview

Max Total Supply

994 CB

Holders

258

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 CB
0x4b3f3d286d06e27900157fe3afa0ba6980fd5a5d
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:
CryptoBozosNFT

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees 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 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.6.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 be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/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: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

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


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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: contracts/CryptoBozos.sol



pragma solidity ^0.8.0;






contract CryptoBozosNFT is ERC721A, Ownable {

  using SafeMath for uint256;
  using Strings for uint256;
  string private _baseUri;
  string private _notRevealURI; 
  bool public RevealedActive = false;
  uint256 public PriceGenesis = 0.08 ether;
  uint256 public PricePresale = 0.1 ether;
  uint256 public PricePresale2 = 0.12 ether;
  uint256 public PricePublic = 0.13 ether;
  uint256 public MaxToken = 7777;

  uint256 public TokenIndex = 0;
  event TokenMinted(uint256 supply);
  enum Steps {Launch, Genesis, Presale, Presale2, PublicSale, SoldOut}
  Steps public sellingStep;

  mapping (address => uint256) public MaxperWallet;

  bytes32 public merkleRootPresale;
  bytes32 public merkleRootPresale2WL;
  bytes32 public merkleRootGenesisWL;

  constructor() ERC721A("Crypto Bozos NFT", "CB") {sellingStep = Steps.Launch;}

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

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory a) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
    if (totalSupply() >= MaxToken || RevealedActive == true) {
      if (tokenId < MaxToken) {
        uint256 offsetId = tokenId.add(MaxToken.sub(TokenIndex)).mod(MaxToken);
        return string(abi.encodePacked(_baseURI(), offsetId.toString(), ".json"));
      }
    } else { return _notRevealURI; }
  }

  function mintGenesis(uint8 mintAmount, address _account, bytes32[] calldata _proof) public payable {
    require(sellingStep == Steps.Genesis, "Genesis has not started yet.");
    require(totalSupply().add(mintAmount) <= 777, "Genesis Sold Out");
    require(isGenesisWL(_account, _proof), "Not on the whitelist");
    require(MaxperWallet[msg.sender] + mintAmount <= 3, "Max NFTs Reached");
    MaxperWallet[msg.sender] += mintAmount;
    require(mintAmount > 0, "At least one should be minted");
    require(PriceGenesis * mintAmount <= msg.value, "Not enough funds");
    if(totalSupply() + mintAmount == 777) { RevealedActive = true; }
    _mint(msg.sender, mintAmount);
    emit TokenMinted(totalSupply());
  }

  function mintPresale(uint8 mintAmount, address _account, bytes32[] calldata _proof) public payable {
    require(sellingStep == Steps.Presale, "Presale has not started yet.");
    require(totalSupply().add(mintAmount) <= 2277, "Presale Sold Out");
    require(isPresale(_account, _proof), "Not on the whitelist");
    require(MaxperWallet[msg.sender] + mintAmount <= 5, "Max NFTs Reached");
    MaxperWallet[msg.sender] += mintAmount;
    require(mintAmount > 0, "At least one should be minted");
    require(PricePresale * mintAmount <= msg.value, "Not enough funds");
    if(totalSupply() + mintAmount == 2277) { RevealedActive = true; }
    _mint(msg.sender, mintAmount);
    emit TokenMinted(totalSupply());
  }

  function mintPresale2(uint8 mintAmount, address _account, bytes32[] calldata _proof) public payable {
    require(sellingStep == Steps.Presale2, "Presale2 has not started yet.");
    require(totalSupply().add(mintAmount) <= 4277, "Presale2 Sold Out");
    require(isPresale2WL(_account, _proof), "Not on the whitelist");
    require(MaxperWallet[msg.sender] + mintAmount <= 7, "Max NFTs Reached");
    MaxperWallet[msg.sender] += mintAmount;    
    require(mintAmount > 0, "At least one should be minted");
    require(PricePresale2 * mintAmount <= msg.value, "Not enough funds");
    if(totalSupply() + mintAmount == 4277) { RevealedActive = true; }
    _mint(msg.sender, mintAmount);
    emit TokenMinted(totalSupply());
  }

  function mint(uint8 mintAmount) public payable {
    require(sellingStep != Steps.SoldOut, "Sold Out");
    require(sellingStep == Steps.PublicSale, "Sorry, public sale has not started yet.");
    require(totalSupply().add(mintAmount) <= MaxToken, "Sold Out");                                                               
    require(MaxperWallet[msg.sender] + mintAmount <= 50, "Max NFTs Reached");
    MaxperWallet[msg.sender] += mintAmount;
    require(mintAmount > 0, "At least one should be minted");
    require(PricePublic * mintAmount <= msg.value, "Not enough funds"); 
    if(totalSupply() + mintAmount == MaxToken) { sellingStep = Steps.SoldOut; }
    _mint(msg.sender, mintAmount);
    emit TokenMinted(totalSupply());
  }

  function _mint(address recipient, uint256 quantity) internal {
    _safeMint(recipient, quantity);
  }

  function OwnerMint(uint256 num) public onlyOwner {
    require(totalSupply().add(num) <= MaxToken, "Sold Out");
    if(totalSupply().add(num) == MaxToken) { sellingStep = Steps.SoldOut; }    
    _mint(msg.sender, num);
    emit TokenMinted(totalSupply());
  }

  function Airdrop(uint256 num, address recipient) public onlyOwner {
    require(totalSupply().add(num) <= MaxToken, "Sold Out");
    if(totalSupply().add(num) == MaxToken) { sellingStep = Steps.SoldOut; }    
    _mint(recipient, num);
    emit TokenMinted(totalSupply());
  }

  function AirdropGroup(address[] memory receivers) external onlyOwner {
    require(totalSupply().add(receivers.length) <= MaxToken, "Sold Out");
    if(totalSupply().add(receivers.length) == MaxToken) { sellingStep = Steps.SoldOut; }    
    for (uint256 i = 0; i < receivers.length; i++) {
      Airdrop(1, receivers[i]);
    }
  }

  function setGenesis() external onlyOwner {
    sellingStep = Steps.Genesis;
  }

  function setPresale() external onlyOwner {
    require(sellingStep == Steps.Genesis, "Active Genesis Selling Step at first");
    sellingStep = Steps.Presale;
  }

  function setPresale2() external onlyOwner {
    require(sellingStep == Steps.Presale, "Active Presale Selling Step at first");
    sellingStep = Steps.Presale2;
  }

  function setPublicSale() external onlyOwner {
    require(sellingStep == Steps.Presale2, "Active Presale2 Selling Step at first");
    sellingStep = Steps.PublicSale;
  }

  function setBaseURI(string calldata baseURI) external onlyOwner {
    _baseUri = baseURI;
  }

  function setNotRevealURI(string memory preRevealURI) external onlyOwner {
    _notRevealURI = preRevealURI;
  }

  function setPricePublic(uint256 _newPricePublic) public onlyOwner {
    PricePublic = _newPricePublic;
  }

  function setPriceGenesis(uint256 _newPriceGenesis) public onlyOwner {
    PriceGenesis = _newPriceGenesis;
  }

  function setPricePresale(uint256 _newPricePresale) public onlyOwner {
    PricePresale = _newPricePresale;
  }

  function setPricePresale2(uint256 _newPricePresale2) public onlyOwner {
    PricePresale2 = _newPricePresale2;
  }

  function isPresale(address account, bytes32[] calldata proof) internal view returns(bool) {
    return _verify(_leaf(account), proof);
  }

  function _leaf(address account) internal pure returns(bytes32) {
    return keccak256(abi.encodePacked(account));
  }

  function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns(bool) {
    return MerkleProof.verify(proof, merkleRootPresale, leaf);
  }

  function changeMerkleRootPresale(bytes32 _newMerkleRootPresale) external onlyOwner {
    merkleRootPresale = _newMerkleRootPresale;
  }

  function isGenesisWL(address account, bytes32[] calldata proof) internal view returns(bool) {
    return _verifyGenesisWL(_leaf(account), proof);
  }
  
  function _verifyGenesisWL(bytes32 leaf, bytes32[] memory proof) internal view returns(bool) {
    return MerkleProof.verify(proof, merkleRootGenesisWL, leaf);
  }

  function changeMerkleRootGenesisWL(bytes32 _newmerkleRootGenesisWL) external onlyOwner {
    merkleRootGenesisWL = _newmerkleRootGenesisWL;
  }

  function isPresale2WL(address account, bytes32[] calldata proof) internal view returns(bool) {
    return _verifyPresale2WL(_leaf(account), proof);
  }

  function _verifyPresale2WL(bytes32 leaf, bytes32[] memory proof) internal view returns(bool) {
        return MerkleProof.verify(proof, merkleRootPresale2WL, leaf);
  }

  function changeMerkleRootPresale2WL(bytes32 _newmerkleRootPresale2WL) external onlyOwner {
      merkleRootPresale2WL = _newmerkleRootPresale2WL;
  }

  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }

  function TurnRevealMode() public onlyOwner {
    RevealedActive = true;
  }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"TokenMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"AirdropGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MaxToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"MaxperWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"OwnerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"PriceGenesis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PricePresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PricePresale2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PricePublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RevealedActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TokenIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TurnRevealMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newmerkleRootGenesisWL","type":"bytes32"}],"name":"changeMerkleRootGenesisWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRootPresale","type":"bytes32"}],"name":"changeMerkleRootPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newmerkleRootPresale2WL","type":"bytes32"}],"name":"changeMerkleRootPresale2WL","outputs":[],"stateMutability":"nonpayable","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":"merkleRootGenesisWL","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootPresale","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootPresale2WL","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"mintAmount","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"mintAmount","type":"uint8"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintGenesis","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"mintAmount","type":"uint8"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"mintAmount","type":"uint8"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintPresale2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellingStep","outputs":[{"internalType":"enum CryptoBozosNFT.Steps","name":"","type":"uint8"}],"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setGenesis","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"preRevealURI","type":"string"}],"name":"setNotRevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPresale2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPriceGenesis","type":"uint256"}],"name":"setPriceGenesis","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPricePresale","type":"uint256"}],"name":"setPricePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPricePresale2","type":"uint256"}],"name":"setPricePresale2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPricePublic","type":"uint256"}],"name":"setPricePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"a","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600b805460ff1916905567011c37937e080000600c5567016345785d8a0000600d556701aa535d3d0c0000600e556701cdda4faccd0000600f55611e6160105560006011553480156200005657600080fd5b506040518060400160405280601081526020016f10dc9e5c1d1bc8109bde9bdcc813919560821b8152506040518060400160405280600281526020016121a160f11b8152508160029080519060200190620000b39291906200013d565b508051620000c99060039060208401906200013d565b50506000805550620000db33620000eb565b6012805460ff1916905562000220565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014b90620001e3565b90600052602060002090601f0160209004810192826200016f5760008555620001ba565b82601f106200018a57805160ff1916838001178555620001ba565b82800160010185558215620001ba579182015b82811115620001ba5782518255916020019190600101906200019d565b50620001c8929150620001cc565b5090565b5b80821115620001c85760008155600101620001cd565b600181811c90821680620001f857607f821691505b602082108114156200021a57634e487b7160e01b600052602260045260246000fd5b50919050565b61310380620002306000396000f3fe6080604052600436106102ff5760003560e01c806364c8867f11610190578063b655af4f116100dc578063dad8d8ca11610095578063dd9328a41161006f578063dd9328a414610853578063e985e9c514610868578063f2fde38b146108b1578063fd87f4d1146108d157600080fd5b8063dad8d8ca14610804578063dc33e6811461081e578063dcc407441461083e57600080fd5b8063b655af4f14610752578063b88d4fde14610772578063bc0ac74614610792578063c87b56dd146107a7578063cbccefb2146107c7578063d4c76e8b146107ee57600080fd5b80637e651983116101495780639945681c116101235780639945681c146106dc578063a22cb465146106f2578063a4518fc714610712578063b47821d61461073257600080fd5b80637e651983146106965780638da5cb5b146106a957806395d89b41146106c757600080fd5b806364c8867f146106085780636ecd23061461061b57806370a082311461062e578063715018a61461064e5780637871e154146106635780637b0add091461068357600080fd5b80633ccfd60b1161024f57806356f8f78c116102085780635accac99116101e25780635accac991461059d5780635dd107ee146105bd57806362f1cf3e146105d35780636352211e146105e857600080fd5b806356f8f78c14610548578063596627cc1461055d5780635a94133c1461057d57600080fd5b80633ccfd60b146104aa57806342842e0e146104b25780634530a832146104d257806348683503146104f25780634eae8bda1461051257806355f804b31461052857600080fd5b80630fe048c9116102bc5780631fc70336116102965780631fc703361461043e57806323b872dd146104545780632779d671146104745780632aedc2a31461049457600080fd5b80630fe048c9146103ef5780631618c8df1461040557806318160ddd1461042557600080fd5b806301c124b71461030457806301ffc9a71461032d5780630353025f1461035d57806306fdde0314610373578063081812fc14610395578063095ea7b3146103cd575b600080fd5b34801561031057600080fd5b5061031a60145481565b6040519081526020015b60405180910390f35b34801561033957600080fd5b5061034d6103483660046128d4565b6108fe565b6040519015158152602001610324565b34801561036957600080fd5b5061031a60115481565b34801561037f57600080fd5b50610388610950565b6040516103249190612949565b3480156103a157600080fd5b506103b56103b036600461295c565b6109e2565b6040516001600160a01b039091168152602001610324565b3480156103d957600080fd5b506103ed6103e836600461298c565b610a26565b005b3480156103fb57600080fd5b5061031a600d5481565b34801561041157600080fd5b506103ed61042036600461295c565b610ab4565b34801561043157600080fd5b506001546000540361031a565b34801561044a57600080fd5b5061031a600c5481565b34801561046057600080fd5b506103ed61046f3660046129b6565b610b93565b34801561048057600080fd5b506103ed61048f36600461295c565b610b9e565b3480156104a057600080fd5b5061031a600f5481565b6103ed610bcd565b3480156104be57600080fd5b506103ed6104cd3660046129b6565b610c6b565b3480156104de57600080fd5b506103ed6104ed36600461295c565b610c86565b3480156104fe57600080fd5b506103ed61050d366004612a38565b610cb5565b34801561051e57600080fd5b5061031a60155481565b34801561053457600080fd5b506103ed610543366004612ae4565b610d81565b34801561055457600080fd5b506103ed610db7565b34801561056957600080fd5b506103ed61057836600461295c565b610e6c565b34801561058957600080fd5b506103ed61059836600461295c565b610e9b565b3480156105a957600080fd5b506103ed6105b8366004612bac565b610eca565b3480156105c957600080fd5b5061031a60165481565b3480156105df57600080fd5b506103ed610f07565b3480156105f457600080fd5b506103b561060336600461295c565b610fb7565b6103ed610616366004612c05565b610fc9565b6103ed610629366004612c95565b6111e8565b34801561063a57600080fd5b5061031a610649366004612cb0565b6113bf565b34801561065a57600080fd5b506103ed61140d565b34801561066f57600080fd5b506103ed61067e366004612ccb565b611443565b6103ed610691366004612c05565b611514565b6103ed6106a4366004612c05565b6116ee565b3480156106b557600080fd5b506008546001600160a01b03166103b5565b3480156106d357600080fd5b506103886118c7565b3480156106e857600080fd5b5061031a600e5481565b3480156106fe57600080fd5b506103ed61070d366004612cf7565b6118d6565b34801561071e57600080fd5b506103ed61072d36600461295c565b61196c565b34801561073e57600080fd5b506103ed61074d36600461295c565b61199b565b34801561075e57600080fd5b506103ed61076d36600461295c565b6119ca565b34801561077e57600080fd5b506103ed61078d366004612d33565b6119f9565b34801561079e57600080fd5b506103ed611a4a565b3480156107b357600080fd5b506103886107c236600461295c565b611a83565b3480156107d357600080fd5b506012546107e19060ff1681565b6040516103249190612dc4565b3480156107fa57600080fd5b5061031a60105481565b34801561081057600080fd5b50600b5461034d9060ff1681565b34801561082a57600080fd5b5061031a610839366004612cb0565b611c20565b34801561084a57600080fd5b506103ed611c4e565b34801561085f57600080fd5b506103ed611cfe565b34801561087457600080fd5b5061034d610883366004612dec565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156108bd57600080fd5b506103ed6108cc366004612cb0565b611d3b565b3480156108dd57600080fd5b5061031a6108ec366004612cb0565b60136020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b148061092f57506001600160e01b03198216635b5e139f60e01b145b8061094a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461095f90612e16565b80601f016020809104026020016040519081016040528092919081815260200182805461098b90612e16565b80156109d85780601f106109ad576101008083540402835291602001916109d8565b820191906000526020600020905b8154815290600101906020018083116109bb57829003601f168201915b5050505050905090565b60006109ed82611dd3565b610a0a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a3182610fb7565b9050806001600160a01b0316836001600160a01b03161415610a665760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a865750610a848133610883565b155b15610aa4576040516367d9dca160e11b815260040160405180910390fd5b610aaf838383611dfe565b505050565b6008546001600160a01b03163314610ae75760405162461bcd60e51b8152600401610ade90612e51565b60405180910390fd5b601054610b0182610afb6001546000540390565b90611e5a565b1115610b1f5760405162461bcd60e51b8152600401610ade90612e86565b601054610b3382610afb6001546000540390565b1415610b47576012805460ff191660051790555b610b513382611e6d565b7ff00d28232b285f24f2e38415deb2ceb31069e70d4505838b3911b4f02058502e610b7f6001546000540390565b60405190815260200160405180910390a150565b610aaf838383611e77565b6008546001600160a01b03163314610bc85760405162461bcd60e51b8152600401610ade90612e51565b601455565b6008546001600160a01b03163314610bf75760405162461bcd60e51b8152600401610ade90612e51565b6000610c0b6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610c55576040519150601f19603f3d011682016040523d82523d6000602084013e610c5a565b606091505b5050905080610c6857600080fd5b50565b610aaf838383604051806020016040528060008152506119f9565b6008546001600160a01b03163314610cb05760405162461bcd60e51b8152600401610ade90612e51565b600f55565b6008546001600160a01b03163314610cdf5760405162461bcd60e51b8152600401610ade90612e51565b601054610cf48251610afb6001546000540390565b1115610d125760405162461bcd60e51b8152600401610ade90612e86565b601054610d278251610afb6001546000540390565b1415610d3b576012805460ff191660051790555b60005b8151811015610d7d57610d6b6001838381518110610d5e57610d5e612ea8565b6020026020010151611443565b80610d7581612ed4565b915050610d3e565b5050565b6008546001600160a01b03163314610dab5760405162461bcd60e51b8152600401610ade90612e51565b610aaf600983836127b1565b6008546001600160a01b03163314610de15760405162461bcd60e51b8152600401610ade90612e51565b600360125460ff166005811115610dfa57610dfa612dae565b14610e555760405162461bcd60e51b815260206004820152602560248201527f4163746976652050726573616c65322053656c6c696e67205374657020617420604482015264199a5c9cdd60da1b6064820152608401610ade565b601280546004919060ff19166001835b0217905550565b6008546001600160a01b03163314610e965760405162461bcd60e51b8152600401610ade90612e51565b601555565b6008546001600160a01b03163314610ec55760405162461bcd60e51b8152600401610ade90612e51565b600d55565b6008546001600160a01b03163314610ef45760405162461bcd60e51b8152600401610ade90612e51565b8051610d7d90600a906020840190612835565b6008546001600160a01b03163314610f315760405162461bcd60e51b8152600401610ade90612e51565b600260125460ff166005811115610f4a57610f4a612dae565b14610fa35760405162461bcd60e51b8152602060048201526024808201527f4163746976652050726573616c652053656c6c696e67205374657020617420666044820152631a5c9cdd60e21b6064820152608401610ade565b601280546003919060ff1916600183610e65565b6000610fc282612065565b5192915050565b600260125460ff166005811115610fe257610fe2612dae565b1461102f5760405162461bcd60e51b815260206004820152601c60248201527f50726573616c6520686173206e6f742073746172746564207965742e000000006044820152606401610ade565b6108e56110468560ff16610afb6001546000540390565b11156110875760405162461bcd60e51b815260206004820152601060248201526f141c995cd85b194814dbdb190813dd5d60821b6044820152606401610ade565b61109283838361217f565b6110ae5760405162461bcd60e51b8152600401610ade90612eef565b336000908152601360205260409020546005906110cf9060ff871690612f1d565b11156110ed5760405162461bcd60e51b8152600401610ade90612f35565b336000908152601360205260408120805460ff8716929061110f908490612f1d565b909155505060ff84166111345760405162461bcd60e51b8152600401610ade90612f5f565b348460ff16600d546111469190612f96565b11156111645760405162461bcd60e51b8152600401610ade90612fb5565b8360ff166111756001546000540390565b61117f9190612f1d565b6108e5141561119657600b805460ff191660011790555b6111a3338560ff16611e6d565b7ff00d28232b285f24f2e38415deb2ceb31069e70d4505838b3911b4f02058502e6111d16001546000540390565b60405190815260200160405180910390a150505050565b600560125460ff16600581111561120157611201612dae565b141561121f5760405162461bcd60e51b8152600401610ade90612e86565b600460125460ff16600581111561123857611238612dae565b146112955760405162461bcd60e51b815260206004820152602760248201527f536f7272792c207075626c69632073616c6520686173206e6f7420737461727460448201526632b2103cb2ba1760c91b6064820152608401610ade565b6010546112ac8260ff16610afb6001546000540390565b11156112ca5760405162461bcd60e51b8152600401610ade90612e86565b336000908152601360205260409020546032906112eb9060ff841690612f1d565b11156113095760405162461bcd60e51b8152600401610ade90612f35565b336000908152601360205260408120805460ff8416929061132b908490612f1d565b909155505060ff81166113505760405162461bcd60e51b8152600401610ade90612f5f565b348160ff16600f546113629190612f96565b11156113805760405162461bcd60e51b8152600401610ade90612fb5565b6010548160ff166113946001546000540390565b61139e9190612f1d565b14156113b2576012805460ff191660051790555b610b51338260ff16611e6d565b60006001600160a01b0382166113e8576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146114375760405162461bcd60e51b8152600401610ade90612e51565b61144160006121ce565b565b6008546001600160a01b0316331461146d5760405162461bcd60e51b8152600401610ade90612e51565b60105461148183610afb6001546000540390565b111561149f5760405162461bcd60e51b8152600401610ade90612e86565b6010546114b383610afb6001546000540390565b14156114c7576012805460ff191660051790555b6114d18183611e6d565b7ff00d28232b285f24f2e38415deb2ceb31069e70d4505838b3911b4f02058502e6114ff6001546000540390565b60405190815260200160405180910390a15050565b600360125460ff16600581111561152d5761152d612dae565b1461157a5760405162461bcd60e51b815260206004820152601d60248201527f50726573616c653220686173206e6f742073746172746564207965742e0000006044820152606401610ade565b6110b56115918560ff16610afb6001546000540390565b11156115d35760405162461bcd60e51b8152602060048201526011602482015270141c995cd85b194c8814dbdb190813dd5d607a1b6044820152606401610ade565b6115de838383612220565b6115fa5760405162461bcd60e51b8152600401610ade90612eef565b3360009081526013602052604090205460079061161b9060ff871690612f1d565b11156116395760405162461bcd60e51b8152600401610ade90612f35565b336000908152601360205260408120805460ff8716929061165b908490612f1d565b909155505060ff84166116805760405162461bcd60e51b8152600401610ade90612f5f565b348460ff16600e546116929190612f96565b11156116b05760405162461bcd60e51b8152600401610ade90612fb5565b8360ff166116c16001546000540390565b6116cb9190612f1d565b6110b5141561119657600b805460ff191660011790556111a3338560ff16611e6d565b600160125460ff16600581111561170757611707612dae565b146117545760405162461bcd60e51b815260206004820152601c60248201527f47656e6573697320686173206e6f742073746172746564207965742e000000006044820152606401610ade565b61030961176b8560ff16610afb6001546000540390565b11156117ac5760405162461bcd60e51b815260206004820152601060248201526f11d95b995cda5cc814dbdb190813dd5d60821b6044820152606401610ade565b6117b7838383612267565b6117d35760405162461bcd60e51b8152600401610ade90612eef565b336000908152601360205260409020546003906117f49060ff871690612f1d565b11156118125760405162461bcd60e51b8152600401610ade90612f35565b336000908152601360205260408120805460ff87169290611834908490612f1d565b909155505060ff84166118595760405162461bcd60e51b8152600401610ade90612f5f565b348460ff16600c5461186b9190612f96565b11156118895760405162461bcd60e51b8152600401610ade90612fb5565b8360ff1661189a6001546000540390565b6118a49190612f1d565b610309141561119657600b805460ff191660011790556111a3338560ff16611e6d565b60606003805461095f90612e16565b6001600160a01b0382163314156119005760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146119965760405162461bcd60e51b8152600401610ade90612e51565b600e55565b6008546001600160a01b031633146119c55760405162461bcd60e51b8152600401610ade90612e51565b601655565b6008546001600160a01b031633146119f45760405162461bcd60e51b8152600401610ade90612e51565b600c55565b611a04848484611e77565b6001600160a01b0383163b15158015611a265750611a24848484846122ae565b155b15611a44576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b03163314611a745760405162461bcd60e51b8152600401610ade90612e51565b600b805460ff19166001179055565b6060611a8e82611dd3565b611af25760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610ade565b60105460015460005403101580611b105750600b5460ff1615156001145b15611b8e57601054821015611b89576000611b4e601054611b48611b416011546010546123a590919063ffffffff16565b8690611e5a565b906123b1565b9050611b586123bd565b611b61826123cc565b604051602001611b72929190612fdf565b604051602081830303815290604052915050919050565b919050565b600a8054611b9b90612e16565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc790612e16565b8015611c145780601f10611be957610100808354040283529160200191611c14565b820191906000526020600020905b815481529060010190602001808311611bf757829003601f168201915b50505050509050919050565b6001600160a01b038116600090815260056020526040812054600160401b90046001600160401b031661094a565b6008546001600160a01b03163314611c785760405162461bcd60e51b8152600401610ade90612e51565b600160125460ff166005811115611c9157611c91612dae565b14611cea5760405162461bcd60e51b8152602060048201526024808201527f4163746976652047656e657369732053656c6c696e67205374657020617420666044820152631a5c9cdd60e21b6064820152608401610ade565b601280546002919060ff1916600183610e65565b6008546001600160a01b03163314611d285760405162461bcd60e51b8152600401610ade90612e51565b601280546001919060ff19168280610e65565b6008546001600160a01b03163314611d655760405162461bcd60e51b8152600401610ade90612e51565b6001600160a01b038116611dca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ade565b610c68816121ce565b600080548210801561094a575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611e668284612f1d565b9392505050565b610d7d82826124c9565b6000611e8282612065565b9050836001600160a01b031681600001516001600160a01b031614611eb95760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611ed75750611ed78533610883565b80611ef2575033611ee7846109e2565b6001600160a01b0316145b905080611f1257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611f3957604051633a954ecd60e21b815260040160405180910390fd5b611f4560008487611dfe565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661201957600054821461201957805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101919091528160005481101561216657600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906121645780516001600160a01b0316156120fb579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561215f579392505050565b6120fb565b505b604051636f96cda160e11b815260040160405180910390fd5b60006121c661218d856124e3565b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061252292505050565b949350505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006121c661222e856124e3565b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061253192505050565b60006121c6612275856124e3565b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061254092505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906122e390339089908890889060040161301e565b602060405180830381600087803b1580156122fd57600080fd5b505af192505050801561232d575060408051601f3d908101601f1916820190925261232a9181019061305b565b60015b612388573d80801561235b576040519150601f19603f3d011682016040523d82523d6000602084013e612360565b606091505b508051612380576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000611e668284613078565b6000611e6682846130a5565b60606009805461095f90612e16565b6060816123f05750506040805180820190915260018152600360fc1b602082015290565b8160005b811561241a578061240481612ed4565b91506124139050600a836130b9565b91506123f4565b6000816001600160401b03811115612434576124346129f2565b6040519080825280601f01601f19166020018201604052801561245e576020820181803683370190505b5090505b84156121c657612473600183613078565b9150612480600a866130a5565b61248b906030612f1d565b60f81b8183815181106124a0576124a0612ea8565b60200101906001600160f81b031916908160001a9053506124c2600a866130b9565b9450612462565b610d7d82826040518060200160405280600081525061254f565b6040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b6000611e66826014548561255c565b6000611e66826015548561255c565b6000611e66826016548561255c565b610aaf8383836001612572565b600082612569858461273d565b14949350505050565b6000546001600160a01b03851661259b57604051622e076360e81b815260040160405180910390fd5b836125b95760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561266557506001600160a01b0387163b15155b156126ee575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46126b660008884806001019550886122ae565b6126d3576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561266b5782600054146126e957600080fd5b612734565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156126ef575b5060005561205e565b600081815b84518110156127a957600085828151811061275f5761275f612ea8565b602002602001015190508083116127855760008381526020829052604090209250612796565b600081815260208490526040902092505b50806127a181612ed4565b915050612742565b509392505050565b8280546127bd90612e16565b90600052602060002090601f0160209004810192826127df5760008555612825565b82601f106127f85782800160ff19823516178555612825565b82800160010185558215612825579182015b8281111561282557823582559160200191906001019061280a565b506128319291506128a9565b5090565b82805461284190612e16565b90600052602060002090601f0160209004810192826128635760008555612825565b82601f1061287c57805160ff1916838001178555612825565b82800160010185558215612825579182015b8281111561282557825182559160200191906001019061288e565b5b8082111561283157600081556001016128aa565b6001600160e01b031981168114610c6857600080fd5b6000602082840312156128e657600080fd5b8135611e66816128be565b60005b8381101561290c5781810151838201526020016128f4565b83811115611a445750506000910152565b600081518084526129358160208601602086016128f1565b601f01601f19169290920160200192915050565b602081526000611e66602083018461291d565b60006020828403121561296e57600080fd5b5035919050565b80356001600160a01b0381168114611b8957600080fd5b6000806040838503121561299f57600080fd5b6129a883612975565b946020939093013593505050565b6000806000606084860312156129cb57600080fd5b6129d484612975565b92506129e260208501612975565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612a3057612a306129f2565b604052919050565b60006020808385031215612a4b57600080fd5b82356001600160401b0380821115612a6257600080fd5b818501915085601f830112612a7657600080fd5b813581811115612a8857612a886129f2565b8060051b9150612a99848301612a08565b8181529183018401918481019088841115612ab357600080fd5b938501935b83851015612ad857612ac985612975565b82529385019390850190612ab8565b98975050505050505050565b60008060208385031215612af757600080fd5b82356001600160401b0380821115612b0e57600080fd5b818501915085601f830112612b2257600080fd5b813581811115612b3157600080fd5b866020828501011115612b4357600080fd5b60209290920196919550909350505050565b60006001600160401b03831115612b6e57612b6e6129f2565b612b81601f8401601f1916602001612a08565b9050828152838383011115612b9557600080fd5b828260208301376000602084830101529392505050565b600060208284031215612bbe57600080fd5b81356001600160401b03811115612bd457600080fd5b8201601f81018413612be557600080fd5b6121c684823560208401612b55565b803560ff81168114611b8957600080fd5b60008060008060608587031215612c1b57600080fd5b612c2485612bf4565b9350612c3260208601612975565b925060408501356001600160401b0380821115612c4e57600080fd5b818701915087601f830112612c6257600080fd5b813581811115612c7157600080fd5b8860208260051b8501011115612c8657600080fd5b95989497505060200194505050565b600060208284031215612ca757600080fd5b611e6682612bf4565b600060208284031215612cc257600080fd5b611e6682612975565b60008060408385031215612cde57600080fd5b82359150612cee60208401612975565b90509250929050565b60008060408385031215612d0a57600080fd5b612d1383612975565b915060208301358015158114612d2857600080fd5b809150509250929050565b60008060008060808587031215612d4957600080fd5b612d5285612975565b9350612d6060208601612975565b92506040850135915060608501356001600160401b03811115612d8257600080fd5b8501601f81018713612d9357600080fd5b612da287823560208401612b55565b91505092959194509250565b634e487b7160e01b600052602160045260246000fd5b6020810160068310612de657634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215612dff57600080fd5b612e0883612975565b9150612cee60208401612975565b600181811c90821680612e2a57607f821691505b60208210811415612e4b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526008908201526714dbdb190813dd5d60c21b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612ee857612ee8612ebe565b5060010190565b602080825260149082015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b604082015260600190565b60008219821115612f3057612f30612ebe565b500190565b60208082526010908201526f13585e081391951cc814995858da195960821b604082015260600190565b6020808252601d908201527f4174206c65617374206f6e652073686f756c64206265206d696e746564000000604082015260600190565b6000816000190483118215151615612fb057612fb0612ebe565b500290565b60208082526010908201526f4e6f7420656e6f7567682066756e647360801b604082015260600190565b60008351612ff18184602088016128f1565b8351908301906130058183602088016128f1565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130519083018461291d565b9695505050505050565b60006020828403121561306d57600080fd5b8151611e66816128be565b60008282101561308a5761308a612ebe565b500390565b634e487b7160e01b600052601260045260246000fd5b6000826130b4576130b461308f565b500690565b6000826130c8576130c861308f565b50049056fea264697066735822122026bbf3579636b88983a903770652f5eaaf046d2bbc7118aa3ae78e926abc186464736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c806364c8867f11610190578063b655af4f116100dc578063dad8d8ca11610095578063dd9328a41161006f578063dd9328a414610853578063e985e9c514610868578063f2fde38b146108b1578063fd87f4d1146108d157600080fd5b8063dad8d8ca14610804578063dc33e6811461081e578063dcc407441461083e57600080fd5b8063b655af4f14610752578063b88d4fde14610772578063bc0ac74614610792578063c87b56dd146107a7578063cbccefb2146107c7578063d4c76e8b146107ee57600080fd5b80637e651983116101495780639945681c116101235780639945681c146106dc578063a22cb465146106f2578063a4518fc714610712578063b47821d61461073257600080fd5b80637e651983146106965780638da5cb5b146106a957806395d89b41146106c757600080fd5b806364c8867f146106085780636ecd23061461061b57806370a082311461062e578063715018a61461064e5780637871e154146106635780637b0add091461068357600080fd5b80633ccfd60b1161024f57806356f8f78c116102085780635accac99116101e25780635accac991461059d5780635dd107ee146105bd57806362f1cf3e146105d35780636352211e146105e857600080fd5b806356f8f78c14610548578063596627cc1461055d5780635a94133c1461057d57600080fd5b80633ccfd60b146104aa57806342842e0e146104b25780634530a832146104d257806348683503146104f25780634eae8bda1461051257806355f804b31461052857600080fd5b80630fe048c9116102bc5780631fc70336116102965780631fc703361461043e57806323b872dd146104545780632779d671146104745780632aedc2a31461049457600080fd5b80630fe048c9146103ef5780631618c8df1461040557806318160ddd1461042557600080fd5b806301c124b71461030457806301ffc9a71461032d5780630353025f1461035d57806306fdde0314610373578063081812fc14610395578063095ea7b3146103cd575b600080fd5b34801561031057600080fd5b5061031a60145481565b6040519081526020015b60405180910390f35b34801561033957600080fd5b5061034d6103483660046128d4565b6108fe565b6040519015158152602001610324565b34801561036957600080fd5b5061031a60115481565b34801561037f57600080fd5b50610388610950565b6040516103249190612949565b3480156103a157600080fd5b506103b56103b036600461295c565b6109e2565b6040516001600160a01b039091168152602001610324565b3480156103d957600080fd5b506103ed6103e836600461298c565b610a26565b005b3480156103fb57600080fd5b5061031a600d5481565b34801561041157600080fd5b506103ed61042036600461295c565b610ab4565b34801561043157600080fd5b506001546000540361031a565b34801561044a57600080fd5b5061031a600c5481565b34801561046057600080fd5b506103ed61046f3660046129b6565b610b93565b34801561048057600080fd5b506103ed61048f36600461295c565b610b9e565b3480156104a057600080fd5b5061031a600f5481565b6103ed610bcd565b3480156104be57600080fd5b506103ed6104cd3660046129b6565b610c6b565b3480156104de57600080fd5b506103ed6104ed36600461295c565b610c86565b3480156104fe57600080fd5b506103ed61050d366004612a38565b610cb5565b34801561051e57600080fd5b5061031a60155481565b34801561053457600080fd5b506103ed610543366004612ae4565b610d81565b34801561055457600080fd5b506103ed610db7565b34801561056957600080fd5b506103ed61057836600461295c565b610e6c565b34801561058957600080fd5b506103ed61059836600461295c565b610e9b565b3480156105a957600080fd5b506103ed6105b8366004612bac565b610eca565b3480156105c957600080fd5b5061031a60165481565b3480156105df57600080fd5b506103ed610f07565b3480156105f457600080fd5b506103b561060336600461295c565b610fb7565b6103ed610616366004612c05565b610fc9565b6103ed610629366004612c95565b6111e8565b34801561063a57600080fd5b5061031a610649366004612cb0565b6113bf565b34801561065a57600080fd5b506103ed61140d565b34801561066f57600080fd5b506103ed61067e366004612ccb565b611443565b6103ed610691366004612c05565b611514565b6103ed6106a4366004612c05565b6116ee565b3480156106b557600080fd5b506008546001600160a01b03166103b5565b3480156106d357600080fd5b506103886118c7565b3480156106e857600080fd5b5061031a600e5481565b3480156106fe57600080fd5b506103ed61070d366004612cf7565b6118d6565b34801561071e57600080fd5b506103ed61072d36600461295c565b61196c565b34801561073e57600080fd5b506103ed61074d36600461295c565b61199b565b34801561075e57600080fd5b506103ed61076d36600461295c565b6119ca565b34801561077e57600080fd5b506103ed61078d366004612d33565b6119f9565b34801561079e57600080fd5b506103ed611a4a565b3480156107b357600080fd5b506103886107c236600461295c565b611a83565b3480156107d357600080fd5b506012546107e19060ff1681565b6040516103249190612dc4565b3480156107fa57600080fd5b5061031a60105481565b34801561081057600080fd5b50600b5461034d9060ff1681565b34801561082a57600080fd5b5061031a610839366004612cb0565b611c20565b34801561084a57600080fd5b506103ed611c4e565b34801561085f57600080fd5b506103ed611cfe565b34801561087457600080fd5b5061034d610883366004612dec565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156108bd57600080fd5b506103ed6108cc366004612cb0565b611d3b565b3480156108dd57600080fd5b5061031a6108ec366004612cb0565b60136020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b148061092f57506001600160e01b03198216635b5e139f60e01b145b8061094a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461095f90612e16565b80601f016020809104026020016040519081016040528092919081815260200182805461098b90612e16565b80156109d85780601f106109ad576101008083540402835291602001916109d8565b820191906000526020600020905b8154815290600101906020018083116109bb57829003601f168201915b5050505050905090565b60006109ed82611dd3565b610a0a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a3182610fb7565b9050806001600160a01b0316836001600160a01b03161415610a665760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a865750610a848133610883565b155b15610aa4576040516367d9dca160e11b815260040160405180910390fd5b610aaf838383611dfe565b505050565b6008546001600160a01b03163314610ae75760405162461bcd60e51b8152600401610ade90612e51565b60405180910390fd5b601054610b0182610afb6001546000540390565b90611e5a565b1115610b1f5760405162461bcd60e51b8152600401610ade90612e86565b601054610b3382610afb6001546000540390565b1415610b47576012805460ff191660051790555b610b513382611e6d565b7ff00d28232b285f24f2e38415deb2ceb31069e70d4505838b3911b4f02058502e610b7f6001546000540390565b60405190815260200160405180910390a150565b610aaf838383611e77565b6008546001600160a01b03163314610bc85760405162461bcd60e51b8152600401610ade90612e51565b601455565b6008546001600160a01b03163314610bf75760405162461bcd60e51b8152600401610ade90612e51565b6000610c0b6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610c55576040519150601f19603f3d011682016040523d82523d6000602084013e610c5a565b606091505b5050905080610c6857600080fd5b50565b610aaf838383604051806020016040528060008152506119f9565b6008546001600160a01b03163314610cb05760405162461bcd60e51b8152600401610ade90612e51565b600f55565b6008546001600160a01b03163314610cdf5760405162461bcd60e51b8152600401610ade90612e51565b601054610cf48251610afb6001546000540390565b1115610d125760405162461bcd60e51b8152600401610ade90612e86565b601054610d278251610afb6001546000540390565b1415610d3b576012805460ff191660051790555b60005b8151811015610d7d57610d6b6001838381518110610d5e57610d5e612ea8565b6020026020010151611443565b80610d7581612ed4565b915050610d3e565b5050565b6008546001600160a01b03163314610dab5760405162461bcd60e51b8152600401610ade90612e51565b610aaf600983836127b1565b6008546001600160a01b03163314610de15760405162461bcd60e51b8152600401610ade90612e51565b600360125460ff166005811115610dfa57610dfa612dae565b14610e555760405162461bcd60e51b815260206004820152602560248201527f4163746976652050726573616c65322053656c6c696e67205374657020617420604482015264199a5c9cdd60da1b6064820152608401610ade565b601280546004919060ff19166001835b0217905550565b6008546001600160a01b03163314610e965760405162461bcd60e51b8152600401610ade90612e51565b601555565b6008546001600160a01b03163314610ec55760405162461bcd60e51b8152600401610ade90612e51565b600d55565b6008546001600160a01b03163314610ef45760405162461bcd60e51b8152600401610ade90612e51565b8051610d7d90600a906020840190612835565b6008546001600160a01b03163314610f315760405162461bcd60e51b8152600401610ade90612e51565b600260125460ff166005811115610f4a57610f4a612dae565b14610fa35760405162461bcd60e51b8152602060048201526024808201527f4163746976652050726573616c652053656c6c696e67205374657020617420666044820152631a5c9cdd60e21b6064820152608401610ade565b601280546003919060ff1916600183610e65565b6000610fc282612065565b5192915050565b600260125460ff166005811115610fe257610fe2612dae565b1461102f5760405162461bcd60e51b815260206004820152601c60248201527f50726573616c6520686173206e6f742073746172746564207965742e000000006044820152606401610ade565b6108e56110468560ff16610afb6001546000540390565b11156110875760405162461bcd60e51b815260206004820152601060248201526f141c995cd85b194814dbdb190813dd5d60821b6044820152606401610ade565b61109283838361217f565b6110ae5760405162461bcd60e51b8152600401610ade90612eef565b336000908152601360205260409020546005906110cf9060ff871690612f1d565b11156110ed5760405162461bcd60e51b8152600401610ade90612f35565b336000908152601360205260408120805460ff8716929061110f908490612f1d565b909155505060ff84166111345760405162461bcd60e51b8152600401610ade90612f5f565b348460ff16600d546111469190612f96565b11156111645760405162461bcd60e51b8152600401610ade90612fb5565b8360ff166111756001546000540390565b61117f9190612f1d565b6108e5141561119657600b805460ff191660011790555b6111a3338560ff16611e6d565b7ff00d28232b285f24f2e38415deb2ceb31069e70d4505838b3911b4f02058502e6111d16001546000540390565b60405190815260200160405180910390a150505050565b600560125460ff16600581111561120157611201612dae565b141561121f5760405162461bcd60e51b8152600401610ade90612e86565b600460125460ff16600581111561123857611238612dae565b146112955760405162461bcd60e51b815260206004820152602760248201527f536f7272792c207075626c69632073616c6520686173206e6f7420737461727460448201526632b2103cb2ba1760c91b6064820152608401610ade565b6010546112ac8260ff16610afb6001546000540390565b11156112ca5760405162461bcd60e51b8152600401610ade90612e86565b336000908152601360205260409020546032906112eb9060ff841690612f1d565b11156113095760405162461bcd60e51b8152600401610ade90612f35565b336000908152601360205260408120805460ff8416929061132b908490612f1d565b909155505060ff81166113505760405162461bcd60e51b8152600401610ade90612f5f565b348160ff16600f546113629190612f96565b11156113805760405162461bcd60e51b8152600401610ade90612fb5565b6010548160ff166113946001546000540390565b61139e9190612f1d565b14156113b2576012805460ff191660051790555b610b51338260ff16611e6d565b60006001600160a01b0382166113e8576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146114375760405162461bcd60e51b8152600401610ade90612e51565b61144160006121ce565b565b6008546001600160a01b0316331461146d5760405162461bcd60e51b8152600401610ade90612e51565b60105461148183610afb6001546000540390565b111561149f5760405162461bcd60e51b8152600401610ade90612e86565b6010546114b383610afb6001546000540390565b14156114c7576012805460ff191660051790555b6114d18183611e6d565b7ff00d28232b285f24f2e38415deb2ceb31069e70d4505838b3911b4f02058502e6114ff6001546000540390565b60405190815260200160405180910390a15050565b600360125460ff16600581111561152d5761152d612dae565b1461157a5760405162461bcd60e51b815260206004820152601d60248201527f50726573616c653220686173206e6f742073746172746564207965742e0000006044820152606401610ade565b6110b56115918560ff16610afb6001546000540390565b11156115d35760405162461bcd60e51b8152602060048201526011602482015270141c995cd85b194c8814dbdb190813dd5d607a1b6044820152606401610ade565b6115de838383612220565b6115fa5760405162461bcd60e51b8152600401610ade90612eef565b3360009081526013602052604090205460079061161b9060ff871690612f1d565b11156116395760405162461bcd60e51b8152600401610ade90612f35565b336000908152601360205260408120805460ff8716929061165b908490612f1d565b909155505060ff84166116805760405162461bcd60e51b8152600401610ade90612f5f565b348460ff16600e546116929190612f96565b11156116b05760405162461bcd60e51b8152600401610ade90612fb5565b8360ff166116c16001546000540390565b6116cb9190612f1d565b6110b5141561119657600b805460ff191660011790556111a3338560ff16611e6d565b600160125460ff16600581111561170757611707612dae565b146117545760405162461bcd60e51b815260206004820152601c60248201527f47656e6573697320686173206e6f742073746172746564207965742e000000006044820152606401610ade565b61030961176b8560ff16610afb6001546000540390565b11156117ac5760405162461bcd60e51b815260206004820152601060248201526f11d95b995cda5cc814dbdb190813dd5d60821b6044820152606401610ade565b6117b7838383612267565b6117d35760405162461bcd60e51b8152600401610ade90612eef565b336000908152601360205260409020546003906117f49060ff871690612f1d565b11156118125760405162461bcd60e51b8152600401610ade90612f35565b336000908152601360205260408120805460ff87169290611834908490612f1d565b909155505060ff84166118595760405162461bcd60e51b8152600401610ade90612f5f565b348460ff16600c5461186b9190612f96565b11156118895760405162461bcd60e51b8152600401610ade90612fb5565b8360ff1661189a6001546000540390565b6118a49190612f1d565b610309141561119657600b805460ff191660011790556111a3338560ff16611e6d565b60606003805461095f90612e16565b6001600160a01b0382163314156119005760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146119965760405162461bcd60e51b8152600401610ade90612e51565b600e55565b6008546001600160a01b031633146119c55760405162461bcd60e51b8152600401610ade90612e51565b601655565b6008546001600160a01b031633146119f45760405162461bcd60e51b8152600401610ade90612e51565b600c55565b611a04848484611e77565b6001600160a01b0383163b15158015611a265750611a24848484846122ae565b155b15611a44576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b03163314611a745760405162461bcd60e51b8152600401610ade90612e51565b600b805460ff19166001179055565b6060611a8e82611dd3565b611af25760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610ade565b60105460015460005403101580611b105750600b5460ff1615156001145b15611b8e57601054821015611b89576000611b4e601054611b48611b416011546010546123a590919063ffffffff16565b8690611e5a565b906123b1565b9050611b586123bd565b611b61826123cc565b604051602001611b72929190612fdf565b604051602081830303815290604052915050919050565b919050565b600a8054611b9b90612e16565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc790612e16565b8015611c145780601f10611be957610100808354040283529160200191611c14565b820191906000526020600020905b815481529060010190602001808311611bf757829003601f168201915b50505050509050919050565b6001600160a01b038116600090815260056020526040812054600160401b90046001600160401b031661094a565b6008546001600160a01b03163314611c785760405162461bcd60e51b8152600401610ade90612e51565b600160125460ff166005811115611c9157611c91612dae565b14611cea5760405162461bcd60e51b8152602060048201526024808201527f4163746976652047656e657369732053656c6c696e67205374657020617420666044820152631a5c9cdd60e21b6064820152608401610ade565b601280546002919060ff1916600183610e65565b6008546001600160a01b03163314611d285760405162461bcd60e51b8152600401610ade90612e51565b601280546001919060ff19168280610e65565b6008546001600160a01b03163314611d655760405162461bcd60e51b8152600401610ade90612e51565b6001600160a01b038116611dca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ade565b610c68816121ce565b600080548210801561094a575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611e668284612f1d565b9392505050565b610d7d82826124c9565b6000611e8282612065565b9050836001600160a01b031681600001516001600160a01b031614611eb95760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611ed75750611ed78533610883565b80611ef2575033611ee7846109e2565b6001600160a01b0316145b905080611f1257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611f3957604051633a954ecd60e21b815260040160405180910390fd5b611f4560008487611dfe565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661201957600054821461201957805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101919091528160005481101561216657600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906121645780516001600160a01b0316156120fb579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561215f579392505050565b6120fb565b505b604051636f96cda160e11b815260040160405180910390fd5b60006121c661218d856124e3565b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061252292505050565b949350505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006121c661222e856124e3565b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061253192505050565b60006121c6612275856124e3565b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061254092505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906122e390339089908890889060040161301e565b602060405180830381600087803b1580156122fd57600080fd5b505af192505050801561232d575060408051601f3d908101601f1916820190925261232a9181019061305b565b60015b612388573d80801561235b576040519150601f19603f3d011682016040523d82523d6000602084013e612360565b606091505b508051612380576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000611e668284613078565b6000611e6682846130a5565b60606009805461095f90612e16565b6060816123f05750506040805180820190915260018152600360fc1b602082015290565b8160005b811561241a578061240481612ed4565b91506124139050600a836130b9565b91506123f4565b6000816001600160401b03811115612434576124346129f2565b6040519080825280601f01601f19166020018201604052801561245e576020820181803683370190505b5090505b84156121c657612473600183613078565b9150612480600a866130a5565b61248b906030612f1d565b60f81b8183815181106124a0576124a0612ea8565b60200101906001600160f81b031916908160001a9053506124c2600a866130b9565b9450612462565b610d7d82826040518060200160405280600081525061254f565b6040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b6000611e66826014548561255c565b6000611e66826015548561255c565b6000611e66826016548561255c565b610aaf8383836001612572565b600082612569858461273d565b14949350505050565b6000546001600160a01b03851661259b57604051622e076360e81b815260040160405180910390fd5b836125b95760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561266557506001600160a01b0387163b15155b156126ee575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46126b660008884806001019550886122ae565b6126d3576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561266b5782600054146126e957600080fd5b612734565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156126ef575b5060005561205e565b600081815b84518110156127a957600085828151811061275f5761275f612ea8565b602002602001015190508083116127855760008381526020829052604090209250612796565b600081815260208490526040902092505b50806127a181612ed4565b915050612742565b509392505050565b8280546127bd90612e16565b90600052602060002090601f0160209004810192826127df5760008555612825565b82601f106127f85782800160ff19823516178555612825565b82800160010185558215612825579182015b8281111561282557823582559160200191906001019061280a565b506128319291506128a9565b5090565b82805461284190612e16565b90600052602060002090601f0160209004810192826128635760008555612825565b82601f1061287c57805160ff1916838001178555612825565b82800160010185558215612825579182015b8281111561282557825182559160200191906001019061288e565b5b8082111561283157600081556001016128aa565b6001600160e01b031981168114610c6857600080fd5b6000602082840312156128e657600080fd5b8135611e66816128be565b60005b8381101561290c5781810151838201526020016128f4565b83811115611a445750506000910152565b600081518084526129358160208601602086016128f1565b601f01601f19169290920160200192915050565b602081526000611e66602083018461291d565b60006020828403121561296e57600080fd5b5035919050565b80356001600160a01b0381168114611b8957600080fd5b6000806040838503121561299f57600080fd5b6129a883612975565b946020939093013593505050565b6000806000606084860312156129cb57600080fd5b6129d484612975565b92506129e260208501612975565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612a3057612a306129f2565b604052919050565b60006020808385031215612a4b57600080fd5b82356001600160401b0380821115612a6257600080fd5b818501915085601f830112612a7657600080fd5b813581811115612a8857612a886129f2565b8060051b9150612a99848301612a08565b8181529183018401918481019088841115612ab357600080fd5b938501935b83851015612ad857612ac985612975565b82529385019390850190612ab8565b98975050505050505050565b60008060208385031215612af757600080fd5b82356001600160401b0380821115612b0e57600080fd5b818501915085601f830112612b2257600080fd5b813581811115612b3157600080fd5b866020828501011115612b4357600080fd5b60209290920196919550909350505050565b60006001600160401b03831115612b6e57612b6e6129f2565b612b81601f8401601f1916602001612a08565b9050828152838383011115612b9557600080fd5b828260208301376000602084830101529392505050565b600060208284031215612bbe57600080fd5b81356001600160401b03811115612bd457600080fd5b8201601f81018413612be557600080fd5b6121c684823560208401612b55565b803560ff81168114611b8957600080fd5b60008060008060608587031215612c1b57600080fd5b612c2485612bf4565b9350612c3260208601612975565b925060408501356001600160401b0380821115612c4e57600080fd5b818701915087601f830112612c6257600080fd5b813581811115612c7157600080fd5b8860208260051b8501011115612c8657600080fd5b95989497505060200194505050565b600060208284031215612ca757600080fd5b611e6682612bf4565b600060208284031215612cc257600080fd5b611e6682612975565b60008060408385031215612cde57600080fd5b82359150612cee60208401612975565b90509250929050565b60008060408385031215612d0a57600080fd5b612d1383612975565b915060208301358015158114612d2857600080fd5b809150509250929050565b60008060008060808587031215612d4957600080fd5b612d5285612975565b9350612d6060208601612975565b92506040850135915060608501356001600160401b03811115612d8257600080fd5b8501601f81018713612d9357600080fd5b612da287823560208401612b55565b91505092959194509250565b634e487b7160e01b600052602160045260246000fd5b6020810160068310612de657634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215612dff57600080fd5b612e0883612975565b9150612cee60208401612975565b600181811c90821680612e2a57607f821691505b60208210811415612e4b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526008908201526714dbdb190813dd5d60c21b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612ee857612ee8612ebe565b5060010190565b602080825260149082015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b604082015260600190565b60008219821115612f3057612f30612ebe565b500190565b60208082526010908201526f13585e081391951cc814995858da195960821b604082015260600190565b6020808252601d908201527f4174206c65617374206f6e652073686f756c64206265206d696e746564000000604082015260600190565b6000816000190483118215151615612fb057612fb0612ebe565b500290565b60208082526010908201526f4e6f7420656e6f7567682066756e647360801b604082015260600190565b60008351612ff18184602088016128f1565b8351908301906130058183602088016128f1565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906130519083018461291d565b9695505050505050565b60006020828403121561306d57600080fd5b8151611e66816128be565b60008282101561308a5761308a612ebe565b500390565b634e487b7160e01b600052601260045260246000fd5b6000826130b4576130b461308f565b500690565b6000826130c8576130c861308f565b50049056fea264697066735822122026bbf3579636b88983a903770652f5eaaf046d2bbc7118aa3ae78e926abc186464736f6c63430008090033

Deployed Bytecode Sourcemap

54597:8625:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55256:32;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;55256:32:0;;;;;;;;34243:305;;;;;;;;;;-1:-1:-1;34243:305:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;34243:305:0;582:187:1;55026:29:0;;;;;;;;;;;;;;;;37356:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38859:204::-;;;;;;;;;;-1:-1:-1;38859:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2056:32:1;;;2038:51;;2026:2;2011:18;38859:204:0;1892:203:1;38422:371:0;;;;;;;;;;-1:-1:-1;38422:371:0;;;;;:::i;:::-;;:::i;:::-;;54855:39;;;;;;;;;;;;;;;;59123:265;;;;;;;;;;-1:-1:-1;59123:265:0;;;;;:::i;:::-;;:::i;33492:303::-;;;;;;;;;;-1:-1:-1;33746:12:0;;33536:7;33730:13;:28;33492:303;;54810:40;;;;;;;;;;;;;;;;39724:170;;;;;;;;;;-1:-1:-1;39724:170:0;;;;;:::i;:::-;;:::i;61757:137::-;;;;;;;;;;-1:-1:-1;61757:137:0;;;;;:::i;:::-;;:::i;54945:39::-;;;;;;;;;;;;;;;;63068:147;;;:::i;39965:185::-;;;;;;;;;;-1:-1:-1;39965:185:0;;;;;:::i;:::-;;:::i;60855:108::-;;;;;;;;;;-1:-1:-1;60855:108:0;;;;;:::i;:::-;;:::i;59681:338::-;;;;;;;;;;-1:-1:-1;59681:338:0;;;;;:::i;:::-;;:::i;55293:35::-;;;;;;;;;;;;;;;;60635:95;;;;;;;;;;-1:-1:-1;60635:95:0;;;;;:::i;:::-;;:::i;60456:173::-;;;;;;;;;;;;;:::i;62715:151::-;;;;;;;;;;-1:-1:-1;62715:151:0;;;;;:::i;:::-;;:::i;61087:112::-;;;;;;;;;;-1:-1:-1;61087:112:0;;;;;:::i;:::-;;:::i;60736:113::-;;;;;;;;;;-1:-1:-1;60736:113:0;;;;;:::i;:::-;;:::i;55333:34::-;;;;;;;;;;;;;;;;60283:167;;;;;;;;;;;;;:::i;37164:125::-;;;;;;;;;;-1:-1:-1;37164:125:0;;;;;:::i;:::-;;:::i;56784:726::-;;;;;;:::i;:::-;;:::i;58260:747::-;;;;;;:::i;:::-;;:::i;34612:206::-;;;;;;;;;;-1:-1:-1;34612:206:0;;;;;:::i;:::-;;:::i;53701:103::-;;;;;;;;;;;;;:::i;59394:281::-;;;;;;;;;;-1:-1:-1;59394:281:0;;;;;:::i;:::-;;:::i;57516:738::-;;;;;;:::i;:::-;;:::i;56052:726::-;;;;;;:::i;:::-;;:::i;53050:87::-;;;;;;;;;;-1:-1:-1;53123:6:0;;-1:-1:-1;;;;;53123:6:0;53050:87;;37525:104;;;;;;;;;;;;;:::i;54899:41::-;;;;;;;;;;;;;;;;39135:287;;;;;;;;;;-1:-1:-1;39135:287:0;;;;;:::i;:::-;;:::i;61205:116::-;;;;;;;;;;-1:-1:-1;61205:116:0;;;;;:::i;:::-;;:::i;62229:145::-;;;;;;;;;;-1:-1:-1;62229:145:0;;;;;:::i;:::-;;:::i;60969:112::-;;;;;;;;;;-1:-1:-1;60969:112:0;;;;;:::i;:::-;;:::i;40221:369::-;;;;;;;;;;-1:-1:-1;40221:369:0;;;;;:::i;:::-;;:::i;62985:77::-;;;;;;;;;;;;;:::i;55558:488::-;;;;;;;;;;-1:-1:-1;55558:488:0;;;;;:::i;:::-;;:::i;55170:24::-;;;;;;;;;;-1:-1:-1;55170:24:0;;;;;;;;;;;;;;;:::i;54989:30::-;;;;;;;;;;;;;;;;54771:34;;;;;;;;;;-1:-1:-1;54771:34:0;;;;;;;;62872:107;;;;;;;;;;-1:-1:-1;62872:107:0;;;;;:::i;:::-;;:::i;60112:165::-;;;;;;;;;;;;;:::i;60025:81::-;;;;;;;;;;;;;:::i;39493:164::-;;;;;;;;;;-1:-1:-1;39493:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;39614:25:0;;;39590:4;39614:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;39493:164;53959:201;;;;;;;;;;-1:-1:-1;53959:201:0;;;;;:::i;:::-;;:::i;55201:48::-;;;;;;;;;;-1:-1:-1;55201:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;34243:305;34345:4;-1:-1:-1;;;;;;34382:40:0;;-1:-1:-1;;;34382:40:0;;:105;;-1:-1:-1;;;;;;;34439:48:0;;-1:-1:-1;;;34439:48:0;34382:105;:158;;;-1:-1:-1;;;;;;;;;;23335:40:0;;;34504:36;34362:178;34243:305;-1:-1:-1;;34243:305:0:o;37356:100::-;37410:13;37443:5;37436:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37356:100;:::o;38859:204::-;38927:7;38952:16;38960:7;38952;:16::i;:::-;38947:64;;38977:34;;-1:-1:-1;;;38977:34:0;;;;;;;;;;;38947:64;-1:-1:-1;39031:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;39031:24:0;;38859:204::o;38422:371::-;38495:13;38511:24;38527:7;38511:15;:24::i;:::-;38495:40;;38556:5;-1:-1:-1;;;;;38550:11:0;:2;-1:-1:-1;;;;;38550:11:0;;38546:48;;;38570:24;;-1:-1:-1;;;38570:24:0;;;;;;;;;;;38546:48;29839:10;-1:-1:-1;;;;;38611:21:0;;;;;;:63;;-1:-1:-1;38637:37:0;38654:5;29839:10;39493:164;:::i;38637:37::-;38636:38;38611:63;38607:138;;;38698:35;;-1:-1:-1;;;38698:35:0;;;;;;;;;;;38607:138;38757:28;38766:2;38770:7;38779:5;38757:8;:28::i;:::-;38484:309;38422:371;;:::o;59123:265::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;;;;;;;;;59213:8:::1;;59187:22;59205:3;59187:13;33746:12:::0;;33536:7;33730:13;:28;;33492:303;59187:13:::1;:17:::0;::::1;:22::i;:::-;:34;;59179:55;;;;-1:-1:-1::0;;;59179:55:0::1;;;;;;;:::i;:::-;59270:8;;59244:22;59262:3;59244:13;33746:12:::0;;33536:7;33730:13;:28;;33492:303;59244:22:::1;:34;59241:71;;;59282:11;:27:::0;;-1:-1:-1;;59282:27:0::1;59296:13;59282:27;::::0;;59241:71:::1;59322:22;59328:10;59340:3;59322:5;:22::i;:::-;59356:26;59368:13;33746:12:::0;;33536:7;33730:13;:28;;33492:303;59368:13:::1;59356:26;::::0;160:25:1;;;148:2;133:18;59356:26:0::1;;;;;;;59123:265:::0;:::o;39724:170::-;39858:28;39868:4;39874:2;39878:7;39858:9;:28::i;61757:137::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;61847:17:::1;:41:::0;61757:137::o;63068:147::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;63121:8:::1;63143:7;53123:6:::0;;-1:-1:-1;;;;;53123:6:0;;53050:87;63143:7:::1;-1:-1:-1::0;;;;;63135:21:0::1;63164;63135:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63120:70;;;63205:3;63197:12;;;::::0;::::1;;63113:102;63068:147::o:0;39965:185::-;40103:39;40120:4;40126:2;40130:7;40103:39;;;;;;;;;;;;:16;:39::i;60855:108::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;60928:11:::1;:29:::0;60855:108::o;59681:338::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;59804:8:::1;;59765:35;59783:9;:16;59765:13;33746:12:::0;;33536:7;33730:13;:28;;33492:303;59765:35:::1;:47;;59757:68;;;;-1:-1:-1::0;;;59757:68:0::1;;;;;;;:::i;:::-;59874:8;;59835:35;59853:9;:16;59835:13;33746:12:::0;;33536:7;33730:13;:28;;33492:303;59835:35:::1;:47;59832:84;;;59886:11;:27:::0;;-1:-1:-1;;59886:27:0::1;59900:13;59886:27;::::0;;59832:84:::1;59931:9;59926:88;59950:9;:16;59946:1;:20;59926:88;;;59982:24;59990:1;59993:9;60003:1;59993:12;;;;;;;;:::i;:::-;;;;;;;59982:7;:24::i;:::-;59968:3:::0;::::1;::::0;::::1;:::i;:::-;;;;59926:88;;;;59681:338:::0;:::o;60635:95::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;60706:18:::1;:8;60717:7:::0;;60706:18:::1;:::i;60456:173::-:0;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;60530:14:::1;60515:11;::::0;::::1;;:29;::::0;::::1;;;;;;:::i;:::-;;60507:79;;;::::0;-1:-1:-1;;;60507:79:0;;11113:2:1;60507:79:0::1;::::0;::::1;11095:21:1::0;11152:2;11132:18;;;11125:30;11191:34;11171:18;;;11164:62;-1:-1:-1;;;11242:18:1;;;11235:35;11287:19;;60507:79:0::1;10911:401:1::0;60507:79:0::1;60593:11;:30:::0;;60607:16:::1;::::0;60593:11;-1:-1:-1;;60593:30:0::1;::::0;60607:16;60593:30:::1;;;;;;60456:173::o:0;62715:151::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;62813:20:::1;:47:::0;62715:151::o;61087:112::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;61162:12:::1;:31:::0;61087:112::o;60736:113::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;60815:28;;::::1;::::0;:13:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;60283:167::-:0;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;60355:13:::1;60340:11;::::0;::::1;;:28;::::0;::::1;;;;;;:::i;:::-;;60332:77;;;::::0;-1:-1:-1;;;60332:77:0;;11519:2:1;60332:77:0::1;::::0;::::1;11501:21:1::0;11558:2;11538:18;;;11531:30;11597:34;11577:18;;;11570:62;-1:-1:-1;;;11648:18:1;;;11641:34;11692:19;;60332:77:0::1;11317:400:1::0;60332:77:0::1;60416:11;:28:::0;;60430:14:::1;::::0;60416:11;-1:-1:-1;;60416:28:0::1;::::0;60430:14;60416:28:::1;::::0;37164:125;37228:7;37255:21;37268:7;37255:12;:21::i;:::-;:26;;37164:125;-1:-1:-1;;37164:125:0:o;56784:726::-;56913:13;56898:11;;;;:28;;;;;;;;:::i;:::-;;56890:69;;;;-1:-1:-1;;;56890:69:0;;11924:2:1;56890:69:0;;;11906:21:1;11963:2;11943:18;;;11936:30;12002;11982:18;;;11975:58;12050:18;;56890:69:0;11722:352:1;56890:69:0;57007:4;56974:29;56992:10;56974:29;;:13;33746:12;;33536:7;33730:13;:28;;33492:303;56974:29;:37;;56966:66;;;;-1:-1:-1;;;56966:66:0;;12281:2:1;56966:66:0;;;12263:21:1;12320:2;12300:18;;;12293:30;-1:-1:-1;;;12339:18:1;;;12332:46;12395:18;;56966:66:0;12079:340:1;56966:66:0;57047:27;57057:8;57067:6;;57047:9;:27::i;:::-;57039:60;;;;-1:-1:-1;;;57039:60:0;;;;;;;:::i;:::-;57127:10;57114:24;;;;:12;:24;;;;;;57155:1;;57114:37;;;;;;;:::i;:::-;:42;;57106:71;;;;-1:-1:-1;;;57106:71:0;;;;;;;:::i;:::-;57197:10;57184:24;;;;:12;:24;;;;;:38;;;;;;:24;:38;;;;;:::i;:::-;;;;-1:-1:-1;;57237:14:0;;;57229:56;;;;-1:-1:-1;;;57229:56:0;;;;;;;:::i;:::-;57329:9;57315:10;57300:25;;:12;;:25;;;;:::i;:::-;:38;;57292:67;;;;-1:-1:-1;;;57292:67:0;;;;;;;:::i;:::-;57385:10;57369:26;;:13;33746:12;;33536:7;33730:13;:28;;33492:303;57369:13;:26;;;;:::i;:::-;57399:4;57369:34;57366:65;;;57407:14;:21;;-1:-1:-1;;57407:21:0;57424:4;57407:21;;;57366:65;57437:29;57443:10;57455;57437:29;;:5;:29::i;:::-;57478:26;57490:13;33746:12;;33536:7;33730:13;:28;;33492:303;57490:13;57478:26;;160:25:1;;;148:2;133:18;57478:26:0;;;;;;;56784:726;;;;:::o;58260:747::-;58337:13;58322:11;;;;:28;;;;;;;;:::i;:::-;;;58314:49;;;;-1:-1:-1;;;58314:49:0;;;;;;;:::i;:::-;58393:16;58378:11;;;;:31;;;;;;;;:::i;:::-;;58370:83;;;;-1:-1:-1;;;58370:83:0;;14329:2:1;58370:83:0;;;14311:21:1;14368:2;14348:18;;;14341:30;14407:34;14387:18;;;14380:62;-1:-1:-1;;;14458:18:1;;;14451:37;14505:19;;58370:83:0;14127:403:1;58370:83:0;58501:8;;58468:29;58486:10;58468:29;;:13;33746:12;;33536:7;33730:13;:28;;33492:303;58468:29;:41;;58460:62;;;;-1:-1:-1;;;58460:62:0;;;;;;;:::i;:::-;58613:10;58600:24;;;;:12;:24;;;;;;58641:2;;58600:37;;;;;;;:::i;:::-;:43;;58592:72;;;;-1:-1:-1;;;58592:72:0;;;;;;;:::i;:::-;58684:10;58671:24;;;;:12;:24;;;;;:38;;;;;;:24;:38;;;;;:::i;:::-;;;;-1:-1:-1;;58724:14:0;;;58716:56;;;;-1:-1:-1;;;58716:56:0;;;;;;;:::i;:::-;58815:9;58801:10;58787:24;;:11;;:24;;;;:::i;:::-;:37;;58779:66;;;;-1:-1:-1;;;58779:66:0;;;;;;;:::i;:::-;58886:8;;58872:10;58856:26;;:13;33746:12;;33536:7;33730:13;:28;;33492:303;58856:13;:26;;;;:::i;:::-;:38;58853:75;;;58898:11;:27;;-1:-1:-1;;58898:27:0;58912:13;58898:27;;;58853:75;58934:29;58940:10;58952;58934:29;;:5;:29::i;34612:206::-;34676:7;-1:-1:-1;;;;;34700:19:0;;34696:60;;34728:28;;-1:-1:-1;;;34728:28:0;;;;;;;;;;;34696:60;-1:-1:-1;;;;;;34782:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;34782:27:0;;34612:206::o;53701:103::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;53766:30:::1;53793:1;53766:18;:30::i;:::-;53701:103::o:0;59394:281::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;59501:8:::1;;59475:22;59493:3;59475:13;33746:12:::0;;33536:7;33730:13;:28;;33492:303;59475:22:::1;:34;;59467:55;;;;-1:-1:-1::0;;;59467:55:0::1;;;;;;;:::i;:::-;59558:8;;59532:22;59550:3;59532:13;33746:12:::0;;33536:7;33730:13;:28;;33492:303;59532:22:::1;:34;59529:71;;;59570:11;:27:::0;;-1:-1:-1;;59570:27:0::1;59584:13;59570:27;::::0;;59529:71:::1;59610:21;59616:9;59627:3;59610:5;:21::i;:::-;59643:26;59655:13;33746:12:::0;;33536:7;33730:13;:28;;33492:303;59655:13:::1;59643:26;::::0;160:25:1;;;148:2;133:18;59643:26:0::1;;;;;;;59394:281:::0;;:::o;57516:738::-;57646:14;57631:11;;;;:29;;;;;;;;:::i;:::-;;57623:71;;;;-1:-1:-1;;;57623:71:0;;14737:2:1;57623:71:0;;;14719:21:1;14776:2;14756:18;;;14749:30;14815:31;14795:18;;;14788:59;14864:18;;57623:71:0;14535:353:1;57623:71:0;57742:4;57709:29;57727:10;57709:29;;:13;33746:12;;33536:7;33730:13;:28;;33492:303;57709:29;:37;;57701:67;;;;-1:-1:-1;;;57701:67:0;;15095:2:1;57701:67:0;;;15077:21:1;15134:2;15114:18;;;15107:30;-1:-1:-1;;;15153:18:1;;;15146:47;15210:18;;57701:67:0;14893:341:1;57701:67:0;57783:30;57796:8;57806:6;;57783:12;:30::i;:::-;57775:63;;;;-1:-1:-1;;;57775:63:0;;;;;;;:::i;:::-;57866:10;57853:24;;;;:12;:24;;;;;;57894:1;;57853:37;;;;;;;:::i;:::-;:42;;57845:71;;;;-1:-1:-1;;;57845:71:0;;;;;;;:::i;:::-;57936:10;57923:24;;;;:12;:24;;;;;:38;;;;;;:24;:38;;;;;:::i;:::-;;;;-1:-1:-1;;57980:14:0;;;57972:56;;;;-1:-1:-1;;;57972:56:0;;;;;;;:::i;:::-;58073:9;58059:10;58043:26;;:13;;:26;;;;:::i;:::-;:39;;58035:68;;;;-1:-1:-1;;;58035:68:0;;;;;;;:::i;:::-;58129:10;58113:26;;:13;33746:12;;33536:7;33730:13;:28;;33492:303;58113:13;:26;;;;:::i;:::-;58143:4;58113:34;58110:65;;;58151:14;:21;;-1:-1:-1;;58151:21:0;58168:4;58151:21;;;58181:29;58187:10;58199;58181:29;;:5;:29::i;56052:726::-;56181:13;56166:11;;;;:28;;;;;;;;:::i;:::-;;56158:69;;;;-1:-1:-1;;;56158:69:0;;15441:2:1;56158:69:0;;;15423:21:1;15480:2;15460:18;;;15453:30;15519;15499:18;;;15492:58;15567:18;;56158:69:0;15239:352:1;56158:69:0;56275:3;56242:29;56260:10;56242:29;;:13;33746:12;;33536:7;33730:13;:28;;33492:303;56242:29;:36;;56234:65;;;;-1:-1:-1;;;56234:65:0;;15798:2:1;56234:65:0;;;15780:21:1;15837:2;15817:18;;;15810:30;-1:-1:-1;;;15856:18:1;;;15849:46;15912:18;;56234:65:0;15596:340:1;56234:65:0;56314:29;56326:8;56336:6;;56314:11;:29::i;:::-;56306:62;;;;-1:-1:-1;;;56306:62:0;;;;;;;:::i;:::-;56396:10;56383:24;;;;:12;:24;;;;;;56424:1;;56383:37;;;;;;;:::i;:::-;:42;;56375:71;;;;-1:-1:-1;;;56375:71:0;;;;;;;:::i;:::-;56466:10;56453:24;;;;:12;:24;;;;;:38;;;;;;:24;:38;;;;;:::i;:::-;;;;-1:-1:-1;;56506:14:0;;;56498:56;;;;-1:-1:-1;;;56498:56:0;;;;;;;:::i;:::-;56598:9;56584:10;56569:25;;:12;;:25;;;;:::i;:::-;:38;;56561:67;;;;-1:-1:-1;;;56561:67:0;;;;;;;:::i;:::-;56654:10;56638:26;;:13;33746:12;;33536:7;33730:13;:28;;33492:303;56638:13;:26;;;;:::i;:::-;56668:3;56638:33;56635:64;;;56675:14;:21;;-1:-1:-1;;56675:21:0;56692:4;56675:21;;;56705:29;56711:10;56723;56705:29;;:5;:29::i;37525:104::-;37581:13;37614:7;37607:14;;;;;:::i;39135:287::-;-1:-1:-1;;;;;39234:24:0;;29839:10;39234:24;39230:54;;;39267:17;;-1:-1:-1;;;39267:17:0;;;;;;;;;;;39230:54;29839:10;39297:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;39297:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;39297:53:0;;;;;;;;;;39366:48;;722:41:1;;;39297:42:0;;29839:10;39366:48;;695:18:1;39366:48:0;;;;;;;39135:287;;:::o;61205:116::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;61282:13:::1;:33:::0;61205:116::o;62229:145::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;62323:19:::1;:45:::0;62229:145::o;60969:112::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;61044:12:::1;:31:::0;60969:112::o;40221:369::-;40388:28;40398:4;40404:2;40408:7;40388:9;:28::i;:::-;-1:-1:-1;;;;;40431:13:0;;13415:19;:23;;40431:76;;;;;40451:56;40482:4;40488:2;40492:7;40501:5;40451:30;:56::i;:::-;40450:57;40431:76;40427:156;;;40531:40;;-1:-1:-1;;;40531:40:0;;;;;;;;;;;40427:156;40221:369;;;;:::o;62985:77::-;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;63035:14:::1;:21:::0;;-1:-1:-1;;63035:21:0::1;63052:4;63035:21;::::0;;62985:77::o;55558:488::-;55631:15;55663:16;55671:7;55663;:16::i;:::-;55655:76;;;;-1:-1:-1;;;55655:76:0;;16143:2:1;55655:76:0;;;16125:21:1;16182:2;16162:18;;;16155:30;16221:34;16201:18;;;16194:62;-1:-1:-1;;;16272:18:1;;;16265:45;16327:19;;55655:76:0;15941:411:1;55655:76:0;55759:8;;33746:12;;33536:7;33730:13;:28;55742:25;;:51;;;-1:-1:-1;55771:14:0;;;;:22;;:14;:22;55742:51;55738:303;;;55818:8;;55808:7;:18;55804:199;;;55839:16;55858:51;55900:8;;55858:37;55870:24;55883:10;;55870:8;;:12;;:24;;;;:::i;:::-;55858:7;;:11;:37::i;:::-;:41;;:51::i;:::-;55839:70;;55951:10;:8;:10::i;:::-;55963:19;:8;:17;:19::i;:::-;55934:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55920:73;;;55558:488;;;:::o;55804:199::-;55558:488;;;:::o;55738:303::-;56025:13;56018:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55558:488;;;:::o;62872:107::-;-1:-1:-1;;;;;34996:19:0;;62930:7;34996:19;;;:12;:19;;;;;:32;-1:-1:-1;;;34996:32:0;;-1:-1:-1;;;;;34996:32:0;62953:20;34900:137;60112:165;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;60183:13:::1;60168:11;::::0;::::1;;:28;::::0;::::1;;;;;;:::i;:::-;;60160:77;;;::::0;-1:-1:-1;;;60160:77:0;;17201:2:1;60160:77:0::1;::::0;::::1;17183:21:1::0;17240:2;17220:18;;;17213:30;17279:34;17259:18;;;17252:62;-1:-1:-1;;;17330:18:1;;;17323:34;17374:19;;60160:77:0::1;16999:400:1::0;60160:77:0::1;60244:11;:27:::0;;60258:13:::1;::::0;60244:11;-1:-1:-1;;60244:27:0::1;::::0;60258:13;60244:27:::1;::::0;60025:81;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;60073:11:::1;:27:::0;;60087:13:::1;::::0;60073:11;-1:-1:-1;;60073:27:0::1;60087:13:::0;;60073:27:::1;::::0;53959:201;53123:6;;-1:-1:-1;;;;;53123:6:0;29839:10;53270:23;53262:68;;;;-1:-1:-1;;;53262:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54048:22:0;::::1;54040:73;;;::::0;-1:-1:-1;;;54040:73:0;;17606:2:1;54040:73:0::1;::::0;::::1;17588:21:1::0;17645:2;17625:18;;;17618:30;17684:34;17664:18;;;17657:62;-1:-1:-1;;;17735:18:1;;;17728:36;17781:19;;54040:73:0::1;17404:402:1::0;54040:73:0::1;54124:28;54143:8;54124:18;:28::i;40845:174::-:0;40902:4;40966:13;;40956:7;:23;40926:85;;;;-1:-1:-1;;40984:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;40984:27:0;;;;40983:28;;40845:174::o;49002:196::-;49117:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;49117:29:0;-1:-1:-1;;;;;49117:29:0;;;;;;;;;49162:28;;49117:24;;49162:28;;;;;;;49002:196;;;:::o;2913:98::-;2971:7;2998:5;3002:1;2998;:5;:::i;:::-;2991:12;2913:98;-1:-1:-1;;;2913:98:0:o;59013:104::-;59081:30;59091:9;59102:8;59081:9;:30::i;43945:2130::-;44060:35;44098:21;44111:7;44098:12;:21::i;:::-;44060:59;;44158:4;-1:-1:-1;;;;;44136:26:0;:13;:18;;;-1:-1:-1;;;;;44136:26:0;;44132:67;;44171:28;;-1:-1:-1;;;44171:28:0;;;;;;;;;;;44132:67;44212:22;29839:10;-1:-1:-1;;;;;44238:20:0;;;;:73;;-1:-1:-1;44275:36:0;44292:4;29839:10;39493:164;:::i;44275:36::-;44238:126;;;-1:-1:-1;29839:10:0;44328:20;44340:7;44328:11;:20::i;:::-;-1:-1:-1;;;;;44328:36:0;;44238:126;44212:153;;44383:17;44378:66;;44409:35;;-1:-1:-1;;;44409:35:0;;;;;;;;;;;44378:66;-1:-1:-1;;;;;44459:16:0;;44455:52;;44484:23;;-1:-1:-1;;;44484:23:0;;;;;;;;;;;44455:52;44628:35;44645:1;44649:7;44658:4;44628:8;:35::i;:::-;-1:-1:-1;;;;;44959:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;44959:31:0;;;-1:-1:-1;;;;;44959:31:0;;;-1:-1:-1;;44959:31:0;;;;;;;45005:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;45005:29:0;;;;;;;;;;;45085:20;;;:11;:20;;;;;;45120:18;;-1:-1:-1;;;;;;45153:49:0;;;;-1:-1:-1;;;45186:15:0;45153:49;;;;;;;;;;45476:11;;45536:24;;;;;45579:13;;45085:20;;45536:24;;45579:13;45575:384;;45789:13;;45774:11;:28;45770:174;;45827:20;;45896:28;;;;-1:-1:-1;;;;;45870:54:0;-1:-1:-1;;;45870:54:0;-1:-1:-1;;;;;;45870:54:0;;;-1:-1:-1;;;;;45827:20:0;;45870:54;;;;45770:174;44934:1036;;;46006:7;46002:2;-1:-1:-1;;;;;45987:27:0;45996:4;-1:-1:-1;;;;;45987:27:0;;;;;;;;;;;46025:42;44049:2026;;43945:2130;;;:::o;35993:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;36104:7:0;36187:13;;36180:4;:20;36149:886;;;36221:31;36255:17;;;:11;:17;;;;;;;;;36221:51;;;;;;;;;-1:-1:-1;;;;;36221:51:0;;;;-1:-1:-1;;;36221:51:0;;-1:-1:-1;;;;;36221:51:0;;;;;;;;-1:-1:-1;;;36221:51:0;;;;;;;;;;;;;;36291:729;;36341:14;;-1:-1:-1;;;;;36341:28:0;;36337:101;;36405:9;35993:1109;-1:-1:-1;;;35993:1109:0:o;36337:101::-;-1:-1:-1;;;36780:6:0;36825:17;;;;:11;:17;;;;;;;;;36813:29;;;;;;;;;-1:-1:-1;;;;;36813:29:0;;;;;-1:-1:-1;;;36813:29:0;;-1:-1:-1;;;;;36813:29:0;;;;;;;;-1:-1:-1;;;36813:29:0;;;;;;;;;;;;;36873:28;36869:109;;36941:9;35993:1109;-1:-1:-1;;;35993:1109:0:o;36869:109::-;36740:261;;;36202:833;36149:886;37063:31;;-1:-1:-1;;;37063:31:0;;;;;;;;;;;61327:140;61411:4;61431:30;61439:14;61445:7;61439:5;:14::i;:::-;61455:5;;61431:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61431:7:0;;-1:-1:-1;;;61431:30:0:i;:::-;61424:37;61327:140;-1:-1:-1;;;;61327:140:0:o;54320:191::-;54413:6;;;-1:-1:-1;;;;;54430:17:0;;;-1:-1:-1;;;;;;54430:17:0;;;;;;;54463:40;;54413:6;;;54430:17;54413:6;;54463:40;;54394:16;;54463:40;54383:128;54320:191;:::o;62380:153::-;62467:4;62487:40;62505:14;62511:7;62505:5;:14::i;:::-;62521:5;;62487:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62487:17:0;;-1:-1:-1;;;62487:40:0:i;61900:151::-;61986:4;62006:39;62023:14;62029:7;62023:5;:14::i;:::-;62039:5;;62006:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62006:16:0;;-1:-1:-1;;;62006:39:0:i;49690:667::-;49874:72;;-1:-1:-1;;;49874:72:0;;49853:4;;-1:-1:-1;;;;;49874:36:0;;;;;:72;;29839:10;;49925:4;;49931:7;;49940:5;;49874:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49874:72:0;;;;;;;;-1:-1:-1;;49874:72:0;;;;;;;;;;;;:::i;:::-;;;49870:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50108:13:0;;50104:235;;50154:40;;-1:-1:-1;;;50154:40:0;;;;;;;;;;;50104:235;50297:6;50291:13;50282:6;50278:2;50274:15;50267:38;49870:480;-1:-1:-1;;;;;;49993:55:0;-1:-1:-1;;;49993:55:0;;-1:-1:-1;49690:667:0;;;;;;:::o;3294:98::-;3352:7;3379:5;3383:1;3379;:5;:::i;4615:98::-;4673:7;4700:5;4704:1;4700;:5;:::i;55457:95::-;55517:13;55541:8;55534:15;;;;;:::i;10128:723::-;10184:13;10405:10;10401:53;;-1:-1:-1;;10432:10:0;;;;;;;;;;;;-1:-1:-1;;;10432:10:0;;;;;10128:723::o;10401:53::-;10479:5;10464:12;10520:78;10527:9;;10520:78;;10553:8;;;;:::i;:::-;;-1:-1:-1;10576:10:0;;-1:-1:-1;10584:2:0;10576:10;;:::i;:::-;;;10520:78;;;10608:19;10640:6;-1:-1:-1;;;;;10630:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10630:17:0;;10608:39;;10658:154;10665:10;;10658:154;;10692:11;10702:1;10692:11;;:::i;:::-;;-1:-1:-1;10761:10:0;10769:2;10761:5;:10;:::i;:::-;10748:24;;:2;:24;:::i;:::-;10735:39;;10718:6;10725;10718:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10718:56:0;;;;;;;;-1:-1:-1;10789:11:0;10798:2;10789:11;;:::i;:::-;;;10658:154;;41027:104;41096:27;41106:2;41110:8;41096:27;;;;;;;;;;;;:9;:27::i;61473:119::-;61560:25;;-1:-1:-1;;19212:2:1;19208:15;;;19204:53;61560:25:0;;;19192:66:1;61527:7:0;;19274:12:1;;61560:25:0;;;;;;;;;;;;61550:36;;;;;;61543:43;;61473:119;;;:::o;61598:153::-;61675:4;61695:50;61714:5;61721:17;;61740:4;61695:18;:50::i;62539:170::-;62626:4;62650:53;62669:5;62676:20;;62698:4;62650:18;:53::i;62059:164::-;62145:4;62165:52;62184:5;62191:19;;62212:4;62165:18;:52::i;41494:163::-;41617:32;41623:2;41627:8;41637:5;41644:4;41617:5;:32::i;8298:190::-;8423:4;8476;8447:25;8460:5;8467:4;8447:12;:25::i;:::-;:33;;8298:190;-1:-1:-1;;;;8298:190:0:o;41916:1775::-;42055:20;42078:13;-1:-1:-1;;;;;42106:16:0;;42102:48;;42131:19;;-1:-1:-1;;;42131:19:0;;;;;;;;;;;42102:48;42165:13;42161:44;;42187:18;;-1:-1:-1;;;42187:18:0;;;;;;;;;;;42161:44;-1:-1:-1;;;;;42556:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;42615:49:0;;-1:-1:-1;;;;;42556:44:0;;;;;;;42615:49;;;-1:-1:-1;;;;;42556:44:0;;;;;;42615:49;;;;;;;;;;;;;;;;42681:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;42731:66:0;;;;-1:-1:-1;;;42781:15:0;42731:66;;;;;;;;;;42681:25;42878:23;;;42922:4;:23;;;;-1:-1:-1;;;;;;42930:13:0;;13415:19;:23;;42930:15;42918:641;;;42966:314;42997:38;;43022:12;;-1:-1:-1;;;;;42997:38:0;;;43014:1;;42997:38;;43014:1;;42997:38;43063:69;43102:1;43106:2;43110:14;;;;;;43126:5;43063:30;:69::i;:::-;43058:174;;43168:40;;-1:-1:-1;;;43168:40:0;;;;;;;;;;;43058:174;43275:3;43259:12;:19;;42966:314;;43361:12;43344:13;;:29;43340:43;;43375:8;;;43340:43;42918:641;;;43424:120;43455:40;;43480:14;;;;;-1:-1:-1;;;;;43455:40:0;;;43472:1;;43455:40;;43472:1;;43455:40;43539:3;43523:12;:19;;43424:120;;42918:641;-1:-1:-1;43573:13:0;:28;43623:60;40221:369;8849:675;8932:7;8975:4;8932:7;8990:497;9014:5;:12;9010:1;:16;8990:497;;;9048:20;9071:5;9077:1;9071:8;;;;;;;;:::i;:::-;;;;;;;9048:31;;9114:12;9098;:28;9094:382;;9600:13;9650:15;;;9686:4;9679:15;;;9733:4;9717:21;;9226:57;;9094:382;;;9600:13;9650:15;;;9686:4;9679:15;;;9733:4;9717:21;;9403:57;;9094:382;-1:-1:-1;9028:3:0;;;;:::i;:::-;;;;8990:497;;;-1:-1:-1;9504:12:0;8849:675;-1:-1:-1;;;8849:675:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:131:1;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;956:258::-;1028:1;1038:113;1052:6;1049:1;1046:13;1038:113;;;1128:11;;;1122:18;1109:11;;;1102:39;1074:2;1067:10;1038:113;;;1169:6;1166:1;1163:13;1160:48;;;-1:-1:-1;;1204:1:1;1186:16;;1179:27;956:258::o;1219:::-;1261:3;1299:5;1293:12;1326:6;1321:3;1314:19;1342:63;1398:6;1391:4;1386:3;1382:14;1375:4;1368:5;1364:16;1342:63;:::i;:::-;1459:2;1438:15;-1:-1:-1;;1434:29:1;1425:39;;;;1466:4;1421:50;;1219:258;-1:-1:-1;;1219:258:1:o;1482:220::-;1631:2;1620:9;1613:21;1594:4;1651:45;1692:2;1681:9;1677:18;1669:6;1651:45;:::i;1707:180::-;1766:6;1819:2;1807:9;1798:7;1794:23;1790:32;1787:52;;;1835:1;1832;1825:12;1787:52;-1:-1:-1;1858:23:1;;1707:180;-1:-1:-1;1707:180:1:o;2100:173::-;2168:20;;-1:-1:-1;;;;;2217:31:1;;2207:42;;2197:70;;2263:1;2260;2253:12;2278:254;2346:6;2354;2407:2;2395:9;2386:7;2382:23;2378:32;2375:52;;;2423:1;2420;2413:12;2375:52;2446:29;2465:9;2446:29;:::i;:::-;2436:39;2522:2;2507:18;;;;2494:32;;-1:-1:-1;;;2278:254:1:o;2537:328::-;2614:6;2622;2630;2683:2;2671:9;2662:7;2658:23;2654:32;2651:52;;;2699:1;2696;2689:12;2651:52;2722:29;2741:9;2722:29;:::i;:::-;2712:39;;2770:38;2804:2;2793:9;2789:18;2770:38;:::i;:::-;2760:48;;2855:2;2844:9;2840:18;2827:32;2817:42;;2537:328;;;;;:::o;3055:127::-;3116:10;3111:3;3107:20;3104:1;3097:31;3147:4;3144:1;3137:15;3171:4;3168:1;3161:15;3187:275;3258:2;3252:9;3323:2;3304:13;;-1:-1:-1;;3300:27:1;3288:40;;-1:-1:-1;;;;;3343:34:1;;3379:22;;;3340:62;3337:88;;;3405:18;;:::i;:::-;3441:2;3434:22;3187:275;;-1:-1:-1;3187:275:1:o;3467:952::-;3551:6;3582:2;3625;3613:9;3604:7;3600:23;3596:32;3593:52;;;3641:1;3638;3631:12;3593:52;3681:9;3668:23;-1:-1:-1;;;;;3751:2:1;3743:6;3740:14;3737:34;;;3767:1;3764;3757:12;3737:34;3805:6;3794:9;3790:22;3780:32;;3850:7;3843:4;3839:2;3835:13;3831:27;3821:55;;3872:1;3869;3862:12;3821:55;3908:2;3895:16;3930:2;3926;3923:10;3920:36;;;3936:18;;:::i;:::-;3982:2;3979:1;3975:10;3965:20;;4005:28;4029:2;4025;4021:11;4005:28;:::i;:::-;4067:15;;;4137:11;;;4133:20;;;4098:12;;;;4165:19;;;4162:39;;;4197:1;4194;4187:12;4162:39;4221:11;;;;4241:148;4257:6;4252:3;4249:15;4241:148;;;4323:23;4342:3;4323:23;:::i;:::-;4311:36;;4274:12;;;;4367;;;;4241:148;;;4408:5;3467:952;-1:-1:-1;;;;;;;;3467:952:1:o;4424:592::-;4495:6;4503;4556:2;4544:9;4535:7;4531:23;4527:32;4524:52;;;4572:1;4569;4562:12;4524:52;4612:9;4599:23;-1:-1:-1;;;;;4682:2:1;4674:6;4671:14;4668:34;;;4698:1;4695;4688:12;4668:34;4736:6;4725:9;4721:22;4711:32;;4781:7;4774:4;4770:2;4766:13;4762:27;4752:55;;4803:1;4800;4793:12;4752:55;4843:2;4830:16;4869:2;4861:6;4858:14;4855:34;;;4885:1;4882;4875:12;4855:34;4930:7;4925:2;4916:6;4912:2;4908:15;4904:24;4901:37;4898:57;;;4951:1;4948;4941:12;4898:57;4982:2;4974:11;;;;;5004:6;;-1:-1:-1;4424:592:1;;-1:-1:-1;;;;4424:592:1:o;5021:407::-;5086:5;-1:-1:-1;;;;;5112:6:1;5109:30;5106:56;;;5142:18;;:::i;:::-;5180:57;5225:2;5204:15;;-1:-1:-1;;5200:29:1;5231:4;5196:40;5180:57;:::i;:::-;5171:66;;5260:6;5253:5;5246:21;5300:3;5291:6;5286:3;5282:16;5279:25;5276:45;;;5317:1;5314;5307:12;5276:45;5366:6;5361:3;5354:4;5347:5;5343:16;5330:43;5420:1;5413:4;5404:6;5397:5;5393:18;5389:29;5382:40;5021:407;;;;;:::o;5433:451::-;5502:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:52;;;5571:1;5568;5561:12;5523:52;5611:9;5598:23;-1:-1:-1;;;;;5636:6:1;5633:30;5630:50;;;5676:1;5673;5666:12;5630:50;5699:22;;5752:4;5744:13;;5740:27;-1:-1:-1;5730:55:1;;5781:1;5778;5771:12;5730:55;5804:74;5870:7;5865:2;5852:16;5847:2;5843;5839:11;5804:74;:::i;5889:156::-;5955:20;;6015:4;6004:16;;5994:27;;5984:55;;6035:1;6032;6025:12;6050:759;6152:6;6160;6168;6176;6229:2;6217:9;6208:7;6204:23;6200:32;6197:52;;;6245:1;6242;6235:12;6197:52;6268:27;6285:9;6268:27;:::i;:::-;6258:37;;6314:38;6348:2;6337:9;6333:18;6314:38;:::i;:::-;6304:48;;6403:2;6392:9;6388:18;6375:32;-1:-1:-1;;;;;6467:2:1;6459:6;6456:14;6453:34;;;6483:1;6480;6473:12;6453:34;6521:6;6510:9;6506:22;6496:32;;6566:7;6559:4;6555:2;6551:13;6547:27;6537:55;;6588:1;6585;6578:12;6537:55;6628:2;6615:16;6654:2;6646:6;6643:14;6640:34;;;6670:1;6667;6660:12;6640:34;6723:7;6718:2;6708:6;6705:1;6701:14;6697:2;6693:23;6689:32;6686:45;6683:65;;;6744:1;6741;6734:12;6683:65;6050:759;;;;-1:-1:-1;;6775:2:1;6767:11;;-1:-1:-1;;;6050:759:1:o;6814:182::-;6871:6;6924:2;6912:9;6903:7;6899:23;6895:32;6892:52;;;6940:1;6937;6930:12;6892:52;6963:27;6980:9;6963:27;:::i;7001:186::-;7060:6;7113:2;7101:9;7092:7;7088:23;7084:32;7081:52;;;7129:1;7126;7119:12;7081:52;7152:29;7171:9;7152:29;:::i;7192:254::-;7260:6;7268;7321:2;7309:9;7300:7;7296:23;7292:32;7289:52;;;7337:1;7334;7327:12;7289:52;7373:9;7360:23;7350:33;;7402:38;7436:2;7425:9;7421:18;7402:38;:::i;:::-;7392:48;;7192:254;;;;;:::o;7451:347::-;7516:6;7524;7577:2;7565:9;7556:7;7552:23;7548:32;7545:52;;;7593:1;7590;7583:12;7545:52;7616:29;7635:9;7616:29;:::i;:::-;7606:39;;7695:2;7684:9;7680:18;7667:32;7742:5;7735:13;7728:21;7721:5;7718:32;7708:60;;7764:1;7761;7754:12;7708:60;7787:5;7777:15;;;7451:347;;;;;:::o;7803:667::-;7898:6;7906;7914;7922;7975:3;7963:9;7954:7;7950:23;7946:33;7943:53;;;7992:1;7989;7982:12;7943:53;8015:29;8034:9;8015:29;:::i;:::-;8005:39;;8063:38;8097:2;8086:9;8082:18;8063:38;:::i;:::-;8053:48;;8148:2;8137:9;8133:18;8120:32;8110:42;;8203:2;8192:9;8188:18;8175:32;-1:-1:-1;;;;;8222:6:1;8219:30;8216:50;;;8262:1;8259;8252:12;8216:50;8285:22;;8338:4;8330:13;;8326:27;-1:-1:-1;8316:55:1;;8367:1;8364;8357:12;8316:55;8390:74;8456:7;8451:2;8438:16;8433:2;8429;8425:11;8390:74;:::i;:::-;8380:84;;;7803:667;;;;;;;:::o;8475:127::-;8536:10;8531:3;8527:20;8524:1;8517:31;8567:4;8564:1;8557:15;8591:4;8588:1;8581:15;8607:338;8749:2;8734:18;;8782:1;8771:13;;8761:144;;8827:10;8822:3;8818:20;8815:1;8808:31;8862:4;8859:1;8852:15;8890:4;8887:1;8880:15;8761:144;8914:25;;;8607:338;:::o;8950:260::-;9018:6;9026;9079:2;9067:9;9058:7;9054:23;9050:32;9047:52;;;9095:1;9092;9085:12;9047:52;9118:29;9137:9;9118:29;:::i;:::-;9108:39;;9166:38;9200:2;9189:9;9185:18;9166:38;:::i;9215:380::-;9294:1;9290:12;;;;9337;;;9358:61;;9412:4;9404:6;9400:17;9390:27;;9358:61;9465:2;9457:6;9454:14;9434:18;9431:38;9428:161;;;9511:10;9506:3;9502:20;9499:1;9492:31;9546:4;9543:1;9536:15;9574:4;9571:1;9564:15;9428:161;;9215:380;;;:::o;9600:356::-;9802:2;9784:21;;;9821:18;;;9814:30;9880:34;9875:2;9860:18;;9853:62;9947:2;9932:18;;9600:356::o;9961:331::-;10163:2;10145:21;;;10202:1;10182:18;;;10175:29;-1:-1:-1;;;10235:2:1;10220:18;;10213:38;10283:2;10268:18;;9961:331::o;10507:127::-;10568:10;10563:3;10559:20;10556:1;10549:31;10599:4;10596:1;10589:15;10623:4;10620:1;10613:15;10639:127;10700:10;10695:3;10691:20;10688:1;10681:31;10731:4;10728:1;10721:15;10755:4;10752:1;10745:15;10771:135;10810:3;-1:-1:-1;;10831:17:1;;10828:43;;;10851:18;;:::i;:::-;-1:-1:-1;10898:1:1;10887:13;;10771:135::o;12424:344::-;12626:2;12608:21;;;12665:2;12645:18;;;12638:30;-1:-1:-1;;;12699:2:1;12684:18;;12677:50;12759:2;12744:18;;12424:344::o;12773:128::-;12813:3;12844:1;12840:6;12837:1;12834:13;12831:39;;;12850:18;;:::i;:::-;-1:-1:-1;12886:9:1;;12773:128::o;12906:340::-;13108:2;13090:21;;;13147:2;13127:18;;;13120:30;-1:-1:-1;;;13181:2:1;13166:18;;13159:46;13237:2;13222:18;;12906:340::o;13251:353::-;13453:2;13435:21;;;13492:2;13472:18;;;13465:30;13531:31;13526:2;13511:18;;13504:59;13595:2;13580:18;;13251:353::o;13609:168::-;13649:7;13715:1;13711;13707:6;13703:14;13700:1;13697:21;13692:1;13685:9;13678:17;13674:45;13671:71;;;13722:18;;:::i;:::-;-1:-1:-1;13762:9:1;;13609:168::o;13782:340::-;13984:2;13966:21;;;14023:2;14003:18;;;13996:30;-1:-1:-1;;;14057:2:1;14042:18;;14035:46;14113:2;14098:18;;13782:340::o;16357:637::-;16637:3;16675:6;16669:13;16691:53;16737:6;16732:3;16725:4;16717:6;16713:17;16691:53;:::i;:::-;16807:13;;16766:16;;;;16829:57;16807:13;16766:16;16863:4;16851:17;;16829:57;:::i;:::-;-1:-1:-1;;;16908:20:1;;16937:22;;;16986:1;16975:13;;16357:637;-1:-1:-1;;;;16357:637:1:o;17811:489::-;-1:-1:-1;;;;;18080:15:1;;;18062:34;;18132:15;;18127:2;18112:18;;18105:43;18179:2;18164:18;;18157:34;;;18227:3;18222:2;18207:18;;18200:31;;;18005:4;;18248:46;;18274:19;;18266:6;18248:46;:::i;:::-;18240:54;17811:489;-1:-1:-1;;;;;;17811:489:1:o;18305:249::-;18374:6;18427:2;18415:9;18406:7;18402:23;18398:32;18395:52;;;18443:1;18440;18433:12;18395:52;18475:9;18469:16;18494:30;18518:5;18494:30;:::i;18559:125::-;18599:4;18627:1;18624;18621:8;18618:34;;;18632:18;;:::i;:::-;-1:-1:-1;18669:9:1;;18559:125::o;18689:127::-;18750:10;18745:3;18741:20;18738:1;18731:31;18781:4;18778:1;18771:15;18805:4;18802:1;18795:15;18821:112;18853:1;18879;18869:35;;18884:18;;:::i;:::-;-1:-1:-1;18918:9:1;;18821:112::o;18938:120::-;18978:1;19004;18994:35;;19009:18;;:::i;:::-;-1:-1:-1;19043:9:1;;18938:120::o

Swarm Source

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