ETH Price: $3,610.27 (+9.36%)

Token

Pumpkinheads (PH)
 

Overview

Max Total Supply

5,500 PH

Holders

1,674

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
joielly.eth
Balance
2 PH
0xc60b1704717f678cf1c998adc88a651d122993aa
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:
Pumpkins

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-22
*/

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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



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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/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



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



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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/Pumpkins.sol


pragma solidity >=0.4.22 <0.9.0;




abstract contract Verifiable {
    /* 1. Unlock MetaMask account
    ethereum.enable()
    */

    /* 2. Get message hash to sign
    getMessageHash(
        0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C,
        123,
        "coffee and donuts",
        1
    )

    hash = "0xcf36ac4f97dc10d91fc2cbb20d718e94a8cbfe0f82eaedc6a4aa38946fb797cd"
    */
    function getMessageHash(
        string memory _code,
        string memory _method
    ) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(_code, _method));
    }

    function getMessageHashWithAddress(
      string memory _code,
      string memory _method,
      address user
    ) public pure returns(bytes32) {
      return keccak256(abi.encodePacked(_code, _method, user));
    }

    function verifySignature(
      bytes32 _message,
      bytes memory _signature,
      address _signer
    ) public pure returns (bool) {
      (address recoveredSigner, ECDSA.RecoverError error) = ECDSA.tryRecover(
        ECDSA.toEthSignedMessageHash(_message),
        _signature
      );

      if (error == ECDSA.RecoverError.NoError && recoveredSigner == _signer) {
        return true;
      } else {
        return false;
      }
    }
}

