ETH Price: $3,302.68 (-0.42%)

Token

Vitalik Rocks (VITALIKROCKS)
 

Overview

Max Total Supply

0 VITALIKROCKS

Holders

134

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
0 VITALIKROCKS
0x42147ee918238fdff257a15fa758944d6b870b6a
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:
Vitaliks

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 2022-03-24
*/

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


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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/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/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.5.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: balance query for the zero address");
        return _balances[owner];
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _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: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

// File: contracts/Vitaliks.sol



pragma solidity >=0.8.0;




contract Vitaliks is ERC721, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    string baseURI;
    string public baseExtension = ".json";
    uint256 public MAX_VITALIKS;
    uint256 public latestNewVitalikForSale;

    struct Vitalik {
        address owner;
        bool currentlyForSale;
        uint price;
        uint timesSold;
    }

    mapping (uint => Vitalik) public vitaliks;
    mapping (address => uint[]) public vitalikOwnersHistory;
    
    mapping (uint256 => address) public idToOwner;
    mapping (uint256 => address) public idToApproval;
    mapping (address => uint256) public ownerToNFTokenCount;
    mapping (address => mapping (address => bool)) public ownerToOperators;

    constructor(string memory name, string memory symbol, string memory initBaseURI, uint256 maxNFTSupply) ERC721(name, symbol) {
        setBaseURI(initBaseURI);
        MAX_VITALIKS = maxNFTSupply;
        latestNewVitalikForSale = 1;
        vitaliks[1].currentlyForSale = true;
        vitaliks[1].price = (10**16)*1;
    }

    // Internal Functions
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function _tokenExists(uint256 tokenId) internal view virtual returns (bool) {
        return idToOwner[tokenId] != address(0);
    }

    modifier canTransfer(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(
            tokenOwner == msg.sender
            || idToApproval[_tokenId] == msg.sender
            || ownerToOperators[tokenOwner][msg.sender]
        );
        _;
    }

    modifier validNFToken(uint256 _tokenId) {
        address tokenOwner = getVitalikOwner(_tokenId);
        require(tokenOwner != address(0));
        _;
    }

    function _addNFToken(address _to, uint256 _tokenId) internal virtual {
        require(idToOwner[_tokenId] == address(0));

        idToOwner[_tokenId] = _to;
        ownerToNFTokenCount[_to]++;
    }

    function _mint(address _to, uint256 _tokenId) internal virtual override {
        require(_to != address(0));
        require(idToOwner[_tokenId] == address(0));

        _addNFToken(_to, _tokenId);

        emit Transfer(address(0), _to, _tokenId);
    }

    function _clearApproval(uint256 _tokenId) private {
        if (idToApproval[_tokenId] != address(0)) {
            delete idToApproval[_tokenId];
        }
    }

    function _removeNFToken(address _from, uint256 _tokenId) internal virtual {
        require(idToOwner[_tokenId] == _from);
        ownerToNFTokenCount[_from] = ownerToNFTokenCount[_from]--;
        delete idToOwner[_tokenId];
    }

    function _transfer(address _to, uint256 _tokenId) internal {
        address from = idToOwner[_tokenId];
        _clearApproval(_tokenId);

        _removeNFToken(from, _tokenId);
        _addNFToken(_to, _tokenId);
        
        vitaliks[_tokenId].owner = _to;

        emit Transfer(from, _to, _tokenId);
    }

    function _safeTransferFrom(address _from, address _to, uint256 _tokenId) private canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = getVitalikOwner(_tokenId);
        require(tokenOwner == _from);
        require(_to != address(0));

        _transfer(_to, _tokenId);
    }

    // Public Functions
    function getVitalikInfo (uint vitalikNumber) public view returns (address, bool, uint, uint) {
        return (vitaliks[vitalikNumber].owner, vitaliks[vitalikNumber].currentlyForSale, vitaliks[vitalikNumber].price, vitaliks[vitalikNumber].timesSold);
    }
    
    function getVitalikOwner (uint vitalikNumber) public view returns (address) {
        return (vitaliks[vitalikNumber].owner);
    }
    
    function getVitalikOwnerHistory (address _address) public view returns (uint[] memory ownersHistory) {
        ownersHistory = vitalikOwnersHistory[_address];
    }

    function buyVitalik (uint vitalikNumber) public payable {
        require(vitaliks[vitalikNumber].currentlyForSale == true);
        require(msg.value == vitaliks[vitalikNumber].price);
        require(vitalikNumber <= MAX_VITALIKS);

        vitaliks[vitalikNumber].timesSold++;
        vitalikOwnersHistory[msg.sender].push(vitalikNumber);
        vitaliks[vitalikNumber].currentlyForSale = false;

        if (vitalikNumber != latestNewVitalikForSale) {
            address currentVitalikOwner = getVitalikOwner(vitalikNumber);
            payable(currentVitalikOwner).transfer(vitaliks[vitalikNumber].price);
            idToApproval[vitalikNumber] = msg.sender;
            _safeTransferFrom(currentVitalikOwner, msg.sender, vitalikNumber);
        } else {
            vitaliks[vitalikNumber].owner = msg.sender;
            
            if (latestNewVitalikForSale < MAX_VITALIKS) {
                latestNewVitalikForSale++;
                vitaliks[latestNewVitalikForSale].price = SafeMath.add(SafeMath.div(SafeMath.mul(SafeMath.mul(vitaliks[vitalikNumber].price, 10**6), 3624), 10**12), vitaliks[vitalikNumber].price);
                vitaliks[latestNewVitalikForSale].currentlyForSale = true;
            }

            _mint(msg.sender, vitalikNumber);
        }
    }

    function sellVitalik (uint vitalikNumber, uint price) public {
        require(msg.sender == vitaliks[vitalikNumber].owner);
        require(price > 0);
        
        vitaliks[vitalikNumber].price = price;
        vitaliks[vitalikNumber].currentlyForSale = true;
    }

    function giftVitalik (uint vitalikNumber, address receiver) public {
        require(msg.sender == vitaliks[vitalikNumber].owner);
        require(receiver != address(0));

        vitalikOwnersHistory[receiver].push(vitalikNumber);
        _safeTransferFrom(msg.sender, receiver, vitalikNumber);
    }
    
    function dontSellVitalik (uint vitalikNumber) public {
        require(msg.sender == vitaliks[vitalikNumber].owner);
        
        vitaliks[vitalikNumber].currentlyForSale = false;
    }
    
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory) {
            require(
                _tokenExists(tokenId),
                "ERC721Metadata: URI query for nonexistent token"
            );

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

    // Owner Functions
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

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

    function checkBalance() public view onlyOwner returns (uint) {
        uint balance = address(this).balance;
        return balance;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"initBaseURI","type":"string"},{"internalType":"uint256","name":"maxNFTSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_VITALIKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vitalikNumber","type":"uint256"}],"name":"buyVitalik","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"checkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vitalikNumber","type":"uint256"}],"name":"dontSellVitalik","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vitalikNumber","type":"uint256"}],"name":"getVitalikInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vitalikNumber","type":"uint256"}],"name":"getVitalikOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getVitalikOwnerHistory","outputs":[{"internalType":"uint256[]","name":"ownersHistory","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vitalikNumber","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"giftVitalik","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToApproval","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToOwner","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":"latestNewVitalikForSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ownerToNFTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"ownerToOperators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vitalikNumber","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"sellVitalik","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","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"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"vitalikOwnersHistory","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vitaliks","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"currentlyForSale","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timesSold","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506008908051906020019062000051929190620002fb565b503480156200005f57600080fd5b5060405162004c5b38038062004c5b833981810160405281019062000085919062000440565b838381600090805190602001906200009f929190620002fb565b508060019080519060200190620000b8929190620002fb565b505050620000db620000cf6200015860201b60201c565b6200016060201b60201c565b620000ec826200022660201b60201c565b806009819055506001600a819055506001600b60006001815260200190815260200160002060000160146101000a81548160ff021916908315150217905550662386f26fc10000600b60006001815260200190815260200160002060010181905550505050506200073a565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002366200015860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200025c620002d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002ac9062000536565b60405180910390fd5b8060079080519060200190620002cd929190620002fb565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003099062000608565b90600052602060002090601f0160209004810192826200032d576000855562000379565b82601f106200034857805160ff191683800117855562000379565b8280016001018555821562000379579182015b82811115620003785782518255916020019190600101906200035b565b5b5090506200038891906200038c565b5090565b5b80821115620003a75760008160009055506001016200038d565b5090565b6000620003c2620003bc8462000581565b62000558565b905082815260208101848484011115620003e157620003e0620006d7565b5b620003ee848285620005d2565b509392505050565b600082601f8301126200040e576200040d620006d2565b5b815162000420848260208601620003ab565b91505092915050565b6000815190506200043a8162000720565b92915050565b600080600080608085870312156200045d576200045c620006e1565b5b600085015167ffffffffffffffff8111156200047e576200047d620006dc565b5b6200048c87828801620003f6565b945050602085015167ffffffffffffffff811115620004b057620004af620006dc565b5b620004be87828801620003f6565b935050604085015167ffffffffffffffff811115620004e257620004e1620006dc565b5b620004f087828801620003f6565b9250506060620005038782880162000429565b91505092959194509250565b60006200051e602083620005b7565b91506200052b82620006f7565b602082019050919050565b6000602082019050818103600083015262000551816200050f565b9050919050565b60006200056462000577565b90506200057282826200063e565b919050565b6000604051905090565b600067ffffffffffffffff8211156200059f576200059e620006a3565b5b620005aa82620006e6565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b83811015620005f2578082015181840152602081019050620005d5565b8381111562000602576000848401525b50505050565b600060028204905060018216806200062157607f821691505b6020821081141562000638576200063762000674565b5b50919050565b6200064982620006e6565b810181811067ffffffffffffffff821117156200066b576200066a620006a3565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200072b81620005c8565b81146200073757600080fd5b50565b614511806200074a6000396000f3fe6080604052600436106102045760003560e01c80638da5cb5b11610118578063c6682862116100a0578063d17124f31161006f578063d17124f3146107d2578063e985e9c5146107fb578063ecd4991914610838578063f2fde38b14610861578063fbbfe9e91461088a57610204565b8063c668286214610714578063c71daccb1461073f578063c87b56dd1461076a578063cf2a17a6146107a757610204565b80639fe2a68b116100e75780639fe2a68b1461060b578063a22cb46514610648578063a90f911c14610671578063b88d4fde146106ae578063bfc206ed146106d757610204565b80638da5cb5b14610538578063940cebe11461056357806395d89b41146105a05780639b1152f4146105cb57610204565b8063494600161161019b5780636352211e1161016a5780636352211e1461044b57806370a0823114610488578063715018a6146104c557806371a0c1b8146104dc57806375f1627d1461051c57610204565b8063494600161461036b57806355c2c2c6146103a857806355f804b3146103e557806359399b601461040e57610204565b8063203dfcaa116101d7578063203dfcaa146102d757806323b872dd146103025780633ccfd60b1461032b57806342842e0e1461034257610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061335a565b6108b3565b60405161023d9190613967565b60405180910390f35b34801561025257600080fd5b5061025b610995565b6040516102689190613982565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906133fd565b610a27565b6040516102a59190613899565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d0919061331a565b610aac565b005b3480156102e357600080fd5b506102ec610bc4565b6040516102f99190613b64565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613204565b610bca565b005b34801561033757600080fd5b50610340610c2a565b005b34801561034e57600080fd5b5061036960048036038101906103649190613204565b610cf5565b005b34801561037757600080fd5b50610392600480360381019061038d91906133fd565b610d15565b60405161039f9190613899565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca919061331a565b610d55565b6040516103dc9190613b64565b60405180910390f35b3480156103f157600080fd5b5061040c600480360381019061040791906133b4565b610d86565b005b34801561041a57600080fd5b50610435600480360381019061043091906131c4565b610e1c565b6040516104429190613967565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d91906133fd565b610e4b565b60405161047f9190613899565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190613197565b610efd565b6040516104bc9190613b64565b60405180910390f35b3480156104d157600080fd5b506104da610fb5565b005b3480156104e857600080fd5b5061050360048036038101906104fe91906133fd565b61103d565b6040516105139493929190613900565b60405180910390f35b610536600480360381019061053191906133fd565b6110db565b005b34801561054457600080fd5b5061054d611407565b60405161055a9190613899565b60405180910390f35b34801561056f57600080fd5b5061058a60048036038101906105859190613197565b611431565b6040516105979190613945565b60405180910390f35b3480156105ac57600080fd5b506105b56114c8565b6040516105c29190613982565b60405180910390f35b3480156105d757600080fd5b506105f260048036038101906105ed91906133fd565b61155a565b6040516106029493929190613900565b60405180910390f35b34801561061757600080fd5b50610632600480360381019061062d91906133fd565b6115b7565b60405161063f9190613899565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a91906132da565b6115ea565b005b34801561067d57600080fd5b5061069860048036038101906106939190613197565b611600565b6040516106a59190613b64565b60405180910390f35b3480156106ba57600080fd5b506106d560048036038101906106d09190613257565b611618565b005b3480156106e357600080fd5b506106fe60048036038101906106f991906133fd565b61167a565b60405161070b9190613899565b60405180910390f35b34801561072057600080fd5b506107296116ad565b6040516107369190613982565b60405180910390f35b34801561074b57600080fd5b5061075461173b565b6040516107619190613b64565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c91906133fd565b6117c5565b60405161079e9190613982565b60405180910390f35b3480156107b357600080fd5b506107bc61186f565b6040516107c99190613b64565b60405180910390f35b3480156107de57600080fd5b506107f960048036038101906107f491906133fd565b611875565b005b34801561080757600080fd5b50610822600480360381019061081d91906131c4565b611915565b60405161082f9190613967565b60405180910390f35b34801561084457600080fd5b5061085f600480360381019061085a919061346a565b6119a9565b005b34801561086d57600080fd5b5061088860048036038101906108839190613197565b611a72565b005b34801561089657600080fd5b506108b160048036038101906108ac919061342a565b611b6a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061098e575061098d82611c87565b5b9050919050565b6060600080546109a490613e8c565b80601f01602080910402602001604051908101604052809291908181526020018280546109d090613e8c565b8015610a1d5780601f106109f257610100808354040283529160200191610a1d565b820191906000526020600020905b815481529060010190602001808311610a0057829003601f168201915b5050505050905090565b6000610a3282611cf1565b610a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6890613ac4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab782610e4b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90613b24565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b47611d5d565b73ffffffffffffffffffffffffffffffffffffffff161480610b765750610b7581610b70611d5d565b611915565b5b610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac90613a64565b60405180910390fd5b610bbf8383611d65565b505050565b600a5481565b610bdb610bd5611d5d565b82611e1e565b610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190613b44565b60405180910390fd5b610c25838383611efc565b505050565b610c32611d5d565b73ffffffffffffffffffffffffffffffffffffffff16610c50611407565b73ffffffffffffffffffffffffffffffffffffffff1614610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90613ae4565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cf1573d6000803e3d6000fd5b5050565b610d1083838360405180602001604052806000815250611618565b505050565b6000600b600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c6020528160005260406000208181548110610d7157600080fd5b90600052602060002001600091509150505481565b610d8e611d5d565b73ffffffffffffffffffffffffffffffffffffffff16610dac611407565b73ffffffffffffffffffffffffffffffffffffffff1614610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df990613ae4565b60405180910390fd5b8060079080519060200190610e18929190612fab565b5050565b60106020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb90613aa4565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6590613a84565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fbd611d5d565b73ffffffffffffffffffffffffffffffffffffffff16610fdb611407565b73ffffffffffffffffffffffffffffffffffffffff1614611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102890613ae4565b60405180910390fd5b61103b6000612163565b565b600080600080600b600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b600087815260200190815260200160002060000160149054906101000a900460ff16600b600088815260200190815260200160002060010154600b60008981526020019081526020016000206002015493509350935093509193509193565b60011515600b600083815260200190815260200160002060000160149054906101000a900460ff1615151461110f57600080fd5b600b600082815260200190815260200160002060010154341461113157600080fd5b60095481111561114057600080fd5b600b6000828152602001908152602001600020600201600081548092919061116790613eef565b9190505550600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556000600b600083815260200190815260200160002060000160146101000a81548160ff021916908315150217905550600a5481146112d757600061121582610d15565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc600b6000858152602001908152602001600020600101549081150290604051600060405180830381858888f19350505050158015611273573d6000803e3d6000fd5b5033600e600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506112d1813384612229565b50611404565b33600b600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600954600a5410156113f957600a600081548092919061134b90613eef565b91905055506113ab61138f61138461137c600b600086815260200190815260200160002060010154620f424061246f565b610e2861246f565b64e8d4a51000612485565b600b60008481526020019081526020016000206001015461249b565b600b6000600a548152602001908152602001600020600101819055506001600b6000600a54815260200190815260200160002060000160146101000a81548160ff0219169083151502179055505b61140333826124b1565b5b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156114bc57602002820191906000526020600020905b8154815260200190600101908083116114a8575b50505050509050919050565b6060600180546114d790613e8c565b80601f016020809104026020016040519081016040528092919081815260200182805461150390613e8c565b80156115505780601f1061152557610100808354040283529160200191611550565b820191906000526020600020905b81548152906001019060200180831161153357829003601f168201915b5050505050905090565b600b6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060010154908060020154905084565b600e6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115fc6115f5611d5d565b83836125c1565b5050565b600f6020528060005260406000206000915090505481565b611629611623611d5d565b83611e1e565b611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f90613b44565b60405180910390fd5b6116748484848461272e565b50505050565b600d6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600880546116ba90613e8c565b80601f01602080910402602001604051908101604052809291908181526020018280546116e690613e8c565b80156117335780601f1061170857610100808354040283529160200191611733565b820191906000526020600020905b81548152906001019060200180831161171657829003601f168201915b505050505081565b6000611745611d5d565b73ffffffffffffffffffffffffffffffffffffffff16611763611407565b73ffffffffffffffffffffffffffffffffffffffff16146117b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b090613ae4565b60405180910390fd5b60004790508091505090565b60606117d08261278a565b61180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180690613b04565b60405180910390fd5b60006118196127f6565b905060008151116118395760405180602001604052806000815250611867565b8061184384612888565b600860405160200161185793929190613868565b6040516020818303038152906040525b915050919050565b60095481565b600b600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118e357600080fd5b6000600b600083815260200190815260200160002060000160146101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a1757600080fd5b60008111611a2457600080fd5b80600b6000848152602001908152602001600020600101819055506001600b600084815260200190815260200160002060000160146101000a81548160ff0219169083151502179055505050565b611a7a611d5d565b73ffffffffffffffffffffffffffffffffffffffff16611a98611407565b73ffffffffffffffffffffffffffffffffffffffff1614611aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae590613ae4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b55906139c4565b60405180910390fd5b611b6781612163565b50565b600b600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bd857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c1257600080fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055611c83338284612229565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dd883610e4b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e2982611cf1565b611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f90613a44565b60405180910390fd5b6000611e7383610e4b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ee257508373ffffffffffffffffffffffffffffffffffffffff16611eca84610a27565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ef35750611ef28185611915565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f1c82610e4b565b73ffffffffffffffffffffffffffffffffffffffff1614611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f69906139e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd990613a04565b60405180910390fd5b611fed8383836129e9565b611ff8600082611d65565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120489190613d78565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461209f9190613c97565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461215e8383836129ee565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806000600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806122fa57503373ffffffffffffffffffffffffffffffffffffffff16600e600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061238b5750601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61239457600080fd5b8260006123a082610d15565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123dc57600080fd5b60006123e786610d15565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461242157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561245b57600080fd5b61246587876129f3565b5050505050505050565b6000818361247d9190613d1e565b905092915050565b600081836124939190613ced565b905092915050565b600081836124a99190613c97565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124eb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461255757600080fd5b6125618282612afd565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262790613a24565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127219190613967565b60405180910390a3505050565b612739848484611efc565b61274584848484612c14565b612784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277b906139a4565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600d600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606007805461280590613e8c565b80601f016020809104026020016040519081016040528092919081815260200182805461283190613e8c565b801561287e5780601f106128535761010080835404028352916020019161287e565b820191906000526020600020905b81548152906001019060200180831161286157829003601f168201915b5050505050905090565b606060008214156128d0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129e4565b600082905060005b600082146129025780806128eb90613eef565b915050600a826128fb9190613ced565b91506128d8565b60008167ffffffffffffffff81111561291e5761291d614025565b5b6040519080825280601f01601f1916602001820160405280156129505781602001600182028036833780820191505090505b5090505b600085146129dd576001826129699190613d78565b9150600a856129789190613f38565b60306129849190613c97565b60f81b81838151811061299a57612999613ff6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129d69190613ced565b9450612954565b8093505050505b919050565b505050565b505050565b6000600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612a3482612dab565b612a3e8183612e4c565b612a488383612afd565b82600b600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b6957600080fd5b81600d600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612c0b90613eef565b91905055505050565b6000612c358473ffffffffffffffffffffffffffffffffffffffff16612f88565b15612d9e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c5e611d5d565b8786866040518563ffffffff1660e01b8152600401612c8094939291906138b4565b602060405180830381600087803b158015612c9a57600080fd5b505af1925050508015612ccb57506040513d601f19601f82011682018060405250810190612cc89190613387565b60015b612d4e573d8060008114612cfb576040519150601f19603f3d011682016040523d82523d6000602084013e612d00565b606091505b50600081511415612d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3d906139a4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612da3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff16600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612e4957600e600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b8173ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612eb757600080fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612f0790613e62565b91905055600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612fb790613e8c565b90600052602060002090601f016020900481019282612fd95760008555613020565b82601f10612ff257805160ff1916838001178555613020565b82800160010185558215613020579182015b8281111561301f578251825591602001919060010190613004565b5b50905061302d9190613031565b5090565b5b8082111561304a576000816000905550600101613032565b5090565b600061306161305c84613ba4565b613b7f565b90508281526020810184848401111561307d5761307c614059565b5b613088848285613e20565b509392505050565b60006130a361309e84613bd5565b613b7f565b9050828152602081018484840111156130bf576130be614059565b5b6130ca848285613e20565b509392505050565b6000813590506130e18161447f565b92915050565b6000813590506130f681614496565b92915050565b60008135905061310b816144ad565b92915050565b600081519050613120816144ad565b92915050565b600082601f83011261313b5761313a614054565b5b813561314b84826020860161304e565b91505092915050565b600082601f83011261316957613168614054565b5b8135613179848260208601613090565b91505092915050565b600081359050613191816144c4565b92915050565b6000602082840312156131ad576131ac614063565b5b60006131bb848285016130d2565b91505092915050565b600080604083850312156131db576131da614063565b5b60006131e9858286016130d2565b92505060206131fa858286016130d2565b9150509250929050565b60008060006060848603121561321d5761321c614063565b5b600061322b868287016130d2565b935050602061323c868287016130d2565b925050604061324d86828701613182565b9150509250925092565b6000806000806080858703121561327157613270614063565b5b600061327f878288016130d2565b9450506020613290878288016130d2565b93505060406132a187828801613182565b925050606085013567ffffffffffffffff8111156132c2576132c161405e565b5b6132ce87828801613126565b91505092959194509250565b600080604083850312156132f1576132f0614063565b5b60006132ff858286016130d2565b9250506020613310858286016130e7565b9150509250929050565b6000806040838503121561333157613330614063565b5b600061333f858286016130d2565b925050602061335085828601613182565b9150509250929050565b6000602082840312156133705761336f614063565b5b600061337e848285016130fc565b91505092915050565b60006020828403121561339d5761339c614063565b5b60006133ab84828501613111565b91505092915050565b6000602082840312156133ca576133c9614063565b5b600082013567ffffffffffffffff8111156133e8576133e761405e565b5b6133f484828501613154565b91505092915050565b60006020828403121561341357613412614063565b5b600061342184828501613182565b91505092915050565b6000806040838503121561344157613440614063565b5b600061344f85828601613182565b9250506020613460858286016130d2565b9150509250929050565b6000806040838503121561348157613480614063565b5b600061348f85828601613182565b92505060206134a085828601613182565b9150509250929050565b60006134b6838361384a565b60208301905092915050565b6134cb81613dac565b82525050565b60006134dc82613c2b565b6134e68185613c59565b93506134f183613c06565b8060005b8381101561352257815161350988826134aa565b975061351483613c4c565b9250506001810190506134f5565b5085935050505092915050565b61353881613dbe565b82525050565b600061354982613c36565b6135538185613c6a565b9350613563818560208601613e2f565b61356c81614068565b840191505092915050565b600061358282613c41565b61358c8185613c7b565b935061359c818560208601613e2f565b6135a581614068565b840191505092915050565b60006135bb82613c41565b6135c58185613c8c565b93506135d5818560208601613e2f565b80840191505092915050565b600081546135ee81613e8c565b6135f88186613c8c565b94506001821660008114613613576001811461362457613657565b60ff19831686528186019350613657565b61362d85613c16565b60005b8381101561364f57815481890152600182019150602081019050613630565b838801955050505b50505092915050565b600061366d603283613c7b565b915061367882614079565b604082019050919050565b6000613690602683613c7b565b915061369b826140c8565b604082019050919050565b60006136b3602583613c7b565b91506136be82614117565b604082019050919050565b60006136d6602483613c7b565b91506136e182614166565b604082019050919050565b60006136f9601983613c7b565b9150613704826141b5565b602082019050919050565b600061371c602c83613c7b565b9150613727826141de565b604082019050919050565b600061373f603883613c7b565b915061374a8261422d565b604082019050919050565b6000613762602a83613c7b565b915061376d8261427c565b604082019050919050565b6000613785602983613c7b565b9150613790826142cb565b604082019050919050565b60006137a8602c83613c7b565b91506137b38261431a565b604082019050919050565b60006137cb602083613c7b565b91506137d682614369565b602082019050919050565b60006137ee602f83613c7b565b91506137f982614392565b604082019050919050565b6000613811602183613c7b565b915061381c826143e1565b604082019050919050565b6000613834603183613c7b565b915061383f82614430565b604082019050919050565b61385381613e16565b82525050565b61386281613e16565b82525050565b600061387482866135b0565b915061388082856135b0565b915061388c82846135e1565b9150819050949350505050565b60006020820190506138ae60008301846134c2565b92915050565b60006080820190506138c960008301876134c2565b6138d660208301866134c2565b6138e36040830185613859565b81810360608301526138f5818461353e565b905095945050505050565b600060808201905061391560008301876134c2565b613922602083018661352f565b61392f6040830185613859565b61393c6060830184613859565b95945050505050565b6000602082019050818103600083015261395f81846134d1565b905092915050565b600060208201905061397c600083018461352f565b92915050565b6000602082019050818103600083015261399c8184613577565b905092915050565b600060208201905081810360008301526139bd81613660565b9050919050565b600060208201905081810360008301526139dd81613683565b9050919050565b600060208201905081810360008301526139fd816136a6565b9050919050565b60006020820190508181036000830152613a1d816136c9565b9050919050565b60006020820190508181036000830152613a3d816136ec565b9050919050565b60006020820190508181036000830152613a5d8161370f565b9050919050565b60006020820190508181036000830152613a7d81613732565b9050919050565b60006020820190508181036000830152613a9d81613755565b9050919050565b60006020820190508181036000830152613abd81613778565b9050919050565b60006020820190508181036000830152613add8161379b565b9050919050565b60006020820190508181036000830152613afd816137be565b9050919050565b60006020820190508181036000830152613b1d816137e1565b9050919050565b60006020820190508181036000830152613b3d81613804565b9050919050565b60006020820190508181036000830152613b5d81613827565b9050919050565b6000602082019050613b796000830184613859565b92915050565b6000613b89613b9a565b9050613b958282613ebe565b919050565b6000604051905090565b600067ffffffffffffffff821115613bbf57613bbe614025565b5b613bc882614068565b9050602081019050919050565b600067ffffffffffffffff821115613bf057613bef614025565b5b613bf982614068565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ca282613e16565b9150613cad83613e16565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ce257613ce1613f69565b5b828201905092915050565b6000613cf882613e16565b9150613d0383613e16565b925082613d1357613d12613f98565b5b828204905092915050565b6000613d2982613e16565b9150613d3483613e16565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d6d57613d6c613f69565b5b828202905092915050565b6000613d8382613e16565b9150613d8e83613e16565b925082821015613da157613da0613f69565b5b828203905092915050565b6000613db782613df6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e4d578082015181840152602081019050613e32565b83811115613e5c576000848401525b50505050565b6000613e6d82613e16565b91506000821415613e8157613e80613f69565b5b600182039050919050565b60006002820490506001821680613ea457607f821691505b60208210811415613eb857613eb7613fc7565b5b50919050565b613ec782614068565b810181811067ffffffffffffffff82111715613ee657613ee5614025565b5b80604052505050565b6000613efa82613e16565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f2d57613f2c613f69565b5b600182019050919050565b6000613f4382613e16565b9150613f4e83613e16565b925082613f5e57613f5d613f98565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61448881613dac565b811461449357600080fd5b50565b61449f81613dbe565b81146144aa57600080fd5b50565b6144b681613dca565b81146144c157600080fd5b50565b6144cd81613e16565b81146144d857600080fd5b5056fea2646970667358221220ac38e718d435af2fea96cb3f54791fefb2c987ca013ceba85edd7693333b5fa964736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000d566974616c696b20526f636b7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c564954414c494b524f434b5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5876317158685261516f4662625651696652535569424d69455a785664557a557044534676757a42414b616d2f00000000000000000000

