ETH Price: $3,506.36 (+4.01%)
Gas: 4 Gwei

Token

CloudPasses (CLOUDS)
 

Overview

Max Total Supply

99 CLOUDS

Holders

58

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 CLOUDS
0x5cc6ea0eabc760aaff7800ab8b198f0342cc6362
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:
CloudPasses

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-17
*/

// File: @openzeppelin/contracts/utils/math/Math.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: CloudPassesFinal.sol


pragma solidity ^0.8.17;










/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extensions
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
  using Address for address;
  using Strings for uint256;

  string private _name;
  string private _symbol;

  // nft ownership + burns data
  address[] public owners;
  uint public burnedTokens;

  function totalSupply() public override view returns (uint256) {
    return owners.length - burnedTokens;
  }

  function tokenByIndex(uint256 id) public override pure returns (uint256) {
    return id;
  }
  function tokenOfOwnerByIndex(address user, uint256 id) public override view returns (uint256) {
    uint256 ownedCount = 0;
    for(uint i = 0; i < owners.length; i++) {
      if(owners[i] == user) {
        if(ownedCount == id) {
          return i;
        } else {
          ownedCount++;
        }
      }
    }

    revert("ID_TOO_HIGH");
  }

  // 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");
    uint count;
    for(uint i = 0; i < owners.length; i++) {
      if(owner == owners[i]) {
        count++;
      }
    }
    return count;
  }

  /**
  * @dev See {IERC721-ownerOf}.
  */
  function ownerOf(uint256 tokenId) public view virtual override returns (address) {
    require(tokenId < owners.length, "ERC721: owner query for nonexistent token");
    address owner = owners[tokenId];
    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.length > tokenId && 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), "ALREADY_MINTED");

    owners.push(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);

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

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

    // delete owners[tokenId];
    owners[tokenId] = address(0);
    burnedTokens++;

    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");

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

    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;
    }
  }
}