contract Pumpkins is Ownable, ERC721Enumerable, Verifiable {
  using Strings for uint256;

  bool public isMintActive;
  string public baseURI;
  uint256 public presaleStartAt;
  uint public mintPrice = 0.035 ether;
  mapping(string => bool) public _usedCoupons;
  uint public givenAwayPumpkins = 0;
  uint public mintedPumpkins = 0;

  uint256 constant PRESALE_DURATION = 86400; // 1 day in seconds
  uint constant TOTAL_SUPPLY = 5555;
  uint constant MAX_PER_PURCHASE = 5;
  uint constant GIVEAWAY_POOL = 170;

  uint public REVEAL_TIMESTAMP;

  // settable only once, to be assigned after reveal
  string public PUMPKIN_PROVENANCE;

  uint public startingIndexBlock;
  uint public startingIndex;

  constructor(
    bool _isMintActive,
    string memory _newURI,
    uint _presaleStartAt,
    uint _revealTimestamp
  ) ERC721("Pumpkinheads", "PH") {
    isMintActive = _isMintActive;
    baseURI = _newURI;
    presaleStartAt = _presaleStartAt;
    REVEAL_TIMESTAMP = _revealTimestamp;
  }

  modifier presaleOngoing() {
    require(block.timestamp >= presaleStartAt, "Pumpkinheads: Presale has not started yet");
    require(block.timestamp <= presaleStartAt + PRESALE_DURATION, "Pumpkinheads: Presale already ended");
    _;
  }

  modifier validSignature(
    string memory _couponCode,
    string memory _method,
    bytes memory _signature
  ) {
    require(
      verifySignature(
        getMessageHash(_couponCode, _method),
        _signature,
        owner()
      ),
      "Pumpkinheads: Invalid Signature"
    );

    require(!_usedCoupons[_couponCode], "Pumpkinheads: Coupon code already used");
    _;
  }

  modifier validSignatureForFreeMint(
    string memory _couponCode,
    address _user,
    bytes memory _signature
  ) {
    require(
      verifySignature(
          getMessageHashWithAddress(_couponCode, "freeMint", _user),
          _signature,
          owner()
      ),
      "Pumpkinheads: Invalid Free Mint Signature"
    );

    require(!_usedCoupons[_couponCode], "Pumpkinheads: Coupon code already used");
    _;
  }

  function setIsMintActive(bool _isMintActive) public onlyOwner {
    isMintActive = _isMintActive;
  }

  function _mintPumpkins(address to, uint _numTokens, uint _mintedSoFar) internal {
    for (uint i = 0; i < _numTokens; i++) {
      _safeMint(to, _mintedSoFar + i);
    }

    setStartingBlock(_mintedSoFar + _numTokens);
  }

  function mint(uint _numTokens) public payable {
    require(isMintActive, "Pumpkinheads: Sale is not active");

    uint mintedSoFar = mintedPumpkins + GIVEAWAY_POOL;
    require(_numTokens > 0 && _numTokens <= MAX_PER_PURCHASE, "Pumpkinheads: Invalid number of pumpkins!");
    require(mintedSoFar + _numTokens <= TOTAL_SUPPLY, "Pumpkinheads: Not enough tokens left!");
    require(msg.value >= mintPrice * _numTokens, "Pumpkinheads: Not enough funds!");
    _mintPumpkins(_msgSender(), _numTokens, mintedSoFar);
    mintedPumpkins += _numTokens;
  }

  function freeMint(
    string memory _couponCode,
    bytes memory _signature
  )
  public
  presaleOngoing
  validSignatureForFreeMint(_couponCode, _msgSender(), _signature)
  {
    uint mintedSoFar = mintedPumpkins + GIVEAWAY_POOL;
    require(mintedSoFar < TOTAL_SUPPLY, "Pumpkinheads: Not enough tokens left!");
    _mintPumpkins(_msgSender(), 1, mintedSoFar);
    _usedCoupons[_couponCode] = true;
    mintedPumpkins += 1;
  }

  function presaleMint(
    string memory _presalePass,
    bytes memory _signature
  ) public
    payable
    presaleOngoing
    validSignature(_presalePass, "presaleMint", _signature) {
      uint mintedSoFar = mintedPumpkins + GIVEAWAY_POOL;
      require(mintedSoFar < TOTAL_SUPPLY, "Pumpkinheads: Not enough tokens left!");
      require(msg.value >= mintPrice, "Pumpkinheads: Not enough funds!");
      _mintPumpkins(_msgSender(), 1, mintedSoFar);
      _usedCoupons[_presalePass] = true;
      mintedPumpkins += 1;
    }

  function pumpkinsOfOwner(address owner) public view returns (uint[] memory) {
    uint balance = balanceOf(owner);
    uint[] memory wallet = new uint[](balance);

    for (uint i = 0; i < balance; i++) {
      wallet[i] = tokenOfOwnerByIndex(owner, i);
    }

    return wallet;
  }

  function giveaway(address _receiver, uint _numTokens) public onlyOwner {
    require(givenAwayPumpkins + _numTokens <= GIVEAWAY_POOL, "Pumpkinheads: Not enough tokens left!");
    _mintPumpkins(_receiver, _numTokens, givenAwayPumpkins);
    givenAwayPumpkins += _numTokens;
  }

  function ownsAllTokens(address _owner, uint[] memory _tokenIds) public view returns (bool) {
    for (uint i = 0; i < _tokenIds.length; i++) {
      uint tokenIndex = _tokenIds[i];
      if (ownerOf(tokenIndex) != _owner) {
        return false;
      }
    }

    return true;
  }

  function exists(uint id) public view returns (bool) {
    return _exists(id);
  }

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

  function setMintPrice(uint _mintPrice) public onlyOwner {
    mintPrice = _mintPrice;
  }

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

  function isValidSignature(
    string memory _couponCode,
    string memory _method,
    bytes memory _signature
  )
  public
  view
  validSignature(_couponCode, _method, _signature)
  returns (bool)
  {
    return true;
  }

  function isValidFreeMintSignature(
    string memory _couponCode,
    address _user,
    bytes memory _signature
  ) public
    view
    validSignatureForFreeMint(_couponCode, _user, _signature)
    returns (bool)
  {
      return true;
  }

  function withdraw() public payable onlyOwner {
    uint balance = address(this).balance;
    payable(msg.sender).transfer(balance);
  }

  function setProvenanceHash(string memory _provenance) public onlyOwner {
    require(bytes(PUMPKIN_PROVENANCE).length == 0, "Pumpkinheads: Provenance already set");
    PUMPKIN_PROVENANCE = _provenance;
  }

  function setStartingIndex() public {
    require(startingIndex == 0, "Starting index is already set");
    require(startingIndexBlock != 0, "Starting index block must be set");

    startingIndex = uint(blockhash(startingIndexBlock)) % TOTAL_SUPPLY;
    // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
    if (block.number - startingIndexBlock > 255) {
        startingIndex = uint(blockhash(block.number - 1)) % TOTAL_SUPPLY;
    }

    // Prevent default sequence
    if (startingIndex == 0) {
        startingIndex = startingIndex + 1;
    }
  }

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

    uint256 artId = (tokenId + startingIndex) % TOTAL_SUPPLY;
    return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, artId.toString())) : "";
  }

  function setStartingBlock(uint _mintedSoFar) internal {
    if (startingIndexBlock == 0 && (_mintedSoFar == TOTAL_SUPPLY || block.timestamp >= REVEAL_TIMESTAMP)) {
      startingIndexBlock = block.number;
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bool","name":"_isMintActive","type":"bool"},{"internalType":"string","name":"_newURI","type":"string"},{"internalType":"uint256","name":"_presaleStartAt","type":"uint256"},{"internalType":"uint256","name":"_revealTimestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PUMPKIN_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"_usedCoupons","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_couponCode","type":"string"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"freeMint","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":"string","name":"_code","type":"string"},{"internalType":"string","name":"_method","type":"string"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"_code","type":"string"},{"internalType":"string","name":"_method","type":"string"},{"internalType":"address","name":"user","type":"address"}],"name":"getMessageHashWithAddress","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"givenAwayPumpkins","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_couponCode","type":"string"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"isValidFreeMintSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_couponCode","type":"string"},{"internalType":"string","name":"_method","type":"string"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedPumpkins","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"ownsAllTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_presalePass","type":"string"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleStartAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"pumpkinsOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isMintActive","type":"bool"}],"name":"setIsMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_message","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"address","name":"_signer","type":"address"}],"name":"verifySignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052667c585087238000600e55600060105560006011553480156200002657600080fd5b506040516200370a3803806200370a833981016040819052620000499162000217565b6040518060400160405280600c81526020016b50756d706b696e686561647360a01b815250604051806040016040528060028152602001610a0960f31b815250620000a36200009d6200010760201b60201c565b6200010b565b8151620000b89060019060208501906200015b565b508051620000ce9060029060208401906200015b565b5050600b805460ff1916861515179055508251620000f490600c9060208601906200015b565b50600d91909155601255506200035b9050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000169906200031e565b90600052602060002090601f0160209004810192826200018d5760008555620001d8565b82601f10620001a857805160ff1916838001178555620001d8565b82800160010185558215620001d8579182015b82811115620001d8578251825591602001919060010190620001bb565b50620001e6929150620001ea565b5090565b5b80821115620001e65760008155600101620001eb565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156200022e57600080fd5b845180151581146200023f57600080fd5b602086810151919550906001600160401b03808211156200025f57600080fd5b818801915088601f8301126200027457600080fd5b81518181111562000289576200028962000201565b604051601f8201601f19908116603f01168101908382118183101715620002b457620002b462000201565b816040528281528b86848701011115620002cd57600080fd5b600093505b82841015620002f15784840186015181850187015292850192620002d2565b82841115620003035760008684830101525b60408b01516060909b0151999c909b50975050505050505050565b600181811c908216806200033357607f821691505b602082108114156200035557634e487b7160e01b600052602260045260246000fd5b50919050565b61339f806200036b6000396000f3fe6080604052600436106102935760003560e01c80635ea4a5201161015a578063b88d4fde116100c1578063e44a19dd1161007a578063e44a19dd1461078f578063e985e9c5146107a4578063e9866550146107ed578063f2fde38b14610802578063f4a0a52814610822578063fa4e25b41461084257600080fd5b8063b88d4fde146106f7578063bf3b12c114610717578063c87b56dd1461072d578063cb774d471461074d578063df4449f314610763578063e36d64981461077957600080fd5b80638da5cb5b116101135780638da5cb5b1461065e57806395d89b411461067c578063a0712d6814610691578063a22cb465146106a4578063a2f4dc15146106c4578063acca3eb5146106d757600080fd5b80635ea4a520146105b15780636352211e146105de5780636817c76c146105fe5780636c0360eb1461061457806370a0823114610629578063715018a61461064957600080fd5b80633b53aab0116101fe5780634f6ccce7116101b75780634f6ccce7146105015780635172162a1461052157806355f804b3146105375780635a45125e146105575780635a5084d0146105775780635b92ac0d1461059757600080fd5b80633b53aab0146104595780633ccfd60b1461047957806342842e0e146104815780634c208e92146104a15780634ce98417146104c15780634f558e79146104e157600080fd5b8063109695231161025057806310969523146103a457806318160ddd146103c457806318e20a38146103e357806323b872dd146103f95780632f745c591461041957806331cd41991461043957600080fd5b806301ffc9a714610298578063050225ea146102cd57806306fdde03146102ef578063081812fc14610311578063095ea7b31461034957806309bba3b614610369575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612847565b610862565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102ed6102e8366004612880565b61088d565b005b3480156102fb57600080fd5b50610304610916565b6040516102c49190612902565b34801561031d57600080fd5b5061033161032c366004612915565b6109a8565b6040516001600160a01b0390911681526020016102c4565b34801561035557600080fd5b506102ed610364366004612880565b610a3d565b34801561037557600080fd5b506102b86103843660046129e5565b8051602081830181018051600f8252928201919093012091525460ff1681565b3480156103b057600080fd5b506102ed6103bf3660046129e5565b610b53565b3480156103d057600080fd5b506009545b6040519081526020016102c4565b3480156103ef57600080fd5b506103d560125481565b34801561040557600080fd5b506102ed610414366004612a1a565b610bfc565b34801561042557600080fd5b506103d5610434366004612880565b610c2d565b34801561044557600080fd5b506102b8610454366004612a56565b610cc3565b34801561046557600080fd5b506102b8610474366004612aad565b610d7d565b6102ed610e2c565b34801561048d57600080fd5b506102ed61049c366004612a1a565b610e85565b3480156104ad57600080fd5b506102ed6104bc366004612b21565b610ea0565b3480156104cd57600080fd5b506103d56104dc366004612b21565b611016565b3480156104ed57600080fd5b506102b86104fc366004612915565b611049565b34801561050d57600080fd5b506103d561051c366004612915565b611068565b34801561052d57600080fd5b506103d5600d5481565b34801561054357600080fd5b506102ed6105523660046129e5565b6110fb565b34801561056357600080fd5b506103d5610572366004612b85565b611138565b34801561058357600080fd5b506102b8610592366004612be1565b61116e565b3480156105a357600080fd5b50600b546102b89060ff1681565b3480156105bd57600080fd5b506105d16105cc366004612c3c565b6111cc565b6040516102c49190612c57565b3480156105ea57600080fd5b506103316105f9366004612915565b61126e565b34801561060a57600080fd5b506103d5600e5481565b34801561062057600080fd5b506103046112e5565b34801561063557600080fd5b506103d5610644366004612c3c565b611373565b34801561065557600080fd5b506102ed6113fa565b34801561066a57600080fd5b506000546001600160a01b0316610331565b34801561068857600080fd5b50610304611430565b6102ed61069f366004612915565b61143f565b3480156106b057600080fd5b506102ed6106bf366004612cab565b6115b8565b6102ed6106d2366004612b21565b61167d565b3480156106e357600080fd5b506102b86106f2366004612cde565b611814565b34801561070357600080fd5b506102ed610712366004612d97565b611888565b34801561072357600080fd5b506103d560115481565b34801561073957600080fd5b50610304610748366004612915565b6118c0565b34801561075957600080fd5b506103d560155481565b34801561076f57600080fd5b506103d560105481565b34801561078557600080fd5b506103d560145481565b34801561079b57600080fd5b506103046119bb565b3480156107b057600080fd5b506102b86107bf366004612dff565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156107f957600080fd5b506102ed6119c8565b34801561080e57600080fd5b506102ed61081d366004612c3c565b611ac8565b34801561082e57600080fd5b506102ed61083d366004612915565b611b63565b34801561084e57600080fd5b506102ed61085d366004612e29565b611b92565b60006001600160e01b0319821663780e9d6360e01b1480610887575061088782611bcf565b92915050565b6000546001600160a01b031633146108c05760405162461bcd60e51b81526004016108b790612e44565b60405180910390fd5b60aa816010546108d09190612e8f565b11156108ee5760405162461bcd60e51b81526004016108b790612ea7565b6108fb8282601054611c1f565b806010600082825461090d9190612e8f565b90915550505050565b60606001805461092590612eec565b80601f016020809104026020016040519081016040528092919081815260200182805461095190612eec565b801561099e5780601f106109735761010080835404028352916020019161099e565b820191906000526020600020905b81548152906001019060200180831161098157829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610a215760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108b7565b506000908152600560205260409020546001600160a01b031690565b6000610a488261126e565b9050806001600160a01b0316836001600160a01b03161415610ab65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108b7565b336001600160a01b0382161480610ad25750610ad281336107bf565b610b445760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108b7565b610b4e8383611c62565b505050565b6000546001600160a01b03163314610b7d5760405162461bcd60e51b81526004016108b790612e44565b60138054610b8a90612eec565b159050610be55760405162461bcd60e51b8152602060048201526024808201527f50756d706b696e68656164733a2050726f76656e616e636520616c7265616479604482015263081cd95d60e21b60648201526084016108b7565b8051610bf8906013906020840190612798565b5050565b610c063382611cd0565b610c225760405162461bcd60e51b81526004016108b790612f27565b610b4e838383611dc7565b6000610c3883611373565b8210610c9a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108b7565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000806000610d28610d22876040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b86611f72565b90925090506000816004811115610d4157610d41612f78565b148015610d5f5750836001600160a01b0316826001600160a01b0316145b15610d6f57600192505050610d76565b6000925050505b9392505050565b6000838383610dc3610db08460405180604001604052806008815260200167199c9959535a5b9d60c21b81525085611138565b826104546000546001600160a01b031690565b610ddf5760405162461bcd60e51b81526004016108b790612f8e565b600f83604051610def9190612ff3565b9081526040519081900360200190205460ff1615610e1f5760405162461bcd60e51b81526004016108b79061300f565b5060019695505050505050565b6000546001600160a01b03163314610e565760405162461bcd60e51b81526004016108b790612e44565b6040514790339082156108fc029083906000818181858888f19350505050158015610bf8573d6000803e3d6000fd5b610b4e83838360405180602001604052806000815250611888565b600d54421015610ec25760405162461bcd60e51b81526004016108b790613055565b62015180600d54610ed39190612e8f565b421115610ef25760405162461bcd60e51b81526004016108b79061309e565b813382610f23610db08460405180604001604052806008815260200167199c9959535a5b9d60c21b81525085611138565b610f3f5760405162461bcd60e51b81526004016108b790612f8e565b600f83604051610f4f9190612ff3565b9081526040519081900360200190205460ff1615610f7f5760405162461bcd60e51b81526004016108b79061300f565b600060aa601154610f909190612e8f565b90506115b38110610fb35760405162461bcd60e51b81526004016108b790612ea7565b610fbf33600183611c1f565b6001600f87604051610fd19190612ff3565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506001601160008282546110099190612e8f565b9091555050505050505050565b6000828260405160200161102b9291906130e1565b60405160208183030381529060405280519060200120905092915050565b6000818152600360205260408120546001600160a01b03161515610887565b600061107360095490565b82106110d65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108b7565b600982815481106110e9576110e9613110565b90600052602060002001549050919050565b6000546001600160a01b031633146111255760405162461bcd60e51b81526004016108b790612e44565b8051610bf890600c906020840190612798565b600083838360405160200161114f93929190613126565b6040516020818303038152906040528051906020012090509392505050565b6000838383611180610db08484611016565b610ddf5760405162461bcd60e51b815260206004820152601f60248201527f50756d706b696e68656164733a20496e76616c6964205369676e61747572650060448201526064016108b7565b606060006111d983611373565b905060008167ffffffffffffffff8111156111f6576111f661292e565b60405190808252806020026020018201604052801561121f578160200160208202803683370190505b50905060005b82811015611266576112378582610c2d565b82828151811061124957611249613110565b60209081029190910101528061125e81613171565b915050611225565b509392505050565b6000818152600360205260408120546001600160a01b0316806108875760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108b7565b600c80546112f290612eec565b80601f016020809104026020016040519081016040528092919081815260200182805461131e90612eec565b801561136b5780601f106113405761010080835404028352916020019161136b565b820191906000526020600020905b81548152906001019060200180831161134e57829003601f168201915b505050505081565b60006001600160a01b0382166113de5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108b7565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146114245760405162461bcd60e51b81526004016108b790612e44565b61142e6000611fe2565b565b60606002805461092590612eec565b600b5460ff166114915760405162461bcd60e51b815260206004820181905260248201527f50756d706b696e68656164733a2053616c65206973206e6f742061637469766560448201526064016108b7565b600060aa6011546114a29190612e8f565b90506000821180156114b5575060058211155b6115135760405162461bcd60e51b815260206004820152602960248201527f50756d706b696e68656164733a20496e76616c6964206e756d626572206f662060448201526870756d706b696e732160b81b60648201526084016108b7565b6115b36115208383612e8f565b111561153e5760405162461bcd60e51b81526004016108b790612ea7565b81600e5461154c919061318c565b34101561159b5760405162461bcd60e51b815260206004820152601f60248201527f50756d706b696e68656164733a204e6f7420656e6f7567682066756e6473210060448201526064016108b7565b6115a6338383611c1f565b816011600082825461090d9190612e8f565b6001600160a01b0382163314156116115760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108b7565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600d5442101561169f5760405162461bcd60e51b81526004016108b790613055565b62015180600d546116b09190612e8f565b4211156116cf5760405162461bcd60e51b81526004016108b79061309e565b816040518060400160405280600b81526020016a1c1c995cd85b19535a5b9d60aa1b81525082611702610db08484611016565b61174e5760405162461bcd60e51b815260206004820152601f60248201527f50756d706b696e68656164733a20496e76616c6964205369676e61747572650060448201526064016108b7565b600f8360405161175e9190612ff3565b9081526040519081900360200190205460ff161561178e5760405162461bcd60e51b81526004016108b79061300f565b600060aa60115461179f9190612e8f565b90506115b381106117c25760405162461bcd60e51b81526004016108b790612ea7565b600e54341015610fb35760405162461bcd60e51b815260206004820152601f60248201527f50756d706b696e68656164733a204e6f7420656e6f7567682066756e6473210060448201526064016108b7565b6000805b825181101561187e57600083828151811061183557611835613110565b60200260200101519050846001600160a01b03166118528261126e565b6001600160a01b03161461186b57600092505050610887565b508061187681613171565b915050611818565b5060019392505050565b6118923383611cd0565b6118ae5760405162461bcd60e51b81526004016108b790612f27565b6118ba84848484612032565b50505050565b6000818152600360205260409020546060906001600160a01b031661193f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108b7565b60006115b3601554846119529190612e8f565b61195c91906131c1565b90506000600c805461196d90612eec565b9050116119895760405180602001604052806000815250610d76565b600c61199482612065565b6040516020016119a59291906131d5565b6040516020818303038152906040529392505050565b601380546112f290612eec565b60155415611a185760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c72656164792073657400000060448201526064016108b7565b601454611a675760405162461bcd60e51b815260206004820181905260248201527f5374617274696e6720696e64657820626c6f636b206d7573742062652073657460448201526064016108b7565b601454611a78906115b390406131c1565b60155560145460ff90611a8b904361327c565b1115611aae576115b3611a9f60014361327c565b611aaa9190406131c1565b6015555b60155461142e57601554611ac3906001612e8f565b601555565b6000546001600160a01b03163314611af25760405162461bcd60e51b81526004016108b790612e44565b6001600160a01b038116611b575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b7565b611b6081611fe2565b50565b6000546001600160a01b03163314611b8d5760405162461bcd60e51b81526004016108b790612e44565b600e55565b6000546001600160a01b03163314611bbc5760405162461bcd60e51b81526004016108b790612e44565b600b805460ff1916911515919091179055565b60006001600160e01b031982166380ac58cd60e01b1480611c0057506001600160e01b03198216635b5e139f60e01b145b8061088757506301ffc9a760e01b6001600160e01b0319831614610887565b60005b82811015611c4f57611c3d84611c388385612e8f565b612163565b80611c4781613171565b915050611c22565b50610b4e611c5d8383612e8f565b61217d565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c978261126e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316611d495760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108b7565b6000611d548361126e565b9050806001600160a01b0316846001600160a01b03161480611d8f5750836001600160a01b0316611d84846109a8565b6001600160a01b0316145b80611dbf57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611dda8261126e565b6001600160a01b031614611e425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108b7565b6001600160a01b038216611ea45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108b7565b611eaf8383836121a6565b611eba600082611c62565b6001600160a01b0383166000908152600460205260408120805460019290611ee390849061327c565b90915550506001600160a01b0382166000908152600460205260408120805460019290611f11908490612e8f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080825160411415611fa95760208301516040840151606085015160001a611f9d8782858561225e565b94509450505050611fdb565b825160401415611fd35760208301516040840151611fc886838361234b565b935093505050611fdb565b506000905060025b9250929050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61203d848484611dc7565b6120498484848461237a565b6118ba5760405162461bcd60e51b81526004016108b790613293565b6060816120895750506040805180820190915260018152600360fc1b602082015290565b8160005b81156120b3578061209d81613171565b91506120ac9050600a836132e5565b915061208d565b60008167ffffffffffffffff8111156120ce576120ce61292e565b6040519080825280601f01601f1916602001820160405280156120f8576020820181803683370190505b5090505b8415611dbf5761210d60018361327c565b915061211a600a866131c1565b612125906030612e8f565b60f81b81838151811061213a5761213a613110565b60200101906001600160f81b031916908160001a90535061215c600a866132e5565b94506120fc565b610bf8828260405180602001604052806000815250612487565b60145415801561219a57506115b381148061219a57506012544210155b15611b60574360145550565b6001600160a01b038316612201576121fc81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612224565b816001600160a01b0316836001600160a01b0316146122245761222483826124ba565b6001600160a01b03821661223b57610b4e81612557565b826001600160a01b0316826001600160a01b031614610b4e57610b4e8282612606565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156122955750600090506003612342565b8460ff16601b141580156122ad57508460ff16601c14155b156122be5750600090506004612342565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612312573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661233b57600060019250925050612342565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161236c8782888561225e565b935093505050935093915050565b60006001600160a01b0384163b1561247c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123be9033908990889088906004016132f9565b602060405180830381600087803b1580156123d857600080fd5b505af1925050508015612408575060408051601f3d908101601f1916820190925261240591810190613336565b60015b612462573d808015612436576040519150601f19603f3d011682016040523d82523d6000602084013e61243b565b606091505b50805161245a5760405162461bcd60e51b81526004016108b790613293565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dbf565b506001949350505050565b612491838361264a565b61249e600084848461237a565b610b4e5760405162461bcd60e51b81526004016108b790613293565b600060016124c784611373565b6124d1919061327c565b600083815260086020526040902054909150808214612524576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906125699060019061327c565b6000838152600a60205260408120546009805493945090928490811061259157612591613110565b9060005260206000200154905080600983815481106125b2576125b2613110565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806125ea576125ea613353565b6001900381819060005260206000200160009055905550505050565b600061261183611373565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160a01b0382166126a05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108b7565b6000818152600360205260409020546001600160a01b0316156127055760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108b7565b612711600083836121a6565b6001600160a01b038216600090815260046020526040812080546001929061273a908490612e8f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546127a490612eec565b90600052602060002090601f0160209004810192826127c6576000855561280c565b82601f106127df57805160ff191683800117855561280c565b8280016001018555821561280c579182015b8281111561280c5782518255916020019190600101906127f1565b5061281892915061281c565b5090565b5b80821115612818576000815560010161281d565b6001600160e01b031981168114611b6057600080fd5b60006020828403121561285957600080fd5b8135610d7681612831565b80356001600160a01b038116811461287b57600080fd5b919050565b6000806040838503121561289357600080fd5b61289c83612864565b946020939093013593505050565b60005b838110156128c55781810151838201526020016128ad565b838111156118ba5750506000910152565b600081518084526128ee8160208601602086016128aa565b601f01601f19169290920160200192915050565b602081526000610d7660208301846128d6565b60006020828403121561292757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561296d5761296d61292e565b604052919050565b600082601f83011261298657600080fd5b813567ffffffffffffffff8111156129a0576129a061292e565b6129b3601f8201601f1916602001612944565b8181528460208386010111156129c857600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156129f757600080fd5b813567ffffffffffffffff811115612a0e57600080fd5b611dbf84828501612975565b600080600060608486031215612a2f57600080fd5b612a3884612864565b9250612a4660208501612864565b9150604084013590509250925092565b600080600060608486031215612a6b57600080fd5b83359250602084013567ffffffffffffffff811115612a8957600080fd5b612a9586828701612975565b925050612aa460408501612864565b90509250925092565b600080600060608486031215612ac257600080fd5b833567ffffffffffffffff80821115612ada57600080fd5b612ae687838801612975565b9450612af460208701612864565b93506040860135915080821115612b0a57600080fd5b50612b1786828701612975565b9150509250925092565b60008060408385031215612b3457600080fd5b823567ffffffffffffffff80821115612b4c57600080fd5b612b5886838701612975565b93506020850135915080821115612b6e57600080fd5b50612b7b85828601612975565b9150509250929050565b600080600060608486031215612b9a57600080fd5b833567ffffffffffffffff80821115612bb257600080fd5b612bbe87838801612975565b94506020860135915080821115612bd457600080fd5b50612a9586828701612975565b600080600060608486031215612bf657600080fd5b833567ffffffffffffffff80821115612c0e57600080fd5b612c1a87838801612975565b94506020860135915080821115612c3057600080fd5b612af487838801612975565b600060208284031215612c4e57600080fd5b610d7682612864565b6020808252825182820181905260009190848201906040850190845b81811015612c8f57835183529284019291840191600101612c73565b50909695505050505050565b8035801515811461287b57600080fd5b60008060408385031215612cbe57600080fd5b612cc783612864565b9150612cd560208401612c9b565b90509250929050565b60008060408385031215612cf157600080fd5b612cfa83612864565b915060208084013567ffffffffffffffff80821115612d1857600080fd5b818601915086601f830112612d2c57600080fd5b813581811115612d3e57612d3e61292e565b8060051b9150612d4f848301612944565b8181529183018401918481019089841115612d6957600080fd5b938501935b83851015612d8757843582529385019390850190612d6e565b8096505050505050509250929050565b60008060008060808587031215612dad57600080fd5b612db685612864565b9350612dc460208601612864565b925060408501359150606085013567ffffffffffffffff811115612de757600080fd5b612df387828801612975565b91505092959194509250565b60008060408385031215612e1257600080fd5b612e1b83612864565b9150612cd560208401612864565b600060208284031215612e3b57600080fd5b610d7682612c9b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612ea257612ea2612e79565b500190565b60208082526025908201527f50756d706b696e68656164733a204e6f7420656e6f75676820746f6b656e73206040820152646c6566742160d81b606082015260800190565b600181811c90821680612f0057607f821691505b60208210811415612f2157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b60208082526029908201527f50756d706b696e68656164733a20496e76616c69642046726565204d696e74206040820152685369676e617475726560b81b606082015260800190565b60008151612fe98185602086016128aa565b9290920192915050565b600082516130058184602087016128aa565b9190910192915050565b60208082526026908201527f50756d706b696e68656164733a20436f75706f6e20636f646520616c726561646040820152651e481d5cd95960d21b606082015260800190565b60208082526029908201527f50756d706b696e68656164733a2050726573616c6520686173206e6f74207374604082015268185c9d1959081e595d60ba1b606082015260800190565b60208082526023908201527f50756d706b696e68656164733a2050726573616c6520616c726561647920656e60408201526219195960ea1b606082015260800190565b600083516130f38184602088016128aa565b8351908301906131078183602088016128aa565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b600084516131388184602089016128aa565b84519083019061314c8183602089016128aa565b60609490941b6bffffffffffffffffffffffff19169301928352505060140192915050565b600060001982141561318557613185612e79565b5060010190565b60008160001904831182151516156131a6576131a6612e79565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826131d0576131d06131ab565b500690565b600080845481600182811c9150808316806131f157607f831692505b602080841082141561321157634e487b7160e01b86526022600452602486fd5b818015613225576001811461323657613263565b60ff19861689528489019650613263565b60008b81526020902060005b8681101561325b5781548b820152908501908301613242565b505084890196505b5050505050506132738185612fd7565b95945050505050565b60008282101561328e5761328e612e79565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000826132f4576132f46131ab565b500490565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061332c908301846128d6565b9695505050505050565b60006020828403121561334857600080fd5b8151610d7681612831565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220a5380ccadec2fe5b7b08fd68332b2c6ce3d58d8c2a20aa690b56f06ad59f1dd064736f6c63430008090033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000061741560000000000000000000000000000000000000000000000000000000006176f0a0000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6170692e70756d706b696e68656164736e66742e636f6d2f6d657461646174612f0000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102935760003560e01c80635ea4a5201161015a578063b88d4fde116100c1578063e44a19dd1161007a578063e44a19dd1461078f578063e985e9c5146107a4578063e9866550146107ed578063f2fde38b14610802578063f4a0a52814610822578063fa4e25b41461084257600080fd5b8063b88d4fde146106f7578063bf3b12c114610717578063c87b56dd1461072d578063cb774d471461074d578063df4449f314610763578063e36d64981461077957600080fd5b80638da5cb5b116101135780638da5cb5b1461065e57806395d89b411461067c578063a0712d6814610691578063a22cb465146106a4578063a2f4dc15146106c4578063acca3eb5146106d757600080fd5b80635ea4a520146105b15780636352211e146105de5780636817c76c146105fe5780636c0360eb1461061457806370a0823114610629578063715018a61461064957600080fd5b80633b53aab0116101fe5780634f6ccce7116101b75780634f6ccce7146105015780635172162a1461052157806355f804b3146105375780635a45125e146105575780635a5084d0146105775780635b92ac0d1461059757600080fd5b80633b53aab0146104595780633ccfd60b1461047957806342842e0e146104815780634c208e92146104a15780634ce98417146104c15780634f558e79146104e157600080fd5b8063109695231161025057806310969523146103a457806318160ddd146103c457806318e20a38146103e357806323b872dd146103f95780632f745c591461041957806331cd41991461043957600080fd5b806301ffc9a714610298578063050225ea146102cd57806306fdde03146102ef578063081812fc14610311578063095ea7b31461034957806309bba3b614610369575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612847565b610862565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102ed6102e8366004612880565b61088d565b005b3480156102fb57600080fd5b50610304610916565b6040516102c49190612902565b34801561031d57600080fd5b5061033161032c366004612915565b6109a8565b6040516001600160a01b0390911681526020016102c4565b34801561035557600080fd5b506102ed610364366004612880565b610a3d565b34801561037557600080fd5b506102b86103843660046129e5565b8051602081830181018051600f8252928201919093012091525460ff1681565b3480156103b057600080fd5b506102ed6103bf3660046129e5565b610b53565b3480156103d057600080fd5b506009545b6040519081526020016102c4565b3480156103ef57600080fd5b506103d560125481565b34801561040557600080fd5b506102ed610414366004612a1a565b610bfc565b34801561042557600080fd5b506103d5610434366004612880565b610c2d565b34801561044557600080fd5b506102b8610454366004612a56565b610cc3565b34801561046557600080fd5b506102b8610474366004612aad565b610d7d565b6102ed610e2c565b34801561048d57600080fd5b506102ed61049c366004612a1a565b610e85565b3480156104ad57600080fd5b506102ed6104bc366004612b21565b610ea0565b3480156104cd57600080fd5b506103d56104dc366004612b21565b611016565b3480156104ed57600080fd5b506102b86104fc366004612915565b611049565b34801561050d57600080fd5b506103d561051c366004612915565b611068565b34801561052d57600080fd5b506103d5600d5481565b34801561054357600080fd5b506102ed6105523660046129e5565b6110fb565b34801561056357600080fd5b506103d5610572366004612b85565b611138565b34801561058357600080fd5b506102b8610592366004612be1565b61116e565b3480156105a357600080fd5b50600b546102b89060ff1681565b3480156105bd57600080fd5b506105d16105cc366004612c3c565b6111cc565b6040516102c49190612c57565b3480156105ea57600080fd5b506103316105f9366004612915565b61126e565b34801561060a57600080fd5b506103d5600e5481565b34801561062057600080fd5b506103046112e5565b34801561063557600080fd5b506103d5610644366004612c3c565b611373565b34801561065557600080fd5b506102ed6113fa565b34801561066a57600080fd5b506000546001600160a01b0316610331565b34801561068857600080fd5b50610304611430565b6102ed61069f366004612915565b61143f565b3480156106b057600080fd5b506102ed6106bf366004612cab565b6115b8565b6102ed6106d2366004612b21565b61167d565b3480156106e357600080fd5b506102b86106f2366004612cde565b611814565b34801561070357600080fd5b506102ed610712366004612d97565b611888565b34801561072357600080fd5b506103d560115481565b34801561073957600080fd5b50610304610748366004612915565b6118c0565b34801561075957600080fd5b506103d560155481565b34801561076f57600080fd5b506103d560105481565b34801561078557600080fd5b506103d560145481565b34801561079b57600080fd5b506103046119bb565b3480156107b057600080fd5b506102b86107bf366004612dff565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156107f957600080fd5b506102ed6119c8565b34801561080e57600080fd5b506102ed61081d366004612c3c565b611ac8565b34801561082e57600080fd5b506102ed61083d366004612915565b611b63565b34801561084e57600080fd5b506102ed61085d366004612e29565b611b92565b60006001600160e01b0319821663780e9d6360e01b1480610887575061088782611bcf565b92915050565b6000546001600160a01b031633146108c05760405162461bcd60e51b81526004016108b790612e44565b60405180910390fd5b60aa816010546108d09190612e8f565b11156108ee5760405162461bcd60e51b81526004016108b790612ea7565b6108fb8282601054611c1f565b806010600082825461090d9190612e8f565b90915550505050565b60606001805461092590612eec565b80601f016020809104026020016040519081016040528092919081815260200182805461095190612eec565b801561099e5780601f106109735761010080835404028352916020019161099e565b820191906000526020600020905b81548152906001019060200180831161098157829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610a215760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108b7565b506000908152600560205260409020546001600160a01b031690565b6000610a488261126e565b9050806001600160a01b0316836001600160a01b03161415610ab65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108b7565b336001600160a01b0382161480610ad25750610ad281336107bf565b610b445760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108b7565b610b4e8383611c62565b505050565b6000546001600160a01b03163314610b7d5760405162461bcd60e51b81526004016108b790612e44565b60138054610b8a90612eec565b159050610be55760405162461bcd60e51b8152602060048201526024808201527f50756d706b696e68656164733a2050726f76656e616e636520616c7265616479604482015263081cd95d60e21b60648201526084016108b7565b8051610bf8906013906020840190612798565b5050565b610c063382611cd0565b610c225760405162461bcd60e51b81526004016108b790612f27565b610b4e838383611dc7565b6000610c3883611373565b8210610c9a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108b7565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000806000610d28610d22876040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b86611f72565b90925090506000816004811115610d4157610d41612f78565b148015610d5f5750836001600160a01b0316826001600160a01b0316145b15610d6f57600192505050610d76565b6000925050505b9392505050565b6000838383610dc3610db08460405180604001604052806008815260200167199c9959535a5b9d60c21b81525085611138565b826104546000546001600160a01b031690565b610ddf5760405162461bcd60e51b81526004016108b790612f8e565b600f83604051610def9190612ff3565b9081526040519081900360200190205460ff1615610e1f5760405162461bcd60e51b81526004016108b79061300f565b5060019695505050505050565b6000546001600160a01b03163314610e565760405162461bcd60e51b81526004016108b790612e44565b6040514790339082156108fc029083906000818181858888f19350505050158015610bf8573d6000803e3d6000fd5b610b4e83838360405180602001604052806000815250611888565b600d54421015610ec25760405162461bcd60e51b81526004016108b790613055565b62015180600d54610ed39190612e8f565b421115610ef25760405162461bcd60e51b81526004016108b79061309e565b813382610f23610db08460405180604001604052806008815260200167199c9959535a5b9d60c21b81525085611138565b610f3f5760405162461bcd60e51b81526004016108b790612f8e565b600f83604051610f4f9190612ff3565b9081526040519081900360200190205460ff1615610f7f5760405162461bcd60e51b81526004016108b79061300f565b600060aa601154610f909190612e8f565b90506115b38110610fb35760405162461bcd60e51b81526004016108b790612ea7565b610fbf33600183611c1f565b6001600f87604051610fd19190612ff3565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506001601160008282546110099190612e8f565b9091555050505050505050565b6000828260405160200161102b9291906130e1565b60405160208183030381529060405280519060200120905092915050565b6000818152600360205260408120546001600160a01b03161515610887565b600061107360095490565b82106110d65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108b7565b600982815481106110e9576110e9613110565b90600052602060002001549050919050565b6000546001600160a01b031633146111255760405162461bcd60e51b81526004016108b790612e44565b8051610bf890600c906020840190612798565b600083838360405160200161114f93929190613126565b6040516020818303038152906040528051906020012090509392505050565b6000838383611180610db08484611016565b610ddf5760405162461bcd60e51b815260206004820152601f60248201527f50756d706b696e68656164733a20496e76616c6964205369676e61747572650060448201526064016108b7565b606060006111d983611373565b905060008167ffffffffffffffff8111156111f6576111f661292e565b60405190808252806020026020018201604052801561121f578160200160208202803683370190505b50905060005b82811015611266576112378582610c2d565b82828151811061124957611249613110565b60209081029190910101528061125e81613171565b915050611225565b509392505050565b6000818152600360205260408120546001600160a01b0316806108875760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108b7565b600c80546112f290612eec565b80601f016020809104026020016040519081016040528092919081815260200182805461131e90612eec565b801561136b5780601f106113405761010080835404028352916020019161136b565b820191906000526020600020905b81548152906001019060200180831161134e57829003601f168201915b505050505081565b60006001600160a01b0382166113de5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108b7565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146114245760405162461bcd60e51b81526004016108b790612e44565b61142e6000611fe2565b565b60606002805461092590612eec565b600b5460ff166114915760405162461bcd60e51b815260206004820181905260248201527f50756d706b696e68656164733a2053616c65206973206e6f742061637469766560448201526064016108b7565b600060aa6011546114a29190612e8f565b90506000821180156114b5575060058211155b6115135760405162461bcd60e51b815260206004820152602960248201527f50756d706b696e68656164733a20496e76616c6964206e756d626572206f662060448201526870756d706b696e732160b81b60648201526084016108b7565b6115b36115208383612e8f565b111561153e5760405162461bcd60e51b81526004016108b790612ea7565b81600e5461154c919061318c565b34101561159b5760405162461bcd60e51b815260206004820152601f60248201527f50756d706b696e68656164733a204e6f7420656e6f7567682066756e6473210060448201526064016108b7565b6115a6338383611c1f565b816011600082825461090d9190612e8f565b6001600160a01b0382163314156116115760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108b7565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600d5442101561169f5760405162461bcd60e51b81526004016108b790613055565b62015180600d546116b09190612e8f565b4211156116cf5760405162461bcd60e51b81526004016108b79061309e565b816040518060400160405280600b81526020016a1c1c995cd85b19535a5b9d60aa1b81525082611702610db08484611016565b61174e5760405162461bcd60e51b815260206004820152601f60248201527f50756d706b696e68656164733a20496e76616c6964205369676e61747572650060448201526064016108b7565b600f8360405161175e9190612ff3565b9081526040519081900360200190205460ff161561178e5760405162461bcd60e51b81526004016108b79061300f565b600060aa60115461179f9190612e8f565b90506115b381106117c25760405162461bcd60e51b81526004016108b790612ea7565b600e54341015610fb35760405162461bcd60e51b815260206004820152601f60248201527f50756d706b696e68656164733a204e6f7420656e6f7567682066756e6473210060448201526064016108b7565b6000805b825181101561187e57600083828151811061183557611835613110565b60200260200101519050846001600160a01b03166118528261126e565b6001600160a01b03161461186b57600092505050610887565b508061187681613171565b915050611818565b5060019392505050565b6118923383611cd0565b6118ae5760405162461bcd60e51b81526004016108b790612f27565b6118ba84848484612032565b50505050565b6000818152600360205260409020546060906001600160a01b031661193f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108b7565b60006115b3601554846119529190612e8f565b61195c91906131c1565b90506000600c805461196d90612eec565b9050116119895760405180602001604052806000815250610d76565b600c61199482612065565b6040516020016119a59291906131d5565b6040516020818303038152906040529392505050565b601380546112f290612eec565b60155415611a185760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c72656164792073657400000060448201526064016108b7565b601454611a675760405162461bcd60e51b815260206004820181905260248201527f5374617274696e6720696e64657820626c6f636b206d7573742062652073657460448201526064016108b7565b601454611a78906115b390406131c1565b60155560145460ff90611a8b904361327c565b1115611aae576115b3611a9f60014361327c565b611aaa9190406131c1565b6015555b60155461142e57601554611ac3906001612e8f565b601555565b6000546001600160a01b03163314611af25760405162461bcd60e51b81526004016108b790612e44565b6001600160a01b038116611b575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b7565b611b6081611fe2565b50565b6000546001600160a01b03163314611b8d5760405162461bcd60e51b81526004016108b790612e44565b600e55565b6000546001600160a01b03163314611bbc5760405162461bcd60e51b81526004016108b790612e44565b600b805460ff1916911515919091179055565b60006001600160e01b031982166380ac58cd60e01b1480611c0057506001600160e01b03198216635b5e139f60e01b145b8061088757506301ffc9a760e01b6001600160e01b0319831614610887565b60005b82811015611c4f57611c3d84611c388385612e8f565b612163565b80611c4781613171565b915050611c22565b50610b4e611c5d8383612e8f565b61217d565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c978261126e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316611d495760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108b7565b6000611d548361126e565b9050806001600160a01b0316846001600160a01b03161480611d8f5750836001600160a01b0316611d84846109a8565b6001600160a01b0316145b80611dbf57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611dda8261126e565b6001600160a01b031614611e425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108b7565b6001600160a01b038216611ea45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108b7565b611eaf8383836121a6565b611eba600082611c62565b6001600160a01b0383166000908152600460205260408120805460019290611ee390849061327c565b90915550506001600160a01b0382166000908152600460205260408120805460019290611f11908490612e8f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080825160411415611fa95760208301516040840151606085015160001a611f9d8782858561225e565b94509450505050611fdb565b825160401415611fd35760208301516040840151611fc886838361234b565b935093505050611fdb565b506000905060025b9250929050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61203d848484611dc7565b6120498484848461237a565b6118ba5760405162461bcd60e51b81526004016108b790613293565b6060816120895750506040805180820190915260018152600360fc1b602082015290565b8160005b81156120b3578061209d81613171565b91506120ac9050600a836132e5565b915061208d565b60008167ffffffffffffffff8111156120ce576120ce61292e565b6040519080825280601f01601f1916602001820160405280156120f8576020820181803683370190505b5090505b8415611dbf5761210d60018361327c565b915061211a600a866131c1565b612125906030612e8f565b60f81b81838151811061213a5761213a613110565b60200101906001600160f81b031916908160001a90535061215c600a866132e5565b94506120fc565b610bf8828260405180602001604052806000815250612487565b60145415801561219a57506115b381148061219a57506012544210155b15611b60574360145550565b6001600160a01b038316612201576121fc81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612224565b816001600160a01b0316836001600160a01b0316146122245761222483826124ba565b6001600160a01b03821661223b57610b4e81612557565b826001600160a01b0316826001600160a01b031614610b4e57610b4e8282612606565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156122955750600090506003612342565b8460ff16601b141580156122ad57508460ff16601c14155b156122be5750600090506004612342565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612312573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661233b57600060019250925050612342565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161236c8782888561225e565b935093505050935093915050565b60006001600160a01b0384163b1561247c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123be9033908990889088906004016132f9565b602060405180830381600087803b1580156123d857600080fd5b505af1925050508015612408575060408051601f3d908101601f1916820190925261240591810190613336565b60015b612462573d808015612436576040519150601f19603f3d011682016040523d82523d6000602084013e61243b565b606091505b50805161245a5760405162461bcd60e51b81526004016108b790613293565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dbf565b506001949350505050565b612491838361264a565b61249e600084848461237a565b610b4e5760405162461bcd60e51b81526004016108b790613293565b600060016124c784611373565b6124d1919061327c565b600083815260086020526040902054909150808214612524576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906125699060019061327c565b6000838152600a60205260408120546009805493945090928490811061259157612591613110565b9060005260206000200154905080600983815481106125b2576125b2613110565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806125ea576125ea613353565b6001900381819060005260206000200160009055905550505050565b600061261183611373565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160a01b0382166126a05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108b7565b6000818152600360205260409020546001600160a01b0316156127055760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108b7565b612711600083836121a6565b6001600160a01b038216600090815260046020526040812080546001929061273a908490612e8f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546127a490612eec565b90600052602060002090601f0160209004810192826127c6576000855561280c565b82601f106127df57805160ff191683800117855561280c565b8280016001018555821561280c579182015b8281111561280c5782518255916020019190600101906127f1565b5061281892915061281c565b5090565b5b80821115612818576000815560010161281d565b6001600160e01b031981168114611b6057600080fd5b60006020828403121561285957600080fd5b8135610d7681612831565b80356001600160a01b038116811461287b57600080fd5b919050565b6000806040838503121561289357600080fd5b61289c83612864565b946020939093013593505050565b60005b838110156128c55781810151838201526020016128ad565b838111156118ba5750506000910152565b600081518084526128ee8160208601602086016128aa565b601f01601f19169290920160200192915050565b602081526000610d7660208301846128d6565b60006020828403121561292757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561296d5761296d61292e565b604052919050565b600082601f83011261298657600080fd5b813567ffffffffffffffff8111156129a0576129a061292e565b6129b3601f8201601f1916602001612944565b8181528460208386010111156129c857600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156129f757600080fd5b813567ffffffffffffffff811115612a0e57600080fd5b611dbf84828501612975565b600080600060608486031215612a2f57600080fd5b612a3884612864565b9250612a4660208501612864565b9150604084013590509250925092565b600080600060608486031215612a6b57600080fd5b83359250602084013567ffffffffffffffff811115612a8957600080fd5b612a9586828701612975565b925050612aa460408501612864565b90509250925092565b600080600060608486031215612ac257600080fd5b833567ffffffffffffffff80821115612ada57600080fd5b612ae687838801612975565b9450612af460208701612864565b93506040860135915080821115612b0a57600080fd5b50612b1786828701612975565b9150509250925092565b60008060408385031215612b3457600080fd5b823567ffffffffffffffff80821115612b4c57600080fd5b612b5886838701612975565b93506020850135915080821115612b6e57600080fd5b50612b7b85828601612975565b9150509250929050565b600080600060608486031215612b9a57600080fd5b833567ffffffffffffffff80821115612bb257600080fd5b612bbe87838801612975565b94506020860135915080821115612bd457600080fd5b50612a9586828701612975565b600080600060608486031215612bf657600080fd5b833567ffffffffffffffff80821115612c0e57600080fd5b612c1a87838801612975565b94506020860135915080821115612c3057600080fd5b612af487838801612975565b600060208284031215612c4e57600080fd5b610d7682612864565b6020808252825182820181905260009190848201906040850190845b81811015612c8f57835183529284019291840191600101612c73565b50909695505050505050565b8035801515811461287b57600080fd5b60008060408385031215612cbe57600080fd5b612cc783612864565b9150612cd560208401612c9b565b90509250929050565b60008060408385031215612cf157600080fd5b612cfa83612864565b915060208084013567ffffffffffffffff80821115612d1857600080fd5b818601915086601f830112612d2c57600080fd5b813581811115612d3e57612d3e61292e565b8060051b9150612d4f848301612944565b8181529183018401918481019089841115612d6957600080fd5b938501935b83851015612d8757843582529385019390850190612d6e565b8096505050505050509250929050565b60008060008060808587031215612dad57600080fd5b612db685612864565b9350612dc460208601612864565b925060408501359150606085013567ffffffffffffffff811115612de757600080fd5b612df387828801612975565b91505092959194509250565b60008060408385031215612e1257600080fd5b612e1b83612864565b9150612cd560208401612864565b600060208284031215612e3b57600080fd5b610d7682612c9b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612ea257612ea2612e79565b500190565b60208082526025908201527f50756d706b696e68656164733a204e6f7420656e6f75676820746f6b656e73206040820152646c6566742160d81b606082015260800190565b600181811c90821680612f0057607f821691505b60208210811415612f2157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b60208082526029908201527f50756d706b696e68656164733a20496e76616c69642046726565204d696e74206040820152685369676e617475726560b81b606082015260800190565b60008151612fe98185602086016128aa565b9290920192915050565b600082516130058184602087016128aa565b9190910192915050565b60208082526026908201527f50756d706b696e68656164733a20436f75706f6e20636f646520616c726561646040820152651e481d5cd95960d21b606082015260800190565b60208082526029908201527f50756d706b696e68656164733a2050726573616c6520686173206e6f74207374604082015268185c9d1959081e595d60ba1b606082015260800190565b60208082526023908201527f50756d706b696e68656164733a2050726573616c6520616c726561647920656e60408201526219195960ea1b606082015260800190565b600083516130f38184602088016128aa565b8351908301906131078183602088016128aa565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b600084516131388184602089016128aa565b84519083019061314c8183602089016128aa565b60609490941b6bffffffffffffffffffffffff19169301928352505060140192915050565b600060001982141561318557613185612e79565b5060010190565b60008160001904831182151516156131a6576131a6612e79565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826131d0576131d06131ab565b500690565b600080845481600182811c9150808316806131f157607f831692505b602080841082141561321157634e487b7160e01b86526022600452602486fd5b818015613225576001811461323657613263565b60ff19861689528489019650613263565b60008b81526020902060005b8681101561325b5781548b820152908501908301613242565b505084890196505b5050505050506132738185612fd7565b95945050505050565b60008282101561328e5761328e612e79565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000826132f4576132f46131ab565b500490565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061332c908301846128d6565b9695505050505050565b60006020828403121561334857600080fd5b8151610d7681612831565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220a5380ccadec2fe5b7b08fd68332b2c6ce3d58d8c2a20aa690b56f06ad59f1dd064736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000061741560000000000000000000000000000000000000000000000000000000006176f0a0000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6170692e70756d706b696e68656164736e66742e636f6d2f6d657461646174612f0000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _isMintActive (bool): False
Arg [1] : _newURI (string): https://api.pumpkinheadsnft.com/metadata/
Arg [2] : _presaleStartAt (uint256): 1634997600
Arg [3] : _revealTimestamp (uint256): 1635184800

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000061741560
Arg [3] : 000000000000000000000000000000000000000000000000000000006176f0a0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [5] : 68747470733a2f2f6170692e70756d706b696e68656164736e66742e636f6d2f
Arg [6] : 6d657461646174612f0000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53463:7362:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45973:224;;;;;;;;;;-1:-1:-1;45973:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;45973:224:0;;;;;;;;57799:281;;;;;;;;;;-1:-1:-1;57799:281:0;;;;;:::i;:::-;;:::i;:::-;;33865:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35424:221::-;;;;;;;;;;-1:-1:-1;35424:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2151:32:1;;;2133:51;;2121:2;2106:18;35424:221:0;1987:203:1;34947:411:0;;;;;;;;;;-1:-1:-1;34947:411:0;;;;;:::i;:::-;;:::i;53688:43::-;;;;;;;;;;-1:-1:-1;53688:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59419:209;;;;;;;;;;-1:-1:-1;59419:209:0;;;;;:::i;:::-;;:::i;46613:113::-;;;;;;;;;;-1:-1:-1;46701:10:0;:17;46613:113;;;3616:25:1;;;3604:2;3589:18;46613:113:0;3470:177:1;53994:28:0;;;;;;;;;;;;;;;;36314:339;;;;;;;;;;-1:-1:-1;36314:339:0;;;;;:::i;:::-;;:::i;46281:256::-;;;;;;;;;;-1:-1:-1;46281:256:0;;;;;:::i;:::-;;:::i;52998:458::-;;;;;;;;;;-1:-1:-1;52998:458:0;;;;;:::i;:::-;;:::i;59019:250::-;;;;;;;;;;-1:-1:-1;59019:250:0;;;;;:::i;:::-;;:::i;59275:138::-;;;:::i;36724:185::-;;;;;;;;;;-1:-1:-1;36724:185:0;;;;;:::i;:::-;;:::i;56507:444::-;;;;;;;;;;-1:-1:-1;56507:444:0;;;;;:::i;:::-;;:::i;52567:192::-;;;;;;;;;;-1:-1:-1;52567:192:0;;;;;:::i;:::-;;:::i;58382:83::-;;;;;;;;;;-1:-1:-1;58382:83:0;;;;;:::i;:::-;;:::i;46803:233::-;;;;;;;;;;-1:-1:-1;46803:233:0;;;;;:::i;:::-;;:::i;53614:29::-;;;;;;;;;;;;;;;;58471:103;;;;;;;;;;-1:-1:-1;58471:103:0;;;;;:::i;:::-;;:::i;52767:223::-;;;;;;;;;;-1:-1:-1;52767:223:0;;;;;:::i;:::-;;:::i;58777:236::-;;;;;;;;;;-1:-1:-1;58777:236:0;;;;;:::i;:::-;;:::i;53559:24::-;;;;;;;;;;-1:-1:-1;53559:24:0;;;;;;;;57501:292;;;;;;;;;;-1:-1:-1;57501:292:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33559:239::-;;;;;;;;;;-1:-1:-1;33559:239:0;;;;;:::i;:::-;;:::i;53648:35::-;;;;;;;;;;;;;;;;53588:21;;;;;;;;;;;;;:::i;33289:208::-;;;;;;;;;;-1:-1:-1;33289:208:0;;;;;:::i;:::-;;:::i;13564:94::-;;;;;;;;;;;;;:::i;12913:87::-;;;;;;;;;;-1:-1:-1;12959:7:0;12986:6;-1:-1:-1;;;;;12986:6:0;12913:87;;34034:104;;;;;;;;;;;;;:::i;55941:560::-;;;;;;:::i;:::-;;:::i;35717:295::-;;;;;;;;;;-1:-1:-1;35717:295:0;;;;;:::i;:::-;;:::i;56957:538::-;;;;;;:::i;:::-;;:::i;58086:290::-;;;;;;;;;;-1:-1:-1;58086:290:0;;;;;:::i;:::-;;:::i;36980:328::-;;;;;;;;;;-1:-1:-1;36980:328:0;;;;;:::i;:::-;;:::i;53774:30::-;;;;;;;;;;;;;;;;60266:332;;;;;;;;;;-1:-1:-1;60266:332:0;;;;;:::i;:::-;;:::i;54157:25::-;;;;;;;;;;;;;;;;53736:33;;;;;;;;;;;;;;;;54122:30;;;;;;;;;;;;;;;;54083:32;;;;;;;;;;;;;:::i;36083:164::-;;;;;;;;;;-1:-1:-1;36083:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;36204:25:0;;;36180:4;36204:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;36083:164;59634:626;;;;;;;;;;;;;:::i;13813:192::-;;;;;;;;;;-1:-1:-1;13813:192:0;;;;;:::i;:::-;;:::i;58580:91::-;;;;;;;;;;-1:-1:-1;58580:91:0;;;;;:::i;:::-;;:::i;55596:103::-;;;;;;;;;;-1:-1:-1;55596:103:0;;;;;:::i;:::-;;:::i;45973:224::-;46075:4;-1:-1:-1;;;;;;46099:50:0;;-1:-1:-1;;;46099:50:0;;:90;;;46153:36;46177:11;46153:23;:36::i;:::-;46092:97;45973:224;-1:-1:-1;;45973:224:0:o;57799:281::-;12959:7;12986:6;-1:-1:-1;;;;;12986:6:0;11781:10;13133:23;13125:68;;;;-1:-1:-1;;;13125:68:0;;;;;;;:::i;:::-;;;;;;;;;53984:3:::1;57905:10;57885:17;;:30;;;;:::i;:::-;:47;;57877:97;;;;-1:-1:-1::0;;;57877:97:0::1;;;;;;;:::i;:::-;57981:55;57995:9;58006:10;58018:17;;57981:13;:55::i;:::-;58064:10;58043:17;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;57799:281:0:o;33865:100::-;33919:13;33952:5;33945:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33865:100;:::o;35424:221::-;35500:7;38907:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38907:16:0;35520:73;;;;-1:-1:-1;;;35520:73:0;;12609:2:1;35520:73:0;;;12591:21:1;12648:2;12628:18;;;12621:30;12687:34;12667:18;;;12660:62;-1:-1:-1;;;12738:18:1;;;12731:42;12790:19;;35520:73:0;12407:408:1;35520:73:0;-1:-1:-1;35613:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;35613:24:0;;35424:221::o;34947:411::-;35028:13;35044:23;35059:7;35044:14;:23::i;:::-;35028:39;;35092:5;-1:-1:-1;;;;;35086:11:0;:2;-1:-1:-1;;;;;35086:11:0;;;35078:57;;;;-1:-1:-1;;;35078:57:0;;13022:2:1;35078:57:0;;;13004:21:1;13061:2;13041:18;;;13034:30;13100:34;13080:18;;;13073:62;-1:-1:-1;;;13151:18:1;;;13144:31;13192:19;;35078:57:0;12820:397:1;35078:57:0;11781:10;-1:-1:-1;;;;;35170:21:0;;;;:62;;-1:-1:-1;35195:37:0;35212:5;11781:10;36083:164;:::i;35195:37::-;35148:168;;;;-1:-1:-1;;;35148:168:0;;13424:2:1;35148:168:0;;;13406:21:1;13463:2;13443:18;;;13436:30;13502:34;13482:18;;;13475:62;13573:26;13553:18;;;13546:54;13617:19;;35148:168:0;13222:420:1;35148:168:0;35329:21;35338:2;35342:7;35329:8;:21::i;:::-;35017:341;34947:411;;:::o;59419:209::-;12959:7;12986:6;-1:-1:-1;;;;;12986:6:0;11781:10;13133:23;13125:68;;;;-1:-1:-1;;;13125:68:0;;;;;;;:::i;:::-;59511:18:::1;59505:32;;;;;:::i;:::-;:37:::0;;-1:-1:-1;59497:86:0::1;;;::::0;-1:-1:-1;;;59497:86:0;;13849:2:1;59497:86:0::1;::::0;::::1;13831:21:1::0;13888:2;13868:18;;;13861:30;13927:34;13907:18;;;13900:62;-1:-1:-1;;;13978:18:1;;;13971:34;14022:19;;59497:86:0::1;13647:400:1::0;59497:86:0::1;59590:32:::0;;::::1;::::0;:18:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;;59419:209:::0;:::o;36314:339::-;36509:41;11781:10;36542:7;36509:18;:41::i;:::-;36501:103;;;;-1:-1:-1;;;36501:103:0;;;;;;;:::i;:::-;36617:28;36627:4;36633:2;36637:7;36617:9;:28::i;46281:256::-;46378:7;46414:23;46431:5;46414:16;:23::i;:::-;46406:5;:31;46398:87;;;;-1:-1:-1;;;46398:87:0;;14672:2:1;46398:87:0;;;14654:21:1;14711:2;14691:18;;;14684:30;14750:34;14730:18;;;14723:62;-1:-1:-1;;;14801:18:1;;;14794:41;14852:19;;46398:87:0;14470:407:1;46398:87:0;-1:-1:-1;;;;;;46503:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;46281:256::o;52998:458::-;53132:4;53148:23;53173:24;53201:95;53228:38;53257:8;8386:58;;26427:66:1;8386:58:0;;;26415:79:1;26510:12;;;26503:28;;;8253:7:0;;26547:12:1;;8386:58:0;;;;;;;;;;;;8376:69;;;;;;8369:76;;8184:269;;;;53228:38;53277:10;53201:16;:95::i;:::-;53147:149;;-1:-1:-1;53147:149:0;-1:-1:-1;53320:26:0;53311:5;:35;;;;;;;;:::i;:::-;;:65;;;;;53369:7;-1:-1:-1;;;;;53350:26:0;:15;-1:-1:-1;;;;;53350:26:0;;53311:65;53307:142;;;53396:4;53389:11;;;;;;53307:142;53434:5;53427:12;;;;52998:458;;;;;;:::o;59019:250::-;59234:4;59188:11;59201:5;59208:10;55294:137;55322:57;55348:11;55322:57;;;;;;;;;;;;;-1:-1:-1;;;55322:57:0;;;55373:5;55322:25;:57::i;:::-;55392:10;55415:7;12959;12986:6;-1:-1:-1;;;;;12986:6:0;;12913:87;55294:137;55278:212;;;;-1:-1:-1;;;55278:212:0;;;;;;;:::i;:::-;55508:12;55521:11;55508:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;55507:26;55499:77;;;;-1:-1:-1;;;55499:77:0;;;;;;;:::i;:::-;-1:-1:-1;59259:4:0::1;::::0;59019:250;-1:-1:-1;;;;;;59019:250:0:o;59275:138::-;12959:7;12986:6;-1:-1:-1;;;;;12986:6:0;11781:10;13133:23;13125:68;;;;-1:-1:-1;;;13125:68:0;;;;;;;:::i;:::-;59370:37:::1;::::0;59342:21:::1;::::0;59378:10:::1;::::0;59370:37;::::1;;;::::0;59342:21;;59327:12:::1;59370:37:::0;59327:12;59370:37;59342:21;59378:10;59370:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;36724:185:::0;36862:39;36879:4;36885:2;36889:7;36862:39;;;;;;;;;;;;:16;:39::i;56507:444::-;54555:14;;54536:15;:33;;54528:87;;;;-1:-1:-1;;;54528:87:0;;;;;;;:::i;:::-;53847:5;54649:14;;:33;;;;:::i;:::-;54630:15;:52;;54622:100;;;;-1:-1:-1;;;54622:100:0;;;;;;;:::i;:::-;56649:11;11781:10;56676::::1;55294:137;55322:57;55348:11;55322:57;;;;;;;;;;;;;-1:-1:-1::0;;;55322:57:0::1;;::::0;55373:5:::1;55322:25;:57::i;55294:137::-;55278:212;;;;-1:-1:-1::0;;;55278:212:0::1;;;;;;;:::i;:::-;55508:12;55521:11;55508:25;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;55507:26;55499:77;;;;-1:-1:-1::0;;;55499:77:0::1;;;;;;;:::i;:::-;56698:16:::2;53984:3;56717:14;;:30;;;;:::i;:::-;56698:49;;53906:4;56762:11;:26;56754:76;;;;-1:-1:-1::0;;;56754:76:0::2;;;;;;;:::i;:::-;56837:43;11781:10:::0;56865:1:::2;56868:11;56837:13;:43::i;:::-;56915:4;56887:12;56900:11;56887:25;;;;;;:::i;:::-;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;56944:1;56926:14;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;56507:444:0:o;52567:192::-;52681:7;52735:5;52742:7;52718:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52708:43;;;;;;52701:50;;52567:192;;;;:::o;58382:83::-;58428:4;38907:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38907:16:0;:30;;58448:11;38818:127;46803:233;46878:7;46914:30;46701:10;:17;;46613:113;46914:30;46906:5;:38;46898:95;;;;-1:-1:-1;;;46898:95:0;;17793:2:1;46898:95:0;;;17775:21:1;17832:2;17812:18;;;17805:30;17871:34;17851:18;;;17844:62;-1:-1:-1;;;17922:18:1;;;17915:42;17974:19;;46898:95:0;17591:408:1;46898:95:0;47011:10;47022:5;47011:17;;;;;;;;:::i;:::-;;;;;;;;;47004:24;;46803:233;;;:::o;58471:103::-;12959:7;12986:6;-1:-1:-1;;;;;12986:6:0;11781:10;13133:23;13125:68;;;;-1:-1:-1;;;13125:68:0;;;;;;;:::i;:::-;58551:17;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;52767:223::-:0;52908:7;52960:5;52967:7;52976:4;52943:38;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52933:49;;;;;;52926:56;;52767:223;;;;;:::o;58777:236::-;58980:4;58934:11;58947:7;58956:10;54884:110;54910:36;54925:11;54938:7;54910:14;:36::i;54884:110::-;54868:175;;;;-1:-1:-1;;;54868:175:0;;18954:2:1;54868:175:0;;;18936:21:1;18993:2;18973:18;;;18966:30;19032:33;19012:18;;;19005:61;19083:18;;54868:175:0;18752:355:1;57501:292:0;57562:13;57584:12;57599:16;57609:5;57599:9;:16::i;:::-;57584:31;;57622:20;57656:7;57645:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57645:19:0;;57622:42;;57678:6;57673:93;57694:7;57690:1;:11;57673:93;;;57729:29;57749:5;57756:1;57729:19;:29::i;:::-;57717:6;57724:1;57717:9;;;;;;;;:::i;:::-;;;;;;;;;;:41;57703:3;;;;:::i;:::-;;;;57673:93;;;-1:-1:-1;57781:6:0;57501:292;-1:-1:-1;;;57501:292:0:o;33559:239::-;33631:7;33667:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33667:16:0;33702:19;33694:73;;;;-1:-1:-1;;;33694:73:0;;19454:2:1;33694:73:0;;;19436:21:1;19493:2;19473:18;;;19466:30;19532:34;19512:18;;;19505:62;-1:-1:-1;;;19583:18:1;;;19576:39;19632:19;;33694:73:0;19252:405:1;53588:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33289:208::-;33361:7;-1:-1:-1;;;;;33389:19:0;;33381:74;;;;-1:-1:-1;;;33381:74:0;;19864:2:1;33381:74:0;;;19846:21:1;19903:2;19883:18;;;19876:30;19942:34;19922:18;;;19915:62;-1:-1:-1;;;19993:18:1;;;19986:40;20043:19;;33381:74:0;19662:406:1;33381:74:0;-1:-1:-1;;;;;;33473:16:0;;;;;:9;:16;;;;;;;33289:208::o;13564:94::-;12959:7;12986:6;-1:-1:-1;;;;;12986:6:0;11781:10;13133:23;13125:68;;;;-1:-1:-1;;;13125:68:0;;;;;;;:::i;:::-;13629:21:::1;13647:1;13629:9;:21::i;:::-;13564:94::o:0;34034:104::-;34090:13;34123:7;34116:14;;;;;:::i;55941:560::-;56002:12;;;;55994:57;;;;-1:-1:-1;;;55994:57:0;;20275:2:1;55994:57:0;;;20257:21:1;;;20294:18;;;20287:30;20353:34;20333:18;;;20326:62;20405:18;;55994:57:0;20073:356:1;55994:57:0;56060:16;53984:3;56079:14;;:30;;;;:::i;:::-;56060:49;;56137:1;56124:10;:14;:48;;;;;53948:1;56142:10;:30;;56124:48;56116:102;;;;-1:-1:-1;;;56116:102:0;;20636:2:1;56116:102:0;;;20618:21:1;20675:2;20655:18;;;20648:30;20714:34;20694:18;;;20687:62;-1:-1:-1;;;20765:18:1;;;20758:39;20814:19;;56116:102:0;20434:405:1;56116:102:0;53906:4;56233:24;56247:10;56233:11;:24;:::i;:::-;:40;;56225:90;;;;-1:-1:-1;;;56225:90:0;;;;;;;:::i;:::-;56355:10;56343:9;;:22;;;;:::i;:::-;56330:9;:35;;56322:79;;;;-1:-1:-1;;;56322:79:0;;21219:2:1;56322:79:0;;;21201:21:1;21258:2;21238:18;;;21231:30;21297:33;21277:18;;;21270:61;21348:18;;56322:79:0;21017:355:1;56322:79:0;56408:52;11781:10;56436;56448:11;56408:13;:52::i;:::-;56485:10;56467:14;;:28;;;;;;;:::i;35717:295::-;-1:-1:-1;;;;;35820:24:0;;11781:10;35820:24;;35812:62;;;;-1:-1:-1;;;35812:62:0;;21579:2:1;35812:62:0;;;21561:21:1;21618:2;21598:18;;;21591:30;21657:27;21637:18;;;21630:55;21702:18;;35812:62:0;21377:349:1;35812:62:0;11781:10;35887:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;35887:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;35887:53:0;;;;;;;;;;35956:48;;540:41:1;;;35887:42:0;;11781:10;35956:48;;513:18:1;35956:48:0;;;;;;;35717:295;;:::o;56957:538::-;54555:14;;54536:15;:33;;54528:87;;;;-1:-1:-1;;;54528:87:0;;;;;;;:::i;:::-;53847:5;54649:14;;:33;;;;:::i;:::-;54630:15;:52;;54622:100;;;;-1:-1:-1;;;54622:100:0;;;;;;;:::i;:::-;57106:12:::1;54742:401;;;;;;;;;;;;;-1:-1:-1::0;;;54742:401:0::1;;::::0;57135:10:::1;54884:110;54910:36;54925:11;54938:7;54910:14;:36::i;54884:110::-;54868:175;;;::::0;-1:-1:-1;;;54868:175:0;;18954:2:1;54868:175:0::1;::::0;::::1;18936:21:1::0;18993:2;18973:18;;;18966:30;19032:33;19012:18;;;19005:61;19083:18;;54868:175:0::1;18752:355:1::0;54868:175:0::1;55061:12;55074:11;55061:25;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;55060:26;55052:77;;;;-1:-1:-1::0;;;55052:77:0::1;;;;;;;:::i;:::-;57156:16:::2;53984:3;57175:14;;:30;;;;:::i;:::-;57156:49;;53906:4;57222:11;:26;57214:76;;;;-1:-1:-1::0;;;57214:76:0::2;;;;;;;:::i;:::-;57320:9;;57307;:22;;57299:66;;;::::0;-1:-1:-1;;;57299:66:0;;21219:2:1;57299:66:0::2;::::0;::::2;21201:21:1::0;21258:2;21238:18;;;21231:30;21297:33;21277:18;;;21270:61;21348:18;;57299:66:0::2;21017:355:1::0;58086:290:0;58171:4;;58184:167;58205:9;:16;58201:1;:20;58184:167;;;58237:15;58255:9;58265:1;58255:12;;;;;;;;:::i;:::-;;;;;;;58237:30;;58303:6;-1:-1:-1;;;;;58280:29:0;:19;58288:10;58280:7;:19::i;:::-;-1:-1:-1;;;;;58280:29:0;;58276:68;;58329:5;58322:12;;;;;;58276:68;-1:-1:-1;58223:3:0;;;;:::i;:::-;;;;58184:167;;;-1:-1:-1;58366:4:0;;58086:290;-1:-1:-1;;;58086:290:0:o;36980:328::-;37155:41;11781:10;37188:7;37155:18;:41::i;:::-;37147:103;;;;-1:-1:-1;;;37147:103:0;;;;;;;:::i;:::-;37261:39;37275:4;37281:2;37285:7;37294:5;37261:13;:39::i;:::-;36980:328;;;;:::o;60266:332::-;38883:4;38907:16;;;:7;:16;;;;;;60331:13;;-1:-1:-1;;;;;38907:16:0;60353:76;;;;-1:-1:-1;;;60353:76:0;;21933:2:1;60353:76:0;;;21915:21:1;21972:2;21952:18;;;21945:30;22011:34;21991:18;;;21984:62;-1:-1:-1;;;22062:18:1;;;22055:45;22117:19;;60353:76:0;21731:411:1;60353:76:0;60438:13;53906:4;60465:13;;60455:7;:23;;;;:::i;:::-;60454:40;;;;:::i;:::-;60438:56;;60532:1;60514:7;60508:21;;;;;:::i;:::-;;;:25;:84;;;;;;;;;;;;;;;;;60560:7;60569:16;:5;:14;:16::i;:::-;60543:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60501:91;60266:332;-1:-1:-1;;;60266:332:0:o;54083:32::-;;;;;;;:::i;59634:626::-;59684:13;;:18;59676:60;;;;-1:-1:-1;;;59676:60:0;;23903:2:1;59676:60:0;;;23885:21:1;23942:2;23922:18;;;23915:30;23981:31;23961:18;;;23954:59;24030:18;;59676:60:0;23701:353:1;59676:60:0;59751:18;;59743:68;;;;-1:-1:-1;;;59743:68:0;;24261:2:1;59743:68:0;;;24243:21:1;;;24280:18;;;24273:30;24339:34;24319:18;;;24312:62;24391:18;;59743:68:0;24059:356:1;59743:68:0;59851:18;;59836:50;;53906:4;;59841:29;59836:50;:::i;:::-;59820:13;:66;60029:18;;60050:3;;60014:33;;:12;:33;:::i;:::-;:39;60010:128;;;53906:4;60097:16;60112:1;60097:12;:16;:::i;:::-;60082:48;;;60087:27;60082:48;:::i;:::-;60066:13;:64;60010:128;60183:13;;60179:76;;60230:13;;:17;;60246:1;60230:17;:::i;:::-;60214:13;:33;59634:626::o;13813:192::-;12959:7;12986:6;-1:-1:-1;;;;;12986:6:0;11781:10;13133:23;13125:68;;;;-1:-1:-1;;;13125:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13902:22:0;::::1;13894:73;;;::::0;-1:-1:-1;;;13894:73:0;;24752:2:1;13894:73:0::1;::::0;::::1;24734:21:1::0;24791:2;24771:18;;;24764:30;24830:34;24810:18;;;24803:62;-1:-1:-1;;;24881:18:1;;;24874:36;24927:19;;13894:73:0::1;24550:402:1::0;13894:73:0::1;13978:19;13988:8;13978:9;:19::i;:::-;13813:192:::0;:::o;58580:91::-;12959:7;12986:6;-1:-1:-1;;;;;12986:6:0;11781:10;13133:23;13125:68;;;;-1:-1:-1;;;13125:68:0;;;;;;;:::i;:::-;58643:9:::1;:22:::0;58580:91::o;55596:103::-;12959:7;12986:6;-1:-1:-1;;;;;12986:6:0;11781:10;13133:23;13125:68;;;;-1:-1:-1;;;13125:68:0;;;;;;;:::i;:::-;55665:12:::1;:28:::0;;-1:-1:-1;;55665:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55596:103::o;32920:305::-;33022:4;-1:-1:-1;;;;;;33059:40:0;;-1:-1:-1;;;33059:40:0;;:105;;-1:-1:-1;;;;;;;33116:48:0;;-1:-1:-1;;;33116:48:0;33059:105;:158;;;-1:-1:-1;;;;;;;;;;25008:40:0;;;33181:36;24899:157;55705:230;55797:6;55792:86;55813:10;55809:1;:14;55792:86;;;55839:31;55849:2;55853:16;55868:1;55853:12;:16;:::i;:::-;55839:9;:31::i;:::-;55825:3;;;;:::i;:::-;;;;55792:86;;;-1:-1:-1;55886:43:0;55903:25;55918:10;55903:12;:25;:::i;:::-;55886:16;:43::i;42800:174::-;42875:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;42875:29:0;-1:-1:-1;;;;;42875:29:0;;;;;;;;:24;;42929:23;42875:24;42929:14;:23::i;:::-;-1:-1:-1;;;;;42920:46:0;;;;;;;;;;;42800:174;;:::o;39112:348::-;39205:4;38907:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38907:16:0;39222:73;;;;-1:-1:-1;;;39222:73:0;;25159:2:1;39222:73:0;;;25141:21:1;25198:2;25178:18;;;25171:30;25237:34;25217:18;;;25210:62;-1:-1:-1;;;25288:18:1;;;25281:42;25340:19;;39222:73:0;24957:408:1;39222:73:0;39306:13;39322:23;39337:7;39322:14;:23::i;:::-;39306:39;;39375:5;-1:-1:-1;;;;;39364:16:0;:7;-1:-1:-1;;;;;39364:16:0;;:51;;;;39408:7;-1:-1:-1;;;;;39384:31:0;:20;39396:7;39384:11;:20::i;:::-;-1:-1:-1;;;;;39384:31:0;;39364:51;:87;;;-1:-1:-1;;;;;;36204:25:0;;;36180:4;36204:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;39419:32;39356:96;39112:348;-1:-1:-1;;;;39112:348:0:o;42104:578::-;42263:4;-1:-1:-1;;;;;42236:31:0;:23;42251:7;42236:14;:23::i;:::-;-1:-1:-1;;;;;42236:31:0;;42228:85;;;;-1:-1:-1;;;42228:85:0;;25572:2:1;42228:85:0;;;25554:21:1;25611:2;25591:18;;;25584:30;25650:34;25630:18;;;25623:62;-1:-1:-1;;;25701:18:1;;;25694:39;25750:19;;42228:85:0;25370:405:1;42228:85:0;-1:-1:-1;;;;;42332:16:0;;42324:65;;;;-1:-1:-1;;;42324:65:0;;25982:2:1;42324:65:0;;;25964:21:1;26021:2;26001:18;;;25994:30;26060:34;26040:18;;;26033:62;-1:-1:-1;;;26111:18:1;;;26104:34;26155:19;;42324:65:0;25780:400:1;42324:65:0;42402:39;42423:4;42429:2;42433:7;42402:20;:39::i;:::-;42506:29;42523:1;42527:7;42506:8;:29::i;:::-;-1:-1:-1;;;;;42548:15:0;;;;;;:9;:15;;;;;:20;;42567:1;;42548:15;:20;;42567:1;;42548:20;:::i;:::-;;;;-1:-1:-1;;;;;;;42579:13:0;;;;;;:9;:13;;;;;:18;;42596:1;;42579:13;:18;;42596:1;;42579:18;:::i;:::-;;;;-1:-1:-1;;42608:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42608:21:0;-1:-1:-1;;;;;42608:21:0;;;;;;;;;42647:27;;42608:16;;42647:27;;;;;;;42104:578;;;:::o;2225:1308::-;2306:7;2315:12;2540:9;:16;2560:2;2540:22;2536:990;;;2836:4;2821:20;;2815:27;2886:4;2871:20;;2865:27;2944:4;2929:20;;2923:27;2579:9;2915:36;2987:25;2998:4;2915:36;2815:27;2865;2987:10;:25::i;:::-;2980:32;;;;;;;;;2536:990;3034:9;:16;3054:2;3034:22;3030:496;;;3309:4;3294:20;;3288:27;3360:4;3345:20;;3339:27;3402:23;3413:4;3288:27;3339;3402:10;:23::i;:::-;3395:30;;;;;;;;3030:496;-1:-1:-1;3474:1:0;;-1:-1:-1;3478:35:0;3030:496;2225:1308;;;;;:::o;14013:173::-;14069:16;14088:6;;-1:-1:-1;;;;;14105:17:0;;;-1:-1:-1;;;;;;14105:17:0;;;;;;14138:40;;14088:6;;;;;;;14138:40;;14069:16;14138:40;14058:128;14013:173;:::o;38190:315::-;38347:28;38357:4;38363:2;38367:7;38347:9;:28::i;:::-;38394:48;38417:4;38423:2;38427:7;38436:5;38394:22;:48::i;:::-;38386:111;;;;-1:-1:-1;;;38386:111:0;;;;;;;:::i;9317:723::-;9373:13;9594:10;9590:53;;-1:-1:-1;;9621:10:0;;;;;;;;;;;;-1:-1:-1;;;9621:10:0;;;;;9317:723::o;9590:53::-;9668:5;9653:12;9709:78;9716:9;;9709:78;;9742:8;;;;:::i;:::-;;-1:-1:-1;9765:10:0;;-1:-1:-1;9773:2:0;9765:10;;:::i;:::-;;;9709:78;;;9797:19;9829:6;9819:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9819:17:0;;9797:39;;9847:154;9854:10;;9847:154;;9881:11;9891:1;9881:11;;:::i;:::-;;-1:-1:-1;9950:10:0;9958:2;9950:5;:10;:::i;:::-;9937:24;;:2;:24;:::i;:::-;9924:39;;9907:6;9914;9907:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9907:56:0;;;;;;;;-1:-1:-1;9978:11:0;9987:2;9978:11;;:::i;:::-;;;9847:154;;39802:110;39878:26;39888:2;39892:7;39878:26;;;;;;;;;;;;:9;:26::i;60604:218::-;60669:18;;:23;:96;;;;;53906:4;60697:12;:28;:67;;;;60748:16;;60729:15;:35;;60697:67;60665:152;;;60797:12;60776:18;:33;60604:218;:::o;47649:589::-;-1:-1:-1;;;;;47855:18:0;;47851:187;;47890:40;47922:7;49065:10;:17;;49038:24;;;;:15;:24;;;;;:44;;;49093:24;;;;;;;;;;;;48961:164;47890:40;47851:187;;;47960:2;-1:-1:-1;;;;;47952:10:0;:4;-1:-1:-1;;;;;47952:10:0;;47948:90;;47979:47;48012:4;48018:7;47979:32;:47::i;:::-;-1:-1:-1;;;;;48052:16:0;;48048:183;;48085:45;48122:7;48085:36;:45::i;48048:183::-;48158:4;-1:-1:-1;;;;;48152:10:0;:2;-1:-1:-1;;;;;48152:10:0;;48148:83;;48179:40;48207:2;48211:7;48179:27;:40::i;5834:1632::-;5965:7;;6899:66;6886:79;;6882:163;;;-1:-1:-1;6998:1:0;;-1:-1:-1;7002:30:0;6982:51;;6882:163;7059:1;:7;;7064:2;7059:7;;:18;;;;;7070:1;:7;;7075:2;7070:7;;7059:18;7055:102;;;-1:-1:-1;7110:1:0;;-1:-1:-1;7114:30:0;7094:51;;7055:102;7271:24;;;7254:14;7271:24;;;;;;;;;27341:25:1;;;27414:4;27402:17;;27382:18;;;27375:45;;;;27436:18;;;27429:34;;;27479:18;;;27472:34;;;7271:24:0;;27313:19:1;;7271:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7271:24:0;;-1:-1:-1;;7271:24:0;;;-1:-1:-1;;;;;;;7310:20:0;;7306:103;;7363:1;7367:29;7347:50;;;;;;;7306:103;7429:6;-1:-1:-1;7437:20:0;;-1:-1:-1;5834:1632:0;;;;;;;;:::o;4829:391::-;4943:7;;-1:-1:-1;;;;;5044:75:0;;5146:3;5142:12;;;5156:2;5138:21;5187:25;5198:4;5138:21;5207:1;5044:75;5187:10;:25::i;:::-;5180:32;;;;;;4829:391;;;;;;:::o;43539:799::-;43694:4;-1:-1:-1;;;;;43715:13:0;;15282:20;15330:8;43711:620;;43751:72;;-1:-1:-1;;;43751:72:0;;-1:-1:-1;;;;;43751:36:0;;;;;:72;;11781:10;;43802:4;;43808:7;;43817:5;;43751:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43751:72:0;;;;;;;;-1:-1:-1;;43751:72:0;;;;;;;;;;;;:::i;:::-;;;43747:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43993:13:0;;43989:272;;44036:60;;-1:-1:-1;;;44036:60:0;;;;;;;:::i;43989:272::-;44211:6;44205:13;44196:6;44192:2;44188:15;44181:38;43747:529;-1:-1:-1;;;;;;43874:51:0;-1:-1:-1;;;43874:51:0;;-1:-1:-1;43867:58:0;;43711:620;-1:-1:-1;44315:4:0;43539:799;;;;;;:::o;40139:321::-;40269:18;40275:2;40279:7;40269:5;:18::i;:::-;40320:54;40351:1;40355:2;40359:7;40368:5;40320:22;:54::i;:::-;40298:154;;;;-1:-1:-1;;;40298:154:0;;;;;;;:::i;49752:988::-;50018:22;50068:1;50043:22;50060:4;50043:16;:22::i;:::-;:26;;;;:::i;:::-;50080:18;50101:26;;;:17;:26;;;;;;50018:51;;-1:-1:-1;50234:28:0;;;50230:328;;-1:-1:-1;;;;;50301:18:0;;50279:19;50301:18;;;:12;:18;;;;;;;;:34;;;;;;;;;50352:30;;;;;;:44;;;50469:30;;:17;:30;;;;;:43;;;50230:328;-1:-1:-1;50654:26:0;;;;:17;:26;;;;;;;;50647:33;;;-1:-1:-1;;;;;50698:18:0;;;;;:12;:18;;;;;:34;;;;;;;50691:41;49752:988::o;51035:1079::-;51313:10;:17;51288:22;;51313:21;;51333:1;;51313:21;:::i;:::-;51345:18;51366:24;;;:15;:24;;;;;;51739:10;:26;;51288:46;;-1:-1:-1;51366:24:0;;51288:46;;51739:26;;;;;;:::i;:::-;;;;;;;;;51717:48;;51803:11;51778:10;51789;51778:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;51883:28;;;:15;:28;;;;;;;:41;;;52055:24;;;;;52048:31;52090:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;51106:1008;;;51035:1079;:::o;48539:221::-;48624:14;48641:20;48658:2;48641:16;:20::i;:::-;-1:-1:-1;;;;;48672:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;48717:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;48539:221:0:o;40796:382::-;-1:-1:-1;;;;;40876:16:0;;40868:61;;;;-1:-1:-1;;;40868:61:0;;28610:2:1;40868:61:0;;;28592:21:1;;;28629:18;;;28622:30;28688:34;28668:18;;;28661:62;28740:18;;40868:61:0;28408:356:1;40868:61:0;38883:4;38907:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38907:16:0;:30;40940:58;;;;-1:-1:-1;;;40940:58:0;;28971:2:1;40940:58:0;;;28953:21:1;29010:2;28990:18;;;28983:30;29049;29029:18;;;29022:58;29097:18;;40940:58:0;28769:352:1;40940:58:0;41011:45;41040:1;41044:2;41048:7;41011:20;:45::i;:::-;-1:-1:-1;;;;;41069:13:0;;;;;;:9;:13;;;;;:18;;41086:1;;41069:13;:18;;41086:1;;41069:18;:::i;:::-;;;;-1:-1:-1;;41098:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41098:21:0;-1:-1:-1;;;;;41098:21:0;;;;;;;;41137:33;;41098:16;;;41137:33;;41098:16;;41137:33;40796:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:254::-;838:6;846;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;938:29;957:9;938:29;:::i;:::-;928:39;1014:2;999:18;;;;986:32;;-1:-1:-1;;;770:254:1:o;1029:258::-;1101:1;1111:113;1125:6;1122:1;1119:13;1111:113;;;1201:11;;;1195:18;1182:11;;;1175:39;1147:2;1140:10;1111:113;;;1242:6;1239:1;1236:13;1233:48;;;-1:-1:-1;;1277:1:1;1259:16;;1252:27;1029:258::o;1292:269::-;1345:3;1383:5;1377:12;1410:6;1405:3;1398:19;1426:63;1482:6;1475:4;1470:3;1466:14;1459:4;1452:5;1448:16;1426:63;:::i;:::-;1543:2;1522:15;-1:-1:-1;;1518:29:1;1509:39;;;;1550:4;1505:50;;1292:269;-1:-1:-1;;1292:269:1:o;1566:231::-;1715:2;1704:9;1697:21;1678:4;1735:56;1787:2;1776:9;1772:18;1764:6;1735:56;:::i;1802:180::-;1861:6;1914:2;1902:9;1893:7;1889:23;1885:32;1882:52;;;1930:1;1927;1920:12;1882:52;-1:-1:-1;1953:23:1;;1802:180;-1:-1:-1;1802:180:1:o;2195:127::-;2256:10;2251:3;2247:20;2244:1;2237:31;2287:4;2284:1;2277:15;2311:4;2308:1;2301:15;2327:275;2398:2;2392:9;2463:2;2444:13;;-1:-1:-1;;2440:27:1;2428:40;;2498:18;2483:34;;2519:22;;;2480:62;2477:88;;;2545:18;;:::i;:::-;2581:2;2574:22;2327:275;;-1:-1:-1;2327:275:1:o;2607:531::-;2650:5;2703:3;2696:4;2688:6;2684:17;2680:27;2670:55;;2721:1;2718;2711:12;2670:55;2757:6;2744:20;2783:18;2779:2;2776:26;2773:52;;;2805:18;;:::i;:::-;2849:55;2892:2;2873:13;;-1:-1:-1;;2869:27:1;2898:4;2865:38;2849:55;:::i;:::-;2929:2;2920:7;2913:19;2975:3;2968:4;2963:2;2955:6;2951:15;2947:26;2944:35;2941:55;;;2992:1;2989;2982:12;2941:55;3057:2;3050:4;3042:6;3038:17;3031:4;3022:7;3018:18;3005:55;3105:1;3080:16;;;3098:4;3076:27;3069:38;;;;3084:7;2607:531;-1:-1:-1;;;2607:531:1:o;3143:322::-;3212:6;3265:2;3253:9;3244:7;3240:23;3236:32;3233:52;;;3281:1;3278;3271:12;3233:52;3321:9;3308:23;3354:18;3346:6;3343:30;3340:50;;;3386:1;3383;3376:12;3340:50;3409;3451:7;3442:6;3431:9;3427:22;3409:50;:::i;3652:328::-;3729:6;3737;3745;3798:2;3786:9;3777:7;3773:23;3769:32;3766:52;;;3814:1;3811;3804:12;3766:52;3837:29;3856:9;3837:29;:::i;:::-;3827:39;;3885:38;3919:2;3908:9;3904:18;3885:38;:::i;:::-;3875:48;;3970:2;3959:9;3955:18;3942:32;3932:42;;3652:328;;;;;:::o;3985:463::-;4071:6;4079;4087;4140:2;4128:9;4119:7;4115:23;4111:32;4108:52;;;4156:1;4153;4146:12;4108:52;4192:9;4179:23;4169:33;;4253:2;4242:9;4238:18;4225:32;4280:18;4272:6;4269:30;4266:50;;;4312:1;4309;4302:12;4266:50;4335;4377:7;4368:6;4357:9;4353:22;4335:50;:::i;:::-;4325:60;;;4404:38;4438:2;4427:9;4423:18;4404:38;:::i;:::-;4394:48;;3985:463;;;;;:::o;4453:616::-;4549:6;4557;4565;4618:2;4606:9;4597:7;4593:23;4589:32;4586:52;;;4634:1;4631;4624:12;4586:52;4674:9;4661:23;4703:18;4744:2;4736:6;4733:14;4730:34;;;4760:1;4757;4750:12;4730:34;4783:50;4825:7;4816:6;4805:9;4801:22;4783:50;:::i;:::-;4773:60;;4852:38;4886:2;4875:9;4871:18;4852:38;:::i;:::-;4842:48;;4943:2;4932:9;4928:18;4915:32;4899:48;;4972:2;4962:8;4959:16;4956:36;;;4988:1;4985;4978:12;4956:36;;5011:52;5055:7;5044:8;5033:9;5029:24;5011:52;:::i;:::-;5001:62;;;4453:616;;;;;:::o;5074:542::-;5161:6;5169;5222:2;5210:9;5201:7;5197:23;5193:32;5190:52;;;5238:1;5235;5228:12;5190:52;5278:9;5265:23;5307:18;5348:2;5340:6;5337:14;5334:34;;;5364:1;5361;5354:12;5334:34;5387:50;5429:7;5420:6;5409:9;5405:22;5387:50;:::i;:::-;5377:60;;5490:2;5479:9;5475:18;5462:32;5446:48;;5519:2;5509:8;5506:16;5503:36;;;5535:1;5532;5525:12;5503:36;;5558:52;5602:7;5591:8;5580:9;5576:24;5558:52;:::i;:::-;5548:62;;;5074:542;;;;;:::o;6351:617::-;6448:6;6456;6464;6517:2;6505:9;6496:7;6492:23;6488:32;6485:52;;;6533:1;6530;6523:12;6485:52;6573:9;6560:23;6602:18;6643:2;6635:6;6632:14;6629:34;;;6659:1;6656;6649:12;6629:34;6682:50;6724:7;6715:6;6704:9;6700:22;6682:50;:::i;:::-;6672:60;;6785:2;6774:9;6770:18;6757:32;6741:48;;6814:2;6804:8;6801:16;6798:36;;;6830:1;6827;6820:12;6798:36;;6853:52;6897:7;6886:8;6875:9;6871:24;6853:52;:::i;6973:742::-;7079:6;7087;7095;7148:2;7136:9;7127:7;7123:23;7119:32;7116:52;;;7164:1;7161;7154:12;7116:52;7204:9;7191:23;7233:18;7274:2;7266:6;7263:14;7260:34;;;7290:1;7287;7280:12;7260:34;7313:50;7355:7;7346:6;7335:9;7331:22;7313:50;:::i;:::-;7303:60;;7416:2;7405:9;7401:18;7388:32;7372:48;;7445:2;7435:8;7432:16;7429:36;;;7461:1;7458;7451:12;7429:36;7484:52;7528:7;7517:8;7506:9;7502:24;7484:52;:::i;7720:186::-;7779:6;7832:2;7820:9;7811:7;7807:23;7803:32;7800:52;;;7848:1;7845;7838:12;7800:52;7871:29;7890:9;7871:29;:::i;7911:632::-;8082:2;8134:21;;;8204:13;;8107:18;;;8226:22;;;8053:4;;8082:2;8305:15;;;;8279:2;8264:18;;;8053:4;8348:169;8362:6;8359:1;8356:13;8348:169;;;8423:13;;8411:26;;8492:15;;;;8457:12;;;;8384:1;8377:9;8348:169;;;-1:-1:-1;8534:3:1;;7911:632;-1:-1:-1;;;;;;7911:632:1:o;8548:160::-;8613:20;;8669:13;;8662:21;8652:32;;8642:60;;8698:1;8695;8688:12;8713:254;8778:6;8786;8839:2;8827:9;8818:7;8814:23;8810:32;8807:52;;;8855:1;8852;8845:12;8807:52;8878:29;8897:9;8878:29;:::i;:::-;8868:39;;8926:35;8957:2;8946:9;8942:18;8926:35;:::i;:::-;8916:45;;8713:254;;;;;:::o;8972:1020::-;9065:6;9073;9126:2;9114:9;9105:7;9101:23;9097:32;9094:52;;;9142:1;9139;9132:12;9094:52;9165:29;9184:9;9165:29;:::i;:::-;9155:39;;9213:2;9266;9255:9;9251:18;9238:32;9289:18;9330:2;9322:6;9319:14;9316:34;;;9346:1;9343;9336:12;9316:34;9384:6;9373:9;9369:22;9359:32;;9429:7;9422:4;9418:2;9414:13;9410:27;9400:55;;9451:1;9448;9441:12;9400:55;9487:2;9474:16;9509:2;9505;9502:10;9499:36;;;9515:18;;:::i;:::-;9561:2;9558:1;9554:10;9544:20;;9584:28;9608:2;9604;9600:11;9584:28;:::i;:::-;9646:15;;;9716:11;;;9712:20;;;9677:12;;;;9744:19;;;9741:39;;;9776:1;9773;9766:12;9741:39;9800:11;;;;9820:142;9836:6;9831:3;9828:15;9820:142;;;9902:17;;9890:30;;9853:12;;;;9940;;;;9820:142;;;9981:5;9971:15;;;;;;;;8972:1020;;;;;:::o;9997:538::-;10092:6;10100;10108;10116;10169:3;10157:9;10148:7;10144:23;10140:33;10137:53;;;10186:1;10183;10176:12;10137:53;10209:29;10228:9;10209:29;:::i;:::-;10199:39;;10257:38;10291:2;10280:9;10276:18;10257:38;:::i;:::-;10247:48;;10342:2;10331:9;10327:18;10314:32;10304:42;;10397:2;10386:9;10382:18;10369:32;10424:18;10416:6;10413:30;10410:50;;;10456:1;10453;10446:12;10410:50;10479;10521:7;10512:6;10501:9;10497:22;10479:50;:::i;:::-;10469:60;;;9997:538;;;;;;;:::o;10540:260::-;10608:6;10616;10669:2;10657:9;10648:7;10644:23;10640:32;10637:52;;;10685:1;10682;10675:12;10637:52;10708:29;10727:9;10708:29;:::i;:::-;10698:39;;10756:38;10790:2;10779:9;10775:18;10756:38;:::i;10805:180::-;10861:6;10914:2;10902:9;10893:7;10889:23;10885:32;10882:52;;;10930:1;10927;10920:12;10882:52;10953:26;10969:9;10953:26;:::i;10990:356::-;11192:2;11174:21;;;11211:18;;;11204:30;11270:34;11265:2;11250:18;;11243:62;11337:2;11322:18;;10990:356::o;11351:127::-;11412:10;11407:3;11403:20;11400:1;11393:31;11443:4;11440:1;11433:15;11467:4;11464:1;11457:15;11483:128;11523:3;11554:1;11550:6;11547:1;11544:13;11541:39;;;11560:18;;:::i;:::-;-1:-1:-1;11596:9:1;;11483:128::o;11616:401::-;11818:2;11800:21;;;11857:2;11837:18;;;11830:30;11896:34;11891:2;11876:18;;11869:62;-1:-1:-1;;;11962:2:1;11947:18;;11940:35;12007:3;11992:19;;11616:401::o;12022:380::-;12101:1;12097:12;;;;12144;;;12165:61;;12219:4;12211:6;12207:17;12197:27;;12165:61;12272:2;12264:6;12261:14;12241:18;12238:38;12235:161;;;12318:10;12313:3;12309:20;12306:1;12299:31;12353:4;12350:1;12343:15;12381:4;12378:1;12371:15;12235:161;;12022:380;;;:::o;14052:413::-;14254:2;14236:21;;;14293:2;14273:18;;;14266:30;14332:34;14327:2;14312:18;;14305:62;-1:-1:-1;;;14398:2:1;14383:18;;14376:47;14455:3;14440:19;;14052:413::o;14882:127::-;14943:10;14938:3;14934:20;14931:1;14924:31;14974:4;14971:1;14964:15;14998:4;14995:1;14988:15;15014:405;15216:2;15198:21;;;15255:2;15235:18;;;15228:30;15294:34;15289:2;15274:18;;15267:62;-1:-1:-1;;;15360:2:1;15345:18;;15338:39;15409:3;15394:19;;15014:405::o;15424:185::-;15466:3;15504:5;15498:12;15519:52;15564:6;15559:3;15552:4;15545:5;15541:16;15519:52;:::i;:::-;15587:16;;;;;15424:185;-1:-1:-1;;15424:185:1:o;15614:276::-;15745:3;15783:6;15777:13;15799:53;15845:6;15840:3;15833:4;15825:6;15821:17;15799:53;:::i;:::-;15868:16;;;;;15614:276;-1:-1:-1;;15614:276:1:o;15895:402::-;16097:2;16079:21;;;16136:2;16116:18;;;16109:30;16175:34;16170:2;16155:18;;16148:62;-1:-1:-1;;;16241:2:1;16226:18;;16219:36;16287:3;16272:19;;15895:402::o;16302:405::-;16504:2;16486:21;;;16543:2;16523:18;;;16516:30;16582:34;16577:2;16562:18;;16555:62;-1:-1:-1;;;16648:2:1;16633:18;;16626:39;16697:3;16682:19;;16302:405::o;16712:399::-;16914:2;16896:21;;;16953:2;16933:18;;;16926:30;16992:34;16987:2;16972:18;;16965:62;-1:-1:-1;;;17058:2:1;17043:18;;17036:33;17101:3;17086:19;;16712:399::o;17116:470::-;17295:3;17333:6;17327:13;17349:53;17395:6;17390:3;17383:4;17375:6;17371:17;17349:53;:::i;:::-;17465:13;;17424:16;;;;17487:57;17465:13;17424:16;17521:4;17509:17;;17487:57;:::i;:::-;17560:20;;17116:470;-1:-1:-1;;;;17116:470:1:o;18004:127::-;18065:10;18060:3;18056:20;18053:1;18046:31;18096:4;18093:1;18086:15;18120:4;18117:1;18110:15;18136:611;18343:3;18381:6;18375:13;18397:53;18443:6;18438:3;18431:4;18423:6;18419:17;18397:53;:::i;:::-;18513:13;;18472:16;;;;18535:57;18513:13;18472:16;18569:4;18557:17;;18535:57;:::i;:::-;18665:2;18661:15;;;;-1:-1:-1;;18657:53:1;18614:20;;18643:68;;;-1:-1:-1;;18738:2:1;18727:14;;18136:611;-1:-1:-1;;18136:611:1:o;19112:135::-;19151:3;-1:-1:-1;;19172:17:1;;19169:43;;;19192:18;;:::i;:::-;-1:-1:-1;19239:1:1;19228:13;;19112:135::o;20844:168::-;20884:7;20950:1;20946;20942:6;20938:14;20935:1;20932:21;20927:1;20920:9;20913:17;20909:45;20906:71;;;20957:18;;:::i;:::-;-1:-1:-1;20997:9:1;;20844:168::o;22147:127::-;22208:10;22203:3;22199:20;22196:1;22189:31;22239:4;22236:1;22229:15;22263:4;22260:1;22253:15;22279:112;22311:1;22337;22327:35;;22342:18;;:::i;:::-;-1:-1:-1;22376:9:1;;22279:112::o;22522:1174::-;22698:3;22727:1;22760:6;22754:13;22790:3;22812:1;22840:9;22836:2;22832:18;22822:28;;22900:2;22889:9;22885:18;22922;22912:61;;22966:4;22958:6;22954:17;22944:27;;22912:61;22992:2;23040;23032:6;23029:14;23009:18;23006:38;23003:165;;;-1:-1:-1;;;23067:33:1;;23123:4;23120:1;23113:15;23153:4;23074:3;23141:17;23003:165;23184:18;23211:104;;;;23329:1;23324:320;;;;23177:467;;23211:104;-1:-1:-1;;23244:24:1;;23232:37;;23289:16;;;;-1:-1:-1;23211:104:1;;23324:320;22469:1;22462:14;;;22506:4;22493:18;;23419:1;23433:165;23447:6;23444:1;23441:13;23433:165;;;23525:14;;23512:11;;;23505:35;23568:16;;;;23462:10;;23433:165;;;23437:3;;23627:6;23622:3;23618:16;23611:23;;23177:467;;;;;;;23660:30;23686:3;23678:6;23660:30;:::i;:::-;23653:37;22522:1174;-1:-1:-1;;;;;22522:1174:1:o;24420:125::-;24460:4;24488:1;24485;24482:8;24479:34;;;24493:18;;:::i;:::-;-1:-1:-1;24530:9:1;;24420:125::o;26570:414::-;26772:2;26754:21;;;26811:2;26791:18;;;26784:30;26850:34;26845:2;26830:18;;26823:62;-1:-1:-1;;;26916:2:1;26901:18;;26894:48;26974:3;26959:19;;26570:414::o;26989:120::-;27029:1;27055;27045:35;;27060:18;;:::i;:::-;-1:-1:-1;27094:9:1;;26989:120::o;27517:500::-;-1:-1:-1;;;;;27786:15:1;;;27768:34;;27838:15;;27833:2;27818:18;;27811:43;27885:2;27870:18;;27863:34;;;27933:3;27928:2;27913:18;;27906:31;;;27711:4;;27954:57;;27991:19;;27983:6;27954:57;:::i;:::-;27946:65;27517:500;-1:-1:-1;;;;;;27517:500:1:o;28022:249::-;28091:6;28144:2;28132:9;28123:7;28119:23;28115:32;28112:52;;;28160:1;28157;28150:12;28112:52;28192:9;28186:16;28211:30;28235:5;28211:30;:::i;28276:127::-;28337:10;28332:3;28328:20;28325:1;28318:31;28368:4;28365:1;28358:15;28392:4;28389:1;28382:15

Swarm Source

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