ETH Price: $1,596.68 (-1.27%)
Gas: 8 Gwei
 

Overview

TokenID

5

Total Transfers

-

Market

Fully Diluted Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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:
ERC721GoldenHeartsLimitedToken

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/interfaces/IERC2981.sol

// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

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

pragma solidity ^0.8.0;

/**
 * @title ERC721GoldenHeartsLimitedToken
 * @dev ERC721 token contract for Złote e-serduszka NFT limitowane 2023.
 */
contract ERC721GoldenHeartsLimitedToken is ERC721, IERC2981, Ownable {
    using Math for uint256;
    using Strings for uint256;

    string private _metadataUriPrefix;
    address private _beneficiary;

    uint96 constant ROYALTIES_PERCENT = 10;

    /**
     * @dev Creates token instance with royalties beneficiary address set to `beneficiary`, metadata URI prefix set to `metadataUriPrefix` and mints `count` of tokens to `wallet`.
     */
    constructor(address beneficiary, address wallet, string memory metadataUriPrefix, uint96 count) ERC721("Zlote e-serduszka NFT limitowane 2023", "WOSP2023") {
        require(wallet != address(0), "ERC721GoldenHeartsLimitedToken: cannot mint to the zero address");
        require(count > 0, "ERC721GoldenHeartsLimitedToken: count cannot be 0");

        _beneficiary = beneficiary;
        _metadataUriPrefix = metadataUriPrefix;

        for (uint i = 1; i <= count; ++i) {
            _mint(wallet, i);
        }
    }

    /**
     * @dev Sets royalties beneficiary to `beneficiary`.
     */
    function setBeneficiary(address beneficiary) external onlyOwner {
        require(beneficiary != _beneficiary, "ERC721GoldenHeartsLimitedToken: new value is the same");

        _beneficiary = beneficiary;
    }

    /**
     * @dev Sets metadata URI prefix to `metadataUriPrefix`.
     */
    function setMetadataUriPrefix(string calldata metadataUriPrefix) external onlyOwner {
        require(keccak256(abi.encodePacked(metadataUriPrefix)) != keccak256(abi.encodePacked(_metadataUriPrefix)), "ERC721GoldenHeartsLimitedToken: new value is the same");

        _metadataUriPrefix = metadataUriPrefix;
    }

    /**
     * @dev Returns metadata URI for given `identifier`.
     */
    function tokenURI(uint256 identifier) public view override returns (string memory) {
        require(_exists(identifier), "ERC721GoldenHeartsLimitedToken: token does not exist");

        return string(abi.encodePacked(_metadataUriPrefix, identifier.toString(), ".json"));
    }

    /**
     * @dev See {IERC2981-royaltyInfo}.
     */
    function royaltyInfo(uint256 identifier, uint256 salePrice) public view override returns (address, uint256) {
        require(_exists(identifier), "ERC721GoldenHeartsLimitedToken: token does not exist");
        require(salePrice > 0, "ERC721GoldenHeartsLimitedToken: salePrice cannot be 0");

        if (_beneficiary == address(0)) {
            return (_beneficiary, 0);
        }

        return (_beneficiary, salePrice.mulDiv(ROYALTIES_PERCENT, 100));
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"string","name":"metadataUriPrefix","type":"string"},{"internalType":"uint96","name":"count","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"identifier","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"metadataUriPrefix","type":"string"}],"name":"setMetadataUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceIdentifier","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":"identifier","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}]

Contract Creation Code