Deployed Bytecode

0x6080604052600436106102045760003560e01c80638da5cb5b11610118578063c6682862116100a0578063d17124f31161006f578063d17124f3146107d2578063e985e9c5146107fb578063ecd4991914610838578063f2fde38b14610861578063fbbfe9e91461088a57610204565b8063c668286214610714578063c71daccb1461073f578063c87b56dd1461076a578063cf2a17a6146107a757610204565b80639fe2a68b116100e75780639fe2a68b1461060b578063a22cb46514610648578063a90f911c14610671578063b88d4fde146106ae578063bfc206ed146106d757610204565b80638da5cb5b14610538578063940cebe11461056357806395d89b41146105a05780639b1152f4146105cb57610204565b8063494600161161019b5780636352211e1161016a5780636352211e1461044b57806370a0823114610488578063715018a6146104c557806371a0c1b8146104dc57806375f1627d1461051c57610204565b8063494600161461036b57806355c2c2c6146103a857806355f804b3146103e557806359399b601461040e57610204565b8063203dfcaa116101d7578063203dfcaa146102d757806323b872dd146103025780633ccfd60b1461032b57806342842e0e1461034257610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061335a565b6108b3565b60405161023d9190613967565b60405180910390f35b34801561025257600080fd5b5061025b610995565b6040516102689190613982565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906133fd565b610a27565b6040516102a59190613899565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d0919061331a565b610aac565b005b3480156102e357600080fd5b506102ec610bc4565b6040516102f99190613b64565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613204565b610bca565b005b34801561033757600080fd5b50610340610c2a565b005b34801561034e57600080fd5b5061036960048036038101906103649190613204565b610cf5565b005b34801561037757600080fd5b50610392600480360381019061038d91906133fd565b610d15565b60405161039f9190613899565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca919061331a565b610d55565b6040516103dc9190613b64565b60405180910390f35b3480156103f157600080fd5b5061040c600480360381019061040791906133b4565b610d86565b005b34801561041a57600080fd5b50610435600480360381019061043091906131c4565b610e1c565b6040516104429190613967565b60405180910390f35b34801561045757600080fd5b50610472600480360381019061046d91906133fd565b610e4b565b60405161047f9190613899565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190613197565b610efd565b6040516104bc9190613b64565b60405180910390f35b3480156104d157600080fd5b506104da610fb5565b005b3480156104e857600080fd5b5061050360048036038101906104fe91906133fd565b61103d565b6040516105139493929190613900565b60405180910390f35b610536600480360381019061053191906133fd565b6110db565b005b34801561054457600080fd5b5061054d611407565b60405161055a9190613899565b60405180910390f35b34801561056f57600080fd5b5061058a60048036038101906105859190613197565b611431565b6040516105979190613945565b60405180910390f35b3480156105ac57600080fd5b506105b56114c8565b6040516105c29190613982565b60405180910390f35b3480156105d757600080fd5b506105f260048036038101906105ed91906133fd565b61155a565b6040516106029493929190613900565b60405180910390f35b34801561061757600080fd5b50610632600480360381019061062d91906133fd565b6115b7565b60405161063f9190613899565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a91906132da565b6115ea565b005b34801561067d57600080fd5b5061069860048036038101906106939190613197565b611600565b6040516106a59190613b64565b60405180910390f35b3480156106ba57600080fd5b506106d560048036038101906106d09190613257565b611618565b005b3480156106e357600080fd5b506106fe60048036038101906106f991906133fd565b61167a565b60405161070b9190613899565b60405180910390f35b34801561072057600080fd5b506107296116ad565b6040516107369190613982565b60405180910390f35b34801561074b57600080fd5b5061075461173b565b6040516107619190613b64565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c91906133fd565b6117c5565b60405161079e9190613982565b60405180910390f35b3480156107b357600080fd5b506107bc61186f565b6040516107c99190613b64565b60405180910390f35b3480156107de57600080fd5b506107f960048036038101906107f491906133fd565b611875565b005b34801561080757600080fd5b50610822600480360381019061081d91906131c4565b611915565b60405161082f9190613967565b60405180910390f35b34801561084457600080fd5b5061085f600480360381019061085a919061346a565b6119a9565b005b34801561086d57600080fd5b5061088860048036038101906108839190613197565b611a72565b005b34801561089657600080fd5b506108b160048036038101906108ac919061342a565b611b6a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061098e575061098d82611c87565b5b9050919050565b6060600080546109a490613e8c565b80601f01602080910402602001604051908101604052809291908181526020018280546109d090613e8c565b8015610a1d5780601f106109f257610100808354040283529160200191610a1d565b820191906000526020600020905b815481529060010190602001808311610a0057829003601f168201915b5050505050905090565b6000610a3282611cf1565b610a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6890613ac4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab782610e4b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90613b24565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b47611d5d565b73ffffffffffffffffffffffffffffffffffffffff161480610b765750610b7581610b70611d5d565b611915565b5b610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac90613a64565b60405180910390fd5b610bbf8383611d65565b505050565b600a5481565b610bdb610bd5611d5d565b82611e1e565b610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190613b44565b60405180910390fd5b610c25838383611efc565b505050565b610c32611d5d565b73ffffffffffffffffffffffffffffffffffffffff16610c50611407565b73ffffffffffffffffffffffffffffffffffffffff1614610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90613ae4565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cf1573d6000803e3d6000fd5b5050565b610d1083838360405180602001604052806000815250611618565b505050565b6000600b600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c6020528160005260406000208181548110610d7157600080fd5b90600052602060002001600091509150505481565b610d8e611d5d565b73ffffffffffffffffffffffffffffffffffffffff16610dac611407565b73ffffffffffffffffffffffffffffffffffffffff1614610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df990613ae4565b60405180910390fd5b8060079080519060200190610e18929190612fab565b5050565b60106020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb90613aa4565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6590613a84565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fbd611d5d565b73ffffffffffffffffffffffffffffffffffffffff16610fdb611407565b73ffffffffffffffffffffffffffffffffffffffff1614611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102890613ae4565b60405180910390fd5b61103b6000612163565b565b600080600080600b600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b600087815260200190815260200160002060000160149054906101000a900460ff16600b600088815260200190815260200160002060010154600b60008981526020019081526020016000206002015493509350935093509193509193565b60011515600b600083815260200190815260200160002060000160149054906101000a900460ff1615151461110f57600080fd5b600b600082815260200190815260200160002060010154341461113157600080fd5b60095481111561114057600080fd5b600b6000828152602001908152602001600020600201600081548092919061116790613eef565b9190505550600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556000600b600083815260200190815260200160002060000160146101000a81548160ff021916908315150217905550600a5481146112d757600061121582610d15565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc600b6000858152602001908152602001600020600101549081150290604051600060405180830381858888f19350505050158015611273573d6000803e3d6000fd5b5033600e600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506112d1813384612229565b50611404565b33600b600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600954600a5410156113f957600a600081548092919061134b90613eef565b91905055506113ab61138f61138461137c600b600086815260200190815260200160002060010154620f424061246f565b610e2861246f565b64e8d4a51000612485565b600b60008481526020019081526020016000206001015461249b565b600b6000600a548152602001908152602001600020600101819055506001600b6000600a54815260200190815260200160002060000160146101000a81548160ff0219169083151502179055505b61140333826124b1565b5b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156114bc57602002820191906000526020600020905b8154815260200190600101908083116114a8575b50505050509050919050565b6060600180546114d790613e8c565b80601f016020809104026020016040519081016040528092919081815260200182805461150390613e8c565b80156115505780601f1061152557610100808354040283529160200191611550565b820191906000526020600020905b81548152906001019060200180831161153357829003601f168201915b5050505050905090565b600b6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff16908060010154908060020154905084565b600e6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115fc6115f5611d5d565b83836125c1565b5050565b600f6020528060005260406000206000915090505481565b611629611623611d5d565b83611e1e565b611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f90613b44565b60405180910390fd5b6116748484848461272e565b50505050565b600d6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600880546116ba90613e8c565b80601f01602080910402602001604051908101604052809291908181526020018280546116e690613e8c565b80156117335780601f1061170857610100808354040283529160200191611733565b820191906000526020600020905b81548152906001019060200180831161171657829003601f168201915b505050505081565b6000611745611d5d565b73ffffffffffffffffffffffffffffffffffffffff16611763611407565b73ffffffffffffffffffffffffffffffffffffffff16146117b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b090613ae4565b60405180910390fd5b60004790508091505090565b60606117d08261278a565b61180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180690613b04565b60405180910390fd5b60006118196127f6565b905060008151116118395760405180602001604052806000815250611867565b8061184384612888565b600860405160200161185793929190613868565b6040516020818303038152906040525b915050919050565b60095481565b600b600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118e357600080fd5b6000600b600083815260200190815260200160002060000160146101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a1757600080fd5b60008111611a2457600080fd5b80600b6000848152602001908152602001600020600101819055506001600b600084815260200190815260200160002060000160146101000a81548160ff0219169083151502179055505050565b611a7a611d5d565b73ffffffffffffffffffffffffffffffffffffffff16611a98611407565b73ffffffffffffffffffffffffffffffffffffffff1614611aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae590613ae4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b55906139c4565b60405180910390fd5b611b6781612163565b50565b600b600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bd857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c1257600080fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055611c83338284612229565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dd883610e4b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e2982611cf1565b611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f90613a44565b60405180910390fd5b6000611e7383610e4b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ee257508373ffffffffffffffffffffffffffffffffffffffff16611eca84610a27565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ef35750611ef28185611915565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f1c82610e4b565b73ffffffffffffffffffffffffffffffffffffffff1614611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f69906139e4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd990613a04565b60405180910390fd5b611fed8383836129e9565b611ff8600082611d65565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120489190613d78565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461209f9190613c97565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461215e8383836129ee565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806000600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806122fa57503373ffffffffffffffffffffffffffffffffffffffff16600e600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061238b5750601060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61239457600080fd5b8260006123a082610d15565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123dc57600080fd5b60006123e786610d15565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461242157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16141561245b57600080fd5b61246587876129f3565b5050505050505050565b6000818361247d9190613d1e565b905092915050565b600081836124939190613ced565b905092915050565b600081836124a99190613c97565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124eb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461255757600080fd5b6125618282612afd565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262790613a24565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127219190613967565b60405180910390a3505050565b612739848484611efc565b61274584848484612c14565b612784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277b906139a4565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600d600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606007805461280590613e8c565b80601f016020809104026020016040519081016040528092919081815260200182805461283190613e8c565b801561287e5780601f106128535761010080835404028352916020019161287e565b820191906000526020600020905b81548152906001019060200180831161286157829003601f168201915b5050505050905090565b606060008214156128d0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129e4565b600082905060005b600082146129025780806128eb90613eef565b915050600a826128fb9190613ced565b91506128d8565b60008167ffffffffffffffff81111561291e5761291d614025565b5b6040519080825280601f01601f1916602001820160405280156129505781602001600182028036833780820191505090505b5090505b600085146129dd576001826129699190613d78565b9150600a856129789190613f38565b60306129849190613c97565b60f81b81838151811061299a57612999613ff6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129d69190613ced565b9450612954565b8093505050505b919050565b505050565b505050565b6000600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612a3482612dab565b612a3e8183612e4c565b612a488383612afd565b82600b600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b6957600080fd5b81600d600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612c0b90613eef565b91905055505050565b6000612c358473ffffffffffffffffffffffffffffffffffffffff16612f88565b15612d9e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c5e611d5d565b8786866040518563ffffffff1660e01b8152600401612c8094939291906138b4565b602060405180830381600087803b158015612c9a57600080fd5b505af1925050508015612ccb57506040513d601f19601f82011682018060405250810190612cc89190613387565b60015b612d4e573d8060008114612cfb576040519150601f19603f3d011682016040523d82523d6000602084013e612d00565b606091505b50600081511415612d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3d906139a4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612da3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff16600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612e4957600e600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b8173ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612eb757600080fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612f0790613e62565b91905055600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612fb790613e8c565b90600052602060002090601f016020900481019282612fd95760008555613020565b82601f10612ff257805160ff1916838001178555613020565b82800160010185558215613020579182015b8281111561301f578251825591602001919060010190613004565b5b50905061302d9190613031565b5090565b5b8082111561304a576000816000905550600101613032565b5090565b600061306161305c84613ba4565b613b7f565b90508281526020810184848401111561307d5761307c614059565b5b613088848285613e20565b509392505050565b60006130a361309e84613bd5565b613b7f565b9050828152602081018484840111156130bf576130be614059565b5b6130ca848285613e20565b509392505050565b6000813590506130e18161447f565b92915050565b6000813590506130f681614496565b92915050565b60008135905061310b816144ad565b92915050565b600081519050613120816144ad565b92915050565b600082601f83011261313b5761313a614054565b5b813561314b84826020860161304e565b91505092915050565b600082601f83011261316957613168614054565b5b8135613179848260208601613090565b91505092915050565b600081359050613191816144c4565b92915050565b6000602082840312156131ad576131ac614063565b5b60006131bb848285016130d2565b91505092915050565b600080604083850312156131db576131da614063565b5b60006131e9858286016130d2565b92505060206131fa858286016130d2565b9150509250929050565b60008060006060848603121561321d5761321c614063565b5b600061322b868287016130d2565b935050602061323c868287016130d2565b925050604061324d86828701613182565b9150509250925092565b6000806000806080858703121561327157613270614063565b5b600061327f878288016130d2565b9450506020613290878288016130d2565b93505060406132a187828801613182565b925050606085013567ffffffffffffffff8111156132c2576132c161405e565b5b6132ce87828801613126565b91505092959194509250565b600080604083850312156132f1576132f0614063565b5b60006132ff858286016130d2565b9250506020613310858286016130e7565b9150509250929050565b6000806040838503121561333157613330614063565b5b600061333f858286016130d2565b925050602061335085828601613182565b9150509250929050565b6000602082840312156133705761336f614063565b5b600061337e848285016130fc565b91505092915050565b60006020828403121561339d5761339c614063565b5b60006133ab84828501613111565b91505092915050565b6000602082840312156133ca576133c9614063565b5b600082013567ffffffffffffffff8111156133e8576133e761405e565b5b6133f484828501613154565b91505092915050565b60006020828403121561341357613412614063565b5b600061342184828501613182565b91505092915050565b6000806040838503121561344157613440614063565b5b600061344f85828601613182565b9250506020613460858286016130d2565b9150509250929050565b6000806040838503121561348157613480614063565b5b600061348f85828601613182565b92505060206134a085828601613182565b9150509250929050565b60006134b6838361384a565b60208301905092915050565b6134cb81613dac565b82525050565b60006134dc82613c2b565b6134e68185613c59565b93506134f183613c06565b8060005b8381101561352257815161350988826134aa565b975061351483613c4c565b9250506001810190506134f5565b5085935050505092915050565b61353881613dbe565b82525050565b600061354982613c36565b6135538185613c6a565b9350613563818560208601613e2f565b61356c81614068565b840191505092915050565b600061358282613c41565b61358c8185613c7b565b935061359c818560208601613e2f565b6135a581614068565b840191505092915050565b60006135bb82613c41565b6135c58185613c8c565b93506135d5818560208601613e2f565b80840191505092915050565b600081546135ee81613e8c565b6135f88186613c8c565b94506001821660008114613613576001811461362457613657565b60ff19831686528186019350613657565b61362d85613c16565b60005b8381101561364f57815481890152600182019150602081019050613630565b838801955050505b50505092915050565b600061366d603283613c7b565b915061367882614079565b604082019050919050565b6000613690602683613c7b565b915061369b826140c8565b604082019050919050565b60006136b3602583613c7b565b91506136be82614117565b604082019050919050565b60006136d6602483613c7b565b91506136e182614166565b604082019050919050565b60006136f9601983613c7b565b9150613704826141b5565b602082019050919050565b600061371c602c83613c7b565b9150613727826141de565b604082019050919050565b600061373f603883613c7b565b915061374a8261422d565b604082019050919050565b6000613762602a83613c7b565b915061376d8261427c565b604082019050919050565b6000613785602983613c7b565b9150613790826142cb565b604082019050919050565b60006137a8602c83613c7b565b91506137b38261431a565b604082019050919050565b60006137cb602083613c7b565b91506137d682614369565b602082019050919050565b60006137ee602f83613c7b565b91506137f982614392565b604082019050919050565b6000613811602183613c7b565b915061381c826143e1565b604082019050919050565b6000613834603183613c7b565b915061383f82614430565b604082019050919050565b61385381613e16565b82525050565b61386281613e16565b82525050565b600061387482866135b0565b915061388082856135b0565b915061388c82846135e1565b9150819050949350505050565b60006020820190506138ae60008301846134c2565b92915050565b60006080820190506138c960008301876134c2565b6138d660208301866134c2565b6138e36040830185613859565b81810360608301526138f5818461353e565b905095945050505050565b600060808201905061391560008301876134c2565b613922602083018661352f565b61392f6040830185613859565b61393c6060830184613859565b95945050505050565b6000602082019050818103600083015261395f81846134d1565b905092915050565b600060208201905061397c600083018461352f565b92915050565b6000602082019050818103600083015261399c8184613577565b905092915050565b600060208201905081810360008301526139bd81613660565b9050919050565b600060208201905081810360008301526139dd81613683565b9050919050565b600060208201905081810360008301526139fd816136a6565b9050919050565b60006020820190508181036000830152613a1d816136c9565b9050919050565b60006020820190508181036000830152613a3d816136ec565b9050919050565b60006020820190508181036000830152613a5d8161370f565b9050919050565b60006020820190508181036000830152613a7d81613732565b9050919050565b60006020820190508181036000830152613a9d81613755565b9050919050565b60006020820190508181036000830152613abd81613778565b9050919050565b60006020820190508181036000830152613add8161379b565b9050919050565b60006020820190508181036000830152613afd816137be565b9050919050565b60006020820190508181036000830152613b1d816137e1565b9050919050565b60006020820190508181036000830152613b3d81613804565b9050919050565b60006020820190508181036000830152613b5d81613827565b9050919050565b6000602082019050613b796000830184613859565b92915050565b6000613b89613b9a565b9050613b958282613ebe565b919050565b6000604051905090565b600067ffffffffffffffff821115613bbf57613bbe614025565b5b613bc882614068565b9050602081019050919050565b600067ffffffffffffffff821115613bf057613bef614025565b5b613bf982614068565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ca282613e16565b9150613cad83613e16565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ce257613ce1613f69565b5b828201905092915050565b6000613cf882613e16565b9150613d0383613e16565b925082613d1357613d12613f98565b5b828204905092915050565b6000613d2982613e16565b9150613d3483613e16565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d6d57613d6c613f69565b5b828202905092915050565b6000613d8382613e16565b9150613d8e83613e16565b925082821015613da157613da0613f69565b5b828203905092915050565b6000613db782613df6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e4d578082015181840152602081019050613e32565b83811115613e5c576000848401525b50505050565b6000613e6d82613e16565b91506000821415613e8157613e80613f69565b5b600182039050919050565b60006002820490506001821680613ea457607f821691505b60208210811415613eb857613eb7613fc7565b5b50919050565b613ec782614068565b810181811067ffffffffffffffff82111715613ee657613ee5614025565b5b80604052505050565b6000613efa82613e16565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f2d57613f2c613f69565b5b600182019050919050565b6000613f4382613e16565b9150613f4e83613e16565b925082613f5e57613f5d613f98565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b61448881613dac565b811461449357600080fd5b50565b61449f81613dbe565b81146144aa57600080fd5b50565b6144b681613dca565b81146144c157600080fd5b50565b6144cd81613e16565b81146144d857600080fd5b5056fea2646970667358221220ac38e718d435af2fea96cb3f54791fefb2c987ca013ceba85edd7693333b5fa964736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000d566974616c696b20526f636b7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c564954414c494b524f434b5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5876317158685261516f4662625651696652535569424d69455a785664557a557044534676757a42414b616d2f00000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Vitalik Rocks
Arg [1] : symbol (string): VITALIKROCKS
Arg [2] : initBaseURI (string): ipfs://QmXv1qXhRaQoFbbVQifRSUiBMiEZxVdUzUpDSFvuzBAKam/
Arg [3] : maxNFTSupply (uint256): 1000

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [5] : 566974616c696b20526f636b7300000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [7] : 564954414c494b524f434b530000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d5876317158685261516f4662625651696652535569424d
Arg [10] : 69455a785664557a557044534676757a42414b616d2f00000000000000000000


