Sepolia Testnet

Token

ERC-20: My nft (NFT)
ERC-721

Overview

Max Total Supply

1,721 NFT

Holders

810

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Balance
3 NFT
0xb12713bfa9d1de339ca14b01f8f14f092ffe75bf
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:
MyNft

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-19
*/

// 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/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(tokenId) != address(0);
    }

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

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

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

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

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

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @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: contracts/fallback.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;



contract MyNft is ERC721Enumerable, Ownable {

    uint public constant PRICE = 0.005 ether;
    string public baseTokenURI;
    uint private nextTokenId = 1;
    uint[] soldedTokenIds;
    mapping (address => uint[]) nftOwner;
    event MintNft(address senderAddress, uint256 nftToken);

    constructor()  ERC721("My nft", "NFT") {
        setBaseURI("https://ipfs.io/ipfs/QmXvLSHwhZVvjupsiFjBy569DjtvpP8t6pQcbaRSYUyvXT/secret.json");
    }

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

    function setBaseURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    function reserveNFT(uint _tokenId) public onlyOwner  {
        _safeMint(msg.sender, _tokenId);
        nftOwner[msg.sender].push(_tokenId);
        soldedTokenIds.push(_tokenId);
        emit MintNft(msg.sender, _tokenId);
    }

   function mintNFTto(address[] memory _to) public {
    require(_to.length > 0, "Invalid input"); // Проверяем, что массив _to не пустой

    for (uint i = 0; i < _to.length; i++) {
        uint tokenId = nextTokenId; // Присваиваем текущее значение nextTokenId переменной tokenId
        nextTokenId++; // Увеличиваем значение nextTokenId для следующего айди

        _safeMint(_to[i], tokenId);
        soldedTokenIds.push(tokenId);
        emit MintNft(msg.sender, tokenId);
    }
}

    function tokensOfOwner(address _owner) external view returns (uint[] memory) {
        return nftOwner[_owner];
    }

    function withdraw() public payable onlyOwner {
        uint balance = address(this).balance;
        require(balance > 0, "No ether left to withdraw");
        (bool success, ) = (msg.sender).call{value: balance}("");
        require(success, "Transfer failed.");
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"senderAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftToken","type":"uint256"}],"name":"MintNft","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":"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":"baseTokenURI","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":[{"internalType":"address[]","name":"_to","type":"address[]"}],"name":"mintNFTto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"reserveNFT","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":"_baseTokenURI","type":"string"}],"name":"setBaseURI","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526001600c553480156200001657600080fd5b506040518060400160405280600681526020017f4d79206e667400000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4e4654000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009b929190620002bc565b508060019080519060200190620000b4929190620002bc565b505050620000d7620000cb6200010760201b60201c565b6200010f60201b60201c565b620001016040518060800160405280604f8152602001620043c4604f9139620001d560201b60201c565b62000454565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001e56200020160201b60201c565b80600b9080519060200190620001fd929190620002bc565b5050565b620002116200010760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002376200029260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000290576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028790620003cd565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002ca906200041e565b90600052602060002090601f016020900481019282620002ee57600085556200033a565b82601f106200030957805160ff19168380011785556200033a565b828001600101855582156200033a579182015b82811115620003395782518255916020019190600101906200031c565b5b5090506200034991906200034d565b5090565b5b80821115620003685760008160009055506001016200034e565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620003b56020836200036c565b9150620003c2826200037d565b602082019050919050565b60006020820190508181036000830152620003e881620003a6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200043757607f821691505b602082108114156200044e576200044d620003ef565b5b50919050565b613f6080620004646000396000f3fe6080604052600436106101815760003560e01c806370a08231116100d1578063a22cb4651161008a578063d547cfb711610064578063d547cfb714610585578063e8fdb53b146105b0578063e985e9c5146105d9578063f2fde38b1461061657610181565b8063a22cb465146104f6578063b88d4fde1461051f578063c87b56dd1461054857610181565b806370a08231146103e4578063715018a6146104215780638462151c146104385780638d859f3e146104755780638da5cb5b146104a057806395d89b41146104cb57610181565b80632f745c591161013e57806342842e0e1161011857806342842e0e146103185780634f6ccce71461034157806355f804b31461037e5780636352211e146103a757610181565b80632f745c59146102a8578063397be3fd146102e55780633ccfd60b1461030e57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906129b0565b61063f565b6040516101ba91906129f8565b60405180910390f35b3480156101cf57600080fd5b506101d86106b9565b6040516101e59190612aac565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612b04565b61074b565b6040516102229190612b72565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612bb9565b610791565b005b34801561026057600080fd5b506102696108a9565b6040516102769190612c08565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612c23565b6108b6565b005b3480156102b457600080fd5b506102cf60048036038101906102ca9190612bb9565b610916565b6040516102dc9190612c08565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190612b04565b6109bb565b005b610316610a98565b005b34801561032457600080fd5b5061033f600480360381019061033a9190612c23565b610b98565b005b34801561034d57600080fd5b5061036860048036038101906103639190612b04565b610bb8565b6040516103759190612c08565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190612dab565b610c29565b005b3480156103b357600080fd5b506103ce60048036038101906103c99190612b04565b610c4b565b6040516103db9190612b72565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190612df4565b610cd2565b6040516104189190612c08565b60405180910390f35b34801561042d57600080fd5b50610436610d8a565b005b34801561044457600080fd5b5061045f600480360381019061045a9190612df4565b610d9e565b60405161046c9190612edf565b60405180910390f35b34801561048157600080fd5b5061048a610e35565b6040516104979190612c08565b60405180910390f35b3480156104ac57600080fd5b506104b5610e40565b6040516104c29190612b72565b60405180910390f35b3480156104d757600080fd5b506104e0610e6a565b6040516104ed9190612aac565b60405180910390f35b34801561050257600080fd5b5061051d60048036038101906105189190612f2d565b610efc565b005b34801561052b57600080fd5b506105466004803603810190610541919061300e565b610f12565b005b34801561055457600080fd5b5061056f600480360381019061056a9190612b04565b610f74565b60405161057c9190612aac565b60405180910390f35b34801561059157600080fd5b5061059a610fdc565b6040516105a79190612aac565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d29190613159565b61106a565b005b3480156105e557600080fd5b5061060060048036038101906105fb91906131a2565b611177565b60405161060d91906129f8565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190612df4565b61120b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b257506106b18261128f565b5b9050919050565b6060600080546106c890613211565b80601f01602080910402602001604051908101604052809291908181526020018280546106f490613211565b80156107415780601f1061071657610100808354040283529160200191610741565b820191906000526020600020905b81548152906001019060200180831161072457829003601f168201915b5050505050905090565b600061075682611371565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079c82610c4b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561080d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610804906132b5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661082c6113bc565b73ffffffffffffffffffffffffffffffffffffffff16148061085b575061085a816108556113bc565b611177565b5b61089a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089190613347565b60405180910390fd5b6108a483836113c4565b505050565b6000600880549050905090565b6108c76108c16113bc565b8261147d565b610906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fd906133d9565b60405180910390fd5b610911838383611512565b505050565b600061092183610cd2565b8210610962576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109599061346b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109c361180c565b6109cd338261188a565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055600d8190806001815401808255809150506001900390600052602060002001600090919091909150557f2fdf319518046f7b4ebc04a5ca363b42da5e87f5e8150935b3e4ef1ee4509e1a3382604051610a8d92919061348b565b60405180910390a150565b610aa061180c565b600047905060008111610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90613500565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610b0e90613551565b60006040518083038185875af1925050503d8060008114610b4b576040519150601f19603f3d011682016040523d82523d6000602084013e610b50565b606091505b5050905080610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b906135b2565b60405180910390fd5b5050565b610bb383838360405180602001604052806000815250610f12565b505050565b6000610bc26108a9565b8210610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90613644565b60405180910390fd5b60088281548110610c1757610c16613664565b5b90600052602060002001549050919050565b610c3161180c565b80600b9080519060200190610c479291906128a1565b5050565b600080610c57836118a8565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc0906136df565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a90613771565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d9261180c565b610d9c60006118e5565b565b6060600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610e2957602002820191906000526020600020905b815481526020019060010190808311610e15575b50505050509050919050565b6611c37937e0800081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e7990613211565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea590613211565b8015610ef25780601f10610ec757610100808354040283529160200191610ef2565b820191906000526020600020905b815481529060010190602001808311610ed557829003601f168201915b5050505050905090565b610f0e610f076113bc565b83836119ab565b5050565b610f23610f1d6113bc565b8361147d565b610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f59906133d9565b60405180910390fd5b610f6e84848484611b18565b50505050565b6060610f7f82611371565b6000610f89611b74565b90506000815111610fa95760405180602001604052806000815250610fd4565b80610fb384611c06565b604051602001610fc49291906137cd565b6040516020818303038152906040525b915050919050565b600b8054610fe990613211565b80601f016020809104026020016040519081016040528092919081815260200182805461101590613211565b80156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b505050505081565b60008151116110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a59061383d565b60405180910390fd5b60005b8151811015611173576000600c549050600c60008154809291906110d49061388c565b91905055506110fd8383815181106110ef576110ee613664565b5b60200260200101518261188a565b600d8190806001815401808255809150506001900390600052602060002001600090919091909150557f2fdf319518046f7b4ebc04a5ca363b42da5e87f5e8150935b3e4ef1ee4509e1a338260405161115792919061348b565b60405180910390a150808061116b9061388c565b9150506110b1565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61121361180c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127a90613947565b60405180910390fd5b61128c816118e5565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061135a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061136a575061136982611cde565b5b9050919050565b61137a81611d48565b6113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b0906136df565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661143783610c4b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061148983610c4b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114cb57506114ca8185611177565b5b8061150957508373ffffffffffffffffffffffffffffffffffffffff166114f18461074b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661153282610c4b565b73ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f906139d9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90613a6b565b60405180910390fd5b6116058383836001611d89565b8273ffffffffffffffffffffffffffffffffffffffff1661162582610c4b565b73ffffffffffffffffffffffffffffffffffffffff161461167b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611672906139d9565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118078383836001611ee9565b505050565b6118146113bc565b73ffffffffffffffffffffffffffffffffffffffff16611832610e40565b73ffffffffffffffffffffffffffffffffffffffff1614611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90613ad7565b60405180910390fd5b565b6118a4828260405180602001604052806000815250611eef565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1190613b43565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b0b91906129f8565b60405180910390a3505050565b611b23848484611512565b611b2f84848484611f4a565b611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6590613bd5565b60405180910390fd5b50505050565b6060600b8054611b8390613211565b80601f0160208091040260200160405190810160405280929190818152602001828054611baf90613211565b8015611bfc5780601f10611bd157610100808354040283529160200191611bfc565b820191906000526020600020905b815481529060010190602001808311611bdf57829003601f168201915b5050505050905090565b606060006001611c15846120e1565b01905060008167ffffffffffffffff811115611c3457611c33612c80565b5b6040519080825280601f01601f191660200182016040528015611c665781602001600182028036833780820191505090505b509050600082602001820190505b600115611cd3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611cbd57611cbc613bf5565b5b0494506000851415611cce57611cd3565b611c74565b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611d6a836118a8565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611d9584848484612234565b6001811115611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd090613c96565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611e2157611e1c8161235a565b611e60565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611e5f57611e5e85826123a3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ea357611e9e81612510565b611ee2565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611ee157611ee084826125e1565b5b5b5050505050565b50505050565b611ef98383612660565b611f066000848484611f4a565b611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c90613bd5565b60405180910390fd5b505050565b6000611f6b8473ffffffffffffffffffffffffffffffffffffffff1661287e565b156120d4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f946113bc565b8786866040518563ffffffff1660e01b8152600401611fb69493929190613d0b565b602060405180830381600087803b158015611fd057600080fd5b505af192505050801561200157506040513d601f19601f82011682018060405250810190611ffe9190613d6c565b60015b612084573d8060008114612031576040519150601f19603f3d011682016040523d82523d6000602084013e612036565b606091505b5060008151141561207c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207390613bd5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506120d9565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061213f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161213557612134613bf5565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061217c576d04ee2d6d415b85acef8100000000838161217257612171613bf5565b5b0492506020810190505b662386f26fc1000083106121ab57662386f26fc1000083816121a1576121a0613bf5565b5b0492506010810190505b6305f5e10083106121d4576305f5e10083816121ca576121c9613bf5565b5b0492506008810190505b61271083106121f95761271083816121ef576121ee613bf5565b5b0492506004810190505b6064831061221c576064838161221257612211613bf5565b5b0492506002810190505b600a831061222b576001810190505b80915050919050565b600181111561235457600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146122c85780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c09190613d99565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123535780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461234b9190613dcd565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016123b084610cd2565b6123ba9190613d99565b905060006007600084815260200190815260200160002054905081811461249f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125249190613d99565b905060006009600084815260200190815260200160002054905060006008838154811061255457612553613664565b5b90600052602060002001549050806008838154811061257657612575613664565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806125c5576125c4613e23565b5b6001900381819060005260206000200160009055905550505050565b60006125ec83610cd2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c790613e9e565b60405180910390fd5b6126d981611d48565b15612719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271090613f0a565b60405180910390fd5b612727600083836001611d89565b61273081611d48565b15612770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276790613f0a565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461287a600083836001611ee9565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546128ad90613211565b90600052602060002090601f0160209004810192826128cf5760008555612916565b82601f106128e857805160ff1916838001178555612916565b82800160010185558215612916579182015b828111156129155782518255916020019190600101906128fa565b5b5090506129239190612927565b5090565b5b80821115612940576000816000905550600101612928565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61298d81612958565b811461299857600080fd5b50565b6000813590506129aa81612984565b92915050565b6000602082840312156129c6576129c561294e565b5b60006129d48482850161299b565b91505092915050565b60008115159050919050565b6129f2816129dd565b82525050565b6000602082019050612a0d60008301846129e9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a4d578082015181840152602081019050612a32565b83811115612a5c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a7e82612a13565b612a888185612a1e565b9350612a98818560208601612a2f565b612aa181612a62565b840191505092915050565b60006020820190508181036000830152612ac68184612a73565b905092915050565b6000819050919050565b612ae181612ace565b8114612aec57600080fd5b50565b600081359050612afe81612ad8565b92915050565b600060208284031215612b1a57612b1961294e565b5b6000612b2884828501612aef565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b5c82612b31565b9050919050565b612b6c81612b51565b82525050565b6000602082019050612b876000830184612b63565b92915050565b612b9681612b51565b8114612ba157600080fd5b50565b600081359050612bb381612b8d565b92915050565b60008060408385031215612bd057612bcf61294e565b5b6000612bde85828601612ba4565b9250506020612bef85828601612aef565b9150509250929050565b612c0281612ace565b82525050565b6000602082019050612c1d6000830184612bf9565b92915050565b600080600060608486031215612c3c57612c3b61294e565b5b6000612c4a86828701612ba4565b9350506020612c5b86828701612ba4565b9250506040612c6c86828701612aef565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cb882612a62565b810181811067ffffffffffffffff82111715612cd757612cd6612c80565b5b80604052505050565b6000612cea612944565b9050612cf68282612caf565b919050565b600067ffffffffffffffff821115612d1657612d15612c80565b5b612d1f82612a62565b9050602081019050919050565b82818337600083830152505050565b6000612d4e612d4984612cfb565b612ce0565b905082815260208101848484011115612d6a57612d69612c7b565b5b612d75848285612d2c565b509392505050565b600082601f830112612d9257612d91612c76565b5b8135612da2848260208601612d3b565b91505092915050565b600060208284031215612dc157612dc061294e565b5b600082013567ffffffffffffffff811115612ddf57612dde612953565b5b612deb84828501612d7d565b91505092915050565b600060208284031215612e0a57612e0961294e565b5b6000612e1884828501612ba4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e5681612ace565b82525050565b6000612e688383612e4d565b60208301905092915050565b6000602082019050919050565b6000612e8c82612e21565b612e968185612e2c565b9350612ea183612e3d565b8060005b83811015612ed2578151612eb98882612e5c565b9750612ec483612e74565b925050600181019050612ea5565b5085935050505092915050565b60006020820190508181036000830152612ef98184612e81565b905092915050565b612f0a816129dd565b8114612f1557600080fd5b50565b600081359050612f2781612f01565b92915050565b60008060408385031215612f4457612f4361294e565b5b6000612f5285828601612ba4565b9250506020612f6385828601612f18565b9150509250929050565b600067ffffffffffffffff821115612f8857612f87612c80565b5b612f9182612a62565b9050602081019050919050565b6000612fb1612fac84612f6d565b612ce0565b905082815260208101848484011115612fcd57612fcc612c7b565b5b612fd8848285612d2c565b509392505050565b600082601f830112612ff557612ff4612c76565b5b8135613005848260208601612f9e565b91505092915050565b600080600080608085870312156130285761302761294e565b5b600061303687828801612ba4565b945050602061304787828801612ba4565b935050604061305887828801612aef565b925050606085013567ffffffffffffffff81111561307957613078612953565b5b61308587828801612fe0565b91505092959194509250565b600067ffffffffffffffff8211156130ac576130ab612c80565b5b602082029050602081019050919050565b600080fd5b60006130d56130d084613091565b612ce0565b905080838252602082019050602084028301858111156130f8576130f76130bd565b5b835b81811015613121578061310d8882612ba4565b8452602084019350506020810190506130fa565b5050509392505050565b600082601f8301126131405761313f612c76565b5b81356131508482602086016130c2565b91505092915050565b60006020828403121561316f5761316e61294e565b5b600082013567ffffffffffffffff81111561318d5761318c612953565b5b6131998482850161312b565b91505092915050565b600080604083850312156131b9576131b861294e565b5b60006131c785828601612ba4565b92505060206131d885828601612ba4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061322957607f821691505b6020821081141561323d5761323c6131e2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061329f602183612a1e565b91506132aa82613243565b604082019050919050565b600060208201905081810360008301526132ce81613292565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613331603d83612a1e565b915061333c826132d5565b604082019050919050565b6000602082019050818103600083015261336081613324565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006133c3602d83612a1e565b91506133ce82613367565b604082019050919050565b600060208201905081810360008301526133f2816133b6565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613455602b83612a1e565b9150613460826133f9565b604082019050919050565b6000602082019050818103600083015261348481613448565b9050919050565b60006040820190506134a06000830185612b63565b6134ad6020830184612bf9565b9392505050565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b60006134ea601983612a1e565b91506134f5826134b4565b602082019050919050565b60006020820190508181036000830152613519816134dd565b9050919050565b600081905092915050565b50565b600061353b600083613520565b91506135468261352b565b600082019050919050565b600061355c8261352e565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061359c601083612a1e565b91506135a782613566565b602082019050919050565b600060208201905081810360008301526135cb8161358f565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061362e602c83612a1e565b9150613639826135d2565b604082019050919050565b6000602082019050818103600083015261365d81613621565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006136c9601883612a1e565b91506136d482613693565b602082019050919050565b600060208201905081810360008301526136f8816136bc565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061375b602983612a1e565b9150613766826136ff565b604082019050919050565b6000602082019050818103600083015261378a8161374e565b9050919050565b600081905092915050565b60006137a782612a13565b6137b18185613791565b93506137c1818560208601612a2f565b80840191505092915050565b60006137d9828561379c565b91506137e5828461379c565b91508190509392505050565b7f496e76616c696420696e70757400000000000000000000000000000000000000600082015250565b6000613827600d83612a1e565b9150613832826137f1565b602082019050919050565b600060208201905081810360008301526138568161381a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061389782612ace565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138ca576138c961385d565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613931602683612a1e565b915061393c826138d5565b604082019050919050565b6000602082019050818103600083015261396081613924565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006139c3602583612a1e565b91506139ce82613967565b604082019050919050565b600060208201905081810360008301526139f2816139b6565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613a55602483612a1e565b9150613a60826139f9565b604082019050919050565b60006020820190508181036000830152613a8481613a48565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ac1602083612a1e565b9150613acc82613a8b565b602082019050919050565b60006020820190508181036000830152613af081613ab4565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613b2d601983612a1e565b9150613b3882613af7565b602082019050919050565b60006020820190508181036000830152613b5c81613b20565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613bbf603283612a1e565b9150613bca82613b63565b604082019050919050565b60006020820190508181036000830152613bee81613bb2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000613c80603583612a1e565b9150613c8b82613c24565b604082019050919050565b60006020820190508181036000830152613caf81613c73565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613cdd82613cb6565b613ce78185613cc1565b9350613cf7818560208601612a2f565b613d0081612a62565b840191505092915050565b6000608082019050613d206000830187612b63565b613d2d6020830186612b63565b613d3a6040830185612bf9565b8181036060830152613d4c8184613cd2565b905095945050505050565b600081519050613d6681612984565b92915050565b600060208284031215613d8257613d8161294e565b5b6000613d9084828501613d57565b91505092915050565b6000613da482612ace565b9150613daf83612ace565b925082821015613dc257613dc161385d565b5b828203905092915050565b6000613dd882612ace565b9150613de383612ace565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e1857613e1761385d565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613e88602083612a1e565b9150613e9382613e52565b602082019050919050565b60006020820190508181036000830152613eb781613e7b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613ef4601c83612a1e565b9150613eff82613ebe565b602082019050919050565b60006020820190508181036000830152613f2381613ee7565b905091905056fea264697066735822122028092ec8d6367e0277fd78d43ead3d85daea603d5bc57a8580605a35bb8c20a164736f6c6343000809003368747470733a2f2f697066732e696f2f697066732f516d58764c534877685a56766a75707369466a4279353639446a74767050387436705163626152535955797658542f7365637265742e6a736f6e