60806040523480156200001157600080fd5b5060405162003e9d38038062003e9d833981810160405281019062000037919062000874565b60405180606001604052806025815260200162003e78602591396040518060400160405280600881526020017f574f53503230323300000000000000000000000000000000000000000000000081525081600090805190602001906200009f92919062000718565b508060019080519060200190620000b892919062000718565b505050620000db620000cf6200024a60201b60201c565b6200025260201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200014e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001459062000a07565b60405180910390fd5b6000816bffffffffffffffffffffffff1611620001a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200019990620009c3565b60405180910390fd5b83600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160079080519060200190620001fb92919062000718565b506000600190505b816bffffffffffffffffffffffff1681116200023f576200022b84826200031860201b60201c565b80620002379062000c29565b905062000203565b505050505062000e4d565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200038b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038290620009e5565b60405180910390fd5b6200039c816200055f60201b60201c565b15620003df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003d690620009a1565b60405180910390fd5b620003f5600083836001620005a860201b60201c565b62000406816200055f60201b60201c565b1562000449576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044090620009a1565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200055b600083836001620006d560201b60201c565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166200058983620006db60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6001811115620006cf57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614620006405780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000638919062000af6565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620006ce5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620006c6919062000a99565b925050819055505b5b50505050565b50505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b828054620007269062000bbd565b90600052602060002090601f0160209004810192826200074a576000855562000796565b82601f106200076557805160ff191683800117855562000796565b8280016001018555821562000796579182015b828111156200079557825182559160200191906001019062000778565b5b509050620007a59190620007a9565b5090565b5b80821115620007c4576000816000905550600101620007aa565b5090565b6000620007df620007d98462000a52565b62000a29565b905082815260208101848484011115620007fe57620007fd62000d09565b5b6200080b84828562000b87565b509392505050565b600081519050620008248162000e19565b92915050565b600082601f83011262000842576200084162000d04565b5b815162000854848260208601620007c8565b91505092915050565b6000815190506200086e8162000e33565b92915050565b6000806000806080858703121562000891576200089062000d13565b5b6000620008a18782880162000813565b9450506020620008b48782880162000813565b935050604085015167ffffffffffffffff811115620008d857620008d762000d0e565b5b620008e6878288016200082a565b9250506060620008f9878288016200085d565b91505092959194509250565b600062000914601c8362000a88565b9150620009218262000d29565b602082019050919050565b60006200093b60318362000a88565b9150620009488262000d52565b604082019050919050565b60006200096260208362000a88565b91506200096f8262000da1565b602082019050919050565b600062000989603f8362000a88565b9150620009968262000dca565b604082019050919050565b60006020820190508181036000830152620009bc8162000905565b9050919050565b60006020820190508181036000830152620009de816200092c565b9050919050565b6000602082019050818103600083015262000a008162000953565b9050919050565b6000602082019050818103600083015262000a22816200097a565b9050919050565b600062000a3562000a48565b905062000a43828262000bf3565b919050565b6000604051905090565b600067ffffffffffffffff82111562000a705762000a6f62000cd5565b5b62000a7b8262000d18565b9050602081019050919050565b600082825260208201905092915050565b600062000aa68262000b65565b915062000ab38362000b65565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000aeb5762000aea62000c77565b5b828201905092915050565b600062000b038262000b65565b915062000b108362000b65565b92508282101562000b265762000b2562000c77565b5b828203905092915050565b600062000b3e8262000b45565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b60005b8381101562000ba757808201518184015260208101905062000b8a565b8381111562000bb7576000848401525b50505050565b6000600282049050600182168062000bd657607f821691505b6020821081141562000bed5762000bec62000ca6565b5b50919050565b62000bfe8262000d18565b810181811067ffffffffffffffff8211171562000c205762000c1f62000cd5565b5b80604052505050565b600062000c368262000b65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000c6c5762000c6b62000c77565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f455243373231476f6c64656e4865617274734c696d69746564546f6b656e3a2060008201527f636f756e742063616e6e6f742062652030000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f455243373231476f6c64656e4865617274734c696d69746564546f6b656e3a2060008201527f63616e6e6f74206d696e7420746f20746865207a65726f206164647265737300602082015250565b62000e248162000b31565b811462000e3057600080fd5b50565b62000e3e8162000b6f565b811462000e4a57600080fd5b50565b61301b8062000e5d6000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad578063ad2628cd11610071578063ad2628cd14610307578063b88d4fde14610323578063c87b56dd1461033f578063e985e9c51461036f578063f2fde38b1461039f57610121565b806370a0823114610275578063715018a6146102a55780638da5cb5b146102af57806395d89b41146102cd578063a22cb465146102eb57610121565b80631c31f710116100f45780631c31f710146101c057806323b872dd146101dc5780632a55205a146101f857806342842e0e146102295780636352211e1461024557610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b91906120a8565b6103bb565b60405161014d919061262c565b60405180910390f35b61015e610435565b60405161016b9190612647565b60405180910390f35b61018e6004803603810190610189919061214f565b6104c7565b60405161019b919061259c565b60405180910390f35b6101be60048036038101906101b99190612068565b61050d565b005b6101da60048036038101906101d59190611ee5565b610625565b005b6101f660048036038101906101f19190611f52565b610702565b005b610212600480360381019061020d919061217c565b610762565b604051610220929190612603565b60405180910390f35b610243600480360381019061023e9190611f52565b6108c9565b005b61025f600480360381019061025a919061214f565b6108e9565b60405161026c919061259c565b60405180910390f35b61028f600480360381019061028a9190611ee5565b610970565b60405161029c9190612829565b60405180910390f35b6102ad610a28565b005b6102b7610a3c565b6040516102c4919061259c565b60405180910390f35b6102d5610a66565b6040516102e29190612647565b60405180910390f35b61030560048036038101906103009190612028565b610af8565b005b610321600480360381019061031c9190612102565b610b0e565b005b61033d60048036038101906103389190611fa5565b610bbe565b005b6103596004803603810190610354919061214f565b610c20565b6040516103669190612647565b60405180910390f35b61038960048036038101906103849190611f12565b610c9c565b604051610396919061262c565b60405180910390f35b6103b960048036038101906103b49190611ee5565b610d30565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061042e575061042d82610db4565b5b9050919050565b60606000805461044490612a32565b80601f016020809104026020016040519081016040528092919081815260200182805461047090612a32565b80156104bd5780601f10610492576101008083540402835291602001916104bd565b820191906000526020600020905b8154815290600101906020018083116104a057829003601f168201915b5050505050905090565b60006104d282610e96565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610518826108e9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610589576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906127e9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105a8610ee1565b73ffffffffffffffffffffffffffffffffffffffff1614806105d757506105d6816105d1610ee1565b610c9c565b5b610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90612809565b60405180910390fd5b6106208383610ee9565b505050565b61062d610fa2565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156106be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b5906126a9565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61071361070d610ee1565b82611020565b610752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074990612669565b60405180910390fd5b61075d8383836110b5565b505050565b60008061076e846113af565b6107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a490612729565b60405180910390fd5b600083116107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790612689565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561087557600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000915091506108c2565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166108bd600a6bffffffffffffffffffffffff166064866113f09092919063ffffffff16565b915091505b9250929050565b6108e483838360405180602001604052806000815250610bbe565b505050565b6000806108f5836114cc565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e906127c9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156109e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d890612789565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a30610fa2565b610a3a6000611509565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610a7590612a32565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa190612a32565b8015610aee5780601f10610ac357610100808354040283529160200191610aee565b820191906000526020600020905b815481529060010190602001808311610ad157829003601f168201915b5050505050905090565b610b0a610b03610ee1565b83836115cf565b5050565b610b16610fa2565b6007604051602001610b289190612556565b604051602081830303815290604052805190602001208282604051602001610b5192919061253d565b604051602081830303815290604052805190602001201415610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f906126a9565b60405180910390fd5b818160079190610bb9929190611d13565b505050565b610bcf610bc9610ee1565b83611020565b610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0590612669565b60405180910390fd5b610c1a8484848461173c565b50505050565b6060610c2b826113af565b610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6190612729565b60405180910390fd5b6007610c7583611798565b604051602001610c8692919061256d565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d38610fa2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9f906126e9565b60405180910390fd5b610db181611509565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e7f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e8f5750610e8e82611870565b5b9050919050565b610e9f816113af565b610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed5906127c9565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610f5c836108e9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610faa610ee1565b73ffffffffffffffffffffffffffffffffffffffff16610fc8610a3c565b73ffffffffffffffffffffffffffffffffffffffff161461101e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611015906127a9565b60405180910390fd5b565b60008061102c836108e9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061106e575061106d8185610c9c565b5b806110ac57508373ffffffffffffffffffffffffffffffffffffffff16611094846104c7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166110d5826108e9565b73ffffffffffffffffffffffffffffffffffffffff161461112b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112290612709565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561119b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119290612749565b60405180910390fd5b6111a883838360016118da565b8273ffffffffffffffffffffffffffffffffffffffff166111c8826108e9565b73ffffffffffffffffffffffffffffffffffffffff161461121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590612709565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113aa8383836001611a00565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166113d1836114cc565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60008060008019858709858702925082811083820303915050600081141561142c5783828161142257611421612ac4565b5b04925050506114c5565b80841161143857600080fd5b60008486880990508281118203915080830392506000600186190186169050808604955080840493506001818260000304019050808302841793506000600287600302189050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050505b9392505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590612769565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172f919061262c565b60405180910390a3505050565b6117478484846110b5565b61175384848484611a06565b611792576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611789906126c9565b60405180910390fd5b50505050565b6060600060016117a784611b9d565b01905060008167ffffffffffffffff8111156117c6576117c5612b22565b5b6040519080825280601f01601f1916602001820160405280156117f85781602001600182028036833780820191505090505b509050600082602001820190505b600115611865578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161184f5761184e612ac4565b5b049450600085141561186057611865565b611806565b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60018111156119fa57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461196e5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119669190612948565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146119f95780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119f191906128f2565b925050819055505b5b50505050565b50505050565b6000611a278473ffffffffffffffffffffffffffffffffffffffff16611cf0565b15611b90578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a50610ee1565b8786866040518563ffffffff1660e01b8152600401611a7294939291906125b7565b602060405180830381600087803b158015611a8c57600080fd5b505af1925050508015611abd57506040513d601f19601f82011682018060405250810190611aba91906120d5565b60015b611b40573d8060008114611aed576040519150601f19603f3d011682016040523d82523d6000602084013e611af2565b606091505b50600081511415611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f906126c9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611b95565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611bfb577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611bf157611bf0612ac4565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611c38576d04ee2d6d415b85acef81000000008381611c2e57611c2d612ac4565b5b0492506020810190505b662386f26fc100008310611c6757662386f26fc100008381611c5d57611c5c612ac4565b5b0492506010810190505b6305f5e1008310611c90576305f5e1008381611c8657611c85612ac4565b5b0492506008810190505b6127108310611cb5576127108381611cab57611caa612ac4565b5b0492506004810190505b60648310611cd85760648381611cce57611ccd612ac4565b5b0492506002810190505b600a8310611ce7576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054611d1f90612a32565b90600052602060002090601f016020900481019282611d415760008555611d88565b82601f10611d5a57803560ff1916838001178555611d88565b82800160010185558215611d88579182015b82811115611d87578235825591602001919060010190611d6c565b5b509050611d959190611d99565b5090565b5b80821115611db2576000816000905550600101611d9a565b5090565b6000611dc9611dc484612869565b612844565b905082815260208101848484011115611de557611de4612b60565b5b611df08482856129f0565b509392505050565b600081359050611e0781612f89565b92915050565b600081359050611e1c81612fa0565b92915050565b600081359050611e3181612fb7565b92915050565b600081519050611e4681612fb7565b92915050565b600082601f830112611e6157611e60612b56565b5b8135611e71848260208601611db6565b91505092915050565b60008083601f840112611e9057611e8f612b56565b5b8235905067ffffffffffffffff811115611ead57611eac612b51565b5b602083019150836001820283011115611ec957611ec8612b5b565b5b9250929050565b600081359050611edf81612fce565b92915050565b600060208284031215611efb57611efa612b6a565b5b6000611f0984828501611df8565b91505092915050565b60008060408385031215611f2957611f28612b6a565b5b6000611f3785828601611df8565b9250506020611f4885828601611df8565b9150509250929050565b600080600060608486031215611f6b57611f6a612b6a565b5b6000611f7986828701611df8565b9350506020611f8a86828701611df8565b9250506040611f9b86828701611ed0565b9150509250925092565b60008060008060808587031215611fbf57611fbe612b6a565b5b6000611fcd87828801611df8565b9450506020611fde87828801611df8565b9350506040611fef87828801611ed0565b925050606085013567ffffffffffffffff8111156120105761200f612b65565b5b61201c87828801611e4c565b91505092959194509250565b6000806040838503121561203f5761203e612b6a565b5b600061204d85828601611df8565b925050602061205e85828601611e0d565b9150509250929050565b6000806040838503121561207f5761207e612b6a565b5b600061208d85828601611df8565b925050602061209e85828601611ed0565b9150509250929050565b6000602082840312156120be576120bd612b6a565b5b60006120cc84828501611e22565b91505092915050565b6000602082840312156120eb576120ea612b6a565b5b60006120f984828501611e37565b91505092915050565b6000806020838503121561211957612118612b6a565b5b600083013567ffffffffffffffff81111561213757612136612b65565b5b61214385828601611e7a565b92509250509250929050565b60006020828403121561216557612164612b6a565b5b600061217384828501611ed0565b91505092915050565b6000806040838503121561219357612192612b6a565b5b60006121a185828601611ed0565b92505060206121b285828601611ed0565b9150509250929050565b6121c58161297c565b82525050565b6121d48161298e565b82525050565b60006121e5826128af565b6121ef81856128c5565b93506121ff8185602086016129ff565b61220881612b6f565b840191505092915050565b600061221f83856128e7565b935061222c8385846129f0565b82840190509392505050565b6000612243826128ba565b61224d81856128d6565b935061225d8185602086016129ff565b61226681612b6f565b840191505092915050565b600061227c826128ba565b61228681856128e7565b93506122968185602086016129ff565b80840191505092915050565b600081546122af81612a32565b6122b981866128e7565b945060018216600081146122d457600181146122e557612318565b60ff19831686528186019350612318565b6122ee8561289a565b60005b83811015612310578154818901526001820191506020810190506122f1565b838801955050505b50505092915050565b600061232e602d836128d6565b915061233982612b80565b604082019050919050565b60006123516035836128d6565b915061235c82612bcf565b604082019050919050565b60006123746035836128d6565b915061237f82612c1e565b604082019050919050565b60006123976032836128d6565b91506123a282612c6d565b604082019050919050565b60006123ba6026836128d6565b91506123c582612cbc565b604082019050919050565b60006123dd6025836128d6565b91506123e882612d0b565b604082019050919050565b60006124006034836128d6565b915061240b82612d5a565b604082019050919050565b60006124236024836128d6565b915061242e82612da9565b604082019050919050565b60006124466019836128d6565b915061245182612df8565b602082019050919050565b60006124696029836128d6565b915061247482612e21565b604082019050919050565b600061248c6005836128e7565b915061249782612e70565b600582019050919050565b60006124af6020836128d6565b91506124ba82612e99565b602082019050919050565b60006124d26018836128d6565b91506124dd82612ec2565b602082019050919050565b60006124f56021836128d6565b915061250082612eeb565b604082019050919050565b6000612518603d836128d6565b915061252382612f3a565b604082019050919050565b612537816129e6565b82525050565b600061254a828486612213565b91508190509392505050565b600061256282846122a2565b915081905092915050565b600061257982856122a2565b91506125858284612271565b91506125908261247f565b91508190509392505050565b60006020820190506125b160008301846121bc565b92915050565b60006080820190506125cc60008301876121bc565b6125d960208301866121bc565b6125e6604083018561252e565b81810360608301526125f881846121da565b905095945050505050565b600060408201905061261860008301856121bc565b612625602083018461252e565b9392505050565b600060208201905061264160008301846121cb565b92915050565b600060208201905081810360008301526126618184612238565b905092915050565b6000602082019050818103600083015261268281612321565b9050919050565b600060208201905081810360008301526126a281612344565b9050919050565b600060208201905081810360008301526126c281612367565b9050919050565b600060208201905081810360008301526126e28161238a565b9050919050565b60006020820190508181036000830152612702816123ad565b9050919050565b60006020820190508181036000830152612722816123d0565b9050919050565b60006020820190508181036000830152612742816123f3565b9050919050565b6000602082019050818103600083015261276281612416565b9050919050565b6000602082019050818103600083015261278281612439565b9050919050565b600060208201905081810360008301526127a28161245c565b9050919050565b600060208201905081810360008301526127c2816124a2565b9050919050565b600060208201905081810360008301526127e2816124c5565b9050919050565b60006020820190508181036000830152612802816124e8565b9050919050565b600060208201905081810360008301526128228161250b565b9050919050565b600060208201905061283e600083018461252e565b92915050565b600061284e61285f565b905061285a8282612a64565b919050565b6000604051905090565b600067ffffffffffffffff82111561288457612883612b22565b5b61288d82612b6f565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006128fd826129e6565b9150612908836129e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561293d5761293c612a95565b5b828201905092915050565b6000612953826129e6565b915061295e836129e6565b92508282101561297157612970612a95565b5b828203905092915050565b6000612987826129c6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612a1d578082015181840152602081019050612a02565b83811115612a2c576000848401525b50505050565b60006002820490506001821680612a4a57607f821691505b60208210811415612a5e57612a5d612af3565b5b50919050565b612a6d82612b6f565b810181811067ffffffffffffffff82111715612a8c57612a8b612b22565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f455243373231476f6c64656e4865617274734c696d69746564546f6b656e3a2060008201527f73616c6550726963652063616e6e6f7420626520300000000000000000000000602082015250565b7f455243373231476f6c64656e4865617274734c696d69746564546f6b656e3a2060008201527f6e65772076616c7565206973207468652073616d650000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231476f6c64656e4865617274734c696d69746564546f6b656e3a2060008201527f746f6b656e20646f6573206e6f74206578697374000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b612f928161297c565b8114612f9d57600080fd5b50565b612fa98161298e565b8114612fb457600080fd5b50565b612fc08161299a565b8114612fcb57600080fd5b50565b612fd7816129e6565b8114612fe257600080fd5b5056fea2646970667358221220f7a9d6aec1362d1c98a59b6f647bf66304099f90160aeea82928476e33e2e60264736f6c634300080700335a6c6f746520652d7365726475737a6b61204e4654206c696d69746f77616e6520323032330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9ee71c587d1d72314bf385bbcb840e440becbf90000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000003768747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f696e666c75766572756d2d6e66742d776f73702f67686c2f000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad578063ad2628cd11610071578063ad2628cd14610307578063b88d4fde14610323578063c87b56dd1461033f578063e985e9c51461036f578063f2fde38b1461039f57610121565b806370a0823114610275578063715018a6146102a55780638da5cb5b146102af57806395d89b41146102cd578063a22cb465146102eb57610121565b80631c31f710116100f45780631c31f710146101c057806323b872dd146101dc5780632a55205a146101f857806342842e0e146102295780636352211e1461024557610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b91906120a8565b6103bb565b60405161014d919061262c565b60405180910390f35b61015e610435565b60405161016b9190612647565b60405180910390f35b61018e6004803603810190610189919061214f565b6104c7565b60405161019b919061259c565b60405180910390f35b6101be60048036038101906101b99190612068565b61050d565b005b6101da60048036038101906101d59190611ee5565b610625565b005b6101f660048036038101906101f19190611f52565b610702565b005b610212600480360381019061020d919061217c565b610762565b604051610220929190612603565b60405180910390f35b610243600480360381019061023e9190611f52565b6108c9565b005b61025f600480360381019061025a919061214f565b6108e9565b60405161026c919061259c565b60405180910390f35b61028f600480360381019061028a9190611ee5565b610970565b60405161029c9190612829565b60405180910390f35b6102ad610a28565b005b6102b7610a3c565b6040516102c4919061259c565b60405180910390f35b6102d5610a66565b6040516102e29190612647565b60405180910390f35b61030560048036038101906103009190612028565b610af8565b005b610321600480360381019061031c9190612102565b610b0e565b005b61033d60048036038101906103389190611fa5565b610bbe565b005b6103596004803603810190610354919061214f565b610c20565b6040516103669190612647565b60405180910390f35b61038960048036038101906103849190611f12565b610c9c565b604051610396919061262c565b60405180910390f35b6103b960048036038101906103b49190611ee5565b610d30565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061042e575061042d82610db4565b5b9050919050565b60606000805461044490612a32565b80601f016020809104026020016040519081016040528092919081815260200182805461047090612a32565b80156104bd5780601f10610492576101008083540402835291602001916104bd565b820191906000526020600020905b8154815290600101906020018083116104a057829003601f168201915b5050505050905090565b60006104d282610e96565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610518826108e9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610589576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610580906127e9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166105a8610ee1565b73ffffffffffffffffffffffffffffffffffffffff1614806105d757506105d6816105d1610ee1565b610c9c565b5b610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90612809565b60405180910390fd5b6106208383610ee9565b505050565b61062d610fa2565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156106be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b5906126a9565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61071361070d610ee1565b82611020565b610752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074990612669565b60405180910390fd5b61075d8383836110b5565b505050565b60008061076e846113af565b6107ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a490612729565b60405180910390fd5b600083116107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790612689565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561087557600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000915091506108c2565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166108bd600a6bffffffffffffffffffffffff166064866113f09092919063ffffffff16565b915091505b9250929050565b6108e483838360405180602001604052806000815250610bbe565b505050565b6000806108f5836114cc565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e906127c9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156109e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d890612789565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a30610fa2565b610a3a6000611509565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610a7590612a32565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa190612a32565b8015610aee5780601f10610ac357610100808354040283529160200191610aee565b820191906000526020600020905b815481529060010190602001808311610ad157829003601f168201915b5050505050905090565b610b0a610b03610ee1565b83836115cf565b5050565b610b16610fa2565b6007604051602001610b289190612556565b604051602081830303815290604052805190602001208282604051602001610b5192919061253d565b604051602081830303815290604052805190602001201415610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f906126a9565b60405180910390fd5b818160079190610bb9929190611d13565b505050565b610bcf610bc9610ee1565b83611020565b610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0590612669565b60405180910390fd5b610c1a8484848461173c565b50505050565b6060610c2b826113af565b610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6190612729565b60405180910390fd5b6007610c7583611798565b604051602001610c8692919061256d565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d38610fa2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9f906126e9565b60405180910390fd5b610db181611509565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e7f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e8f5750610e8e82611870565b5b9050919050565b610e9f816113af565b610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed5906127c9565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610f5c836108e9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610faa610ee1565b73ffffffffffffffffffffffffffffffffffffffff16610fc8610a3c565b73ffffffffffffffffffffffffffffffffffffffff161461101e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611015906127a9565b60405180910390fd5b565b60008061102c836108e9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061106e575061106d8185610c9c565b5b806110ac57508373ffffffffffffffffffffffffffffffffffffffff16611094846104c7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166110d5826108e9565b73ffffffffffffffffffffffffffffffffffffffff161461112b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112290612709565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561119b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119290612749565b60405180910390fd5b6111a883838360016118da565b8273ffffffffffffffffffffffffffffffffffffffff166111c8826108e9565b73ffffffffffffffffffffffffffffffffffffffff161461121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590612709565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113aa8383836001611a00565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166113d1836114cc565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60008060008019858709858702925082811083820303915050600081141561142c5783828161142257611421612ac4565b5b04925050506114c5565b80841161143857600080fd5b60008486880990508281118203915080830392506000600186190186169050808604955080840493506001818260000304019050808302841793506000600287600302189050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050505b9392505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590612769565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172f919061262c565b60405180910390a3505050565b6117478484846110b5565b61175384848484611a06565b611792576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611789906126c9565b60405180910390fd5b50505050565b6060600060016117a784611b9d565b01905060008167ffffffffffffffff8111156117c6576117c5612b22565b5b6040519080825280601f01601f1916602001820160405280156117f85781602001600182028036833780820191505090505b509050600082602001820190505b600115611865578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161184f5761184e612ac4565b5b049450600085141561186057611865565b611806565b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60018111156119fa57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461196e5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119669190612948565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146119f95780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119f191906128f2565b925050819055505b5b50505050565b50505050565b6000611a278473ffffffffffffffffffffffffffffffffffffffff16611cf0565b15611b90578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a50610ee1565b8786866040518563ffffffff1660e01b8152600401611a7294939291906125b7565b602060405180830381600087803b158015611a8c57600080fd5b505af1925050508015611abd57506040513d601f19601f82011682018060405250810190611aba91906120d5565b60015b611b40573d8060008114611aed576040519150601f19603f3d011682016040523d82523d6000602084013e611af2565b606091505b50600081511415611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f906126c9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611b95565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611bfb577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611bf157611bf0612ac4565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611c38576d04ee2d6d415b85acef81000000008381611c2e57611c2d612ac4565b5b0492506020810190505b662386f26fc100008310611c6757662386f26fc100008381611c5d57611c5c612ac4565b5b0492506010810190505b6305f5e1008310611c90576305f5e1008381611c8657611c85612ac4565b5b0492506008810190505b6127108310611cb5576127108381611cab57611caa612ac4565b5b0492506004810190505b60648310611cd85760648381611cce57611ccd612ac4565b5b0492506002810190505b600a8310611ce7576001810190505b80915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054611d1f90612a32565b90600052602060002090601f016020900481019282611d415760008555611d88565b82601f10611d5a57803560ff1916838001178555611d88565b82800160010185558215611d88579182015b82811115611d87578235825591602001919060010190611d6c565b5b509050611d959190611d99565b5090565b5b80821115611db2576000816000905550600101611d9a565b5090565b6000611dc9611dc484612869565b612844565b905082815260208101848484011115611de557611de4612b60565b5b611df08482856129f0565b509392505050565b600081359050611e0781612f89565b92915050565b600081359050611e1c81612fa0565b92915050565b600081359050611e3181612fb7565b92915050565b600081519050611e4681612fb7565b92915050565b600082601f830112611e6157611e60612b56565b5b8135611e71848260208601611db6565b91505092915050565b60008083601f840112611e9057611e8f612b56565b5b8235905067ffffffffffffffff811115611ead57611eac612b51565b5b602083019150836001820283011115611ec957611ec8612b5b565b5b9250929050565b600081359050611edf81612fce565b92915050565b600060208284031215611efb57611efa612b6a565b5b6000611f0984828501611df8565b91505092915050565b60008060408385031215611f2957611f28612b6a565b5b6000611f3785828601611df8565b9250506020611f4885828601611df8565b9150509250929050565b600080600060608486031215611f6b57611f6a612b6a565b5b6000611f7986828701611df8565b9350506020611f8a86828701611df8565b9250506040611f9b86828701611ed0565b9150509250925092565b60008060008060808587031215611fbf57611fbe612b6a565b5b6000611fcd87828801611df8565b9450506020611fde87828801611df8565b9350506040611fef87828801611ed0565b925050606085013567ffffffffffffffff8111156120105761200f612b65565b5b61201c87828801611e4c565b91505092959194509250565b6000806040838503121561203f5761203e612b6a565b5b600061204d85828601611df8565b925050602061205e85828601611e0d565b9150509250929050565b6000806040838503121561207f5761207e612b6a565b5b600061208d85828601611df8565b925050602061209e85828601611ed0565b9150509250929050565b6000602082840312156120be576120bd612b6a565b5b60006120cc84828501611e22565b91505092915050565b6000602082840312156120eb576120ea612b6a565b5b60006120f984828501611e37565b91505092915050565b6000806020838503121561211957612118612b6a565b5b600083013567ffffffffffffffff81111561213757612136612b65565b5b61214385828601611e7a565b92509250509250929050565b60006020828403121561216557612164612b6a565b5b600061217384828501611ed0565b91505092915050565b6000806040838503121561219357612192612b6a565b5b60006121a185828601611ed0565b92505060206121b285828601611ed0565b9150509250929050565b6121c58161297c565b82525050565b6121d48161298e565b82525050565b60006121e5826128af565b6121ef81856128c5565b93506121ff8185602086016129ff565b61220881612b6f565b840191505092915050565b600061221f83856128e7565b935061222c8385846129f0565b82840190509392505050565b6000612243826128ba565b61224d81856128d6565b935061225d8185602086016129ff565b61226681612b6f565b840191505092915050565b600061227c826128ba565b61228681856128e7565b93506122968185602086016129ff565b80840191505092915050565b600081546122af81612a32565b6122b981866128e7565b945060018216600081146122d457600181146122e557612318565b60ff19831686528186019350612318565b6122ee8561289a565b60005b83811015612310578154818901526001820191506020810190506122f1565b838801955050505b50505092915050565b600061232e602d836128d6565b915061233982612b80565b604082019050919050565b60006123516035836128d6565b915061235c82612bcf565b604082019050919050565b60006123746035836128d6565b915061237f82612c1e565b604082019050919050565b60006123976032836128d6565b91506123a282612c6d565b604082019050919050565b60006123ba6026836128d6565b91506123c582612cbc565b604082019050919050565b60006123dd6025836128d6565b91506123e882612d0b565b604082019050919050565b60006124006034836128d6565b915061240b82612d5a565b604082019050919050565b60006124236024836128d6565b915061242e82612da9565b604082019050919050565b60006124466019836128d6565b915061245182612df8565b602082019050919050565b60006124696029836128d6565b915061247482612e21565b604082019050919050565b600061248c6005836128e7565b915061249782612e70565b600582019050919050565b60006124af6020836128d6565b91506124ba82612e99565b602082019050919050565b60006124d26018836128d6565b91506124dd82612ec2565b602082019050919050565b60006124f56021836128d6565b915061250082612eeb565b604082019050919050565b6000612518603d836128d6565b915061252382612f3a565b604082019050919050565b612537816129e6565b82525050565b600061254a828486612213565b91508190509392505050565b600061256282846122a2565b915081905092915050565b600061257982856122a2565b91506125858284612271565b91506125908261247f565b91508190509392505050565b60006020820190506125b160008301846121bc565b92915050565b60006080820190506125cc60008301876121bc565b6125d960208301866121bc565b6125e6604083018561252e565b81810360608301526125f881846121da565b905095945050505050565b600060408201905061261860008301856121bc565b612625602083018461252e565b9392505050565b600060208201905061264160008301846121cb565b92915050565b600060208201905081810360008301526126618184612238565b905092915050565b6000602082019050818103600083015261268281612321565b9050919050565b600060208201905081810360008301526126a281612344565b9050919050565b600060208201905081810360008301526126c281612367565b9050919050565b600060208201905081810360008301526126e28161238a565b9050919050565b60006020820190508181036000830152612702816123ad565b9050919050565b60006020820190508181036000830152612722816123d0565b9050919050565b60006020820190508181036000830152612742816123f3565b9050919050565b6000602082019050818103600083015261276281612416565b9050919050565b6000602082019050818103600083015261278281612439565b9050919050565b600060208201905081810360008301526127a28161245c565b9050919050565b600060208201905081810360008301526127c2816124a2565b9050919050565b600060208201905081810360008301526127e2816124c5565b9050919050565b60006020820190508181036000830152612802816124e8565b9050919050565b600060208201905081810360008301526128228161250b565b9050919050565b600060208201905061283e600083018461252e565b92915050565b600061284e61285f565b905061285a8282612a64565b919050565b6000604051905090565b600067ffffffffffffffff82111561288457612883612b22565b5b61288d82612b6f565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006128fd826129e6565b9150612908836129e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561293d5761293c612a95565b5b828201905092915050565b6000612953826129e6565b915061295e836129e6565b92508282101561297157612970612a95565b5b828203905092915050565b6000612987826129c6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612a1d578082015181840152602081019050612a02565b83811115612a2c576000848401525b50505050565b60006002820490506001821680612a4a57607f821691505b60208210811415612a5e57612a5d612af3565b5b50919050565b612a6d82612b6f565b810181811067ffffffffffffffff82111715612a8c57612a8b612b22565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f455243373231476f6c64656e4865617274734c696d69746564546f6b656e3a2060008201527f73616c6550726963652063616e6e6f7420626520300000000000000000000000602082015250565b7f455243373231476f6c64656e4865617274734c696d69746564546f6b656e3a2060008201527f6e65772076616c7565206973207468652073616d650000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231476f6c64656e4865617274734c696d69746564546f6b656e3a2060008201527f746f6b656e20646f6573206e6f74206578697374000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b612f928161297c565b8114612f9d57600080fd5b50565b612fa98161298e565b8114612fb457600080fd5b50565b612fc08161299a565b8114612fcb57600080fd5b50565b612fd7816129e6565b8114612fe257600080fd5b5056fea2646970667358221220f7a9d6aec1362d1c98a59b6f647bf66304099f90160aeea82928476e33e2e60264736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9ee71c587d1d72314bf385bbcb840e440becbf90000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000003768747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f696e666c75766572756d2d6e66742d776f73702f67686c2f000000000000000000