Deployed Bytecode Sourcemap

44323:7079:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28606:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29551:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31110:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30633:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44533:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31860:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51110:140;;;;;;;;;;;;;:::i;:::-;;32270:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48004:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44761:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50998:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44998:70;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29245:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28975:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43433:103;;;;;;;;;;;;;:::i;:::-;;47734:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;48323:1306;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42782:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48149:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29720:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44713:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;44881:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31403:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44936:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32526:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44829:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44455:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51258:141;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50447:519;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44499:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50242:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31629:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49637:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43691:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49922:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28606:305;28708:4;28760:25;28745:40;;;:11;:40;;;;:105;;;;28817:33;28802:48;;;:11;:48;;;;28745:105;:158;;;;28867:36;28891:11;28867:23;:36::i;:::-;28745:158;28725:178;;28606:305;;;:::o;29551:100::-;29605:13;29638:5;29631:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29551:100;:::o;31110:221::-;31186:7;31214:16;31222:7;31214;:16::i;:::-;31206:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31299:15;:24;31315:7;31299:24;;;;;;;;;;;;;;;;;;;;;31292:31;;31110:221;;;:::o;30633:411::-;30714:13;30730:23;30745:7;30730:14;:23::i;:::-;30714:39;;30778:5;30772:11;;:2;:11;;;;30764:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30872:5;30856:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30881:37;30898:5;30905:12;:10;:12::i;:::-;30881:16;:37::i;:::-;30856:62;30834:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31015:21;31024:2;31028:7;31015:8;:21::i;:::-;30703:341;30633:411;;:::o;44533:38::-;;;;:::o;31860:339::-;32055:41;32074:12;:10;:12::i;:::-;32088:7;32055:18;:41::i;:::-;32047:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32163:28;32173:4;32179:2;32183:7;32163:9;:28::i;:::-;31860:339;;;:::o;51110:140::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51158:12:::1;51173:21;51158:36;;51213:10;51205:28;;:37;51234:7;51205:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51147:103;51110:140::o:0;32270:185::-;32408:39;32425:4;32431:2;32435:7;32408:39;;;;;;;;;;;;:16;:39::i;:::-;32270:185;;;:::o;48004:133::-;48071:7;48099:8;:23;48108:13;48099:23;;;;;;;;;;;:29;;;;;;;;;;;;48091:38;;48004:133;;;:::o;44761:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50998:104::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51083:11:::1;51073:7;:21;;;;;;;;;;;;:::i;:::-;;50998:104:::0;:::o;44998:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29245:239::-;29317:7;29337:13;29353:7;:16;29361:7;29353:16;;;;;;;;;;;;;;;;;;;;;29337:32;;29405:1;29388:19;;:5;:19;;;;29380:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29471:5;29464:12;;;29245:239;;;:::o;28975:208::-;29047:7;29092:1;29075:19;;:5;:19;;;;29067:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29159:9;:16;29169:5;29159:16;;;;;;;;;;;;;;;;29152:23;;28975:208;;;:::o;43433:103::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43498:30:::1;43525:1;43498:18;:30::i;:::-;43433:103::o:0;47734:258::-;47800:7;47809:4;47815;47821;47846:8;:23;47855:13;47846:23;;;;;;;;;;;:29;;;;;;;;;;;;47877:8;:23;47886:13;47877:23;;;;;;;;;;;:40;;;;;;;;;;;;47919:8;:23;47928:13;47919:23;;;;;;;;;;;:29;;;47950:8;:23;47959:13;47950:23;;;;;;;;;;;:33;;;47838:146;;;;;;;;47734:258;;;;;:::o;48323:1306::-;48442:4;48398:48;;:8;:23;48407:13;48398:23;;;;;;;;;;;:40;;;;;;;;;;;;:48;;;48390:57;;;;;;48479:8;:23;48488:13;48479:23;;;;;;;;;;;:29;;;48466:9;:42;48458:51;;;;;;48545:12;;48528:13;:29;;48520:38;;;;;;48571:8;:23;48580:13;48571:23;;;;;;;;;;;:33;;;:35;;;;;;;;;:::i;:::-;;;;;;48617:20;:32;48638:10;48617:32;;;;;;;;;;;;;;;48655:13;48617:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48723:5;48680:8;:23;48689:13;48680:23;;;;;;;;;;;:40;;;:48;;;;;;;;;;;;;;;;;;48762:23;;48745:13;:40;48741:881;;48802:27;48832:30;48848:13;48832:15;:30::i;:::-;48802:60;;48885:19;48877:37;;:68;48915:8;:23;48924:13;48915:23;;;;;;;;;;;:29;;;48877:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48990:10;48960:12;:27;48973:13;48960:27;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;49015:65;49033:19;49054:10;49066:13;49015:17;:65::i;:::-;48787:305;48741:881;;;49145:10;49113:8;:23;49122:13;49113:23;;;;;;;;;;;:29;;;:42;;;;;;;;;;;;;;;;;;49214:12;;49188:23;;:38;49184:378;;;49247:23;;:25;;;;;;;;;:::i;:::-;;;;;;49333:137;49346:92;49359:70;49372:50;49385:8;:23;49394:13;49385:23;;;;;;;;;;;:29;;;49416:5;49372:12;:50::i;:::-;49424:4;49359:12;:70::i;:::-;49431:6;49346:12;:92::i;:::-;49440:8;:23;49449:13;49440:23;;;;;;;;;;;:29;;;49333:12;:137::i;:::-;49291:8;:33;49300:23;;49291:33;;;;;;;;;;;:39;;:179;;;;49542:4;49489:8;:33;49498:23;;49489:33;;;;;;;;;;;:50;;;:57;;;;;;;;;;;;;;;;;;49184:378;49578:32;49584:10;49596:13;49578:5;:32::i;:::-;48741:881;48323:1306;:::o;42782:87::-;42828:7;42855:6;;;;;;;;;;;42848:13;;42782:87;:::o;48149:166::-;48221:27;48277:20;:30;48298:8;48277:30;;;;;;;;;;;;;;;48261:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48149:166;;;:::o;29720:104::-;29776:13;29809:7;29802:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29720:104;:::o;44713:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44881:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;31403:155::-;31498:52;31517:12;:10;:12::i;:::-;31531:8;31541;31498:18;:52::i;:::-;31403:155;;:::o;44936:55::-;;;;;;;;;;;;;;;;;:::o;32526:328::-;32701:41;32720:12;:10;:12::i;:::-;32734:7;32701:18;:41::i;:::-;32693:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32807:39;32821:4;32827:2;32831:7;32840:5;32807:13;:39::i;:::-;32526:328;;;;:::o;44829:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;44455:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51258:141::-;51313:4;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51330:12:::1;51345:21;51330:36;;51384:7;51377:14;;;51258:141:::0;:::o;50447:519::-;50565:13;50621:21;50634:7;50621:12;:21::i;:::-;50595:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;50742:28;50773:10;:8;:10::i;:::-;50742:41;;50836:1;50811:14;50805:28;:32;:149;;;;;;;;;;;;;;;;;50881:14;50897:18;:7;:16;:18::i;:::-;50917:13;50864:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50805:149;50798:156;;;50447:519;;;:::o;44499:27::-;;;;:::o;50242:193::-;50328:8;:23;50337:13;50328:23;;;;;;;;;;;:29;;;;;;;;;;;;50314:43;;:10;:43;;;50306:52;;;;;;50422:5;50379:8;:23;50388:13;50379:23;;;;;;;;;;;:40;;;:48;;;;;;;;;;;;;;;;;;50242:193;:::o;31629:164::-;31726:4;31750:18;:25;31769:5;31750:25;;;;;;;;;;;;;;;:35;31776:8;31750:35;;;;;;;;;;;;;;;;;;;;;;;;;31743:42;;31629:164;;;;:::o;49637:277::-;49731:8;:23;49740:13;49731:23;;;;;;;;;;;:29;;;;;;;;;;;;49717:43;;:10;:43;;;49709:52;;;;;;49788:1;49780:5;:9;49772:18;;;;;;49843:5;49811:8;:23;49820:13;49811:23;;;;;;;;;;;:29;;:37;;;;49902:4;49859:8;:23;49868:13;49859:23;;;;;;;;;;;:40;;;:47;;;;;;;;;;;;;;;;;;49637:277;;:::o;43691:201::-;43013:12;:10;:12::i;:::-;43002:23;;:7;:5;:7::i;:::-;:23;;;42994:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43800:1:::1;43780:22;;:8;:22;;;;43772:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43856:28;43875:8;43856:18;:28::i;:::-;43691:201:::0;:::o;49922:308::-;50022:8;:23;50031:13;50022:23;;;;;;;;;;;:29;;;;;;;;;;;;50008:43;;:10;:43;;;50000:52;;;;;;50091:1;50071:22;;:8;:22;;;;50063:31;;;;;;50107:20;:30;50128:8;50107:30;;;;;;;;;;;;;;;50143:13;50107:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50168:54;50186:10;50198:8;50208:13;50168:17;:54::i;:::-;49922:308;;:::o;13440:157::-;13525:4;13564:25;13549:40;;;:11;:40;;;;13542:47;;13440:157;;;:::o;34364:127::-;34429:4;34481:1;34453:30;;:7;:16;34461:7;34453:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34446:37;;34364:127;;;:::o;26985:98::-;27038:7;27065:10;27058:17;;26985:98;:::o;38510:174::-;38612:2;38585:15;:24;38601:7;38585:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38668:7;38664:2;38630:46;;38639:23;38654:7;38639:14;:23::i;:::-;38630:46;;;;;;;;;;;;38510:174;;:::o;34658:348::-;34751:4;34776:16;34784:7;34776;:16::i;:::-;34768:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34852:13;34868:23;34883:7;34868:14;:23::i;:::-;34852:39;;34921:5;34910:16;;:7;:16;;;:51;;;;34954:7;34930:31;;:20;34942:7;34930:11;:20::i;:::-;:31;;;34910:51;:87;;;;34965:32;34982:5;34989:7;34965:16;:32::i;:::-;34910:87;34902:96;;;34658:348;;;;:::o;37767:625::-;37926:4;37899:31;;:23;37914:7;37899:14;:23::i;:::-;:31;;;37891:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;38005:1;37991:16;;:2;:16;;;;37983:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38061:39;38082:4;38088:2;38092:7;38061:20;:39::i;:::-;38165:29;38182:1;38186:7;38165:8;:29::i;:::-;38226:1;38207:9;:15;38217:4;38207:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38255:1;38238:9;:13;38248:2;38238:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38286:2;38267:7;:16;38275:7;38267:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38325:7;38321:2;38306:27;;38315:4;38306:27;;;;;;;;;;;;38346:38;38366:4;38372:2;38376:7;38346:19;:38::i;:::-;37767:625;;;:::o;44052:191::-;44126:16;44145:6;;;;;;;;;;;44126:25;;44171:8;44162:6;;:17;;;;;;;;;;;;;;;;;;44226:8;44195:40;;44216:8;44195:40;;;;;;;;;;;;44115:128;44052:191;:::o;47397:304::-;47490:8;45749:18;45770:9;:19;45780:8;45770:19;;;;;;;;;;;;;;;;;;;;;45749:40;;45836:10;45822:24;;:10;:24;;;:77;;;;45889:10;45863:36;;:12;:22;45876:8;45863:22;;;;;;;;;;;;;;;;;;;;;:36;;;45822:77;:134;;;;45916:16;:28;45933:10;45916:28;;;;;;;;;;;;;;;:40;45945:10;45916:40;;;;;;;;;;;;;;;;;;;;;;;;;45822:134;45800:167;;;;;;47513:8:::1;46046:18;46067:25;46083:8;46067:15;:25::i;:::-;46046:46;;46133:1;46111:24;;:10;:24;;;;46103:33;;;::::0;::::1;;47534:18:::2;47555:25;47571:8;47555:15;:25::i;:::-;47534:46;;47613:5;47599:19;;:10;:19;;;47591:28;;;::::0;::::2;;47653:1;47638:17;;:3;:17;;;;47630:26;;;::::0;::::2;;47669:24;47679:3;47684:8;47669:9;:24::i;:::-;47523:178;46035:121:::1;45978:1;45738:249:::0;47397:304;;;;:::o;22879:98::-;22937:7;22968:1;22964;:5;;;;:::i;:::-;22957:12;;22879:98;;;;:::o;23278:::-;23336:7;23367:1;23363;:5;;;;:::i;:::-;23356:12;;23278:98;;;;:::o;22141:::-;22199:7;22230:1;22226;:5;;;;:::i;:::-;22219:12;;22141:98;;;;:::o;46377:262::-;46483:1;46468:17;;:3;:17;;;;46460:26;;;;;;46536:1;46505:33;;:9;:19;46515:8;46505:19;;;;;;;;;;;;;;;;;;;;;:33;;;46497:42;;;;;;46552:26;46564:3;46569:8;46552:11;:26::i;:::-;46622:8;46617:3;46596:35;;46613:1;46596:35;;;;;;;;;;;;46377:262;;:::o;38826:315::-;38981:8;38972:17;;:5;:17;;;;38964:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39068:8;39030:18;:25;39049:5;39030:25;;;;;;;;;;;;;;;:35;39056:8;39030:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39114:8;39092:41;;39107:5;39092:41;;;39124:8;39092:41;;;;;;:::i;:::-;;;;;;;;38826:315;;;:::o;33736:::-;33893:28;33903:4;33909:2;33913:7;33893:9;:28::i;:::-;33940:48;33963:4;33969:2;33973:7;33982:5;33940:22;:48::i;:::-;33932:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33736:315;;;;:::o;45557:134::-;45627:4;45681:1;45651:32;;:9;:18;45661:7;45651:18;;;;;;;;;;;;;;;;;;;;;:32;;;;45644:39;;45557:134;;;:::o;45441:108::-;45501:13;45534:7;45527:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45441:108;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;41077:126::-;;;;:::o;41588:125::-;;;;:::o;47064:325::-;47134:12;47149:9;:19;47159:8;47149:19;;;;;;;;;;;;;;;;;;;;;47134:34;;47179:24;47194:8;47179:14;:24::i;:::-;47216:30;47231:4;47237:8;47216:14;:30::i;:::-;47257:26;47269:3;47274:8;47257:11;:26::i;:::-;47331:3;47304:8;:18;47313:8;47304:18;;;;;;;;;;;:24;;;:30;;;;;;;;;;;;;;;;;;47372:8;47367:3;47352:29;;47361:4;47352:29;;;;;;;;;;;;47123:266;47064:325;;:::o;46164:205::-;46283:1;46252:33;;:9;:19;46262:8;46252:19;;;;;;;;;;;;;;;;;;;;;:33;;;46244:42;;;;;;46321:3;46299:9;:19;46309:8;46299:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;46335:19;:24;46355:3;46335:24;;;;;;;;;;;;;;;;:26;;;;;;;;;:::i;:::-;;;;;;46164:205;;:::o;39706:799::-;39861:4;39882:15;:2;:13;;;:15::i;:::-;39878:620;;;39934:2;39918:36;;;39955:12;:10;:12::i;:::-;39969:4;39975:7;39984:5;39918:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39914:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40177:1;40160:6;:13;:18;40156:272;;;40203:60;;;;;;;;;;:::i;:::-;;;;;;;;40156:272;40378:6;40372:13;40363:6;40359:2;40355:15;40348:38;39914:529;40051:41;;;40041:51;;;:6;:51;;;;40034:58;;;;;39878:620;40482:4;40475:11;;39706:799;;;;;;;:::o;46647:166::-;46746:1;46712:36;;:12;:22;46725:8;46712:22;;;;;;;;;;;;;;;;;;;;;:36;;;46708:98;;46772:12;:22;46785:8;46772:22;;;;;;;;;;;;46765:29;;;;;;;;;;;46708:98;46647:166;:::o;46821:235::-;46937:5;46914:28;;:9;:19;46924:8;46914:19;;;;;;;;;;;;;;;;;;;;;:28;;;46906:37;;;;;;46983:19;:26;47003:5;46983:26;;;;;;;;;;;;;;;;:28;;;;;;;;;:::i;:::-;;;;;46954:19;:26;46974:5;46954:26;;;;;;;;;;;;;;;:57;;;;47029:9;:19;47039:8;47029:19;;;;;;;;;;;;47022:26;;;;;;;;;;;46821:235;;:::o;3357:326::-;3417:4;3674:1;3652:7;:19;;;:23;3645:30;;3357: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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:474::-;7226:6;7234;7283:2;7271:9;7262:7;7258:23;7254:32;7251:119;;;7289:79;;:::i;:::-;7251:119;7409:1;7434:53;7479:7;7470:6;7459:9;7455:22;7434:53;:::i;:::-;7424:63;;7380:117;7536:2;7562:53;7607:7;7598:6;7587:9;7583:22;7562:53;:::i;:::-;7552:63;;7507:118;7158:474;;;;;:::o;7638:::-;7706:6;7714;7763:2;7751:9;7742:7;7738:23;7734:32;7731:119;;;7769:79;;:::i;:::-;7731:119;7889:1;7914:53;7959:7;7950:6;7939:9;7935:22;7914:53;:::i;:::-;7904:63;;7860:117;8016:2;8042:53;8087:7;8078:6;8067:9;8063:22;8042:53;:::i;:::-;8032:63;;7987:118;7638:474;;;;;:::o;8118:179::-;8187:10;8208:46;8250:3;8242:6;8208:46;:::i;:::-;8286:4;8281:3;8277:14;8263:28;;8118:179;;;;:::o;8303:118::-;8390:24;8408:5;8390:24;:::i;:::-;8385:3;8378:37;8303:118;;:::o;8457:732::-;8576:3;8605:54;8653:5;8605:54;:::i;:::-;8675:86;8754:6;8749:3;8675:86;:::i;:::-;8668:93;;8785:56;8835:5;8785:56;:::i;:::-;8864:7;8895:1;8880:284;8905:6;8902:1;8899:13;8880:284;;;8981:6;8975:13;9008:63;9067:3;9052:13;9008:63;:::i;:::-;9001:70;;9094:60;9147:6;9094:60;:::i;:::-;9084:70;;8940:224;8927:1;8924;8920:9;8915:14;;8880:284;;;8884:14;9180:3;9173:10;;8581:608;;;8457:732;;;;:::o;9195:109::-;9276:21;9291:5;9276:21;:::i;:::-;9271:3;9264:34;9195:109;;:::o;9310:360::-;9396:3;9424:38;9456:5;9424:38;:::i;:::-;9478:70;9541:6;9536:3;9478:70;:::i;:::-;9471:77;;9557:52;9602:6;9597:3;9590:4;9583:5;9579:16;9557:52;:::i;:::-;9634:29;9656:6;9634:29;:::i;:::-;9629:3;9625:39;9618:46;;9400:270;9310:360;;;;:::o;9676:364::-;9764:3;9792:39;9825:5;9792:39;:::i;:::-;9847:71;9911:6;9906:3;9847:71;:::i;:::-;9840:78;;9927:52;9972:6;9967:3;9960:4;9953:5;9949:16;9927:52;:::i;:::-;10004:29;10026:6;10004:29;:::i;:::-;9999:3;9995:39;9988:46;;9768:272;9676:364;;;;:::o;10046:377::-;10152:3;10180:39;10213:5;10180:39;:::i;:::-;10235:89;10317:6;10312:3;10235:89;:::i;:::-;10228:96;;10333:52;10378:6;10373:3;10366:4;10359:5;10355:16;10333:52;:::i;:::-;10410:6;10405:3;10401:16;10394:23;;10156:267;10046:377;;;;:::o;10453:845::-;10556:3;10593:5;10587:12;10622:36;10648:9;10622:36;:::i;:::-;10674:89;10756:6;10751:3;10674:89;:::i;:::-;10667:96;;10794:1;10783:9;10779:17;10810:1;10805:137;;;;10956:1;10951:341;;;;10772:520;;10805:137;10889:4;10885:9;10874;10870:25;10865:3;10858:38;10925:6;10920:3;10916:16;10909:23;;10805:137;;10951:341;11018:38;11050:5;11018:38;:::i;:::-;11078:1;11092:154;11106:6;11103:1;11100:13;11092:154;;;11180:7;11174:14;11170:1;11165:3;11161:11;11154:35;11230:1;11221:7;11217:15;11206:26;;11128:4;11125:1;11121:12;11116:17;;11092:154;;;11275:6;11270:3;11266:16;11259:23;;10958:334;;10772:520;;10560:738;;10453:845;;;;:::o;11304:366::-;11446:3;11467:67;11531:2;11526:3;11467:67;:::i;:::-;11460:74;;11543:93;11632:3;11543:93;:::i;:::-;11661:2;11656:3;11652:12;11645:19;;11304:366;;;:::o;11676:::-;11818:3;11839:67;11903:2;11898:3;11839:67;:::i;:::-;11832:74;;11915:93;12004:3;11915:93;:::i;:::-;12033:2;12028:3;12024:12;12017:19;;11676:366;;;:::o;12048:::-;12190:3;12211:67;12275:2;12270:3;12211:67;:::i;:::-;12204:74;;12287:93;12376:3;12287:93;:::i;:::-;12405:2;12400:3;12396:12;12389:19;;12048:366;;;:::o;12420:::-;12562:3;12583:67;12647:2;12642:3;12583:67;:::i;:::-;12576:74;;12659:93;12748:3;12659:93;:::i;:::-;12777:2;12772:3;12768:12;12761:19;;12420:366;;;:::o;12792:::-;12934:3;12955:67;13019:2;13014:3;12955:67;:::i;:::-;12948:74;;13031:93;13120:3;13031:93;:::i;:::-;13149:2;13144:3;13140:12;13133:19;;12792:366;;;:::o;13164:::-;13306:3;13327:67;13391:2;13386:3;13327:67;:::i;:::-;13320:74;;13403:93;13492:3;13403:93;:::i;:::-;13521:2;13516:3;13512:12;13505:19;;13164:366;;;:::o;13536:::-;13678:3;13699:67;13763:2;13758:3;13699:67;:::i;:::-;13692:74;;13775:93;13864:3;13775:93;:::i;:::-;13893:2;13888:3;13884:12;13877:19;;13536:366;;;:::o;13908:::-;14050:3;14071:67;14135:2;14130:3;14071:67;:::i;:::-;14064:74;;14147:93;14236:3;14147:93;:::i;:::-;14265:2;14260:3;14256:12;14249:19;;13908:366;;;:::o;14280:::-;14422:3;14443:67;14507:2;14502:3;14443:67;:::i;:::-;14436:74;;14519:93;14608:3;14519:93;:::i;:::-;14637:2;14632:3;14628:12;14621:19;;14280:366;;;:::o;14652:::-;14794:3;14815:67;14879:2;14874:3;14815:67;:::i;:::-;14808:74;;14891:93;14980:3;14891:93;:::i;:::-;15009:2;15004:3;15000:12;14993:19;;14652:366;;;:::o;15024:::-;15166:3;15187:67;15251:2;15246:3;15187:67;:::i;:::-;15180:74;;15263:93;15352:3;15263:93;:::i;:::-;15381:2;15376:3;15372:12;15365:19;;15024:366;;;:::o;15396:::-;15538:3;15559:67;15623:2;15618:3;15559:67;:::i;:::-;15552:74;;15635:93;15724:3;15635:93;:::i;:::-;15753:2;15748:3;15744:12;15737:19;;15396:366;;;:::o;15768:::-;15910:3;15931:67;15995:2;15990:3;15931:67;:::i;:::-;15924:74;;16007:93;16096:3;16007:93;:::i;:::-;16125:2;16120:3;16116:12;16109:19;;15768:366;;;:::o;16140:::-;16282:3;16303:67;16367:2;16362:3;16303:67;:::i;:::-;16296:74;;16379:93;16468:3;16379:93;:::i;:::-;16497:2;16492:3;16488:12;16481:19;;16140:366;;;:::o;16512:108::-;16589:24;16607:5;16589:24;:::i;:::-;16584:3;16577:37;16512:108;;:::o;16626:118::-;16713:24;16731:5;16713:24;:::i;:::-;16708:3;16701:37;16626:118;;:::o;16750:589::-;16975:3;16997:95;17088:3;17079:6;16997:95;:::i;:::-;16990:102;;17109:95;17200:3;17191:6;17109:95;:::i;:::-;17102:102;;17221:92;17309:3;17300:6;17221:92;:::i;:::-;17214:99;;17330:3;17323:10;;16750:589;;;;;;:::o;17345:222::-;17438:4;17476:2;17465:9;17461:18;17453:26;;17489:71;17557:1;17546:9;17542:17;17533:6;17489:71;:::i;:::-;17345:222;;;;:::o;17573:640::-;17768:4;17806:3;17795:9;17791:19;17783:27;;17820:71;17888:1;17877:9;17873:17;17864:6;17820:71;:::i;:::-;17901:72;17969:2;17958:9;17954:18;17945:6;17901:72;:::i;:::-;17983;18051:2;18040:9;18036:18;18027:6;17983:72;:::i;:::-;18102:9;18096:4;18092:20;18087:2;18076:9;18072:18;18065:48;18130:76;18201:4;18192:6;18130:76;:::i;:::-;18122:84;;17573:640;;;;;;;:::o;18219:541::-;18390:4;18428:3;18417:9;18413:19;18405:27;;18442:71;18510:1;18499:9;18495:17;18486:6;18442:71;:::i;:::-;18523:66;18585:2;18574:9;18570:18;18561:6;18523:66;:::i;:::-;18599:72;18667:2;18656:9;18652:18;18643:6;18599:72;:::i;:::-;18681;18749:2;18738:9;18734:18;18725:6;18681:72;:::i;:::-;18219:541;;;;;;;:::o;18766:373::-;18909:4;18947:2;18936:9;18932:18;18924:26;;18996:9;18990:4;18986:20;18982:1;18971:9;18967:17;18960:47;19024:108;19127:4;19118:6;19024:108;:::i;:::-;19016:116;;18766:373;;;;:::o;19145:210::-;19232:4;19270:2;19259:9;19255:18;19247:26;;19283:65;19345:1;19334:9;19330:17;19321:6;19283:65;:::i;:::-;19145:210;;;;:::o;19361:313::-;19474:4;19512:2;19501:9;19497:18;19489:26;;19561:9;19555:4;19551:20;19547:1;19536:9;19532:17;19525:47;19589:78;19662:4;19653:6;19589:78;:::i;:::-;19581:86;;19361:313;;;;:::o;19680:419::-;19846:4;19884:2;19873:9;19869:18;19861:26;;19933:9;19927:4;19923:20;19919:1;19908:9;19904:17;19897:47;19961:131;20087:4;19961:131;:::i;:::-;19953:139;;19680:419;;;:::o;20105:::-;20271:4;20309:2;20298:9;20294:18;20286:26;;20358:9;20352:4;20348:20;20344:1;20333:9;20329:17;20322:47;20386:131;20512:4;20386:131;:::i;:::-;20378:139;;20105:419;;;:::o;20530:::-;20696:4;20734:2;20723:9;20719:18;20711:26;;20783:9;20777:4;20773:20;20769:1;20758:9;20754:17;20747:47;20811:131;20937:4;20811:131;:::i;:::-;20803:139;;20530:419;;;:::o;20955:::-;21121:4;21159:2;21148:9;21144:18;21136:26;;21208:9;21202:4;21198:20;21194:1;21183:9;21179:17;21172:47;21236:131;21362:4;21236:131;:::i;:::-;21228:139;;20955:419;;;:::o;21380:::-;21546:4;21584:2;21573:9;21569:18;21561:26;;21633:9;21627:4;21623:20;21619:1;21608:9;21604:17;21597:47;21661:131;21787:4;21661:131;:::i;:::-;21653:139;;21380:419;;;:::o;21805:::-;21971:4;22009:2;21998:9;21994:18;21986:26;;22058:9;22052:4;22048:20;22044:1;22033:9;22029:17;22022:47;22086:131;22212:4;22086:131;:::i;:::-;22078:139;;21805:419;;;:::o;22230:::-;22396:4;22434:2;22423:9;22419:18;22411:26;;22483:9;22477:4;22473:20;22469:1;22458:9;22454:17;22447:47;22511:131;22637:4;22511:131;:::i;:::-;22503:139;;22230:419;;;:::o;22655:::-;22821:4;22859:2;22848:9;22844:18;22836:26;;22908:9;22902:4;22898:20;22894:1;22883:9;22879:17;22872:47;22936:131;23062:4;22936:131;:::i;:::-;22928:139;;22655:419;;;:::o;23080:::-;23246:4;23284:2;23273:9;23269:18;23261:26;;23333:9;23327:4;23323:20;23319:1;23308:9;23304:17;23297:47;23361:131;23487:4;23361:131;:::i;:::-;23353:139;;23080:419;;;:::o;23505:::-;23671:4;23709:2;23698:9;23694:18;23686:26;;23758:9;23752:4;23748:20;23744:1;23733:9;23729:17;23722:47;23786:131;23912:4;23786:131;:::i;:::-;23778:139;;23505:419;;;:::o;23930:::-;24096:4;24134:2;24123:9;24119:18;24111:26;;24183:9;24177:4;24173:20;24169:1;24158:9;24154:17;24147:47;24211:131;24337:4;24211:131;:::i;:::-;24203:139;;23930:419;;;:::o;24355:::-;24521:4;24559:2;24548:9;24544:18;24536:26;;24608:9;24602:4;24598:20;24594:1;24583:9;24579:17;24572:47;24636:131;24762:4;24636:131;:::i;:::-;24628:139;;24355:419;;;:::o;24780:::-;24946:4;24984:2;24973:9;24969:18;24961:26;;25033:9;25027:4;25023:20;25019:1;25008:9;25004:17;24997:47;25061:131;25187:4;25061:131;:::i;:::-;25053:139;;24780:419;;;:::o;25205:::-;25371:4;25409:2;25398:9;25394:18;25386:26;;25458:9;25452:4;25448:20;25444:1;25433:9;25429:17;25422:47;25486:131;25612:4;25486:131;:::i;:::-;25478:139;;25205:419;;;:::o;25630:222::-;25723:4;25761:2;25750:9;25746:18;25738:26;;25774:71;25842:1;25831:9;25827:17;25818:6;25774:71;:::i;:::-;25630:222;;;;:::o;25858:129::-;25892:6;25919:20;;:::i;:::-;25909:30;;25948:33;25976:4;25968:6;25948:33;:::i;:::-;25858:129;;;:::o;25993:75::-;26026:6;26059:2;26053:9;26043:19;;25993:75;:::o;26074:307::-;26135:4;26225:18;26217:6;26214:30;26211:56;;;26247:18;;:::i;:::-;26211:56;26285:29;26307:6;26285:29;:::i;:::-;26277:37;;26369:4;26363;26359:15;26351:23;;26074:307;;;:::o;26387:308::-;26449:4;26539:18;26531:6;26528:30;26525:56;;;26561:18;;:::i;:::-;26525:56;26599:29;26621:6;26599:29;:::i;:::-;26591:37;;26683:4;26677;26673:15;26665:23;;26387:308;;;:::o;26701:132::-;26768:4;26791:3;26783:11;;26821:4;26816:3;26812:14;26804:22;;26701:132;;;:::o;26839:141::-;26888:4;26911:3;26903:11;;26934:3;26931:1;26924:14;26968:4;26965:1;26955:18;26947:26;;26839:141;;;:::o;26986:114::-;27053:6;27087:5;27081:12;27071:22;;26986:114;;;:::o;27106:98::-;27157:6;27191:5;27185:12;27175:22;;27106:98;;;:::o;27210:99::-;27262:6;27296:5;27290:12;27280:22;;27210:99;;;:::o;27315:113::-;27385:4;27417;27412:3;27408:14;27400:22;;27315:113;;;:::o;27434:184::-;27533:11;27567:6;27562:3;27555:19;27607:4;27602:3;27598:14;27583:29;;27434:184;;;;:::o;27624:168::-;27707:11;27741:6;27736:3;27729:19;27781:4;27776:3;27772:14;27757:29;;27624:168;;;;:::o;27798:169::-;27882:11;27916:6;27911:3;27904:19;27956:4;27951:3;27947:14;27932:29;;27798:169;;;;:::o;27973:148::-;28075:11;28112:3;28097:18;;27973:148;;;;:::o;28127:305::-;28167:3;28186:20;28204:1;28186:20;:::i;:::-;28181:25;;28220:20;28238:1;28220:20;:::i;:::-;28215:25;;28374:1;28306:66;28302:74;28299:1;28296:81;28293:107;;;28380:18;;:::i;:::-;28293:107;28424:1;28421;28417:9;28410:16;;28127:305;;;;:::o;28438:185::-;28478:1;28495:20;28513:1;28495:20;:::i;:::-;28490:25;;28529:20;28547:1;28529:20;:::i;:::-;28524:25;;28568:1;28558:35;;28573:18;;:::i;:::-;28558:35;28615:1;28612;28608:9;28603:14;;28438:185;;;;:::o;28629:348::-;28669:7;28692:20;28710:1;28692:20;:::i;:::-;28687:25;;28726:20;28744:1;28726:20;:::i;:::-;28721:25;;28914:1;28846:66;28842:74;28839:1;28836:81;28831:1;28824:9;28817:17;28813:105;28810:131;;;28921:18;;:::i;:::-;28810:131;28969:1;28966;28962:9;28951:20;;28629:348;;;;:::o;28983:191::-;29023:4;29043:20;29061:1;29043:20;:::i;:::-;29038:25;;29077:20;29095:1;29077:20;:::i;:::-;29072:25;;29116:1;29113;29110:8;29107:34;;;29121:18;;:::i;:::-;29107:34;29166:1;29163;29159:9;29151:17;;28983:191;;;;:::o;29180:96::-;29217:7;29246:24;29264:5;29246:24;:::i;:::-;29235:35;;29180:96;;;:::o;29282:90::-;29316:7;29359:5;29352:13;29345:21;29334:32;;29282:90;;;:::o;29378:149::-;29414:7;29454:66;29447:5;29443:78;29432:89;;29378:149;;;:::o;29533:126::-;29570:7;29610:42;29603:5;29599:54;29588:65;;29533:126;;;:::o;29665:77::-;29702:7;29731:5;29720:16;;29665:77;;;:::o;29748:154::-;29832:6;29827:3;29822;29809:30;29894:1;29885:6;29880:3;29876:16;29869:27;29748:154;;;:::o;29908:307::-;29976:1;29986:113;30000:6;29997:1;29994:13;29986:113;;;30085:1;30080:3;30076:11;30070:18;30066:1;30061:3;30057:11;30050:39;30022:2;30019:1;30015:10;30010:15;;29986:113;;;30117:6;30114:1;30111:13;30108:101;;;30197:1;30188:6;30183:3;30179:16;30172:27;30108:101;29957:258;29908:307;;;:::o;30221:171::-;30260:3;30283:24;30301:5;30283:24;:::i;:::-;30274:33;;30329:4;30322:5;30319:15;30316:41;;;30337:18;;:::i;:::-;30316:41;30384:1;30377:5;30373:13;30366:20;;30221:171;;;:::o;30398:320::-;30442:6;30479:1;30473:4;30469:12;30459:22;;30526:1;30520:4;30516:12;30547:18;30537:81;;30603:4;30595:6;30591:17;30581:27;;30537:81;30665:2;30657:6;30654:14;30634:18;30631:38;30628:84;;;30684:18;;:::i;:::-;30628:84;30449:269;30398:320;;;:::o;30724:281::-;30807:27;30829:4;30807:27;:::i;:::-;30799:6;30795:40;30937:6;30925:10;30922:22;30901:18;30889:10;30886:34;30883:62;30880:88;;;30948:18;;:::i;:::-;30880:88;30988:10;30984:2;30977:22;30767:238;30724:281;;:::o;31011:233::-;31050:3;31073:24;31091:5;31073:24;:::i;:::-;31064:33;;31119:66;31112:5;31109:77;31106:103;;;31189:18;;:::i;:::-;31106:103;31236:1;31229:5;31225:13;31218:20;;31011:233;;;:::o;31250:176::-;31282:1;31299:20;31317:1;31299:20;:::i;:::-;31294:25;;31333:20;31351:1;31333:20;:::i;:::-;31328:25;;31372:1;31362:35;;31377:18;;:::i;:::-;31362:35;31418:1;31415;31411:9;31406:14;;31250:176;;;;:::o;31432:180::-;31480:77;31477:1;31470:88;31577:4;31574:1;31567:15;31601:4;31598:1;31591:15;31618:180;31666:77;31663:1;31656:88;31763:4;31760:1;31753:15;31787:4;31784:1;31777:15;31804:180;31852:77;31849:1;31842:88;31949:4;31946:1;31939:15;31973:4;31970:1;31963:15;31990:180;32038:77;32035:1;32028:88;32135:4;32132:1;32125:15;32159:4;32156:1;32149:15;32176:180;32224:77;32221:1;32214:88;32321:4;32318:1;32311:15;32345:4;32342:1;32335:15;32362:117;32471:1;32468;32461:12;32485:117;32594:1;32591;32584:12;32608:117;32717:1;32714;32707:12;32731:117;32840:1;32837;32830:12;32854:102;32895:6;32946:2;32942:7;32937:2;32930:5;32926:14;32922:28;32912:38;;32854:102;;;:::o;32962:237::-;33102:34;33098:1;33090:6;33086:14;33079:58;33171:20;33166:2;33158:6;33154:15;33147:45;32962:237;:::o;33205:225::-;33345:34;33341:1;33333:6;33329:14;33322:58;33414:8;33409:2;33401:6;33397:15;33390:33;33205:225;:::o;33436:224::-;33576:34;33572:1;33564:6;33560:14;33553:58;33645:7;33640:2;33632:6;33628:15;33621:32;33436:224;:::o;33666:223::-;33806:34;33802:1;33794:6;33790:14;33783:58;33875:6;33870:2;33862:6;33858:15;33851:31;33666:223;:::o;33895:175::-;34035:27;34031:1;34023:6;34019:14;34012:51;33895:175;:::o;34076:231::-;34216:34;34212:1;34204:6;34200:14;34193:58;34285:14;34280:2;34272:6;34268:15;34261:39;34076:231;:::o;34313:243::-;34453:34;34449:1;34441:6;34437:14;34430:58;34522:26;34517:2;34509:6;34505:15;34498:51;34313:243;:::o;34562:229::-;34702:34;34698:1;34690:6;34686:14;34679:58;34771:12;34766:2;34758:6;34754:15;34747:37;34562:229;:::o;34797:228::-;34937:34;34933:1;34925:6;34921:14;34914:58;35006:11;35001:2;34993:6;34989:15;34982:36;34797:228;:::o;35031:231::-;35171:34;35167:1;35159:6;35155:14;35148:58;35240:14;35235:2;35227:6;35223:15;35216:39;35031:231;:::o;35268:182::-;35408:34;35404:1;35396:6;35392:14;35385:58;35268:182;:::o;35456:234::-;35596:34;35592:1;35584:6;35580:14;35573:58;35665:17;35660:2;35652:6;35648:15;35641:42;35456:234;:::o;35696:220::-;35836:34;35832:1;35824:6;35820:14;35813:58;35905:3;35900:2;35892:6;35888:15;35881:28;35696:220;:::o;35922:236::-;36062:34;36058:1;36050:6;36046:14;36039:58;36131:19;36126:2;36118:6;36114:15;36107:44;35922:236;:::o;36164:122::-;36237:24;36255:5;36237:24;:::i;:::-;36230:5;36227:35;36217:63;;36276:1;36273;36266:12;36217:63;36164:122;:::o;36292:116::-;36362:21;36377:5;36362:21;:::i;:::-;36355:5;36352:32;36342:60;;36398:1;36395;36388:12;36342:60;36292:116;:::o;36414:120::-;36486:23;36503:5;36486:23;:::i;:::-;36479:5;36476:34;36466:62;;36524:1;36521;36514:12;36466:62;36414:120;:::o;36540:122::-;36613:24;36631:5;36613:24;:::i;:::-;36606:5;36603:35;36593:63;;36652:1;36649;36642:12;36593:63;36540:122;:::o

Swarm Source

ipfs://ac38e718d435af2fea96cb3f54791fefb2c987ca013ceba85edd7693333b5fa9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.