Deployed Bytecode

0x6080604052600436106101815760003560e01c806370a08231116100d1578063a22cb4651161008a578063d547cfb711610064578063d547cfb714610585578063e8fdb53b146105b0578063e985e9c5146105d9578063f2fde38b1461061657610181565b8063a22cb465146104f6578063b88d4fde1461051f578063c87b56dd1461054857610181565b806370a08231146103e4578063715018a6146104215780638462151c146104385780638d859f3e146104755780638da5cb5b146104a057806395d89b41146104cb57610181565b80632f745c591161013e57806342842e0e1161011857806342842e0e146103185780634f6ccce71461034157806355f804b31461037e5780636352211e146103a757610181565b80632f745c59146102a8578063397be3fd146102e55780633ccfd60b1461030e57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906129b0565b61063f565b6040516101ba91906129f8565b60405180910390f35b3480156101cf57600080fd5b506101d86106b9565b6040516101e59190612aac565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612b04565b61074b565b6040516102229190612b72565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612bb9565b610791565b005b34801561026057600080fd5b506102696108a9565b6040516102769190612c08565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612c23565b6108b6565b005b3480156102b457600080fd5b506102cf60048036038101906102ca9190612bb9565b610916565b6040516102dc9190612c08565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190612b04565b6109bb565b005b610316610a98565b005b34801561032457600080fd5b5061033f600480360381019061033a9190612c23565b610b98565b005b34801561034d57600080fd5b5061036860048036038101906103639190612b04565b610bb8565b6040516103759190612c08565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190612dab565b610c29565b005b3480156103b357600080fd5b506103ce60048036038101906103c99190612b04565b610c4b565b6040516103db9190612b72565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190612df4565b610cd2565b6040516104189190612c08565b60405180910390f35b34801561042d57600080fd5b50610436610d8a565b005b34801561044457600080fd5b5061045f600480360381019061045a9190612df4565b610d9e565b60405161046c9190612edf565b60405180910390f35b34801561048157600080fd5b5061048a610e35565b6040516104979190612c08565b60405180910390f35b3480156104ac57600080fd5b506104b5610e40565b6040516104c29190612b72565b60405180910390f35b3480156104d757600080fd5b506104e0610e6a565b6040516104ed9190612aac565b60405180910390f35b34801561050257600080fd5b5061051d60048036038101906105189190612f2d565b610efc565b005b34801561052b57600080fd5b506105466004803603810190610541919061300e565b610f12565b005b34801561055457600080fd5b5061056f600480360381019061056a9190612b04565b610f74565b60405161057c9190612aac565b60405180910390f35b34801561059157600080fd5b5061059a610fdc565b6040516105a79190612aac565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d29190613159565b61106a565b005b3480156105e557600080fd5b5061060060048036038101906105fb91906131a2565b611177565b60405161060d91906129f8565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190612df4565b61120b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b257506106b18261128f565b5b9050919050565b6060600080546106c890613211565b80601f01602080910402602001604051908101604052809291908181526020018280546106f490613211565b80156107415780601f1061071657610100808354040283529160200191610741565b820191906000526020600020905b81548152906001019060200180831161072457829003601f168201915b5050505050905090565b600061075682611371565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079c82610c4b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561080d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610804906132b5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661082c6113bc565b73ffffffffffffffffffffffffffffffffffffffff16148061085b575061085a816108556113bc565b611177565b5b61089a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089190613347565b60405180910390fd5b6108a483836113c4565b505050565b6000600880549050905090565b6108c76108c16113bc565b8261147d565b610906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fd906133d9565b60405180910390fd5b610911838383611512565b505050565b600061092183610cd2565b8210610962576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109599061346b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109c361180c565b6109cd338261188a565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915055600d8190806001815401808255809150506001900390600052602060002001600090919091909150557f2fdf319518046f7b4ebc04a5ca363b42da5e87f5e8150935b3e4ef1ee4509e1a3382604051610a8d92919061348b565b60405180910390a150565b610aa061180c565b600047905060008111610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90613500565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610b0e90613551565b60006040518083038185875af1925050503d8060008114610b4b576040519150601f19603f3d011682016040523d82523d6000602084013e610b50565b606091505b5050905080610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b906135b2565b60405180910390fd5b5050565b610bb383838360405180602001604052806000815250610f12565b505050565b6000610bc26108a9565b8210610c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfa90613644565b60405180910390fd5b60088281548110610c1757610c16613664565b5b90600052602060002001549050919050565b610c3161180c565b80600b9080519060200190610c479291906128a1565b5050565b600080610c57836118a8565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc0906136df565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a90613771565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d9261180c565b610d9c60006118e5565b565b6060600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610e2957602002820191906000526020600020905b815481526020019060010190808311610e15575b50505050509050919050565b6611c37937e0800081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e7990613211565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea590613211565b8015610ef25780601f10610ec757610100808354040283529160200191610ef2565b820191906000526020600020905b815481529060010190602001808311610ed557829003601f168201915b5050505050905090565b610f0e610f076113bc565b83836119ab565b5050565b610f23610f1d6113bc565b8361147d565b610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f59906133d9565b60405180910390fd5b610f6e84848484611b18565b50505050565b6060610f7f82611371565b6000610f89611b74565b90506000815111610fa95760405180602001604052806000815250610fd4565b80610fb384611c06565b604051602001610fc49291906137cd565b6040516020818303038152906040525b915050919050565b600b8054610fe990613211565b80601f016020809104026020016040519081016040528092919081815260200182805461101590613211565b80156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b505050505081565b60008151116110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a59061383d565b60405180910390fd5b60005b8151811015611173576000600c549050600c60008154809291906110d49061388c565b91905055506110fd8383815181106110ef576110ee613664565b5b60200260200101518261188a565b600d8190806001815401808255809150506001900390600052602060002001600090919091909150557f2fdf319518046f7b4ebc04a5ca363b42da5e87f5e8150935b3e4ef1ee4509e1a338260405161115792919061348b565b60405180910390a150808061116b9061388c565b9150506110b1565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61121361180c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127a90613947565b60405180910390fd5b61128c816118e5565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061135a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061136a575061136982611cde565b5b9050919050565b61137a81611d48565b6113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b0906136df565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661143783610c4b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061148983610c4b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114cb57506114ca8185611177565b5b8061150957508373ffffffffffffffffffffffffffffffffffffffff166114f18461074b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661153282610c4b565b73ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f906139d9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90613a6b565b60405180910390fd5b6116058383836001611d89565b8273ffffffffffffffffffffffffffffffffffffffff1661162582610c4b565b73ffffffffffffffffffffffffffffffffffffffff161461167b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611672906139d9565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118078383836001611ee9565b505050565b6118146113bc565b73ffffffffffffffffffffffffffffffffffffffff16611832610e40565b73ffffffffffffffffffffffffffffffffffffffff1614611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90613ad7565b60405180910390fd5b565b6118a4828260405180602001604052806000815250611eef565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1190613b43565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b0b91906129f8565b60405180910390a3505050565b611b23848484611512565b611b2f84848484611f4a565b611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6590613bd5565b60405180910390fd5b50505050565b6060600b8054611b8390613211565b80601f0160208091040260200160405190810160405280929190818152602001828054611baf90613211565b8015611bfc5780601f10611bd157610100808354040283529160200191611bfc565b820191906000526020600020905b815481529060010190602001808311611bdf57829003601f168201915b5050505050905090565b606060006001611c15846120e1565b01905060008167ffffffffffffffff811115611c3457611c33612c80565b5b6040519080825280601f01601f191660200182016040528015611c665781602001600182028036833780820191505090505b509050600082602001820190505b600115611cd3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611cbd57611cbc613bf5565b5b0494506000851415611cce57611cd3565b611c74565b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611d6a836118a8565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611d9584848484612234565b6001811115611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd090613c96565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611e2157611e1c8161235a565b611e60565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611e5f57611e5e85826123a3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ea357611e9e81612510565b611ee2565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611ee157611ee084826125e1565b5b5b5050505050565b50505050565b611ef98383612660565b611f066000848484611f4a565b611f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3c90613bd5565b60405180910390fd5b505050565b6000611f6b8473ffffffffffffffffffffffffffffffffffffffff1661287e565b156120d4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f946113bc565b8786866040518563ffffffff1660e01b8152600401611fb69493929190613d0b565b602060405180830381600087803b158015611fd057600080fd5b505af192505050801561200157506040513d601f19601f82011682018060405250810190611ffe9190613d6c565b60015b612084573d8060008114612031576040519150601f19603f3d011682016040523d82523d6000602084013e612036565b606091505b5060008151141561207c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207390613bd5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506120d9565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061213f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161213557612134613bf5565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061217c576d04ee2d6d415b85acef8100000000838161217257612171613bf5565b5b0492506020810190505b662386f26fc1000083106121ab57662386f26fc1000083816121a1576121a0613bf5565b5b0492506010810190505b6305f5e10083106121d4576305f5e10083816121ca576121c9613bf5565b5b0492506008810190505b61271083106121f95761271083816121ef576121ee613bf5565b5b0492506004810190505b6064831061221c576064838161221257612211613bf5565b5b0492506002810190505b600a831061222b576001810190505b80915050919050565b600181111561235457600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146122c85780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122c09190613d99565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123535780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461234b9190613dcd565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016123b084610cd2565b6123ba9190613d99565b905060006007600084815260200190815260200160002054905081811461249f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125249190613d99565b905060006009600084815260200190815260200160002054905060006008838154811061255457612553613664565b5b90600052602060002001549050806008838154811061257657612575613664565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806125c5576125c4613e23565b5b6001900381819060005260206000200160009055905550505050565b60006125ec83610cd2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c790613e9e565b60405180910390fd5b6126d981611d48565b15612719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271090613f0a565b60405180910390fd5b612727600083836001611d89565b61273081611d48565b15612770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276790613f0a565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461287a600083836001611ee9565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546128ad90613211565b90600052602060002090601f0160209004810192826128cf5760008555612916565b82601f106128e857805160ff1916838001178555612916565b82800160010185558215612916579182015b828111156129155782518255916020019190600101906128fa565b5b5090506129239190612927565b5090565b5b80821115612940576000816000905550600101612928565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61298d81612958565b811461299857600080fd5b50565b6000813590506129aa81612984565b92915050565b6000602082840312156129c6576129c561294e565b5b60006129d48482850161299b565b91505092915050565b60008115159050919050565b6129f2816129dd565b82525050565b6000602082019050612a0d60008301846129e9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a4d578082015181840152602081019050612a32565b83811115612a5c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a7e82612a13565b612a888185612a1e565b9350612a98818560208601612a2f565b612aa181612a62565b840191505092915050565b60006020820190508181036000830152612ac68184612a73565b905092915050565b6000819050919050565b612ae181612ace565b8114612aec57600080fd5b50565b600081359050612afe81612ad8565b92915050565b600060208284031215612b1a57612b1961294e565b5b6000612b2884828501612aef565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b5c82612b31565b9050919050565b612b6c81612b51565b82525050565b6000602082019050612b876000830184612b63565b92915050565b612b9681612b51565b8114612ba157600080fd5b50565b600081359050612bb381612b8d565b92915050565b60008060408385031215612bd057612bcf61294e565b5b6000612bde85828601612ba4565b9250506020612bef85828601612aef565b9150509250929050565b612c0281612ace565b82525050565b6000602082019050612c1d6000830184612bf9565b92915050565b600080600060608486031215612c3c57612c3b61294e565b5b6000612c4a86828701612ba4565b9350506020612c5b86828701612ba4565b9250506040612c6c86828701612aef565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cb882612a62565b810181811067ffffffffffffffff82111715612cd757612cd6612c80565b5b80604052505050565b6000612cea612944565b9050612cf68282612caf565b919050565b600067ffffffffffffffff821115612d1657612d15612c80565b5b612d1f82612a62565b9050602081019050919050565b82818337600083830152505050565b6000612d4e612d4984612cfb565b612ce0565b905082815260208101848484011115612d6a57612d69612c7b565b5b612d75848285612d2c565b509392505050565b600082601f830112612d9257612d91612c76565b5b8135612da2848260208601612d3b565b91505092915050565b600060208284031215612dc157612dc061294e565b5b600082013567ffffffffffffffff811115612ddf57612dde612953565b5b612deb84828501612d7d565b91505092915050565b600060208284031215612e0a57612e0961294e565b5b6000612e1884828501612ba4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e5681612ace565b82525050565b6000612e688383612e4d565b60208301905092915050565b6000602082019050919050565b6000612e8c82612e21565b612e968185612e2c565b9350612ea183612e3d565b8060005b83811015612ed2578151612eb98882612e5c565b9750612ec483612e74565b925050600181019050612ea5565b5085935050505092915050565b60006020820190508181036000830152612ef98184612e81565b905092915050565b612f0a816129dd565b8114612f1557600080fd5b50565b600081359050612f2781612f01565b92915050565b60008060408385031215612f4457612f4361294e565b5b6000612f5285828601612ba4565b9250506020612f6385828601612f18565b9150509250929050565b600067ffffffffffffffff821115612f8857612f87612c80565b5b612f9182612a62565b9050602081019050919050565b6000612fb1612fac84612f6d565b612ce0565b905082815260208101848484011115612fcd57612fcc612c7b565b5b612fd8848285612d2c565b509392505050565b600082601f830112612ff557612ff4612c76565b5b8135613005848260208601612f9e565b91505092915050565b600080600080608085870312156130285761302761294e565b5b600061303687828801612ba4565b945050602061304787828801612ba4565b935050604061305887828801612aef565b925050606085013567ffffffffffffffff81111561307957613078612953565b5b61308587828801612fe0565b91505092959194509250565b600067ffffffffffffffff8211156130ac576130ab612c80565b5b602082029050602081019050919050565b600080fd5b60006130d56130d084613091565b612ce0565b905080838252602082019050602084028301858111156130f8576130f76130bd565b5b835b81811015613121578061310d8882612ba4565b8452602084019350506020810190506130fa565b5050509392505050565b600082601f8301126131405761313f612c76565b5b81356131508482602086016130c2565b91505092915050565b60006020828403121561316f5761316e61294e565b5b600082013567ffffffffffffffff81111561318d5761318c612953565b5b6131998482850161312b565b91505092915050565b600080604083850312156131b9576131b861294e565b5b60006131c785828601612ba4565b92505060206131d885828601612ba4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061322957607f821691505b6020821081141561323d5761323c6131e2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061329f602183612a1e565b91506132aa82613243565b604082019050919050565b600060208201905081810360008301526132ce81613292565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613331603d83612a1e565b915061333c826132d5565b604082019050919050565b6000602082019050818103600083015261336081613324565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006133c3602d83612a1e565b91506133ce82613367565b604082019050919050565b600060208201905081810360008301526133f2816133b6565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613455602b83612a1e565b9150613460826133f9565b604082019050919050565b6000602082019050818103600083015261348481613448565b9050919050565b60006040820190506134a06000830185612b63565b6134ad6020830184612bf9565b9392505050565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b60006134ea601983612a1e565b91506134f5826134b4565b602082019050919050565b60006020820190508181036000830152613519816134dd565b9050919050565b600081905092915050565b50565b600061353b600083613520565b91506135468261352b565b600082019050919050565b600061355c8261352e565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061359c601083612a1e565b91506135a782613566565b602082019050919050565b600060208201905081810360008301526135cb8161358f565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061362e602c83612a1e565b9150613639826135d2565b604082019050919050565b6000602082019050818103600083015261365d81613621565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006136c9601883612a1e565b91506136d482613693565b602082019050919050565b600060208201905081810360008301526136f8816136bc565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061375b602983612a1e565b9150613766826136ff565b604082019050919050565b6000602082019050818103600083015261378a8161374e565b9050919050565b600081905092915050565b60006137a782612a13565b6137b18185613791565b93506137c1818560208601612a2f565b80840191505092915050565b60006137d9828561379c565b91506137e5828461379c565b91508190509392505050565b7f496e76616c696420696e70757400000000000000000000000000000000000000600082015250565b6000613827600d83612a1e565b9150613832826137f1565b602082019050919050565b600060208201905081810360008301526138568161381a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061389782612ace565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138ca576138c961385d565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613931602683612a1e565b915061393c826138d5565b604082019050919050565b6000602082019050818103600083015261396081613924565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006139c3602583612a1e565b91506139ce82613967565b604082019050919050565b600060208201905081810360008301526139f2816139b6565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613a55602483612a1e565b9150613a60826139f9565b604082019050919050565b60006020820190508181036000830152613a8481613a48565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ac1602083612a1e565b9150613acc82613a8b565b602082019050919050565b60006020820190508181036000830152613af081613ab4565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613b2d601983612a1e565b9150613b3882613af7565b602082019050919050565b60006020820190508181036000830152613b5c81613b20565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613bbf603283612a1e565b9150613bca82613b63565b604082019050919050565b60006020820190508181036000830152613bee81613bb2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000613c80603583612a1e565b9150613c8b82613c24565b604082019050919050565b60006020820190508181036000830152613caf81613c73565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613cdd82613cb6565b613ce78185613cc1565b9350613cf7818560208601612a2f565b613d0081612a62565b840191505092915050565b6000608082019050613d206000830187612b63565b613d2d6020830186612b63565b613d3a6040830185612bf9565b8181036060830152613d4c8184613cd2565b905095945050505050565b600081519050613d6681612984565b92915050565b600060208284031215613d8257613d8161294e565b5b6000613d9084828501613d57565b91505092915050565b6000613da482612ace565b9150613daf83612ace565b925082821015613dc257613dc161385d565b5b828203905092915050565b6000613dd882612ace565b9150613de383612ace565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e1857613e1761385d565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613e88602083612a1e565b9150613e9382613e52565b602082019050919050565b60006020820190508181036000830152613eb781613e7b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613ef4601c83612a1e565b9150613eff82613ebe565b602082019050919050565b60006020820190508181036000830152613f2381613ee7565b905091905056fea264697066735822122028092ec8d6367e0277fd78d43ead3d85daea603d5bc57a8580605a35bb8c20a164736f6c63430008090033