contract CloudPasses is ERC721, Ownable {

  //---------------------------------------------------------------
  //  CONSTANTS
  //---------------------------------------------------------------
  uint256 public constant MAX_SUPPLY = 100;
  uint256 public constant MAX_PER_WALLET = 2;
  bool    public isRevealed;

  //---------------------------------------------------------------
  //  METADATA
  //---------------------------------------------------------------
  string public baseURI;
  string public coverURI;

  mapping (address => uint) public minters;

  function tokenURI(uint256 id) public view virtual override returns (string memory) {
    require(_exists(id), "ERC721Metadata: URI query for nonexistent token");
    if(!isRevealed) {
      return coverURI;
    }

    return string(abi.encodePacked(baseURI, Strings.toString(id), ".json"));
  }

  //---------------------------------------------------------------
  //  CONSTRUCTOR
  //---------------------------------------------------------------

  constructor(string memory _coverURI) ERC721("CloudPasses", "CLOUDS") {
    coverURI = _coverURI;
    owners.push(address(0x0)); // owners[0] == 0x0 to start id count at 1
    burnedTokens += 1;
  }

  uint public constant MINT_PRICE = 0.02 ether;

  event MintId(uint);
  function mint(uint amount) public payable {
    require(owners.length < MAX_SUPPLY, "MAX_SUPPLY");
    require(msg.value == MINT_PRICE * amount, "WRONG_ETH_AMT");

    minters[msg.sender] += amount;
    require(minters[msg.sender] <= MAX_PER_WALLET, "MAX_TWO_PER_WALLET");
    for(uint i=0; i < amount; ++i) {
      _safeMint(msg.sender, owners.length);
    }
  }

  function burn(uint256 id) public {
    _burn(id);
  }

  //----------------------------------------------------------------
  //  ADMIN FUNCTIONS
  //----------------------------------------------------------------

  function setCoverURI(string memory uri) public onlyOwner {
    coverURI = uri;
  }
  function setBaseURI(string memory uri) public onlyOwner {
    baseURI = uri;
  }
  function setIsRevealed(bool _isRevealed) public onlyOwner {
    isRevealed = _isRevealed;
  }

  //---------------------------------------------------------------
  // WITHDRAWAL
  //---------------------------------------------------------------

  function withdraw(address to, uint256 amount) public onlyOwner {
    (bool success,) = payable(to).call{ value: amount }("");
    require(success, "WITHDRAWAL_FAILED");
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_coverURI","type":"string"}],"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":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"MintId","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":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coverURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","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":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setCoverURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isRevealed","type":"bool"}],"name":"setIsRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200245938038062002459833981016040819052620000349162000193565b6040518060400160405280600b81526020016a436c6f756450617373657360a81b81525060405180604001604052806006815260200165434c4f55445360d01b8152508160009081620000889190620002f7565b506001620000978282620002f7565b505050620000b4620000ae6200012760201b60201c565b6200012b565b6008620000c28282620002f7565b50600280546001818101835560009283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b031916905560038054919290916200011a908490620003c3565b90915550620003eb915050565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215620001a757600080fd5b82516001600160401b0380821115620001bf57600080fd5b818501915085601f830112620001d457600080fd5b815181811115620001e957620001e96200017d565b604051601f8201601f19908116603f011681019083821181831017156200021457620002146200017d565b8160405282815288868487010111156200022d57600080fd5b600093505b8284101562000251578484018601518185018701529285019262000232565b600086848301015280965050505050505092915050565b600181811c908216806200027d57607f821691505b6020821081036200029e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002f257600081815260208120601f850160051c81016020861015620002cd5750805b601f850160051c820191505b81811015620002ee57828155600101620002d9565b5050505b505050565b81516001600160401b038111156200031357620003136200017d565b6200032b8162000324845462000268565b84620002a4565b602080601f8311600181146200036357600084156200034a5750858301515b600019600386901b1c1916600185901b178555620002ee565b600085815260208120601f198616915b82811015620003945788860151825594840194600190910190840162000373565b5085821015620003b35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115620003e557634e487b7160e01b600052601160045260246000fd5b92915050565b61205e80620003fb6000396000f3fe6080604052600436106101f95760003560e01c8063580397061161010d578063a22cb465116100a0578063e985e9c51161006f578063e985e9c514610571578063ecd783c4146105ba578063f2fde38b146105da578063f3fef3a3146105fa578063f46eccc41461061a57600080fd5b8063a22cb465146104f6578063b88d4fde14610516578063c002d23d14610536578063c87b56dd1461055157600080fd5b8063715018a6116100dc578063715018a61461049b5780638da5cb5b146104b057806395d89b41146104ce578063a0712d68146104e357600080fd5b806358039706146104315780636352211e146104465780636c0360eb1461046657806370a082311461047b57600080fd5b80632f745c591161019057806347b5dd541161015f57806347b5dd541461039c57806349a5980a146103b25780634f6ccce7146103d257806354214f69146103f057806355f804b31461041157600080fd5b80632f745c591461032757806332cb6b0c1461034757806342842e0e1461035c57806342966c681461037c57600080fd5b8063095ea7b3116101cc578063095ea7b3146102ad5780630f2cdd6c146102cf57806318160ddd146102f257806323b872dd1461030757600080fd5b806301ffc9a7146101fe578063025e7c271461023357806306fdde031461026b578063081812fc1461028d575b600080fd5b34801561020a57600080fd5b5061021e610219366004611957565b610647565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e36600461197b565b610699565b6040516001600160a01b03909116815260200161022a565b34801561027757600080fd5b506102806106c3565b60405161022a91906119e4565b34801561029957600080fd5b506102536102a836600461197b565b610755565b3480156102b957600080fd5b506102cd6102c8366004611a13565b6107e2565b005b3480156102db57600080fd5b506102e4600281565b60405190815260200161022a565b3480156102fe57600080fd5b506102e46108a1565b34801561031357600080fd5b506102cd610322366004611a3d565b6108b8565b34801561033357600080fd5b506102e4610342366004611a13565b6108e9565b34801561035357600080fd5b506102e4606481565b34801561036857600080fd5b506102cd610377366004611a3d565b610996565b34801561038857600080fd5b506102cd61039736600461197b565b6109b1565b3480156103a857600080fd5b506102e460035481565b3480156103be57600080fd5b506102cd6103cd366004611a89565b6109bd565b3480156103de57600080fd5b506102e46103ed36600461197b565b90565b3480156103fc57600080fd5b5060065461021e90600160a01b900460ff1681565b34801561041d57600080fd5b506102cd61042c366004611b30565b6109e3565b34801561043d57600080fd5b506102806109fb565b34801561045257600080fd5b5061025361046136600461197b565b610a89565b34801561047257600080fd5b50610280610b20565b34801561048757600080fd5b506102e4610496366004611b79565b610b2d565b3480156104a757600080fd5b506102cd610bff565b3480156104bc57600080fd5b506006546001600160a01b0316610253565b3480156104da57600080fd5b50610280610c13565b6102cd6104f136600461197b565b610c22565b34801561050257600080fd5b506102cd610511366004611b94565b610d52565b34801561052257600080fd5b506102cd610531366004611bc7565b610e16565b34801561054257600080fd5b506102e466470de4df82000081565b34801561055d57600080fd5b5061028061056c36600461197b565b610e4e565b34801561057d57600080fd5b5061021e61058c366004611c43565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105c657600080fd5b506102cd6105d5366004611b30565b610f92565b3480156105e657600080fd5b506102cd6105f5366004611b79565b610fa6565b34801561060657600080fd5b506102cd610615366004611a13565b61101c565b34801561062657600080fd5b506102e4610635366004611b79565b60096020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b148061067857506001600160e01b03198216635b5e139f60e01b145b8061069357506301ffc9a760e01b6001600160e01b03198316145b92915050565b600281815481106106a957600080fd5b6000918252602090912001546001600160a01b0316905081565b6060600080546106d290611c6d565b80601f01602080910402602001604051908101604052809291908181526020018280546106fe90611c6d565b801561074b5780601f106107205761010080835404028352916020019161074b565b820191906000526020600020905b81548152906001019060200180831161072e57829003601f168201915b5050505050905090565b6000610760826110bb565b6107c65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107ed82610a89565b9050806001600160a01b0316836001600160a01b03160361085a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107bd565b336001600160a01b03821614806108765750610876813361058c565b6108925760405162461bcd60e51b81526004016107bd90611ca7565b61089c8383611105565b505050565b6003546002546000916108b391611d1a565b905090565b6108c23382611173565b6108de5760405162461bcd60e51b81526004016107bd90611d2d565b61089c83838361125d565b600080805b60025481101561095f57846001600160a01b03166002828154811061091557610915611d7e565b6000918252602090912001546001600160a01b03160361094d5783820361093f5791506106939050565b8161094981611d94565b9250505b8061095781611d94565b9150506108ee565b5060405162461bcd60e51b815260206004820152600b60248201526a09288bea89e9ebe90928e960ab1b60448201526064016107bd565b61089c83838360405180602001604052806000815250610e16565b6109ba816113b3565b50565b6109c5611490565b60068054911515600160a01b0260ff60a01b19909216919091179055565b6109eb611490565b60076109f78282611dfb565b5050565b60088054610a0890611c6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3490611c6d565b8015610a815780601f10610a5657610100808354040283529160200191610a81565b820191906000526020600020905b815481529060010190602001808311610a6457829003601f168201915b505050505081565b6002546000908210610aef5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107bd565b600060028381548110610b0457610b04611d7e565b6000918252602090912001546001600160a01b03169392505050565b60078054610a0890611c6d565b60006001600160a01b038216610b985760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107bd565b6000805b600254811015610bf85760028181548110610bb957610bb9611d7e565b6000918252602090912001546001600160a01b0390811690851603610be65781610be281611d94565b9250505b80610bf081611d94565b915050610b9c565b5092915050565b610c07611490565b610c1160006114ea565b565b6060600180546106d290611c6d565b600254606411610c615760405162461bcd60e51b815260206004820152600a6024820152694d41585f535550504c5960b01b60448201526064016107bd565b610c728166470de4df820000611ebb565b3414610cb05760405162461bcd60e51b815260206004820152600d60248201526c15d493d391d7d1551217d05355609a1b60448201526064016107bd565b3360009081526009602052604081208054839290610ccf908490611ed2565b90915550503360009081526009602052604090205460021015610d295760405162461bcd60e51b815260206004820152601260248201527113505617d515d3d7d4115497d5d05313115560721b60448201526064016107bd565b60005b818110156109f757600254610d4290339061153c565b610d4b81611d94565b9050610d2c565b336001600160a01b03831603610daa5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107bd565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610e203383611173565b610e3c5760405162461bcd60e51b81526004016107bd90611d2d565b610e4884848484611556565b50505050565b6060610e59826110bb565b610ebd5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107bd565b600654600160a01b900460ff16610f605760088054610edb90611c6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0790611c6d565b8015610f545780601f10610f2957610100808354040283529160200191610f54565b820191906000526020600020905b815481529060010190602001808311610f3757829003601f168201915b50505050509050919050565b6007610f6b83611589565b604051602001610f7c929190611ee5565b6040516020818303038152906040529050919050565b610f9a611490565b60086109f78282611dfb565b610fae611490565b6001600160a01b0381166110135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107bd565b6109ba816114ea565b611024611490565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611071576040519150601f19603f3d011682016040523d82523d6000602084013e611076565b606091505b505090508061089c5760405162461bcd60e51b815260206004820152601160248201527015d2551211149055d05317d19052531151607a1b60448201526064016107bd565b60025460009082108015610693575060006001600160a01b0316600283815481106110e8576110e8611d7e565b6000918252602090912001546001600160a01b0316141592915050565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061113a82610a89565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061117e826110bb565b6111df5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107bd565b60006111ea83610a89565b9050806001600160a01b0316846001600160a01b031614806112255750836001600160a01b031661121a84610755565b6001600160a01b0316145b8061125557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661127082610a89565b6001600160a01b0316146112d85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107bd565b6001600160a01b03821661133a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107bd565b611345600082611105565b816002828154811061135957611359611d7e565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006113be82610a89565b9050336001600160a01b03821614806113dc57506113dc813361058c565b6113f85760405162461bcd60e51b81526004016107bd90611ca7565b611403600083611105565b60006002838154811061141857611418611d7e565b6000918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155600380549161144f83611d94565b909155505060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6006546001600160a01b03163314610c115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bd565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6109f782826040518060200160405280600081525061161c565b61156184848461125d565b61156d8484848461164f565b610e485760405162461bcd60e51b81526004016107bd90611f7c565b6060600061159683611750565b600101905060008167ffffffffffffffff8111156115b6576115b6611aa4565b6040519080825280601f01601f1916602001820160405280156115e0576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846115ea57509392505050565b6116268383611828565b611633600084848461164f565b61089c5760405162461bcd60e51b81526004016107bd90611f7c565b60006001600160a01b0384163b1561174557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611693903390899088908890600401611fce565b6020604051808303816000875af19250505080156116ce575060408051601f3d908101601f191682019092526116cb9181019061200b565b60015b61172b573d8080156116fc576040519150601f19603f3d011682016040523d82523d6000602084013e611701565b606091505b5080516000036117235760405162461bcd60e51b81526004016107bd90611f7c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611255565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061178f5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106117bb576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106117d957662386f26fc10000830492506010015b6305f5e10083106117f1576305f5e100830492506008015b612710831061180557612710830492506004015b60648310611817576064830492506002015b600a83106106935760010192915050565b6001600160a01b03821661187e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107bd565b611887816110bb565b156118c55760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b60448201526064016107bd565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146109ba57600080fd5b60006020828403121561196957600080fd5b813561197481611941565b9392505050565b60006020828403121561198d57600080fd5b5035919050565b60005b838110156119af578181015183820152602001611997565b50506000910152565b600081518084526119d0816020860160208601611994565b601f01601f19169290920160200192915050565b60208152600061197460208301846119b8565b80356001600160a01b0381168114611a0e57600080fd5b919050565b60008060408385031215611a2657600080fd5b611a2f836119f7565b946020939093013593505050565b600080600060608486031215611a5257600080fd5b611a5b846119f7565b9250611a69602085016119f7565b9150604084013590509250925092565b80358015158114611a0e57600080fd5b600060208284031215611a9b57600080fd5b61197482611a79565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611ad557611ad5611aa4565b604051601f8501601f19908116603f01168101908282118183101715611afd57611afd611aa4565b81604052809350858152868686011115611b1657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611b4257600080fd5b813567ffffffffffffffff811115611b5957600080fd5b8201601f81018413611b6a57600080fd5b61125584823560208401611aba565b600060208284031215611b8b57600080fd5b611974826119f7565b60008060408385031215611ba757600080fd5b611bb0836119f7565b9150611bbe60208401611a79565b90509250929050565b60008060008060808587031215611bdd57600080fd5b611be6856119f7565b9350611bf4602086016119f7565b925060408501359150606085013567ffffffffffffffff811115611c1757600080fd5b8501601f81018713611c2857600080fd5b611c3787823560208401611aba565b91505092959194509250565b60008060408385031215611c5657600080fd5b611c5f836119f7565b9150611bbe602084016119f7565b600181811c90821680611c8157607f821691505b602082108103611ca157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8181038181111561069357610693611d04565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060018201611da657611da6611d04565b5060010190565b601f82111561089c57600081815260208120601f850160051c81016020861015611dd45750805b601f850160051c820191505b81811015611df357828155600101611de0565b505050505050565b815167ffffffffffffffff811115611e1557611e15611aa4565b611e2981611e238454611c6d565b84611dad565b602080601f831160018114611e5e5760008415611e465750858301515b600019600386901b1c1916600185901b178555611df3565b600085815260208120601f198616915b82811015611e8d57888601518255948401946001909101908401611e6e565b5085821015611eab5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808202811582820484141761069357610693611d04565b8082018082111561069357610693611d04565b6000808454611ef381611c6d565b60018281168015611f0b5760018114611f2057611f4f565b60ff1984168752821515830287019450611f4f565b8860005260208060002060005b85811015611f465781548a820152908401908201611f2d565b50505082870194505b505050508351611f63818360208801611994565b64173539b7b760d91b9101908152600501949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612001908301846119b8565b9695505050505050565b60006020828403121561201d57600080fd5b81516119748161194156fea2646970667358221220b4b16b716e6c45aa7680c7392cb3d0874ab98d8ac6ab74182cb04e6cab4592e464736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5056554e6238754659384a736744534a4157346147686a50374336466f4e326a7377427142666871693571380000000000000000000000

Deployed Bytecode

0x6080604052600436106101f95760003560e01c8063580397061161010d578063a22cb465116100a0578063e985e9c51161006f578063e985e9c514610571578063ecd783c4146105ba578063f2fde38b146105da578063f3fef3a3146105fa578063f46eccc41461061a57600080fd5b8063a22cb465146104f6578063b88d4fde14610516578063c002d23d14610536578063c87b56dd1461055157600080fd5b8063715018a6116100dc578063715018a61461049b5780638da5cb5b146104b057806395d89b41146104ce578063a0712d68146104e357600080fd5b806358039706146104315780636352211e146104465780636c0360eb1461046657806370a082311461047b57600080fd5b80632f745c591161019057806347b5dd541161015f57806347b5dd541461039c57806349a5980a146103b25780634f6ccce7146103d257806354214f69146103f057806355f804b31461041157600080fd5b80632f745c591461032757806332cb6b0c1461034757806342842e0e1461035c57806342966c681461037c57600080fd5b8063095ea7b3116101cc578063095ea7b3146102ad5780630f2cdd6c146102cf57806318160ddd146102f257806323b872dd1461030757600080fd5b806301ffc9a7146101fe578063025e7c271461023357806306fdde031461026b578063081812fc1461028d575b600080fd5b34801561020a57600080fd5b5061021e610219366004611957565b610647565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e36600461197b565b610699565b6040516001600160a01b03909116815260200161022a565b34801561027757600080fd5b506102806106c3565b60405161022a91906119e4565b34801561029957600080fd5b506102536102a836600461197b565b610755565b3480156102b957600080fd5b506102cd6102c8366004611a13565b6107e2565b005b3480156102db57600080fd5b506102e4600281565b60405190815260200161022a565b3480156102fe57600080fd5b506102e46108a1565b34801561031357600080fd5b506102cd610322366004611a3d565b6108b8565b34801561033357600080fd5b506102e4610342366004611a13565b6108e9565b34801561035357600080fd5b506102e4606481565b34801561036857600080fd5b506102cd610377366004611a3d565b610996565b34801561038857600080fd5b506102cd61039736600461197b565b6109b1565b3480156103a857600080fd5b506102e460035481565b3480156103be57600080fd5b506102cd6103cd366004611a89565b6109bd565b3480156103de57600080fd5b506102e46103ed36600461197b565b90565b3480156103fc57600080fd5b5060065461021e90600160a01b900460ff1681565b34801561041d57600080fd5b506102cd61042c366004611b30565b6109e3565b34801561043d57600080fd5b506102806109fb565b34801561045257600080fd5b5061025361046136600461197b565b610a89565b34801561047257600080fd5b50610280610b20565b34801561048757600080fd5b506102e4610496366004611b79565b610b2d565b3480156104a757600080fd5b506102cd610bff565b3480156104bc57600080fd5b506006546001600160a01b0316610253565b3480156104da57600080fd5b50610280610c13565b6102cd6104f136600461197b565b610c22565b34801561050257600080fd5b506102cd610511366004611b94565b610d52565b34801561052257600080fd5b506102cd610531366004611bc7565b610e16565b34801561054257600080fd5b506102e466470de4df82000081565b34801561055d57600080fd5b5061028061056c36600461197b565b610e4e565b34801561057d57600080fd5b5061021e61058c366004611c43565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105c657600080fd5b506102cd6105d5366004611b30565b610f92565b3480156105e657600080fd5b506102cd6105f5366004611b79565b610fa6565b34801561060657600080fd5b506102cd610615366004611a13565b61101c565b34801561062657600080fd5b506102e4610635366004611b79565b60096020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b148061067857506001600160e01b03198216635b5e139f60e01b145b8061069357506301ffc9a760e01b6001600160e01b03198316145b92915050565b600281815481106106a957600080fd5b6000918252602090912001546001600160a01b0316905081565b6060600080546106d290611c6d565b80601f01602080910402602001604051908101604052809291908181526020018280546106fe90611c6d565b801561074b5780601f106107205761010080835404028352916020019161074b565b820191906000526020600020905b81548152906001019060200180831161072e57829003601f168201915b5050505050905090565b6000610760826110bb565b6107c65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107ed82610a89565b9050806001600160a01b0316836001600160a01b03160361085a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107bd565b336001600160a01b03821614806108765750610876813361058c565b6108925760405162461bcd60e51b81526004016107bd90611ca7565b61089c8383611105565b505050565b6003546002546000916108b391611d1a565b905090565b6108c23382611173565b6108de5760405162461bcd60e51b81526004016107bd90611d2d565b61089c83838361125d565b600080805b60025481101561095f57846001600160a01b03166002828154811061091557610915611d7e565b6000918252602090912001546001600160a01b03160361094d5783820361093f5791506106939050565b8161094981611d94565b9250505b8061095781611d94565b9150506108ee565b5060405162461bcd60e51b815260206004820152600b60248201526a09288bea89e9ebe90928e960ab1b60448201526064016107bd565b61089c83838360405180602001604052806000815250610e16565b6109ba816113b3565b50565b6109c5611490565b60068054911515600160a01b0260ff60a01b19909216919091179055565b6109eb611490565b60076109f78282611dfb565b5050565b60088054610a0890611c6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3490611c6d565b8015610a815780601f10610a5657610100808354040283529160200191610a81565b820191906000526020600020905b815481529060010190602001808311610a6457829003601f168201915b505050505081565b6002546000908210610aef5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107bd565b600060028381548110610b0457610b04611d7e565b6000918252602090912001546001600160a01b03169392505050565b60078054610a0890611c6d565b60006001600160a01b038216610b985760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107bd565b6000805b600254811015610bf85760028181548110610bb957610bb9611d7e565b6000918252602090912001546001600160a01b0390811690851603610be65781610be281611d94565b9250505b80610bf081611d94565b915050610b9c565b5092915050565b610c07611490565b610c1160006114ea565b565b6060600180546106d290611c6d565b600254606411610c615760405162461bcd60e51b815260206004820152600a6024820152694d41585f535550504c5960b01b60448201526064016107bd565b610c728166470de4df820000611ebb565b3414610cb05760405162461bcd60e51b815260206004820152600d60248201526c15d493d391d7d1551217d05355609a1b60448201526064016107bd565b3360009081526009602052604081208054839290610ccf908490611ed2565b90915550503360009081526009602052604090205460021015610d295760405162461bcd60e51b815260206004820152601260248201527113505617d515d3d7d4115497d5d05313115560721b60448201526064016107bd565b60005b818110156109f757600254610d4290339061153c565b610d4b81611d94565b9050610d2c565b336001600160a01b03831603610daa5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107bd565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610e203383611173565b610e3c5760405162461bcd60e51b81526004016107bd90611d2d565b610e4884848484611556565b50505050565b6060610e59826110bb565b610ebd5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107bd565b600654600160a01b900460ff16610f605760088054610edb90611c6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0790611c6d565b8015610f545780601f10610f2957610100808354040283529160200191610f54565b820191906000526020600020905b815481529060010190602001808311610f3757829003601f168201915b50505050509050919050565b6007610f6b83611589565b604051602001610f7c929190611ee5565b6040516020818303038152906040529050919050565b610f9a611490565b60086109f78282611dfb565b610fae611490565b6001600160a01b0381166110135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107bd565b6109ba816114ea565b611024611490565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611071576040519150601f19603f3d011682016040523d82523d6000602084013e611076565b606091505b505090508061089c5760405162461bcd60e51b815260206004820152601160248201527015d2551211149055d05317d19052531151607a1b60448201526064016107bd565b60025460009082108015610693575060006001600160a01b0316600283815481106110e8576110e8611d7e565b6000918252602090912001546001600160a01b0316141592915050565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061113a82610a89565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061117e826110bb565b6111df5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107bd565b60006111ea83610a89565b9050806001600160a01b0316846001600160a01b031614806112255750836001600160a01b031661121a84610755565b6001600160a01b0316145b8061125557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661127082610a89565b6001600160a01b0316146112d85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107bd565b6001600160a01b03821661133a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107bd565b611345600082611105565b816002828154811061135957611359611d7e565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006113be82610a89565b9050336001600160a01b03821614806113dc57506113dc813361058c565b6113f85760405162461bcd60e51b81526004016107bd90611ca7565b611403600083611105565b60006002838154811061141857611418611d7e565b6000918252602082200180546001600160a01b0319166001600160a01b039390931692909217909155600380549161144f83611d94565b909155505060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6006546001600160a01b03163314610c115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bd565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6109f782826040518060200160405280600081525061161c565b61156184848461125d565b61156d8484848461164f565b610e485760405162461bcd60e51b81526004016107bd90611f7c565b6060600061159683611750565b600101905060008167ffffffffffffffff8111156115b6576115b6611aa4565b6040519080825280601f01601f1916602001820160405280156115e0576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846115ea57509392505050565b6116268383611828565b611633600084848461164f565b61089c5760405162461bcd60e51b81526004016107bd90611f7c565b60006001600160a01b0384163b1561174557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611693903390899088908890600401611fce565b6020604051808303816000875af19250505080156116ce575060408051601f3d908101601f191682019092526116cb9181019061200b565b60015b61172b573d8080156116fc576040519150601f19603f3d011682016040523d82523d6000602084013e611701565b606091505b5080516000036117235760405162461bcd60e51b81526004016107bd90611f7c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611255565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061178f5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106117bb576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106117d957662386f26fc10000830492506010015b6305f5e10083106117f1576305f5e100830492506008015b612710831061180557612710830492506004015b60648310611817576064830492506002015b600a83106106935760010192915050565b6001600160a01b03821661187e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107bd565b611887816110bb565b156118c55760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b60448201526064016107bd565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146109ba57600080fd5b60006020828403121561196957600080fd5b813561197481611941565b9392505050565b60006020828403121561198d57600080fd5b5035919050565b60005b838110156119af578181015183820152602001611997565b50506000910152565b600081518084526119d0816020860160208601611994565b601f01601f19169290920160200192915050565b60208152600061197460208301846119b8565b80356001600160a01b0381168114611a0e57600080fd5b919050565b60008060408385031215611a2657600080fd5b611a2f836119f7565b946020939093013593505050565b600080600060608486031215611a5257600080fd5b611a5b846119f7565b9250611a69602085016119f7565b9150604084013590509250925092565b80358015158114611a0e57600080fd5b600060208284031215611a9b57600080fd5b61197482611a79565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611ad557611ad5611aa4565b604051601f8501601f19908116603f01168101908282118183101715611afd57611afd611aa4565b81604052809350858152868686011115611b1657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611b4257600080fd5b813567ffffffffffffffff811115611b5957600080fd5b8201601f81018413611b6a57600080fd5b61125584823560208401611aba565b600060208284031215611b8b57600080fd5b611974826119f7565b60008060408385031215611ba757600080fd5b611bb0836119f7565b9150611bbe60208401611a79565b90509250929050565b60008060008060808587031215611bdd57600080fd5b611be6856119f7565b9350611bf4602086016119f7565b925060408501359150606085013567ffffffffffffffff811115611c1757600080fd5b8501601f81018713611c2857600080fd5b611c3787823560208401611aba565b91505092959194509250565b60008060408385031215611c5657600080fd5b611c5f836119f7565b9150611bbe602084016119f7565b600181811c90821680611c8157607f821691505b602082108103611ca157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8181038181111561069357610693611d04565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060018201611da657611da6611d04565b5060010190565b601f82111561089c57600081815260208120601f850160051c81016020861015611dd45750805b601f850160051c820191505b81811015611df357828155600101611de0565b505050505050565b815167ffffffffffffffff811115611e1557611e15611aa4565b611e2981611e238454611c6d565b84611dad565b602080601f831160018114611e5e5760008415611e465750858301515b600019600386901b1c1916600185901b178555611df3565b600085815260208120601f198616915b82811015611e8d57888601518255948401946001909101908401611e6e565b5085821015611eab5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808202811582820484141761069357610693611d04565b8082018082111561069357610693611d04565b6000808454611ef381611c6d565b60018281168015611f0b5760018114611f2057611f4f565b60ff1984168752821515830287019450611f4f565b8860005260208060002060005b85811015611f465781548a820152908401908201611f2d565b50505082870194505b505050508351611f63818360208801611994565b64173539b7b760d91b9101908152600501949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612001908301846119b8565b9695505050505050565b60006020828403121561201d57600080fd5b81516119748161194156fea2646970667358221220b4b16b716e6c45aa7680c7392cb3d0874ab98d8ac6ab74182cb04e6cab4592e464736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5056554e6238754659384a736744534a4157346147686a50374336466f4e326a7377427142666871693571380000000000000000000000

-----Decoded View---------------
Arg [0] : _coverURI (string): ipfs://QmPVUNb8uFY8JsgDSJAW4aGhjP7C6FoN2jswBqBfhqi5q8

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [2] : 697066733a2f2f516d5056554e6238754659384a736744534a4157346147686a
Arg [3] : 50374336466f4e326a7377427142666871693571380000000000000000000000


Deployed Bytecode Sourcemap

50471:2543:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39845:279;;;;;;;;;;-1:-1:-1;39845:279:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;39845:279:0;;;;;;;;38698:23;;;;;;;;;;-1:-1:-1;38698:23:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;941:32:1;;;923:51;;911:2;896:18;38698:23:0;777:203:1;40832:94:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42271:211::-;;;;;;;;;;-1:-1:-1;42271:211:0;;;;;:::i;:::-;;:::i;41838:377::-;;;;;;;;;;-1:-1:-1;41838:377:0;;;;;:::i;:::-;;:::i;:::-;;50718:42;;;;;;;;;;;;50759:1;50718:42;;;;;2324:25:1;;;2312:2;2297:18;50718:42:0;2178:177:1;38757:110:0;;;;;;;;;;;;;:::i;43101:311::-;;;;;;;;;;-1:-1:-1;43101:311:0;;;;;:::i;:::-;;:::i;38972:360::-;;;;;;;;;;-1:-1:-1;38972:360:0;;;;;:::i;:::-;;:::i;50673:40::-;;;;;;;;;;;;50710:3;50673:40;;43473:165;;;;;;;;;;-1:-1:-1;43473:165:0;;;;;:::i;:::-;;:::i;52178:55::-;;;;;;;;;;-1:-1:-1;52178:55:0;;;;;:::i;:::-;;:::i;38726:24::-;;;;;;;;;;;;;;;;52578:95;;;;;;;;;;-1:-1:-1;52578:95:0;;;;;:::i;:::-;;:::i;38873:::-;;;;;;;;;;-1:-1:-1;38873:95:0;;;;;:::i;:::-;38960:2;38873:95;50765:25;;;;;;;;;;-1:-1:-1;50765:25:0;;;;-1:-1:-1;;;50765:25:0;;;;;;52492:82;;;;;;;;;;-1:-1:-1;52492:82:0;;;;;:::i;:::-;;:::i;50977:22::-;;;;;;;;;;;;;:::i;40547:228::-;;;;;;;;;;-1:-1:-1;40547:228:0;;;;;:::i;:::-;;:::i;50951:21::-;;;;;;;;;;;;;:::i;40178:317::-;;;;;;;;;;-1:-1:-1;40178:317:0;;;;;:::i;:::-;;:::i;37400:103::-;;;;;;;;;;;;;:::i;36752:87::-;;;;;;;;;;-1:-1:-1;36825:6:0;;-1:-1:-1;;;;;36825:6:0;36752:87;;40985:98;;;;;;;;;;;;;:::i;51800:372::-;;;;;;:::i;:::-;;:::i;42544:281::-;;;;;;;;;;-1:-1:-1;42544:281:0;;;;;:::i;:::-;;:::i;43699:300::-;;;;;;;;;;-1:-1:-1;43699:300:0;;;;;:::i;:::-;;:::i;51726:44::-;;;;;;;;;;;;51760:10;51726:44;;51053:301;;;;;;;;;;-1:-1:-1;51053:301:0;;;;;:::i;:::-;;:::i;42886:158::-;;;;;;;;;;-1:-1:-1;42886:158:0;;;;;:::i;:::-;-1:-1:-1;;;;;43003:25:0;;;42983:4;43003:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42886:158;52404:84;;;;;;;;;;-1:-1:-1;52404:84:0;;;;;:::i;:::-;;:::i;37658:201::-;;;;;;;;;;-1:-1:-1;37658:201:0;;;;;:::i;:::-;;:::i;52836:175::-;;;;;;;;;;-1:-1:-1;52836:175:0;;;;;:::i;:::-;;:::i;51006:40::-;;;;;;;;;;-1:-1:-1;51006:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;39845:279;39947:4;-1:-1:-1;;;;;;39972:40:0;;-1:-1:-1;;;39972:40:0;;:99;;-1:-1:-1;;;;;;;40023:48:0;;-1:-1:-1;;;40023:48:0;39972:99;:146;;;-1:-1:-1;;;;;;;;;;27572:40:0;;;40082:36;39960:158;39845:279;-1:-1:-1;;39845:279:0:o;38698:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38698:23:0;;-1:-1:-1;38698:23:0;:::o;40832:94::-;40886:13;40915:5;40908:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40832:94;:::o;42271:211::-;42347:7;42371:16;42379:7;42371;:16::i;:::-;42363:73;;;;-1:-1:-1;;;42363:73:0;;6242:2:1;42363:73:0;;;6224:21:1;6281:2;6261:18;;;6254:30;6320:34;6300:18;;;6293:62;-1:-1:-1;;;6371:18:1;;;6364:42;6423:19;;42363:73:0;;;;;;;;;-1:-1:-1;42452:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42452:24:0;;42271:211::o;41838:377::-;41915:13;41931:23;41946:7;41931:14;:23::i;:::-;41915:39;;41975:5;-1:-1:-1;;;;;41969:11:0;:2;-1:-1:-1;;;;;41969:11:0;;41961:57;;;;-1:-1:-1;;;41961:57:0;;6655:2:1;41961:57:0;;;6637:21:1;6694:2;6674:18;;;6667:30;6733:34;6713:18;;;6706:62;-1:-1:-1;;;6784:18:1;;;6777:31;6825:19;;41961:57:0;6453:397:1;41961:57:0;35383:10;-1:-1:-1;;;;;42043:21:0;;;;:62;;-1:-1:-1;42068:37:0;42085:5;35383:10;42886:158;:::i;42068:37::-;42027:152;;;;-1:-1:-1;;;42027:152:0;;;;;;;:::i;:::-;42188:21;42197:2;42201:7;42188:8;:21::i;:::-;41908:307;41838:377;;:::o;38757:110::-;38849:12;;38833:6;:13;38810:7;;38833:28;;;:::i;:::-;38826:35;;38757:110;:::o;43101:311::-;43274:41;35383:10;43307:7;43274:18;:41::i;:::-;43266:103;;;;-1:-1:-1;;;43266:103:0;;;;;;;:::i;:::-;43378:28;43388:4;43394:2;43398:7;43378:9;:28::i;38972:360::-;39057:7;;;39102:195;39122:6;:13;39118:17;;39102:195;;;39167:4;-1:-1:-1;;;;;39154:17:0;:6;39161:1;39154:9;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;39154:9:0;:17;39151:139;;39201:2;39187:10;:16;39184:97;;39225:1;-1:-1:-1;39218:8:0;;-1:-1:-1;39218:8:0;39184:97;39257:12;;;;:::i;:::-;;;;39184:97;39137:3;;;;:::i;:::-;;;;39102:195;;;-1:-1:-1;39305:21:0;;-1:-1:-1;;;39305:21:0;;8437:2:1;39305:21:0;;;8419::1;8476:2;8456:18;;;8449:30;-1:-1:-1;;;8495:18:1;;;8488:41;8546:18;;39305:21:0;8235:335:1;43473:165:0;43593:39;43610:4;43616:2;43620:7;43593:39;;;;;;;;;;;;:16;:39::i;52178:55::-;52218:9;52224:2;52218:5;:9::i;:::-;52178:55;:::o;52578:95::-;36638:13;:11;:13::i;:::-;52643:10:::1;:24:::0;;;::::1;;-1:-1:-1::0;;;52643:24:0::1;-1:-1:-1::0;;;;52643:24:0;;::::1;::::0;;;::::1;::::0;;52578:95::o;52492:82::-;36638:13;:11;:13::i;:::-;52555:7:::1;:13;52565:3:::0;52555:7;:13:::1;:::i;:::-;;52492:82:::0;:::o;50977:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40547:228::-;40653:6;:13;40619:7;;40643:23;;40635:77;;;;-1:-1:-1;;;40635:77:0;;10981:2:1;40635:77:0;;;10963:21:1;11020:2;11000:18;;;10993:30;11059:34;11039:18;;;11032:62;-1:-1:-1;;;11110:18:1;;;11103:39;11159:19;;40635:77:0;10779:405:1;40635:77:0;40719:13;40735:6;40742:7;40735:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;40735:15:0;;40547:228;-1:-1:-1;;;40547:228:0:o;50951:21::-;;;;;;;:::i;40178:317::-;40250:7;-1:-1:-1;;;;;40274:19:0;;40266:74;;;;-1:-1:-1;;;40266:74:0;;11391:2:1;40266:74:0;;;11373:21:1;11430:2;11410:18;;;11403:30;11469:34;11449:18;;;11442:62;-1:-1:-1;;;11520:18:1;;;11513:40;11570:19;;40266:74:0;11189:406:1;40266:74:0;40347:10;;40364:107;40384:6;:13;40380:17;;40364:107;;;40425:6;40432:1;40425:9;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;40425:9:0;;;40416:18;;;;40413:51;;40447:7;;;;:::i;:::-;;;;40413:51;40399:3;;;;:::i;:::-;;;;40364:107;;;-1:-1:-1;40484:5:0;40178:317;-1:-1:-1;;40178:317:0:o;37400:103::-;36638:13;:11;:13::i;:::-;37465:30:::1;37492:1;37465:18;:30::i;:::-;37400:103::o:0;40985:98::-;41041:13;41070:7;41063:14;;;;;:::i;51800:372::-;51857:6;:13;50710:3;-1:-1:-1;51849:49:0;;;;-1:-1:-1;;;51849:49:0;;11802:2:1;51849:49:0;;;11784:21:1;11841:2;11821:18;;;11814:30;-1:-1:-1;;;11860:18:1;;;11853:40;11910:18;;51849:49:0;11600:334:1;51849:49:0;51926:19;51939:6;51760:10;51926:19;:::i;:::-;51913:9;:32;51905:58;;;;-1:-1:-1;;;51905:58:0;;12314:2:1;51905:58:0;;;12296:21:1;12353:2;12333:18;;;12326:30;-1:-1:-1;;;12372:18:1;;;12365:43;12425:18;;51905:58:0;12112:337:1;51905:58:0;51980:10;51972:19;;;;:7;:19;;;;;:29;;51995:6;;51972:19;:29;;51995:6;;51972:29;:::i;:::-;;;;-1:-1:-1;;52024:10:0;52016:19;;;;:7;:19;;;;;;50759:1;-1:-1:-1;52016:37:0;52008:68;;;;-1:-1:-1;;;52008:68:0;;12786:2:1;52008:68:0;;;12768:21:1;12825:2;12805:18;;;12798:30;-1:-1:-1;;;12844:18:1;;;12837:48;12902:18;;52008:68:0;12584:342:1;52008:68:0;52087:6;52083:84;52101:6;52097:1;:10;52083:84;;;52145:6;:13;52123:36;;52133:10;;52123:9;:36::i;:::-;52109:3;;;:::i;:::-;;;52083:84;;42544:281;35383:10;-1:-1:-1;;;;;42643:24:0;;;42635:62;;;;-1:-1:-1;;;42635:62:0;;13133:2:1;42635:62:0;;;13115:21:1;13172:2;13152:18;;;13145:30;13211:27;13191:18;;;13184:55;13256:18;;42635:62:0;12931:349:1;42635:62:0;35383:10;42706:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;42706:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;42706:53:0;;;;;;;;;;42771:48;;540:41:1;;;42706:42:0;;35383:10;42771:48;;513:18:1;42771:48:0;;;;;;;42544:281;;:::o;43699:300::-;43852:41;35383:10;43885:7;43852:18;:41::i;:::-;43844:103;;;;-1:-1:-1;;;43844:103:0;;;;;;;:::i;:::-;43954:39;43968:4;43974:2;43978:7;43987:5;43954:13;:39::i;:::-;43699:300;;;;:::o;51053:301::-;51121:13;51151:11;51159:2;51151:7;:11::i;:::-;51143:71;;;;-1:-1:-1;;;51143:71:0;;13487:2:1;51143:71:0;;;13469:21:1;13526:2;13506:18;;;13499:30;13565:34;13545:18;;;13538:62;-1:-1:-1;;;13616:18:1;;;13609:45;13671:19;;51143:71:0;13285:411:1;51143:71:0;51225:10;;-1:-1:-1;;;51225:10:0;;;;51221:48;;51253:8;51246:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51053:301;;;:::o;51221:48::-;51308:7;51317:20;51334:2;51317:16;:20::i;:::-;51291:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51277:71;;51053:301;;;:::o;52404:84::-;36638:13;:11;:13::i;:::-;52468:8:::1;:14;52479:3:::0;52468:8;:14:::1;:::i;37658:201::-:0;36638:13;:11;:13::i;:::-;-1:-1:-1;;;;;37747:22:0;::::1;37739:73;;;::::0;-1:-1:-1;;;37739:73:0;;15095:2:1;37739:73:0::1;::::0;::::1;15077:21:1::0;15134:2;15114:18;;;15107:30;15173:34;15153:18;;;15146:62;-1:-1:-1;;;15224:18:1;;;15217:36;15270:19;;37739:73:0::1;14893:402:1::0;37739:73:0::1;37823:28;37842:8;37823:18;:28::i;52836:175::-:0;36638:13;:11;:13::i;:::-;52907:12:::1;52932:2;-1:-1:-1::0;;;;;52924:16:0::1;52949:6;52924:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52906:55;;;52976:7;52968:37;;;::::0;-1:-1:-1;;;52968:37:0;;15712:2:1;52968:37:0::1;::::0;::::1;15694:21:1::0;15751:2;15731:18;;;15724:30;-1:-1:-1;;;15770:18:1;;;15763:47;15827:18;;52968:37:0::1;15510:341:1::0;45439:147:0;45524:6;:13;45504:4;;45524:23;-1:-1:-1;45524:56:0;;;;;45578:1;-1:-1:-1;;;;;45551:29:0;:6;45558:7;45551:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;45551:15:0;:29;;45517:63;45439:147;-1:-1:-1;;45439:147:0:o;49095:164::-;49166:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;49166:29:0;-1:-1:-1;;;;;49166:29:0;;;;;;;;:24;;49216:23;49166:24;49216:14;:23::i;:::-;-1:-1:-1;;;;;49207:46:0;;;;;;;;;;;49095:164;;:::o;45739:334::-;45832:4;45853:16;45861:7;45853;:16::i;:::-;45845:73;;;;-1:-1:-1;;;45845:73:0;;16058:2:1;45845:73:0;;;16040:21:1;16097:2;16077:18;;;16070:30;16136:34;16116:18;;;16109:62;-1:-1:-1;;;16187:18:1;;;16180:42;16239:19;;45845:73:0;15856:408:1;45845:73:0;45925:13;45941:23;45956:7;45941:14;:23::i;:::-;45925:39;;45990:5;-1:-1:-1;;;;;45979:16:0;:7;-1:-1:-1;;;;;45979:16:0;;:51;;;;46023:7;-1:-1:-1;;;;;45999:31:0;:20;46011:7;45999:11;:20::i;:::-;-1:-1:-1;;;;;45999:31:0;;45979:51;:87;;;-1:-1:-1;;;;;;43003:25:0;;;42983:4;43003:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46034:32;45971:96;45739:334;-1:-1:-1;;;;45739:334:0:o;48564:425::-;48705:4;-1:-1:-1;;;;;48678:31:0;:23;48693:7;48678:14;:23::i;:::-;-1:-1:-1;;;;;48678:31:0;;48670:85;;;;-1:-1:-1;;;48670:85:0;;16471:2:1;48670:85:0;;;16453:21:1;16510:2;16490:18;;;16483:30;16549:34;16529:18;;;16522:62;-1:-1:-1;;;16600:18:1;;;16593:39;16649:19;;48670:85:0;16269:405:1;48670:85:0;-1:-1:-1;;;;;48770:16:0;;48762:65;;;;-1:-1:-1;;;48762:65:0;;16881:2:1;48762:65:0;;;16863:21:1;16920:2;16900:18;;;16893:30;16959:34;16939:18;;;16932:62;-1:-1:-1;;;17010:18:1;;;17003:34;17054:19;;48762:65:0;16679:400:1;48762:65:0;48884:29;48901:1;48905:7;48884:8;:29::i;:::-;48940:2;48922:6;48929:7;48922:15;;;;;;;;:::i;:::-;;;;;;;;;:20;;-1:-1:-1;;;;;;48922:20:0;-1:-1:-1;;;;;48922:20:0;;;;;;48956:27;;48975:7;;48956:27;;;;;;;;;;48922:15;48956:27;48564:425;;;:::o;47781:464::-;47837:13;47853:23;47868:7;47853:14;:23::i;:::-;47837:39;-1:-1:-1;35383:10:0;-1:-1:-1;;;;;47901:21:0;;;;:62;;-1:-1:-1;47926:37:0;47943:5;35383:10;42886:158;:::i;47926:37::-;47885:152;;;;-1:-1:-1;;;47885:152:0;;;;;;;:::i;:::-;48070:29;48087:1;48091:7;48070:8;:29::i;:::-;48166:1;48140:6;48147:7;48140:15;;;;;;;;:::i;:::-;;;;;;;;;:28;;-1:-1:-1;;;;;;48140:28:0;-1:-1:-1;;;;;48140:28:0;;;;;;;;;;;48175:12;:14;;;;;;:::i;:::-;;;;-1:-1:-1;;48203:36:0;;48231:7;;48227:1;;-1:-1:-1;;;;;48203:36:0;;;;;48227:1;;48203:36;47830:415;47781:464;:::o;36917:132::-;36825:6;;-1:-1:-1;;;;;36825:6:0;35383:10;36981:23;36973:68;;;;-1:-1:-1;;;36973:68:0;;17286:2:1;36973:68:0;;;17268:21:1;;;17305:18;;;17298:30;17364:34;17344:18;;;17337:62;17416:18;;36973:68:0;17084:356:1;38019:191:0;38112:6;;;-1:-1:-1;;;;;38129:17:0;;;-1:-1:-1;;;;;;38129:17:0;;;;;;;38162:40;;38112:6;;;38129:17;38112:6;;38162:40;;38093:16;;38162:40;38082:128;38019:191;:::o;46398:104::-;46470:26;46480:2;46484:7;46470:26;;;;;;;;;;;;:9;:26::i;44856:287::-;44991:28;45001:4;45007:2;45011:7;44991:9;:28::i;:::-;45034:48;45057:4;45063:2;45067:7;45076:5;45034:22;:48::i;:::-;45026:111;;;;-1:-1:-1;;;45026:111:0;;;;;;;:::i;13305:716::-;13361:13;13412:14;13429:17;13440:5;13429:10;:17::i;:::-;13449:1;13429:21;13412:38;;13465:20;13499:6;13488:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13488:18:0;-1:-1:-1;13465:41:0;-1:-1:-1;13630:28:0;;;13646:2;13630:28;13687:288;-1:-1:-1;;13719:5:0;-1:-1:-1;;;13856:2:0;13845:14;;13840:30;13719:5;13827:44;13917:2;13908:11;;;-1:-1:-1;13938:21:0;13687:288;13938:21;-1:-1:-1;13996:6:0;13305:716;-1:-1:-1;;;13305:716:0:o;46718:281::-;46830:18;46836:2;46840:7;46830:5;:18::i;:::-;46871:54;46902:1;46906:2;46910:7;46919:5;46871:22;:54::i;:::-;46855:138;;;;-1:-1:-1;;;46855:138:0;;;;;;;:::i;49793:669::-;49930:4;-1:-1:-1;;;;;49947:13:0;;16727:19;:23;49943:514;;49977:72;;-1:-1:-1;;;49977:72:0;;-1:-1:-1;;;;;49977:36:0;;;;;:72;;35383:10;;50028:4;;50034:7;;50043:5;;49977:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49977:72:0;;;;;;;;-1:-1:-1;;49977:72:0;;;;;;;;;;;;:::i;:::-;;;49973:443;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50197:6;:13;50214:1;50197:18;50193:214;;50230:60;;-1:-1:-1;;;50230:60:0;;;;;;;:::i;50193:214::-;50375:6;50369:13;50360:6;50356:2;50352:15;50345:38;49973:443;-1:-1:-1;;;;;;50092:51:0;-1:-1:-1;;;50092:51:0;;-1:-1:-1;50085:58:0;;49943:514;-1:-1:-1;50445:4:0;49793:669;;;;;;:::o;10171:922::-;10224:7;;-1:-1:-1;;;10302:15:0;;10298:102;;-1:-1:-1;;;10338:15:0;;;-1:-1:-1;10382:2:0;10372:12;10298:102;10427:6;10418:5;:15;10414:102;;10463:6;10454:15;;;-1:-1:-1;10498:2:0;10488:12;10414:102;10543:6;10534:5;:15;10530:102;;10579:6;10570:15;;;-1:-1:-1;10614:2:0;10604:12;10530:102;10659:5;10650;:14;10646:99;;10694:5;10685:14;;;-1:-1:-1;10728:1:0;10718:11;10646:99;10772:5;10763;:14;10759:99;;10807:5;10798:14;;;-1:-1:-1;10841:1:0;10831:11;10759:99;10885:5;10876;:14;10872:99;;10920:5;10911:14;;;-1:-1:-1;10954:1:0;10944:11;10872:99;10998:5;10989;:14;10985:66;;11034:1;11024:11;11079:6;10171:922;-1:-1:-1;;10171:922:0:o;47314:255::-;-1:-1:-1;;;;;47390:16:0;;47382:61;;;;-1:-1:-1;;;47382:61:0;;18946:2:1;47382:61:0;;;18928:21:1;;;18965:18;;;18958:30;19024:34;19004:18;;;18997:62;19076:18;;47382:61:0;18744:356:1;47382:61:0;47459:16;47467:7;47459;:16::i;:::-;47458:17;47450:44;;;;-1:-1:-1;;;47450:44:0;;19307:2:1;47450:44:0;;;19289:21:1;19346:2;19326:18;;;19319:30;-1:-1:-1;;;19365:18:1;;;19358:44;19419:18;;47450:44:0;19105:338:1;47450:44:0;47503:6;:15;;;;;;;-1:-1:-1;47503:15:0;;;;;;;-1:-1:-1;;;;;;47503:15:0;-1:-1:-1;;;;;47503:15:0;;;;;;;;47530:33;;47555:7;;-1:-1:-1;47530:33:0;;-1:-1:-1;;47530:33:0;47314:255;;:::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;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:180::-;651:6;704:2;692:9;683:7;679:23;675:32;672:52;;;720:1;717;710:12;672:52;-1:-1:-1;743:23:1;;592:180;-1:-1:-1;592:180:1:o;985:250::-;1070:1;1080:113;1094:6;1091:1;1088:13;1080:113;;;1170:11;;;1164:18;1151:11;;;1144:39;1116:2;1109:10;1080:113;;;-1:-1:-1;;1227:1:1;1209:16;;1202:27;985:250::o;1240:271::-;1282:3;1320:5;1314:12;1347:6;1342:3;1335:19;1363:76;1432:6;1425:4;1420:3;1416:14;1409:4;1402:5;1398:16;1363:76;:::i;:::-;1493:2;1472:15;-1:-1:-1;;1468:29:1;1459:39;;;;1500:4;1455:50;;1240:271;-1:-1:-1;;1240:271:1:o;1516:220::-;1665:2;1654:9;1647:21;1628:4;1685:45;1726:2;1715:9;1711:18;1703:6;1685:45;:::i;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2693:160::-;2758:20;;2814:13;;2807:21;2797:32;;2787:60;;2843:1;2840;2833:12;2858:180;2914:6;2967:2;2955:9;2946:7;2942:23;2938:32;2935:52;;;2983:1;2980;2973:12;2935:52;3006:26;3022:9;3006:26;:::i;3043:127::-;3104:10;3099:3;3095:20;3092:1;3085:31;3135:4;3132:1;3125:15;3159:4;3156:1;3149:15;3175:632;3240:5;3270:18;3311:2;3303:6;3300:14;3297:40;;;3317:18;;:::i;:::-;3392:2;3386:9;3360:2;3446:15;;-1:-1:-1;;3442:24:1;;;3468:2;3438:33;3434:42;3422:55;;;3492:18;;;3512:22;;;3489:46;3486:72;;;3538:18;;:::i;:::-;3578:10;3574:2;3567:22;3607:6;3598:15;;3637:6;3629;3622:22;3677:3;3668:6;3663:3;3659:16;3656:25;3653:45;;;3694:1;3691;3684:12;3653:45;3744:6;3739:3;3732:4;3724:6;3720:17;3707:44;3799:1;3792:4;3783:6;3775;3771:19;3767:30;3760:41;;;;3175:632;;;;;:::o;3812:451::-;3881:6;3934:2;3922:9;3913:7;3909:23;3905:32;3902:52;;;3950:1;3947;3940:12;3902:52;3990:9;3977:23;4023:18;4015:6;4012:30;4009:50;;;4055:1;4052;4045:12;4009:50;4078:22;;4131:4;4123:13;;4119:27;-1:-1:-1;4109:55:1;;4160:1;4157;4150:12;4109:55;4183:74;4249:7;4244:2;4231:16;4226:2;4222;4218:11;4183:74;:::i;4268:186::-;4327:6;4380:2;4368:9;4359:7;4355:23;4351:32;4348:52;;;4396:1;4393;4386:12;4348:52;4419:29;4438:9;4419:29;:::i;4459:254::-;4524:6;4532;4585:2;4573:9;4564:7;4560:23;4556:32;4553:52;;;4601:1;4598;4591:12;4553:52;4624:29;4643:9;4624:29;:::i;:::-;4614:39;;4672:35;4703:2;4692:9;4688:18;4672:35;:::i;:::-;4662:45;;4459:254;;;;;:::o;4718:667::-;4813:6;4821;4829;4837;4890:3;4878:9;4869:7;4865:23;4861:33;4858:53;;;4907:1;4904;4897:12;4858:53;4930:29;4949:9;4930:29;:::i;:::-;4920:39;;4978:38;5012:2;5001:9;4997:18;4978:38;:::i;:::-;4968:48;;5063:2;5052:9;5048:18;5035:32;5025:42;;5118:2;5107:9;5103:18;5090:32;5145:18;5137:6;5134:30;5131:50;;;5177:1;5174;5167:12;5131:50;5200:22;;5253:4;5245:13;;5241:27;-1:-1:-1;5231:55:1;;5282:1;5279;5272:12;5231:55;5305:74;5371:7;5366:2;5353:16;5348:2;5344;5340:11;5305:74;:::i;:::-;5295:84;;;4718:667;;;;;;;:::o;5390:260::-;5458:6;5466;5519:2;5507:9;5498:7;5494:23;5490:32;5487:52;;;5535:1;5532;5525:12;5487:52;5558:29;5577:9;5558:29;:::i;:::-;5548:39;;5606:38;5640:2;5629:9;5625:18;5606:38;:::i;5655:380::-;5734:1;5730:12;;;;5777;;;5798:61;;5852:4;5844:6;5840:17;5830:27;;5798:61;5905:2;5897:6;5894:14;5874:18;5871:38;5868:161;;5951:10;5946:3;5942:20;5939:1;5932:31;5986:4;5983:1;5976:15;6014:4;6011:1;6004:15;5868:161;;5655:380;;;:::o;6855:420::-;7057:2;7039:21;;;7096:2;7076:18;;;7069:30;7135:34;7130:2;7115:18;;7108:62;7206:26;7201:2;7186:18;;7179:54;7265:3;7250:19;;6855:420::o;7280:127::-;7341:10;7336:3;7332:20;7329:1;7322:31;7372:4;7369:1;7362:15;7396:4;7393:1;7386:15;7412:128;7479:9;;;7500:11;;;7497:37;;;7514:18;;:::i;7545:413::-;7747:2;7729:21;;;7786:2;7766:18;;;7759:30;7825:34;7820:2;7805:18;;7798:62;-1:-1:-1;;;7891:2:1;7876:18;;7869:47;7948:3;7933:19;;7545:413::o;7963:127::-;8024:10;8019:3;8015:20;8012:1;8005:31;8055:4;8052:1;8045:15;8079:4;8076:1;8069:15;8095:135;8134:3;8155:17;;;8152:43;;8175:18;;:::i;:::-;-1:-1:-1;8222:1:1;8211:13;;8095:135::o;8701:545::-;8803:2;8798:3;8795:11;8792:448;;;8839:1;8864:5;8860:2;8853:17;8909:4;8905:2;8895:19;8979:2;8967:10;8963:19;8960:1;8956:27;8950:4;8946:38;9015:4;9003:10;9000:20;8997:47;;;-1:-1:-1;9038:4:1;8997:47;9093:2;9088:3;9084:12;9081:1;9077:20;9071:4;9067:31;9057:41;;9148:82;9166:2;9159:5;9156:13;9148:82;;;9211:17;;;9192:1;9181:13;9148:82;;;9152:3;;;8701:545;;;:::o;9422:1352::-;9548:3;9542:10;9575:18;9567:6;9564:30;9561:56;;;9597:18;;:::i;:::-;9626:97;9716:6;9676:38;9708:4;9702:11;9676:38;:::i;:::-;9670:4;9626:97;:::i;:::-;9778:4;;9842:2;9831:14;;9859:1;9854:663;;;;10561:1;10578:6;10575:89;;;-1:-1:-1;10630:19:1;;;10624:26;10575:89;-1:-1:-1;;9379:1:1;9375:11;;;9371:24;9367:29;9357:40;9403:1;9399:11;;;9354:57;10677:81;;9824:944;;9854:663;8648:1;8641:14;;;8685:4;8672:18;;-1:-1:-1;;9890:20:1;;;10008:236;10022:7;10019:1;10016:14;10008:236;;;10111:19;;;10105:26;10090:42;;10203:27;;;;10171:1;10159:14;;;;10038:19;;10008:236;;;10012:3;10272:6;10263:7;10260:19;10257:201;;;10333:19;;;10327:26;-1:-1:-1;;10416:1:1;10412:14;;;10428:3;10408:24;10404:37;10400:42;10385:58;10370:74;;10257:201;-1:-1:-1;;;;;10504:1:1;10488:14;;;10484:22;10471:36;;-1:-1:-1;9422:1352:1:o;11939:168::-;12012:9;;;12043;;12060:15;;;12054:22;;12040:37;12030:71;;12081:18;;:::i;12454:125::-;12519:9;;;12540:10;;;12537:36;;;12553:18;;:::i;13701:1187::-;13978:3;14007:1;14040:6;14034:13;14070:36;14096:9;14070:36;:::i;:::-;14125:1;14142:18;;;14169:133;;;;14316:1;14311:356;;;;14135:532;;14169:133;-1:-1:-1;;14202:24:1;;14190:37;;14275:14;;14268:22;14256:35;;14247:45;;;-1:-1:-1;14169:133:1;;14311:356;14342:6;14339:1;14332:17;14372:4;14417:2;14414:1;14404:16;14442:1;14456:165;14470:6;14467:1;14464:13;14456:165;;;14548:14;;14535:11;;;14528:35;14591:16;;;;14485:10;;14456:165;;;14460:3;;;14650:6;14645:3;14641:16;14634:23;;14135:532;;;;;14698:6;14692:13;14714:68;14773:8;14768:3;14761:4;14753:6;14749:17;14714:68;:::i;:::-;-1:-1:-1;;;14804:18:1;;14831:22;;;14880:1;14869:13;;13701:1187;-1:-1:-1;;;;13701:1187:1:o;17445:414::-;17647:2;17629:21;;;17686:2;17666:18;;;17659:30;17725:34;17720:2;17705:18;;17698:62;-1:-1:-1;;;17791:2:1;17776:18;;17769:48;17849:3;17834:19;;17445:414::o;17996:489::-;-1:-1:-1;;;;;18265:15:1;;;18247:34;;18317:15;;18312:2;18297:18;;18290:43;18364:2;18349:18;;18342:34;;;18412:3;18407:2;18392:18;;18385:31;;;18190:4;;18433:46;;18459:19;;18451:6;18433:46;:::i;:::-;18425:54;17996:489;-1:-1:-1;;;;;;17996:489:1:o;18490:249::-;18559:6;18612:2;18600:9;18591:7;18587:23;18583:32;18580:52;;;18628:1;18625;18618:12;18580:52;18660:9;18654:16;18679:30;18703:5;18679:30;:::i

Swarm Source

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