-----Decoded View---------------
Arg [0] : beneficiary (address): 0x0000000000000000000000000000000000000000
Arg [1] : wallet (address): 0xA9eE71C587d1d72314BF385BBCB840E440bECBf9
Arg [2] : metadataUriPrefix (string): https://storage.googleapis.com/influverum-nft-wosp/ghl/
Arg [3] : count (uint96): 31

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 000000000000000000000000a9ee71c587d1d72314bf385bbcb840e440becbf9
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000037
Arg [5] : 68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f69
Arg [6] : 6e666c75766572756d2d6e66742d776f73702f67686c2f000000000000000000


Deployed Bytecode Sourcemap

55476:2907:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58149:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40353:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41865:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41383:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56552:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42565:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57605:472;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;42971:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40063:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39794:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2803:103;;;:::i;:::-;;2155:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40522:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42108:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56855:317;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43227:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57256:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42334:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3061:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58149:231;58251:4;58298:26;58275:49;;;:19;:49;;;;:97;;;;58328:44;58352:19;58328:23;:44::i;:::-;58275:97;58268:104;;58149:231;;;:::o;40353:100::-;40407:13;40440:5;40433:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40353:100;:::o;41865:171::-;41941:7;41961:23;41976:7;41961:14;:23::i;:::-;42004:15;:24;42020:7;42004:24;;;;;;;;;;;;;;;;;;;;;41997:31;;41865:171;;;:::o;41383:416::-;41464:13;41480:23;41495:7;41480:14;:23::i;:::-;41464:39;;41528:5;41522:11;;:2;:11;;;;41514:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;41622:5;41606:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;41631:37;41648:5;41655:12;:10;:12::i;:::-;41631:16;:37::i;:::-;41606:62;41584:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;41770:21;41779:2;41783:7;41770:8;:21::i;:::-;41453:346;41383:416;;:::o;56552:215::-;2041:13;:11;:13::i;:::-;56650:12:::1;;;;;;;;;;;56635:27;;:11;:27;;;;56627:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;56748:11;56733:12;;:26;;;;;;;;;;;;;;;;;;56552:215:::0;:::o;42565:335::-;42760:41;42779:12;:10;:12::i;:::-;42793:7;42760:18;:41::i;:::-;42752:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;42864:28;42874:4;42880:2;42884:7;42864:9;:28::i;:::-;42565:335;;;:::o;57605:472::-;57695:7;57704;57732:19;57740:10;57732:7;:19::i;:::-;57724:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;57839:1;57827:9;:13;57819:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;57939:1;57915:26;;:12;;;;;;;;;;;:26;;;57911:83;;;57966:12;;;;;;;;;;;57980:1;57958:24;;;;;;57911:83;58014:12;;;;;;;;;;;58028:40;55728:2;58028:40;;58064:3;58028:9;:16;;:40;;;;;:::i;:::-;58006:63;;;;57605:472;;;;;;:::o;42971:185::-;43109:39;43126:4;43132:2;43136:7;43109:39;;;;;;;;;;;;:16;:39::i;:::-;42971:185;;;:::o;40063:223::-;40135:7;40155:13;40171:17;40180:7;40171:8;:17::i;:::-;40155:33;;40224:1;40207:19;;:5;:19;;;;40199:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;40273:5;40266:12;;;40063:223;;;:::o;39794:207::-;39866:7;39911:1;39894:19;;:5;:19;;;;39886:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39977:9;:16;39987:5;39977:16;;;;;;;;;;;;;;;;39970:23;;39794:207;;;:::o;2803:103::-;2041:13;:11;:13::i;:::-;2868:30:::1;2895:1;2868:18;:30::i;:::-;2803:103::o:0;2155:87::-;2201:7;2228:6;;;;;;;;;;;2221:13;;2155:87;:::o;40522:104::-;40578:13;40611:7;40604:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40522:104;:::o;42108:155::-;42203:52;42222:12;:10;:12::i;:::-;42236:8;42246;42203:18;:52::i;:::-;42108:155;;:::o;56855:317::-;2041:13;:11;:13::i;:::-;57035:18:::1;57018:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;57008:47;;;;;;56985:17;;56968:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56958:46;;;;;;:97;;56950:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;57147:17;;57126:18;:38;;;;;;;:::i;:::-;;56855:317:::0;;:::o;43227:322::-;43401:41;43420:12;:10;:12::i;:::-;43434:7;43401:18;:41::i;:::-;43393:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;43503:38;43517:4;43523:2;43527:7;43536:4;43503:13;:38::i;:::-;43227:322;;;;:::o;57256:282::-;57324:13;57358:19;57366:10;57358:7;:19::i;:::-;57350:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;57478:18;57498:21;:10;:19;:21::i;:::-;57461:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57447:83;;57256:282;;;:::o;42334:164::-;42431:4;42455:18;:25;42474:5;42455:25;;;;;;;;;;;;;;;:35;42481:8;42455:35;;;;;;;;;;;;;;;;;;;;;;;;;42448:42;;42334:164;;;;:::o;3061:201::-;2041:13;:11;:13::i;:::-;3170:1:::1;3150:22;;:8;:22;;;;3142:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3226:28;3245:8;3226:18;:28::i;:::-;3061:201:::0;:::o;39425:305::-;39527:4;39579:25;39564:40;;;:11;:40;;;;:105;;;;39636:33;39621:48;;;:11;:48;;;;39564:105;:158;;;;39686:36;39710:11;39686:23;:36::i;:::-;39564:158;39544:178;;39425:305;;;:::o;51684:135::-;51766:16;51774:7;51766;:16::i;:::-;51758:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51684:135;:::o;710:98::-;763:7;790:10;783:17;;710:98;:::o;50963:174::-;51065:2;51038:15;:24;51054:7;51038:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51121:7;51117:2;51083:46;;51092:23;51107:7;51092:14;:23::i;:::-;51083:46;;;;;;;;;;;;50963:174;;:::o;2320:132::-;2395:12;:10;:12::i;:::-;2384:23;;:7;:5;:7::i;:::-;:23;;;2376:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2320:132::o;45582:264::-;45675:4;45692:13;45708:23;45723:7;45708:14;:23::i;:::-;45692:39;;45761:5;45750:16;;:7;:16;;;:52;;;;45770:32;45787:5;45794:7;45770:16;:32::i;:::-;45750:52;:87;;;;45830:7;45806:31;;:20;45818:7;45806:11;:20::i;:::-;:31;;;45750:87;45742:96;;;45582:264;;;;:::o;49581:1263::-;49740:4;49713:31;;:23;49728:7;49713:14;:23::i;:::-;:31;;;49705:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;49819:1;49805:16;;:2;:16;;;;49797:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49875:42;49896:4;49902:2;49906:7;49915:1;49875:20;:42::i;:::-;50047:4;50020:31;;:23;50035:7;50020:14;:23::i;:::-;:31;;;50012:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50165:15;:24;50181:7;50165:24;;;;;;;;;;;;50158:31;;;;;;;;;;;50660:1;50641:9;:15;50651:4;50641:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;50693:1;50676:9;:13;50686:2;50676:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;50735:2;50716:7;:16;50724:7;50716:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50774:7;50770:2;50755:27;;50764:4;50755:27;;;;;;;;;;;;50795:41;50815:4;50821:2;50825:7;50834:1;50795:19;:41::i;:::-;49581:1263;;;:::o;45287:128::-;45352:4;45405:1;45376:31;;:17;45385:7;45376:8;:17::i;:::-;:31;;;;45369:38;;45287:128;;;:::o;23560:4005::-;23676:14;24028:13;24101;24228:1;24224:6;24221:1;24218;24211:20;24265:1;24262;24258:9;24249:18;;24321:5;24317:2;24314:13;24306:5;24302:2;24298:14;24294:34;24285:43;;24182:161;24436:1;24427:5;:10;24423:77;;;24473:11;24465:5;:19;;;;;:::i;:::-;;;24458:26;;;;;;24423:77;24627:5;24613:11;:19;24605:28;;;;;;24896:17;25034:11;25031:1;25028;25021:25;25008:38;;25165:5;25154:9;25151:20;25144:5;25140:32;25131:41;;25210:9;25203:5;25199:21;25190:30;;25548:12;25593:1;25579:11;25578:12;:16;25563:11;:32;25548:47;;25718:4;25705:11;25701:22;25686:37;;25813:4;25806:5;25802:16;25793:25;;25973:1;25966:4;25959;25956:1;25952:12;25948:23;25944:31;25936:39;;26076:4;26068:5;:12;26059:21;;;;26403:15;26441:1;26426:11;26422:1;:15;26421:21;26403:39;;26692:7;26678:11;:21;26674:1;:25;26663:36;;;;26762:7;26748:11;:21;26744:1;:25;26733:36;;;;26833:7;26819:11;:21;26815:1;:25;26804:36;;;;26904:7;26890:11;:21;26886:1;:25;26875:36;;;;26975:7;26961:11;:21;26957:1;:25;26946:36;;;;27047:7;27033:11;:21;27029:1;:25;27018:36;;;;27511:7;27503:5;:15;27494:24;;27533:13;;;;;23560:4005;;;;;;:::o;44857:117::-;44923:7;44950;:16;44958:7;44950:16;;;;;;;;;;;;;;;;;;;;;44943:23;;44857:117;;;:::o;3422:191::-;3496:16;3515:6;;;;;;;;;;;3496:25;;3541:8;3532:6;;:17;;;;;;;;;;;;;;;;;;3596:8;3565:40;;3586:8;3565:40;;;;;;;;;;;;3485:128;3422:191;:::o;51280:315::-;51435:8;51426:17;;:5;:17;;;;51418:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51522:8;51484:18;:25;51503:5;51484:25;;;;;;;;;;;;;;;:35;51510:8;51484:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;51568:8;51546:41;;51561:5;51546:41;;;51578:8;51546:41;;;;;;:::i;:::-;;;;;;;;51280:315;;;:::o;44430:313::-;44586:28;44596:4;44602:2;44606:7;44586:9;:28::i;:::-;44633:47;44656:4;44662:2;44666:7;44675:4;44633:22;:47::i;:::-;44625:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;44430:313;;;;:::o;35115:716::-;35171:13;35222:14;35259:1;35239:17;35250:5;35239:10;:17::i;:::-;:21;35222:38;;35275:20;35309:6;35298:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35275:41;;35331:11;35460:6;35456:2;35452:15;35444:6;35440:28;35433:35;;35497:288;35504:4;35497:288;;;35529:5;;;;;;;;35671:8;35666:2;35659:5;35655:14;35650:30;35645:3;35637:44;35727:2;35718:11;;;;;;:::i;:::-;;;;;35761:1;35752:5;:10;35748:21;;;35764:5;;35748:21;35497:288;;;35806:6;35799:13;;;;;35115:716;;;:::o;37870:157::-;37955:4;37994:25;37979:40;;;:11;:40;;;;37972:47;;37870:157;;;:::o;53968:410::-;54158:1;54146:9;:13;54142:229;;;54196:1;54180:18;;:4;:18;;;54176:87;;54238:9;54219;:15;54229:4;54219:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;54176:87;54295:1;54281:16;;:2;:16;;;54277:83;;54335:9;54318;:13;54328:2;54318:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;54277:83;54142:229;53968:410;;;;:::o;55100:158::-;;;;;:::o;52383:853::-;52537:4;52558:15;:2;:13;;;:15::i;:::-;52554:675;;;52610:2;52594:36;;;52631:12;:10;:12::i;:::-;52645:4;52651:7;52660:4;52594:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52590:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52852:1;52835:6;:13;:18;52831:328;;;52878:60;;;;;;;;;;:::i;:::-;;;;;;;;52831:328;53109:6;53103:13;53094:6;53090:2;53086:15;53079:38;52590:584;52726:41;;;52716:51;;;:6;:51;;;;52709:58;;;;;52554:675;53213:4;53206:11;;52383:853;;;;;;;:::o;31985:922::-;32038:7;32058:14;32075:1;32058:18;;32125:6;32116:5;:15;32112:102;;32161:6;32152:15;;;;;;:::i;:::-;;;;;32196:2;32186:12;;;;32112:102;32241:6;32232:5;:15;32228:102;;32277:6;32268:15;;;;;;:::i;:::-;;;;;32312:2;32302:12;;;;32228:102;32357:6;32348:5;:15;32344:102;;32393:6;32384:15;;;;;;:::i;:::-;;;;;32428:2;32418:12;;;;32344:102;32473:5;32464;:14;32460:99;;32508:5;32499:14;;;;;;:::i;:::-;;;;;32542:1;32532:11;;;;32460:99;32586:5;32577;:14;32573:99;;32621:5;32612:14;;;;;;:::i;:::-;;;;;32655:1;32645:11;;;;32573:99;32699:5;32690;:14;32686:99;;32734:5;32725:14;;;;;;:::i;:::-;;;;;32768:1;32758:11;;;;32686:99;32812:5;32803;:14;32799:66;;32848:1;32838:11;;;;32799:66;32893:6;32886:13;;;31985:922;;;:::o;13621:326::-;13681:4;13938:1;13916:7;:19;;;:23;13909:30;;13621:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;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:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:474::-;7041:6;7049;7098:2;7086:9;7077:7;7073:23;7069:32;7066:119;;;7104:79;;:::i;:::-;7066:119;7224:1;7249:53;7294:7;7285:6;7274:9;7270:22;7249:53;:::i;:::-;7239:63;;7195:117;7351:2;7377:53;7422:7;7413:6;7402:9;7398:22;7377:53;:::i;:::-;7367:63;;7322:118;6973:474;;;;;:::o;7453:118::-;7540:24;7558:5;7540:24;:::i;:::-;7535:3;7528:37;7453:118;;:::o;7577:109::-;7658:21;7673:5;7658:21;:::i;:::-;7653:3;7646:34;7577:109;;:::o;7692:360::-;7778:3;7806:38;7838:5;7806:38;:::i;:::-;7860:70;7923:6;7918:3;7860:70;:::i;:::-;7853:77;;7939:52;7984:6;7979:3;7972:4;7965:5;7961:16;7939:52;:::i;:::-;8016:29;8038:6;8016:29;:::i;:::-;8011:3;8007:39;8000:46;;7782:270;7692:360;;;;:::o;8082:317::-;8198:3;8219:89;8301:6;8296:3;8219:89;:::i;:::-;8212:96;;8318:43;8354:6;8349:3;8342:5;8318:43;:::i;:::-;8386:6;8381:3;8377:16;8370:23;;8082:317;;;;;:::o;8405:364::-;8493:3;8521:39;8554:5;8521:39;:::i;:::-;8576:71;8640:6;8635:3;8576:71;:::i;:::-;8569:78;;8656:52;8701:6;8696:3;8689:4;8682:5;8678:16;8656:52;:::i;:::-;8733:29;8755:6;8733:29;:::i;:::-;8728:3;8724:39;8717:46;;8497:272;8405:364;;;;:::o;8775:377::-;8881:3;8909:39;8942:5;8909:39;:::i;:::-;8964:89;9046:6;9041:3;8964:89;:::i;:::-;8957:96;;9062:52;9107:6;9102:3;9095:4;9088:5;9084:16;9062:52;:::i;:::-;9139:6;9134:3;9130:16;9123:23;;8885:267;8775:377;;;;:::o;9182:845::-;9285:3;9322:5;9316:12;9351:36;9377:9;9351:36;:::i;:::-;9403:89;9485:6;9480:3;9403:89;:::i;:::-;9396:96;;9523:1;9512:9;9508:17;9539:1;9534:137;;;;9685:1;9680:341;;;;9501:520;;9534:137;9618:4;9614:9;9603;9599:25;9594:3;9587:38;9654:6;9649:3;9645:16;9638:23;;9534:137;;9680:341;9747:38;9779:5;9747:38;:::i;:::-;9807:1;9821:154;9835:6;9832:1;9829:13;9821:154;;;9909:7;9903:14;9899:1;9894:3;9890:11;9883:35;9959:1;9950:7;9946:15;9935:26;;9857:4;9854:1;9850:12;9845:17;;9821:154;;;10004:6;9999:3;9995:16;9988:23;;9687:334;;9501:520;;9289:738;;9182:845;;;;:::o;10033:366::-;10175:3;10196:67;10260:2;10255:3;10196:67;:::i;:::-;10189:74;;10272:93;10361:3;10272:93;:::i;:::-;10390:2;10385:3;10381:12;10374:19;;10033:366;;;:::o;10405:::-;10547:3;10568:67;10632:2;10627:3;10568:67;:::i;:::-;10561:74;;10644:93;10733:3;10644:93;:::i;:::-;10762:2;10757:3;10753:12;10746:19;;10405:366;;;:::o;10777:::-;10919:3;10940:67;11004:2;10999:3;10940:67;:::i;:::-;10933:74;;11016:93;11105:3;11016:93;:::i;:::-;11134:2;11129:3;11125:12;11118:19;;10777:366;;;:::o;11149:::-;11291:3;11312:67;11376:2;11371:3;11312:67;:::i;:::-;11305:74;;11388:93;11477:3;11388:93;:::i;:::-;11506:2;11501:3;11497:12;11490:19;;11149:366;;;:::o;11521:::-;11663:3;11684:67;11748:2;11743:3;11684:67;:::i;:::-;11677:74;;11760:93;11849:3;11760:93;:::i;:::-;11878:2;11873:3;11869:12;11862:19;;11521:366;;;:::o;11893:::-;12035:3;12056:67;12120:2;12115:3;12056:67;:::i;:::-;12049:74;;12132:93;12221:3;12132:93;:::i;:::-;12250:2;12245:3;12241:12;12234:19;;11893:366;;;:::o;12265:::-;12407:3;12428:67;12492:2;12487:3;12428:67;:::i;:::-;12421:74;;12504:93;12593:3;12504:93;:::i;:::-;12622:2;12617:3;12613:12;12606:19;;12265:366;;;:::o;12637:::-;12779:3;12800:67;12864:2;12859:3;12800:67;:::i;:::-;12793:74;;12876:93;12965:3;12876:93;:::i;:::-;12994:2;12989:3;12985:12;12978:19;;12637:366;;;:::o;13009:::-;13151:3;13172:67;13236:2;13231:3;13172:67;:::i;:::-;13165:74;;13248:93;13337:3;13248:93;:::i;:::-;13366:2;13361:3;13357:12;13350:19;;13009:366;;;:::o;13381:::-;13523:3;13544:67;13608:2;13603:3;13544:67;:::i;:::-;13537:74;;13620:93;13709:3;13620:93;:::i;:::-;13738:2;13733:3;13729:12;13722:19;;13381:366;;;:::o;13753:400::-;13913:3;13934:84;14016:1;14011:3;13934:84;:::i;:::-;13927:91;;14027:93;14116:3;14027:93;:::i;:::-;14145:1;14140:3;14136:11;14129:18;;13753:400;;;:::o;14159:366::-;14301:3;14322:67;14386:2;14381:3;14322:67;:::i;:::-;14315:74;;14398:93;14487:3;14398:93;:::i;:::-;14516:2;14511:3;14507:12;14500:19;;14159:366;;;:::o;14531:::-;14673:3;14694:67;14758:2;14753:3;14694:67;:::i;:::-;14687:74;;14770:93;14859:3;14770:93;:::i;:::-;14888:2;14883:3;14879:12;14872:19;;14531:366;;;:::o;14903:::-;15045:3;15066:67;15130:2;15125:3;15066:67;:::i;:::-;15059:74;;15142:93;15231:3;15142:93;:::i;:::-;15260:2;15255:3;15251:12;15244:19;;14903:366;;;:::o;15275:::-;15417:3;15438:67;15502:2;15497:3;15438:67;:::i;:::-;15431:74;;15514:93;15603:3;15514:93;:::i;:::-;15632:2;15627:3;15623:12;15616:19;;15275:366;;;:::o;15647:118::-;15734:24;15752:5;15734:24;:::i;:::-;15729:3;15722:37;15647:118;;:::o;15771:295::-;15913:3;15935:105;16036:3;16027:6;16019;15935:105;:::i;:::-;15928:112;;16057:3;16050:10;;15771:295;;;;;:::o;16072:269::-;16201:3;16223:92;16311:3;16302:6;16223:92;:::i;:::-;16216:99;;16332:3;16325:10;;16072:269;;;;:::o;16347:695::-;16625:3;16647:92;16735:3;16726:6;16647:92;:::i;:::-;16640:99;;16756:95;16847:3;16838:6;16756:95;:::i;:::-;16749:102;;16868:148;17012:3;16868:148;:::i;:::-;16861:155;;17033:3;17026:10;;16347:695;;;;;:::o;17048:222::-;17141:4;17179:2;17168:9;17164:18;17156:26;;17192:71;17260:1;17249:9;17245:17;17236:6;17192:71;:::i;:::-;17048:222;;;;:::o;17276:640::-;17471:4;17509:3;17498:9;17494:19;17486:27;;17523:71;17591:1;17580:9;17576:17;17567:6;17523:71;:::i;:::-;17604:72;17672:2;17661:9;17657:18;17648:6;17604:72;:::i;:::-;17686;17754:2;17743:9;17739:18;17730:6;17686:72;:::i;:::-;17805:9;17799:4;17795:20;17790:2;17779:9;17775:18;17768:48;17833:76;17904:4;17895:6;17833:76;:::i;:::-;17825:84;;17276:640;;;;;;;:::o;17922:332::-;18043:4;18081:2;18070:9;18066:18;18058:26;;18094:71;18162:1;18151:9;18147:17;18138:6;18094:71;:::i;:::-;18175:72;18243:2;18232:9;18228:18;18219:6;18175:72;:::i;:::-;17922:332;;;;;:::o;18260:210::-;18347:4;18385:2;18374:9;18370:18;18362:26;;18398:65;18460:1;18449:9;18445:17;18436:6;18398:65;:::i;:::-;18260:210;;;;:::o;18476:313::-;18589:4;18627:2;18616:9;18612:18;18604:26;;18676:9;18670:4;18666:20;18662:1;18651:9;18647:17;18640:47;18704:78;18777:4;18768:6;18704:78;:::i;:::-;18696:86;;18476:313;;;;:::o;18795:419::-;18961:4;18999:2;18988:9;18984:18;18976:26;;19048:9;19042:4;19038:20;19034:1;19023:9;19019:17;19012:47;19076:131;19202:4;19076:131;:::i;:::-;19068:139;;18795:419;;;:::o;19220:::-;19386:4;19424:2;19413:9;19409:18;19401:26;;19473:9;19467:4;19463:20;19459:1;19448:9;19444:17;19437:47;19501:131;19627:4;19501:131;:::i;:::-;19493:139;;19220:419;;;:::o;19645:::-;19811:4;19849:2;19838:9;19834:18;19826:26;;19898:9;19892:4;19888:20;19884:1;19873:9;19869:17;19862:47;19926:131;20052:4;19926:131;:::i;:::-;19918:139;;19645:419;;;:::o;20070:::-;20236:4;20274:2;20263:9;20259:18;20251:26;;20323:9;20317:4;20313:20;20309:1;20298:9;20294:17;20287:47;20351:131;20477:4;20351:131;:::i;:::-;20343:139;;20070:419;;;:::o;20495:::-;20661:4;20699:2;20688:9;20684:18;20676:26;;20748:9;20742:4;20738:20;20734:1;20723:9;20719:17;20712:47;20776:131;20902:4;20776:131;:::i;:::-;20768:139;;20495:419;;;:::o;20920:::-;21086:4;21124:2;21113:9;21109:18;21101:26;;21173:9;21167:4;21163:20;21159:1;21148:9;21144:17;21137:47;21201:131;21327:4;21201:131;:::i;:::-;21193:139;;20920:419;;;:::o;21345:::-;21511:4;21549:2;21538:9;21534:18;21526:26;;21598:9;21592:4;21588:20;21584:1;21573:9;21569:17;21562:47;21626:131;21752:4;21626:131;:::i;:::-;21618:139;;21345:419;;;:::o;21770:::-;21936:4;21974:2;21963:9;21959:18;21951:26;;22023:9;22017:4;22013:20;22009:1;21998:9;21994:17;21987:47;22051:131;22177:4;22051:131;:::i;:::-;22043:139;;21770:419;;;:::o;22195:::-;22361:4;22399:2;22388:9;22384:18;22376:26;;22448:9;22442:4;22438:20;22434:1;22423:9;22419:17;22412:47;22476:131;22602:4;22476:131;:::i;:::-;22468:139;;22195:419;;;:::o;22620:::-;22786:4;22824:2;22813:9;22809:18;22801:26;;22873:9;22867:4;22863:20;22859:1;22848:9;22844:17;22837:47;22901:131;23027:4;22901:131;:::i;:::-;22893:139;;22620:419;;;:::o;23045:::-;23211:4;23249:2;23238:9;23234:18;23226:26;;23298:9;23292:4;23288:20;23284:1;23273:9;23269:17;23262:47;23326:131;23452:4;23326:131;:::i;:::-;23318:139;;23045:419;;;:::o;23470:::-;23636:4;23674:2;23663:9;23659:18;23651:26;;23723:9;23717:4;23713:20;23709:1;23698:9;23694:17;23687:47;23751:131;23877:4;23751:131;:::i;:::-;23743:139;;23470:419;;;:::o;23895:::-;24061:4;24099:2;24088:9;24084:18;24076:26;;24148:9;24142:4;24138:20;24134:1;24123:9;24119:17;24112:47;24176:131;24302:4;24176:131;:::i;:::-;24168:139;;23895:419;;;:::o;24320:::-;24486:4;24524:2;24513:9;24509:18;24501:26;;24573:9;24567:4;24563:20;24559:1;24548:9;24544:17;24537:47;24601:131;24727:4;24601:131;:::i;:::-;24593:139;;24320:419;;;:::o;24745:222::-;24838:4;24876:2;24865:9;24861:18;24853:26;;24889:71;24957:1;24946:9;24942:17;24933:6;24889:71;:::i;:::-;24745:222;;;;:::o;24973:129::-;25007:6;25034:20;;:::i;:::-;25024:30;;25063:33;25091:4;25083:6;25063:33;:::i;:::-;24973:129;;;:::o;25108:75::-;25141:6;25174:2;25168:9;25158:19;;25108:75;:::o;25189:307::-;25250:4;25340:18;25332:6;25329:30;25326:56;;;25362:18;;:::i;:::-;25326:56;25400:29;25422:6;25400:29;:::i;:::-;25392:37;;25484:4;25478;25474:15;25466:23;;25189:307;;;:::o;25502:141::-;25551:4;25574:3;25566:11;;25597:3;25594:1;25587:14;25631:4;25628:1;25618:18;25610:26;;25502:141;;;:::o;25649:98::-;25700:6;25734:5;25728:12;25718:22;;25649:98;;;:::o;25753:99::-;25805:6;25839:5;25833:12;25823:22;;25753:99;;;:::o;25858:168::-;25941:11;25975:6;25970:3;25963:19;26015:4;26010:3;26006:14;25991:29;;25858:168;;;;:::o;26032:169::-;26116:11;26150:6;26145:3;26138:19;26190:4;26185:3;26181:14;26166:29;;26032:169;;;;:::o;26207:148::-;26309:11;26346:3;26331:18;;26207:148;;;;:::o;26361:305::-;26401:3;26420:20;26438:1;26420:20;:::i;:::-;26415:25;;26454:20;26472:1;26454:20;:::i;:::-;26449:25;;26608:1;26540:66;26536:74;26533:1;26530:81;26527:107;;;26614:18;;:::i;:::-;26527:107;26658:1;26655;26651:9;26644:16;;26361:305;;;;:::o;26672:191::-;26712:4;26732:20;26750:1;26732:20;:::i;:::-;26727:25;;26766:20;26784:1;26766:20;:::i;:::-;26761:25;;26805:1;26802;26799:8;26796:34;;;26810:18;;:::i;:::-;26796:34;26855:1;26852;26848:9;26840:17;;26672:191;;;;:::o;26869:96::-;26906:7;26935:24;26953:5;26935:24;:::i;:::-;26924:35;;26869:96;;;:::o;26971:90::-;27005:7;27048:5;27041:13;27034:21;27023:32;;26971:90;;;:::o;27067:149::-;27103:7;27143:66;27136:5;27132:78;27121:89;;27067:149;;;:::o;27222:126::-;27259:7;27299:42;27292:5;27288:54;27277:65;;27222:126;;;:::o;27354:77::-;27391:7;27420:5;27409:16;;27354:77;;;:::o;27437:154::-;27521:6;27516:3;27511;27498:30;27583:1;27574:6;27569:3;27565:16;27558:27;27437:154;;;:::o;27597:307::-;27665:1;27675:113;27689:6;27686:1;27683:13;27675:113;;;27774:1;27769:3;27765:11;27759:18;27755:1;27750:3;27746:11;27739:39;27711:2;27708:1;27704:10;27699:15;;27675:113;;;27806:6;27803:1;27800:13;27797:101;;;27886:1;27877:6;27872:3;27868:16;27861:27;27797:101;27646:258;27597:307;;;:::o;27910:320::-;27954:6;27991:1;27985:4;27981:12;27971:22;;28038:1;28032:4;28028:12;28059:18;28049:81;;28115:4;28107:6;28103:17;28093:27;;28049:81;28177:2;28169:6;28166:14;28146:18;28143:38;28140:84;;;28196:18;;:::i;:::-;28140:84;27961:269;27910:320;;;:::o;28236:281::-;28319:27;28341:4;28319:27;:::i;:::-;28311:6;28307:40;28449:6;28437:10;28434:22;28413:18;28401:10;28398:34;28395:62;28392:88;;;28460:18;;:::i;:::-;28392:88;28500:10;28496:2;28489:22;28279:238;28236:281;;:::o;28523:180::-;28571:77;28568:1;28561:88;28668:4;28665:1;28658:15;28692:4;28689:1;28682:15;28709:180;28757:77;28754:1;28747:88;28854:4;28851:1;28844:15;28878:4;28875:1;28868:15;28895:180;28943:77;28940:1;28933:88;29040:4;29037:1;29030:15;29064:4;29061:1;29054:15;29081:180;29129:77;29126:1;29119:88;29226:4;29223:1;29216:15;29250:4;29247:1;29240:15;29267:117;29376:1;29373;29366:12;29390:117;29499:1;29496;29489:12;29513:117;29622:1;29619;29612:12;29636:117;29745:1;29742;29735:12;29759:117;29868:1;29865;29858:12;29882:117;29991:1;29988;29981:12;30005:102;30046:6;30097:2;30093:7;30088:2;30081:5;30077:14;30073:28;30063:38;;30005:102;;;:::o;30113:232::-;30253:34;30249:1;30241:6;30237:14;30230:58;30322:15;30317:2;30309:6;30305:15;30298:40;30113:232;:::o;30351:240::-;30491:34;30487:1;30479:6;30475:14;30468:58;30560:23;30555:2;30547:6;30543:15;30536:48;30351:240;:::o;30597:::-;30737:34;30733:1;30725:6;30721:14;30714:58;30806:23;30801:2;30793:6;30789:15;30782:48;30597:240;:::o;30843:237::-;30983:34;30979:1;30971:6;30967:14;30960:58;31052:20;31047:2;31039:6;31035:15;31028:45;30843:237;:::o;31086:225::-;31226:34;31222:1;31214:6;31210:14;31203:58;31295:8;31290:2;31282:6;31278:15;31271:33;31086:225;:::o;31317:224::-;31457:34;31453:1;31445:6;31441:14;31434:58;31526:7;31521:2;31513:6;31509:15;31502:32;31317:224;:::o;31547:239::-;31687:34;31683:1;31675:6;31671:14;31664:58;31756:22;31751:2;31743:6;31739:15;31732:47;31547:239;:::o;31792:223::-;31932:34;31928:1;31920:6;31916:14;31909:58;32001:6;31996:2;31988:6;31984:15;31977:31;31792:223;:::o;32021:175::-;32161:27;32157:1;32149:6;32145:14;32138:51;32021:175;:::o;32202:228::-;32342:34;32338:1;32330:6;32326:14;32319:58;32411:11;32406:2;32398:6;32394:15;32387:36;32202:228;:::o;32436:155::-;32576:7;32572:1;32564:6;32560:14;32553:31;32436:155;:::o;32597:182::-;32737:34;32733:1;32725:6;32721:14;32714:58;32597:182;:::o;32785:174::-;32925:26;32921:1;32913:6;32909:14;32902:50;32785:174;:::o;32965:220::-;33105:34;33101:1;33093:6;33089:14;33082:58;33174:3;33169:2;33161:6;33157:15;33150:28;32965:220;:::o;33191:248::-;33331:34;33327:1;33319:6;33315:14;33308:58;33400:31;33395:2;33387:6;33383:15;33376:56;33191:248;:::o;33445:122::-;33518:24;33536:5;33518:24;:::i;:::-;33511:5;33508:35;33498:63;;33557:1;33554;33547:12;33498:63;33445:122;:::o;33573:116::-;33643:21;33658:5;33643:21;:::i;:::-;33636:5;33633:32;33623:60;;33679:1;33676;33669:12;33623:60;33573:116;:::o;33695:120::-;33767:23;33784:5;33767:23;:::i;:::-;33760:5;33757:34;33747:62;;33805:1;33802;33795:12;33747:62;33695:120;:::o;33821:122::-;33894:24;33912:5;33894:24;:::i;:::-;33887:5;33884:35;33874:63;;33933:1;33930;33923:12;33874:63;33821:122;:::o

Swarm Source

ipfs://f7a9d6aec1362d1c98a59b6f647bf66304099f90160aeea82928476e33e2e602
Loading...
Loading
[ 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.