Deployed Bytecode Sourcemap

62523:1948:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53790:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37852:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39364:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38882:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54430:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40064:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54098:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63226:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64194:274;;;:::i;:::-;;40470:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54620:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63105:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37562:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37293:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61608:103;;;;;;;;;;;;;:::i;:::-;;64067:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62576:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60960:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38021:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39607:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40726:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38196:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62623:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63467:592;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39833:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61866:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53790:224;53892:4;53931:35;53916:50;;;:11;:50;;;;:90;;;;53970:36;53994:11;53970:23;:36::i;:::-;53916:90;53909:97;;53790:224;;;:::o;37852:100::-;37906:13;37939:5;37932:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37852:100;:::o;39364:171::-;39440:7;39460:23;39475:7;39460:14;:23::i;:::-;39503:15;:24;39519:7;39503:24;;;;;;;;;;;;;;;;;;;;;39496:31;;39364:171;;;:::o;38882:416::-;38963:13;38979:23;38994:7;38979:14;:23::i;:::-;38963:39;;39027:5;39021:11;;:2;:11;;;;39013:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;39121:5;39105:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;39130:37;39147:5;39154:12;:10;:12::i;:::-;39130:16;:37::i;:::-;39105:62;39083:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;39269:21;39278:2;39282:7;39269:8;:21::i;:::-;38952:346;38882:416;;:::o;54430:113::-;54491:7;54518:10;:17;;;;54511:24;;54430:113;:::o;40064:335::-;40259:41;40278:12;:10;:12::i;:::-;40292:7;40259:18;:41::i;:::-;40251:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;40363:28;40373:4;40379:2;40383:7;40363:9;:28::i;:::-;40064:335;;;:::o;54098:256::-;54195:7;54231:23;54248:5;54231:16;:23::i;:::-;54223:5;:31;54215:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;54320:12;:19;54333:5;54320:19;;;;;;;;;;;;;;;:26;54340:5;54320:26;;;;;;;;;;;;54313:33;;54098:256;;;;:::o;63226:234::-;60846:13;:11;:13::i;:::-;63290:31:::1;63300:10;63312:8;63290:9;:31::i;:::-;63332:8;:20;63341:10;63332:20;;;;;;;;;;;;;;;63358:8;63332:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63378:14;63398:8;63378:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63423;63431:10;63443:8;63423:29;;;;;;;:::i;:::-;;;;;;;;63226:234:::0;:::o;64194:274::-;60846:13;:11;:13::i;:::-;64250:12:::1;64265:21;64250:36;;64315:1;64305:7;:11;64297:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;64358:12;64377:10;64376:17;;64401:7;64376:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64357:56;;;64432:7;64424:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;64239:229;;64194:274::o:0;40470:185::-;40608:39;40625:4;40631:2;40635:7;40608:39;;;;;;;;;;;;:16;:39::i;:::-;40470:185;;;:::o;54620:233::-;54695:7;54731:30;:28;:30::i;:::-;54723:5;:38;54715:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;54828:10;54839:5;54828:17;;;;;;;;:::i;:::-;;;;;;;;;;54821:24;;54620:233;;;:::o;63105:113::-;60846:13;:11;:13::i;:::-;63197::::1;63182:12;:28;;;;;;;;;;;;:::i;:::-;;63105:113:::0;:::o;37562:223::-;37634:7;37654:13;37670:17;37679:7;37670:8;:17::i;:::-;37654:33;;37723:1;37706:19;;:5;:19;;;;37698:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;37772:5;37765:12;;;37562:223;;;:::o;37293:207::-;37365:7;37410:1;37393:19;;:5;:19;;;;37385:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37476:9;:16;37486:5;37476:16;;;;;;;;;;;;;;;;37469:23;;37293:207;;;:::o;61608:103::-;60846:13;:11;:13::i;:::-;61673:30:::1;61700:1;61673:18;:30::i;:::-;61608:103::o:0;64067:119::-;64129:13;64162:8;:16;64171:6;64162:16;;;;;;;;;;;;;;;64155:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64067:119;;;:::o;62576:40::-;62605:11;62576:40;:::o;60960:87::-;61006:7;61033:6;;;;;;;;;;;61026:13;;60960:87;:::o;38021:104::-;38077:13;38110:7;38103:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38021:104;:::o;39607:155::-;39702:52;39721:12;:10;:12::i;:::-;39735:8;39745;39702:18;:52::i;:::-;39607:155;;:::o;40726:322::-;40900:41;40919:12;:10;:12::i;:::-;40933:7;40900:18;:41::i;:::-;40892:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41002:38;41016:4;41022:2;41026:7;41035:4;41002:13;:38::i;:::-;40726:322;;;;:::o;38196:281::-;38269:13;38295:23;38310:7;38295:14;:23::i;:::-;38331:21;38355:10;:8;:10::i;:::-;38331:34;;38407:1;38389:7;38383:21;:25;:86;;;;;;;;;;;;;;;;;38435:7;38444:18;:7;:16;:18::i;:::-;38418:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38383:86;38376:93;;;38196:281;;;:::o;62623:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63467:592::-;63543:1;63530:3;:10;:14;63522:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;63641:6;63636:420;63657:3;:10;63653:1;:14;63636:420;;;63685:12;63700:11;;63685:26;;63821:11;;:13;;;;;;;;;:::i;:::-;;;;;;63939:26;63949:3;63953:1;63949:6;;;;;;;;:::i;:::-;;;;;;;;63957:7;63939:9;:26::i;:::-;63976:14;63996:7;63976:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64020;64028:10;64040:7;64020:28;;;;;;;:::i;:::-;;;;;;;;63674:382;63669:3;;;;;:::i;:::-;;;;63636:420;;;;63467:592;:::o;39833:164::-;39930:4;39954:18;:25;39973:5;39954:25;;;;;;;;;;;;;;;:35;39980:8;39954:35;;;;;;;;;;;;;;;;;;;;;;;;;39947:42;;39833:164;;;;:::o;61866:201::-;60846:13;:11;:13::i;:::-;61975:1:::1;61955:22;;:8;:22;;;;61947:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;62031:28;62050:8;62031:18;:28::i;:::-;61866:201:::0;:::o;36924:305::-;37026:4;37078:25;37063:40;;;:11;:40;;;;:105;;;;37135:33;37120:48;;;:11;:48;;;;37063:105;:158;;;;37185:36;37209:11;37185:23;:36::i;:::-;37063:158;37043:178;;36924:305;;;:::o;49183:135::-;49265:16;49273:7;49265;:16::i;:::-;49257:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;49183:135;:::o;35303:98::-;35356:7;35383:10;35376:17;;35303:98;:::o;48462:174::-;48564:2;48537:15;:24;48553:7;48537:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;48620:7;48616:2;48582:46;;48591:23;48606:7;48591:14;:23::i;:::-;48582:46;;;;;;;;;;;;48462:174;;:::o;43081:264::-;43174:4;43191:13;43207:23;43222:7;43207:14;:23::i;:::-;43191:39;;43260:5;43249:16;;:7;:16;;;:52;;;;43269:32;43286:5;43293:7;43269:16;:32::i;:::-;43249:52;:87;;;;43329:7;43305:31;;:20;43317:7;43305:11;:20::i;:::-;:31;;;43249:87;43241:96;;;43081:264;;;;:::o;47080:1263::-;47239:4;47212:31;;:23;47227:7;47212:14;:23::i;:::-;:31;;;47204:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47318:1;47304:16;;:2;:16;;;;47296:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;47374:42;47395:4;47401:2;47405:7;47414:1;47374:20;:42::i;:::-;47546:4;47519:31;;:23;47534:7;47519:14;:23::i;:::-;:31;;;47511:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47664:15;:24;47680:7;47664:24;;;;;;;;;;;;47657:31;;;;;;;;;;;48159:1;48140:9;:15;48150:4;48140:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;48192:1;48175:9;:13;48185:2;48175:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;48234:2;48215:7;:16;48223:7;48215:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48273:7;48269:2;48254:27;;48263:4;48254:27;;;;;;;;;;;;48294:41;48314:4;48320:2;48324:7;48333:1;48294:19;:41::i;:::-;47080:1263;;;:::o;61125:132::-;61200:12;:10;:12::i;:::-;61189:23;;:7;:5;:7::i;:::-;:23;;;61181:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61125:132::o;43687:110::-;43763:26;43773:2;43777:7;43763:26;;;;;;;;;;;;:9;:26::i;:::-;43687:110;;:::o;42356:117::-;42422:7;42449;:16;42457:7;42449:16;;;;;;;;;;;;;;;;;;;;;42442:23;;42356:117;;;:::o;62227:191::-;62301:16;62320:6;;;;;;;;;;;62301:25;;62346:8;62337:6;;:17;;;;;;;;;;;;;;;;;;62401:8;62370:40;;62391:8;62370:40;;;;;;;;;;;;62290:128;62227:191;:::o;48779:315::-;48934:8;48925:17;;:5;:17;;;;48917:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49021:8;48983:18;:25;49002:5;48983:25;;;;;;;;;;;;;;;:35;49009:8;48983:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;49067:8;49045:41;;49060:5;49045:41;;;49077:8;49045:41;;;;;;:::i;:::-;;;;;;;;48779:315;;;:::o;41929:313::-;42085:28;42095:4;42101:2;42105:7;42085:9;:28::i;:::-;42132:47;42155:4;42161:2;42165:7;42174:4;42132:22;:47::i;:::-;42124:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;41929:313;;;;:::o;62984:113::-;63044:13;63077:12;63070:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62984:113;:::o;13305:716::-;13361:13;13412:14;13449:1;13429:17;13440:5;13429:10;:17::i;:::-;:21;13412:38;;13465:20;13499:6;13488:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13465:41;;13521:11;13650:6;13646:2;13642:15;13634:6;13630:28;13623:35;;13687:288;13694:4;13687:288;;;13719:5;;;;;;;;13861:8;13856:2;13849:5;13845:14;13840:30;13835:3;13827:44;13917:2;13908:11;;;;;;:::i;:::-;;;;;13951:1;13942:5;:10;13938:21;;;13954:5;;13938:21;13687:288;;;13996:6;13989:13;;;;;13305:716;;;:::o;27463:157::-;27548:4;27587:25;27572:40;;;:11;:40;;;;27565:47;;27463:157;;;:::o;42786:128::-;42851:4;42904:1;42875:31;;:17;42884:7;42875:8;:17::i;:::-;:31;;;;42868:38;;42786:128;;;:::o;54927:915::-;55104:61;55131:4;55137:2;55141:12;55155:9;55104:26;:61::i;:::-;55194:1;55182:9;:13;55178:222;;;55325:63;;;;;;;;;;:::i;:::-;;;;;;;;55178:222;55412:15;55430:12;55412:30;;55475:1;55459:18;;:4;:18;;;55455:187;;;55494:40;55526:7;55494:31;:40::i;:::-;55455:187;;;55564:2;55556:10;;:4;:10;;;55552:90;;55583:47;55616:4;55622:7;55583:32;:47::i;:::-;55552:90;55455:187;55670:1;55656:16;;:2;:16;;;55652:183;;;55689:45;55726:7;55689:36;:45::i;:::-;55652:183;;;55762:4;55756:10;;:2;:10;;;55752:83;;55783:40;55811:2;55815:7;55783:27;:40::i;:::-;55752:83;55652:183;55093:749;54927:915;;;;:::o;52599:158::-;;;;;:::o;44024:319::-;44153:18;44159:2;44163:7;44153:5;:18::i;:::-;44204:53;44235:1;44239:2;44243:7;44252:4;44204:22;:53::i;:::-;44182:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;44024:319;;;:::o;49882:853::-;50036:4;50057:15;:2;:13;;;:15::i;:::-;50053:675;;;50109:2;50093:36;;;50130:12;:10;:12::i;:::-;50144:4;50150:7;50159:4;50093:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50089:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50351:1;50334:6;:13;:18;50330:328;;;50377:60;;;;;;;;;;:::i;:::-;;;;;;;;50330:328;50608:6;50602:13;50593:6;50589:2;50585:15;50578:38;50089:584;50225:41;;;50215:51;;;:6;:51;;;;50208:58;;;;;50053:675;50712:4;50705:11;;49882:853;;;;;;;:::o;10171:922::-;10224:7;10244:14;10261:1;10244:18;;10311:6;10302:5;:15;10298:102;;10347:6;10338:15;;;;;;:::i;:::-;;;;;10382:2;10372:12;;;;10298:102;10427:6;10418:5;:15;10414:102;;10463:6;10454:15;;;;;;:::i;:::-;;;;;10498:2;10488:12;;;;10414:102;10543:6;10534:5;:15;10530:102;;10579:6;10570:15;;;;;;:::i;:::-;;;;;10614:2;10604:12;;;;10530:102;10659:5;10650;:14;10646:99;;10694:5;10685:14;;;;;;:::i;:::-;;;;;10728:1;10718:11;;;;10646:99;10772:5;10763;:14;10759:99;;10807:5;10798:14;;;;;;:::i;:::-;;;;;10841:1;10831:11;;;;10759:99;10885:5;10876;:14;10872:99;;10920:5;10911:14;;;;;;:::i;:::-;;;;;10954:1;10944:11;;;;10872:99;10998:5;10989;:14;10985:66;;11034:1;11024:11;;;;10985:66;11079:6;11072:13;;;10171:922;;;:::o;51467:410::-;51657:1;51645:9;:13;51641:229;;;51695:1;51679:18;;:4;:18;;;51675:87;;51737:9;51718;:15;51728:4;51718:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;51675:87;51794:1;51780:16;;:2;:16;;;51776:83;;51834:9;51817;:13;51827:2;51817:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;51776:83;51641:229;51467:410;;;;:::o;56565:164::-;56669:10;:17;;;;56642:15;:24;56658:7;56642:24;;;;;;;;;;;:44;;;;56697:10;56713:7;56697:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56565:164;:::o;57356:988::-;57622:22;57672:1;57647:22;57664:4;57647:16;:22::i;:::-;:26;;;;:::i;:::-;57622:51;;57684:18;57705:17;:26;57723:7;57705:26;;;;;;;;;;;;57684:47;;57852:14;57838:10;:28;57834:328;;57883:19;57905:12;:18;57918:4;57905:18;;;;;;;;;;;;;;;:34;57924:14;57905:34;;;;;;;;;;;;57883:56;;57989:11;57956:12;:18;57969:4;57956:18;;;;;;;;;;;;;;;:30;57975:10;57956:30;;;;;;;;;;;:44;;;;58106:10;58073:17;:30;58091:11;58073:30;;;;;;;;;;;:43;;;;57868:294;57834:328;58258:17;:26;58276:7;58258:26;;;;;;;;;;;58251:33;;;58302:12;:18;58315:4;58302:18;;;;;;;;;;;;;;;:34;58321:14;58302:34;;;;;;;;;;;58295:41;;;57437:907;;57356:988;;:::o;58639:1079::-;58892:22;58937:1;58917:10;:17;;;;:21;;;;:::i;:::-;58892:46;;58949:18;58970:15;:24;58986:7;58970:24;;;;;;;;;;;;58949:45;;59321:19;59343:10;59354:14;59343:26;;;;;;;;:::i;:::-;;;;;;;;;;59321:48;;59407:11;59382:10;59393;59382:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;59518:10;59487:15;:28;59503:11;59487:28;;;;;;;;;;;:41;;;;59659:15;:24;59675:7;59659:24;;;;;;;;;;;59652:31;;;59694:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58710:1008;;;58639:1079;:::o;56143:221::-;56228:14;56245:20;56262:2;56245:16;:20::i;:::-;56228:37;;56303:7;56276:12;:16;56289:2;56276:16;;;;;;;;;;;;;;;:24;56293:6;56276:24;;;;;;;;;;;:34;;;;56350:6;56321:17;:26;56339:7;56321:26;;;;;;;;;;;:35;;;;56217:147;56143:221;;:::o;44679:942::-;44773:1;44759:16;;:2;:16;;;;44751:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;44832:16;44840:7;44832;:16::i;:::-;44831:17;44823:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44894:48;44923:1;44927:2;44931:7;44940:1;44894:20;:48::i;:::-;45041:16;45049:7;45041;:16::i;:::-;45040:17;45032:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45456:1;45439:9;:13;45449:2;45439:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;45500:2;45481:7;:16;45489:7;45481:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45545:7;45541:2;45520:33;;45537:1;45520:33;;;;;;;;;;;;45566:47;45594:1;45598:2;45602:7;45611:1;45566:19;:47::i;:::-;44679:942;;:::o;16432:326::-;16492:4;16749:1;16727:7;:19;;;:23;16720:30;;16432:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:114::-;8938:6;8972:5;8966:12;8956:22;;8871:114;;;:::o;8991:184::-;9090:11;9124:6;9119:3;9112:19;9164:4;9159:3;9155:14;9140:29;;8991:184;;;;:::o;9181:132::-;9248:4;9271:3;9263:11;;9301:4;9296:3;9292:14;9284:22;;9181:132;;;:::o;9319:108::-;9396:24;9414:5;9396:24;:::i;:::-;9391:3;9384:37;9319:108;;:::o;9433:179::-;9502:10;9523:46;9565:3;9557:6;9523:46;:::i;:::-;9601:4;9596:3;9592:14;9578:28;;9433:179;;;;:::o;9618:113::-;9688:4;9720;9715:3;9711:14;9703:22;;9618:113;;;:::o;9767:732::-;9886:3;9915:54;9963:5;9915:54;:::i;:::-;9985:86;10064:6;10059:3;9985:86;:::i;:::-;9978:93;;10095:56;10145:5;10095:56;:::i;:::-;10174:7;10205:1;10190:284;10215:6;10212:1;10209:13;10190:284;;;10291:6;10285:13;10318:63;10377:3;10362:13;10318:63;:::i;:::-;10311:70;;10404:60;10457:6;10404:60;:::i;:::-;10394:70;;10250:224;10237:1;10234;10230:9;10225:14;;10190:284;;;10194:14;10490:3;10483:10;;9891:608;;;9767:732;;;;:::o;10505:373::-;10648:4;10686:2;10675:9;10671:18;10663:26;;10735:9;10729:4;10725:20;10721:1;10710:9;10706:17;10699:47;10763:108;10866:4;10857:6;10763:108;:::i;:::-;10755:116;;10505:373;;;;:::o;10884:116::-;10954:21;10969:5;10954:21;:::i;:::-;10947:5;10944:32;10934:60;;10990:1;10987;10980:12;10934:60;10884:116;:::o;11006:133::-;11049:5;11087:6;11074:20;11065:29;;11103:30;11127:5;11103:30;:::i;:::-;11006:133;;;;:::o;11145:468::-;11210:6;11218;11267:2;11255:9;11246:7;11242:23;11238:32;11235:119;;;11273:79;;:::i;:::-;11235:119;11393:1;11418:53;11463:7;11454:6;11443:9;11439:22;11418:53;:::i;:::-;11408:63;;11364:117;11520:2;11546:50;11588:7;11579:6;11568:9;11564:22;11546:50;:::i;:::-;11536:60;;11491:115;11145:468;;;;;:::o;11619:307::-;11680:4;11770:18;11762:6;11759:30;11756:56;;;11792:18;;:::i;:::-;11756:56;11830:29;11852:6;11830:29;:::i;:::-;11822:37;;11914:4;11908;11904:15;11896:23;;11619:307;;;:::o;11932:410::-;12009:5;12034:65;12050:48;12091:6;12050:48;:::i;:::-;12034:65;:::i;:::-;12025:74;;12122:6;12115:5;12108:21;12160:4;12153:5;12149:16;12198:3;12189:6;12184:3;12180:16;12177:25;12174:112;;;12205:79;;:::i;:::-;12174:112;12295:41;12329:6;12324:3;12319;12295:41;:::i;:::-;12015:327;11932:410;;;;;:::o;12361:338::-;12416:5;12465:3;12458:4;12450:6;12446:17;12442:27;12432:122;;12473:79;;:::i;:::-;12432:122;12590:6;12577:20;12615:78;12689:3;12681:6;12674:4;12666:6;12662:17;12615:78;:::i;:::-;12606:87;;12422:277;12361:338;;;;:::o;12705:943::-;12800:6;12808;12816;12824;12873:3;12861:9;12852:7;12848:23;12844:33;12841:120;;;12880:79;;:::i;:::-;12841:120;13000:1;13025:53;13070:7;13061:6;13050:9;13046:22;13025:53;:::i;:::-;13015:63;;12971:117;13127:2;13153:53;13198:7;13189:6;13178:9;13174:22;13153:53;:::i;:::-;13143:63;;13098:118;13255:2;13281:53;13326:7;13317:6;13306:9;13302:22;13281:53;:::i;:::-;13271:63;;13226:118;13411:2;13400:9;13396:18;13383:32;13442:18;13434:6;13431:30;13428:117;;;13464:79;;:::i;:::-;13428:117;13569:62;13623:7;13614:6;13603:9;13599:22;13569:62;:::i;:::-;13559:72;;13354:287;12705:943;;;;;;;:::o;13654:311::-;13731:4;13821:18;13813:6;13810:30;13807:56;;;13843:18;;:::i;:::-;13807:56;13893:4;13885:6;13881:17;13873:25;;13953:4;13947;13943:15;13935:23;;13654:311;;;:::o;13971:117::-;14080:1;14077;14070:12;14111:710;14207:5;14232:81;14248:64;14305:6;14248:64;:::i;:::-;14232:81;:::i;:::-;14223:90;;14333:5;14362:6;14355:5;14348:21;14396:4;14389:5;14385:16;14378:23;;14449:4;14441:6;14437:17;14429:6;14425:30;14478:3;14470:6;14467:15;14464:122;;;14497:79;;:::i;:::-;14464:122;14612:6;14595:220;14629:6;14624:3;14621:15;14595:220;;;14704:3;14733:37;14766:3;14754:10;14733:37;:::i;:::-;14728:3;14721:50;14800:4;14795:3;14791:14;14784:21;;14671:144;14655:4;14650:3;14646:14;14639:21;;14595:220;;;14599:21;14213:608;;14111:710;;;;;:::o;14844:370::-;14915:5;14964:3;14957:4;14949:6;14945:17;14941:27;14931:122;;14972:79;;:::i;:::-;14931:122;15089:6;15076:20;15114:94;15204:3;15196:6;15189:4;15181:6;15177:17;15114:94;:::i;:::-;15105:103;;14921:293;14844:370;;;;:::o;15220:539::-;15304:6;15353:2;15341:9;15332:7;15328:23;15324:32;15321:119;;;15359:79;;:::i;:::-;15321:119;15507:1;15496:9;15492:17;15479:31;15537:18;15529:6;15526:30;15523:117;;;15559:79;;:::i;:::-;15523:117;15664:78;15734:7;15725:6;15714:9;15710:22;15664:78;:::i;:::-;15654:88;;15450:302;15220:539;;;;:::o;15765:474::-;15833:6;15841;15890:2;15878:9;15869:7;15865:23;15861:32;15858:119;;;15896:79;;:::i;:::-;15858:119;16016:1;16041:53;16086:7;16077:6;16066:9;16062:22;16041:53;:::i;:::-;16031:63;;15987:117;16143:2;16169:53;16214:7;16205:6;16194:9;16190:22;16169:53;:::i;:::-;16159:63;;16114:118;15765:474;;;;;:::o;16245:180::-;16293:77;16290:1;16283:88;16390:4;16387:1;16380:15;16414:4;16411:1;16404:15;16431:320;16475:6;16512:1;16506:4;16502:12;16492:22;;16559:1;16553:4;16549:12;16580:18;16570:81;;16636:4;16628:6;16624:17;16614:27;;16570:81;16698:2;16690:6;16687:14;16667:18;16664:38;16661:84;;;16717:18;;:::i;:::-;16661:84;16482:269;16431:320;;;:::o;16757:220::-;16897:34;16893:1;16885:6;16881:14;16874:58;16966:3;16961:2;16953:6;16949:15;16942:28;16757:220;:::o;16983:366::-;17125:3;17146:67;17210:2;17205:3;17146:67;:::i;:::-;17139:74;;17222:93;17311:3;17222:93;:::i;:::-;17340:2;17335:3;17331:12;17324:19;;16983:366;;;:::o;17355:419::-;17521:4;17559:2;17548:9;17544:18;17536:26;;17608:9;17602:4;17598:20;17594:1;17583:9;17579:17;17572:47;17636:131;17762:4;17636:131;:::i;:::-;17628:139;;17355:419;;;:::o;17780:248::-;17920:34;17916:1;17908:6;17904:14;17897:58;17989:31;17984:2;17976:6;17972:15;17965:56;17780:248;:::o;18034:366::-;18176:3;18197:67;18261:2;18256:3;18197:67;:::i;:::-;18190:74;;18273:93;18362:3;18273:93;:::i;:::-;18391:2;18386:3;18382:12;18375:19;;18034:366;;;:::o;18406:419::-;18572:4;18610:2;18599:9;18595:18;18587:26;;18659:9;18653:4;18649:20;18645:1;18634:9;18630:17;18623:47;18687:131;18813:4;18687:131;:::i;:::-;18679:139;;18406:419;;;:::o;18831:232::-;18971:34;18967:1;18959:6;18955:14;18948:58;19040:15;19035:2;19027:6;19023:15;19016:40;18831:232;:::o;19069:366::-;19211:3;19232:67;19296:2;19291:3;19232:67;:::i;:::-;19225:74;;19308:93;19397:3;19308:93;:::i;:::-;19426:2;19421:3;19417:12;19410:19;;19069:366;;;:::o;19441:419::-;19607:4;19645:2;19634:9;19630:18;19622:26;;19694:9;19688:4;19684:20;19680:1;19669:9;19665:17;19658:47;19722:131;19848:4;19722:131;:::i;:::-;19714:139;;19441:419;;;:::o;19866:230::-;20006:34;20002:1;19994:6;19990:14;19983:58;20075:13;20070:2;20062:6;20058:15;20051:38;19866:230;:::o;20102:366::-;20244:3;20265:67;20329:2;20324:3;20265:67;:::i;:::-;20258:74;;20341:93;20430:3;20341:93;:::i;:::-;20459:2;20454:3;20450:12;20443:19;;20102:366;;;:::o;20474:419::-;20640:4;20678:2;20667:9;20663:18;20655:26;;20727:9;20721:4;20717:20;20713:1;20702:9;20698:17;20691:47;20755:131;20881:4;20755:131;:::i;:::-;20747:139;;20474:419;;;:::o;20899:332::-;21020:4;21058:2;21047:9;21043:18;21035:26;;21071:71;21139:1;21128:9;21124:17;21115:6;21071:71;:::i;:::-;21152:72;21220:2;21209:9;21205:18;21196:6;21152:72;:::i;:::-;20899:332;;;;;:::o;21237:175::-;21377:27;21373:1;21365:6;21361:14;21354:51;21237:175;:::o;21418:366::-;21560:3;21581:67;21645:2;21640:3;21581:67;:::i;:::-;21574:74;;21657:93;21746:3;21657:93;:::i;:::-;21775:2;21770:3;21766:12;21759:19;;21418:366;;;:::o;21790:419::-;21956:4;21994:2;21983:9;21979:18;21971:26;;22043:9;22037:4;22033:20;22029:1;22018:9;22014:17;22007:47;22071:131;22197:4;22071:131;:::i;:::-;22063:139;;21790:419;;;:::o;22215:147::-;22316:11;22353:3;22338:18;;22215:147;;;;:::o;22368:114::-;;:::o;22488:398::-;22647:3;22668:83;22749:1;22744:3;22668:83;:::i;:::-;22661:90;;22760:93;22849:3;22760:93;:::i;:::-;22878:1;22873:3;22869:11;22862:18;;22488:398;;;:::o;22892:379::-;23076:3;23098:147;23241:3;23098:147;:::i;:::-;23091:154;;23262:3;23255:10;;22892:379;;;:::o;23277:166::-;23417:18;23413:1;23405:6;23401:14;23394:42;23277:166;:::o;23449:366::-;23591:3;23612:67;23676:2;23671:3;23612:67;:::i;:::-;23605:74;;23688:93;23777:3;23688:93;:::i;:::-;23806:2;23801:3;23797:12;23790:19;;23449:366;;;:::o;23821:419::-;23987:4;24025:2;24014:9;24010:18;24002:26;;24074:9;24068:4;24064:20;24060:1;24049:9;24045:17;24038:47;24102:131;24228:4;24102:131;:::i;:::-;24094:139;;23821:419;;;:::o;24246:231::-;24386:34;24382:1;24374:6;24370:14;24363:58;24455:14;24450:2;24442:6;24438:15;24431:39;24246:231;:::o;24483:366::-;24625:3;24646:67;24710:2;24705:3;24646:67;:::i;:::-;24639:74;;24722:93;24811:3;24722:93;:::i;:::-;24840:2;24835:3;24831:12;24824:19;;24483:366;;;:::o;24855:419::-;25021:4;25059:2;25048:9;25044:18;25036:26;;25108:9;25102:4;25098:20;25094:1;25083:9;25079:17;25072:47;25136:131;25262:4;25136:131;:::i;:::-;25128:139;;24855:419;;;:::o;25280:180::-;25328:77;25325:1;25318:88;25425:4;25422:1;25415:15;25449:4;25446:1;25439:15;25466:174;25606:26;25602:1;25594:6;25590:14;25583:50;25466:174;:::o;25646:366::-;25788:3;25809:67;25873:2;25868:3;25809:67;:::i;:::-;25802:74;;25885:93;25974:3;25885:93;:::i;:::-;26003:2;25998:3;25994:12;25987:19;;25646:366;;;:::o;26018:419::-;26184:4;26222:2;26211:9;26207:18;26199:26;;26271:9;26265:4;26261:20;26257:1;26246:9;26242:17;26235:47;26299:131;26425:4;26299:131;:::i;:::-;26291:139;;26018:419;;;:::o;26443:228::-;26583:34;26579:1;26571:6;26567:14;26560:58;26652:11;26647:2;26639:6;26635:15;26628:36;26443:228;:::o;26677:366::-;26819:3;26840:67;26904:2;26899:3;26840:67;:::i;:::-;26833:74;;26916:93;27005:3;26916:93;:::i;:::-;27034:2;27029:3;27025:12;27018:19;;26677:366;;;:::o;27049:419::-;27215:4;27253:2;27242:9;27238:18;27230:26;;27302:9;27296:4;27292:20;27288:1;27277:9;27273:17;27266:47;27330:131;27456:4;27330:131;:::i;:::-;27322:139;;27049:419;;;:::o;27474:148::-;27576:11;27613:3;27598:18;;27474:148;;;;:::o;27628:377::-;27734:3;27762:39;27795:5;27762:39;:::i;:::-;27817:89;27899:6;27894:3;27817:89;:::i;:::-;27810:96;;27915:52;27960:6;27955:3;27948:4;27941:5;27937:16;27915:52;:::i;:::-;27992:6;27987:3;27983:16;27976:23;;27738:267;27628:377;;;;:::o;28011:435::-;28191:3;28213:95;28304:3;28295:6;28213:95;:::i;:::-;28206:102;;28325:95;28416:3;28407:6;28325:95;:::i;:::-;28318:102;;28437:3;28430:10;;28011:435;;;;;:::o;28452:163::-;28592:15;28588:1;28580:6;28576:14;28569:39;28452:163;:::o;28621:366::-;28763:3;28784:67;28848:2;28843:3;28784:67;:::i;:::-;28777:74;;28860:93;28949:3;28860:93;:::i;:::-;28978:2;28973:3;28969:12;28962:19;;28621:366;;;:::o;28993:419::-;29159:4;29197:2;29186:9;29182:18;29174:26;;29246:9;29240:4;29236:20;29232:1;29221:9;29217:17;29210:47;29274:131;29400:4;29274:131;:::i;:::-;29266:139;;28993:419;;;:::o;29418:180::-;29466:77;29463:1;29456:88;29563:4;29560:1;29553:15;29587:4;29584:1;29577:15;29604:233;29643:3;29666:24;29684:5;29666:24;:::i;:::-;29657:33;;29712:66;29705:5;29702:77;29699:103;;;29782:18;;:::i;:::-;29699:103;29829:1;29822:5;29818:13;29811:20;;29604:233;;;:::o;29843:225::-;29983:34;29979:1;29971:6;29967:14;29960:58;30052:8;30047:2;30039:6;30035:15;30028:33;29843:225;:::o;30074:366::-;30216:3;30237:67;30301:2;30296:3;30237:67;:::i;:::-;30230:74;;30313:93;30402:3;30313:93;:::i;:::-;30431:2;30426:3;30422:12;30415:19;;30074:366;;;:::o;30446:419::-;30612:4;30650:2;30639:9;30635:18;30627:26;;30699:9;30693:4;30689:20;30685:1;30674:9;30670:17;30663:47;30727:131;30853:4;30727:131;:::i;:::-;30719:139;;30446:419;;;:::o;30871:224::-;31011:34;31007:1;30999:6;30995:14;30988:58;31080:7;31075:2;31067:6;31063:15;31056:32;30871:224;:::o;31101:366::-;31243:3;31264:67;31328:2;31323:3;31264:67;:::i;:::-;31257:74;;31340:93;31429:3;31340:93;:::i;:::-;31458:2;31453:3;31449:12;31442:19;;31101:366;;;:::o;31473:419::-;31639:4;31677:2;31666:9;31662:18;31654:26;;31726:9;31720:4;31716:20;31712:1;31701:9;31697:17;31690:47;31754:131;31880:4;31754:131;:::i;:::-;31746:139;;31473:419;;;:::o;31898:223::-;32038:34;32034:1;32026:6;32022:14;32015:58;32107:6;32102:2;32094:6;32090:15;32083:31;31898:223;:::o;32127:366::-;32269:3;32290:67;32354:2;32349:3;32290:67;:::i;:::-;32283:74;;32366:93;32455:3;32366:93;:::i;:::-;32484:2;32479:3;32475:12;32468:19;;32127:366;;;:::o;32499:419::-;32665:4;32703:2;32692:9;32688:18;32680:26;;32752:9;32746:4;32742:20;32738:1;32727:9;32723:17;32716:47;32780:131;32906:4;32780:131;:::i;:::-;32772:139;;32499:419;;;:::o;32924:182::-;33064:34;33060:1;33052:6;33048:14;33041:58;32924:182;:::o;33112:366::-;33254:3;33275:67;33339:2;33334:3;33275:67;:::i;:::-;33268:74;;33351:93;33440:3;33351:93;:::i;:::-;33469:2;33464:3;33460:12;33453:19;;33112:366;;;:::o;33484:419::-;33650:4;33688:2;33677:9;33673:18;33665:26;;33737:9;33731:4;33727:20;33723:1;33712:9;33708:17;33701:47;33765:131;33891:4;33765:131;:::i;:::-;33757:139;;33484:419;;;:::o;33909:175::-;34049:27;34045:1;34037:6;34033:14;34026:51;33909:175;:::o;34090:366::-;34232:3;34253:67;34317:2;34312:3;34253:67;:::i;:::-;34246:74;;34329:93;34418:3;34329:93;:::i;:::-;34447:2;34442:3;34438:12;34431:19;;34090:366;;;:::o;34462:419::-;34628:4;34666:2;34655:9;34651:18;34643:26;;34715:9;34709:4;34705:20;34701:1;34690:9;34686:17;34679:47;34743:131;34869:4;34743:131;:::i;:::-;34735:139;;34462:419;;;:::o;34887:237::-;35027:34;35023:1;35015:6;35011:14;35004:58;35096:20;35091:2;35083:6;35079:15;35072:45;34887:237;:::o;35130:366::-;35272:3;35293:67;35357:2;35352:3;35293:67;:::i;:::-;35286:74;;35369:93;35458:3;35369:93;:::i;:::-;35487:2;35482:3;35478:12;35471:19;;35130:366;;;:::o;35502:419::-;35668:4;35706:2;35695:9;35691:18;35683:26;;35755:9;35749:4;35745:20;35741:1;35730:9;35726:17;35719:47;35783:131;35909:4;35783:131;:::i;:::-;35775:139;;35502:419;;;:::o;35927:180::-;35975:77;35972:1;35965:88;36072:4;36069:1;36062:15;36096:4;36093:1;36086:15;36113:240;36253:34;36249:1;36241:6;36237:14;36230:58;36322:23;36317:2;36309:6;36305:15;36298:48;36113:240;:::o;36359:366::-;36501:3;36522:67;36586:2;36581:3;36522:67;:::i;:::-;36515:74;;36598:93;36687:3;36598:93;:::i;:::-;36716:2;36711:3;36707:12;36700:19;;36359:366;;;:::o;36731:419::-;36897:4;36935:2;36924:9;36920:18;36912:26;;36984:9;36978:4;36974:20;36970:1;36959:9;36955:17;36948:47;37012:131;37138:4;37012:131;:::i;:::-;37004:139;;36731:419;;;:::o;37156:98::-;37207:6;37241:5;37235:12;37225:22;;37156:98;;;:::o;37260:168::-;37343:11;37377:6;37372:3;37365:19;37417:4;37412:3;37408:14;37393:29;;37260:168;;;;:::o;37434:360::-;37520:3;37548:38;37580:5;37548:38;:::i;:::-;37602:70;37665:6;37660:3;37602:70;:::i;:::-;37595:77;;37681:52;37726:6;37721:3;37714:4;37707:5;37703:16;37681:52;:::i;:::-;37758:29;37780:6;37758:29;:::i;:::-;37753:3;37749:39;37742:46;;37524:270;37434:360;;;;:::o;37800:640::-;37995:4;38033:3;38022:9;38018:19;38010:27;;38047:71;38115:1;38104:9;38100:17;38091:6;38047:71;:::i;:::-;38128:72;38196:2;38185:9;38181:18;38172:6;38128:72;:::i;:::-;38210;38278:2;38267:9;38263:18;38254:6;38210:72;:::i;:::-;38329:9;38323:4;38319:20;38314:2;38303:9;38299:18;38292:48;38357:76;38428:4;38419:6;38357:76;:::i;:::-;38349:84;;37800:640;;;;;;;:::o;38446:141::-;38502:5;38533:6;38527:13;38518:22;;38549:32;38575:5;38549:32;:::i;:::-;38446:141;;;;:::o;38593:349::-;38662:6;38711:2;38699:9;38690:7;38686:23;38682:32;38679:119;;;38717:79;;:::i;:::-;38679:119;38837:1;38862:63;38917:7;38908:6;38897:9;38893:22;38862:63;:::i;:::-;38852:73;;38808:127;38593:349;;;;:::o;38948:191::-;38988:4;39008:20;39026:1;39008:20;:::i;:::-;39003:25;;39042:20;39060:1;39042:20;:::i;:::-;39037:25;;39081:1;39078;39075:8;39072:34;;;39086:18;;:::i;:::-;39072:34;39131:1;39128;39124:9;39116:17;;38948:191;;;;:::o;39145:305::-;39185:3;39204:20;39222:1;39204:20;:::i;:::-;39199:25;;39238:20;39256:1;39238:20;:::i;:::-;39233:25;;39392:1;39324:66;39320:74;39317:1;39314:81;39311:107;;;39398:18;;:::i;:::-;39311:107;39442:1;39439;39435:9;39428:16;;39145:305;;;;:::o;39456:180::-;39504:77;39501:1;39494:88;39601:4;39598:1;39591:15;39625:4;39622:1;39615:15;39642:182;39782:34;39778:1;39770:6;39766:14;39759:58;39642:182;:::o;39830:366::-;39972:3;39993:67;40057:2;40052:3;39993:67;:::i;:::-;39986:74;;40069:93;40158:3;40069:93;:::i;:::-;40187:2;40182:3;40178:12;40171:19;;39830:366;;;:::o;40202:419::-;40368:4;40406:2;40395:9;40391:18;40383:26;;40455:9;40449:4;40445:20;40441:1;40430:9;40426:17;40419:47;40483:131;40609:4;40483:131;:::i;:::-;40475:139;;40202:419;;;:::o;40627:178::-;40767:30;40763:1;40755:6;40751:14;40744:54;40627:178;:::o;40811:366::-;40953:3;40974:67;41038:2;41033:3;40974:67;:::i;:::-;40967:74;;41050:93;41139:3;41050:93;:::i;:::-;41168:2;41163:3;41159:12;41152:19;;40811:366;;;:::o;41183:419::-;41349:4;41387:2;41376:9;41372:18;41364:26;;41436:9;41430:4;41426:20;41422:1;41411:9;41407:17;41400:47;41464:131;41590:4;41464:131;:::i;:::-;41456:139;;41183:419;;;:::o

Swarm Source

ipfs://28092ec8d6367e0277fd78d43ead3d85daea603d5bc57a8580605a35bb8c20a1
[ 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.