Overview
TokenID
765
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SPUNKYGTD
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2025-01-16 */ // File: @openzeppelin/[email protected]/interfaces/draft-IERC6093.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File: @openzeppelin/[email protected]/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/[email protected]/utils/math/Math.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; 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_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.20; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be * reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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/[email protected]/interfaces/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) pragma solidity ^0.8.20; // File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or * {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the address zero. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/[email protected]/interfaces/IERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol) pragma solidity ^0.8.20; // File: @openzeppelin/[email protected]/interfaces/IERC4906.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol) pragma solidity ^0.8.20; /// @title EIP-721 Metadata Update Extension interface IERC4906 is IERC165, IERC721 { /// @dev This event emits when the metadata of a token is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFT. event MetadataUpdate(uint256 _tokenId); /// @dev This event emits when the metadata of a range of tokens is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFTs. event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.20; /** * @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/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.20; /** * @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}. */ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors { using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; mapping(uint256 tokenId => address) private _owners; mapping(address owner => uint256) private _balances; mapping(uint256 tokenId => address) private _tokenApprovals; mapping(address owner => mapping(address operator => 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 returns (uint256) { if (owner == address(0)) { revert ERC721InvalidOwner(address(0)); } return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual returns (address) { return _requireOwned(tokenId); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual returns (string memory) { _requireOwned(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual { _approve(to, tokenId, _msgSender()); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual returns (address) { _requireOwned(tokenId); return _getApproved(tokenId); } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. address previousOwner = _update(to, tokenId, _msgSender()); if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual { transferFrom(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist * * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`. */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted. */ function _getApproved(uint256 tokenId) internal view virtual returns (address) { return _tokenApprovals[tokenId]; } /** * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in * particular (ignoring whether it is owned by `owner`). * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) { return spender != address(0) && (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender); } /** * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner. * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets * the `spender` for the specific `tokenId`. * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual { if (!_isAuthorized(owner, spender, tokenId)) { if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } else { revert ERC721InsufficientApproval(spender, tokenId); } } } /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that * a uint256 would ever overflow from increments when these increments are bounded to uint128 values. * * WARNING: Increasing an account's balance using this function tends to be paired with an override of the * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership * remain consistent with one another. */ function _increaseBalance(address account, uint128 value) internal virtual { unchecked { _balances[account] += value; } } /** * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update. * * The `auth` argument is optional. If the value passed is non 0, then this function will check that * `auth` is either the owner of the token, or approved to operate on the token (by the owner). * * Emits a {Transfer} event. * * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}. */ function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) { address from = _ownerOf(tokenId); // Perform (optional) operator check if (auth != address(0)) { _checkAuthorized(from, auth, tokenId); } // Execute the update if (from != address(0)) { // Clear approval. No need to re-authorize or emit the Approval event _approve(address(0), tokenId, address(0), false); unchecked { _balances[from] -= 1; } } if (to != address(0)) { unchecked { _balances[to] += 1; } } _owners[tokenId] = to; emit Transfer(from, to, tokenId); return from; } /** * @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 { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner != address(0)) { revert ERC721InvalidSender(address(0)); } } /** * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance. * * 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 { _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); _checkOnERC721Received(address(0), to, tokenId, data); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal { address previousOwner = _update(address(0), tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(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 { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } else if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients * are aware of the ERC721 standard 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 like {safeTransferFrom} in the sense that it invokes * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `tokenId` token must exist and be owned by `from`. * - `to` cannot be the zero address. * - `from` cannot be the zero address. * - 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) internal { _safeTransfer(from, to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Approve `to` to operate on `tokenId` * * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is * either the owner of the token, or approved to operate on all tokens held by this owner. * * Emits an {Approval} event. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address to, uint256 tokenId, address auth) internal { _approve(to, tokenId, auth, true); } /** * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not * emitted in the context of transfers. */ function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual { // Avoid reading the owner unless necessary if (emitEvent || auth != address(0)) { address owner = _requireOwned(tokenId); // We do not use _isAuthorized because single-token approvals should not be able to call approve if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) { revert ERC721InvalidApprover(auth); } if (emitEvent) { emit Approval(owner, to, tokenId); } } _tokenApprovals[tokenId] = to; } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Requirements: * - operator can't be the address zero. * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { if (operator == address(0)) { revert ERC721InvalidOperator(operator); } _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned). * Returns the owner. * * Overrides to ownership logic should be done to {_ownerOf}. */ function _requireOwned(uint256 tokenId) internal view returns (address) { address owner = _ownerOf(tokenId); if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } return owner; } /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the * recipient doesn't accept the token transfer. 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 */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private { if (to.code.length > 0) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { if (retval != IERC721Receiver.onERC721Received.selector) { revert ERC721InvalidReceiver(to); } } catch (bytes memory reason) { if (reason.length == 0) { revert ERC721InvalidReceiver(to); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } } } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.20; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is IERC4906, ERC721 { using Strings for uint256; // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only // defines events and does not include any external function. bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906); // Optional mapping for token URIs mapping(uint256 tokenId => string) private _tokenURIs; /** * @dev See {IERC165-supportsInterface} */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) { return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireOwned(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via string.concat). if (bytes(_tokenURI).length > 0) { return string.concat(base, _tokenURI); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Emits {MetadataUpdate}. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { _tokenURIs[tokenId] = _tokenURI; emit MetadataUpdate(tokenId); } } // File: @chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData( uint80 _roundId ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); } // Compatible with OpenZeppelin Contracts ^5.0.0 pragma solidity ^0.8.20; contract SPUNKYGTD is ERC721, ERC721URIStorage, Ownable { uint256 private _nextTokenId; mapping(address=>bool) allowedSaleContract; address private aiowAddress = 0x9aC26D5af386f5950D3D94476aFB4060325c6976; uint256 private _totalSupply = 999; constructor(address initialOwner) ERC721("Spunky GTD", "SGTD") Ownable(initialOwner) { allowedSaleContract[0xcD0e868EdAD58f3d7836F557515e369560306f8a] = true; } function safeMint(address to, string memory uri) external onlySaleContract { uint256 tokenId = _nextTokenId++; _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } function mint(address to, string memory uri) external onlySaleContract returns (uint256) { require(_totalSupply > _nextTokenId, "All token minted"); uint256 tokenId = _nextTokenId++; _mint(to, tokenId); _setTokenURI(tokenId, uri); return tokenId; } modifier onlySaleContract() { require(allowedSaleContract[msg.sender]); _; } modifier onlyAiow() { require(msg.sender == aiowAddress); _; } function addSaleContract(address saleContract, bool approved) public onlyAiow { allowedSaleContract[saleContract]=approved; } function changeAiowAddress(address _aiowAddress) public onlyAiow { aiowAddress = _aiowAddress; } function setTokenUrl(uint256 tokenId, string memory uri) public onlyOwner { _setTokenURI(tokenId, uri); } // The following functions are overrides required by Solidity. function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function totalSupply() public view returns (uint256) { return _nextTokenId; } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721URIStorage) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"saleContract","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"addSaleContract","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"_aiowAddress","type":"address"}],"name":"changeAiowAddress","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":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenUrl","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052739ac26d5af386f5950d3d94476afb4060325c6976600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e7600b553480156200006c57600080fd5b50604051620031d7380380620031d783398181016040528101906200009291906200034f565b806040518060400160405280600a81526020017f5370756e6b7920475444000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f53475444000000000000000000000000000000000000000000000000000000008152508160009081620001109190620005fb565b508060019081620001229190620005fb565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200019a5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620001919190620006f3565b60405180910390fd5b620001ab816200021f60201b60201c565b5060016009600073cd0e868edad58f3d7836f557515e369560306f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505062000710565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200031782620002ea565b9050919050565b62000329816200030a565b81146200033557600080fd5b50565b60008151905062000349816200031e565b92915050565b600060208284031215620003685762000367620002e5565b5b6000620003788482850162000338565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200040357607f821691505b602082108103620004195762000418620003bb565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000444565b6200048f868362000444565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004dc620004d6620004d084620004a7565b620004b1565b620004a7565b9050919050565b6000819050919050565b620004f883620004bb565b620005106200050782620004e3565b84845462000451565b825550505050565b600090565b6200052762000518565b62000534818484620004ed565b505050565b5b818110156200055c57620005506000826200051d565b6001810190506200053a565b5050565b601f821115620005ab5762000575816200041f565b620005808462000434565b8101602085101562000590578190505b620005a86200059f8562000434565b83018262000539565b50505b505050565b600082821c905092915050565b6000620005d060001984600802620005b0565b1980831691505092915050565b6000620005eb8383620005bd565b9150826002028217905092915050565b620006068262000381565b67ffffffffffffffff8111156200062257620006216200038c565b5b6200062e8254620003ea565b6200063b82828562000560565b600060209050601f8311600181146200067357600084156200065e578287015190505b6200066a8582620005dd565b865550620006da565b601f19841662000683866200041f565b60005b82811015620006ad5784890151825560018201915060208501945060208101905062000686565b86831015620006cd5784890151620006c9601f891682620005bd565b8355505b6001600288020188555050505b505050505050565b620006ed816200030a565b82525050565b60006020820190506200070a6000830184620006e2565b92915050565b612ab780620007206000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063b88d4fde1161007c578063b88d4fde1461034d578063c87b56dd14610369578063d0def52114610399578063d204c45e146103c9578063e985e9c5146103e5578063f2fde38b1461041557610142565b8063715018a6146102cf5780638da5cb5b146102d95780638e6fcd32146102f757806395d89b4114610313578063a22cb4651461033157610142565b806323b872dd1161010a57806323b872dd146101ff57806334d1c6411461021b57806342842e0e14610237578063524cad98146102535780636352211e1461026f57806370a082311461029f57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806318160ddd146101e1575b600080fd5b610161600480360381019061015c9190611e47565b610431565b60405161016e9190611e8f565b60405180910390f35b61017f610443565b60405161018c9190611f3a565b60405180910390f35b6101af60048036038101906101aa9190611f92565b6104d5565b6040516101bc9190612000565b60405180910390f35b6101df60048036038101906101da9190612047565b6104f1565b005b6101e9610507565b6040516101f69190612096565b60405180910390f35b610219600480360381019061021491906120b1565b610511565b005b61023560048036038101906102309190612239565b610613565b005b610251600480360381019061024c91906120b1565b610629565b005b61026d60048036038101906102689190612295565b610649565b005b61028960048036038101906102849190611f92565b6106e7565b6040516102969190612000565b60405180910390f35b6102b960048036038101906102b49190612295565b6106f9565b6040516102c69190612096565b60405180910390f35b6102d76107b3565b005b6102e16107c7565b6040516102ee9190612000565b60405180910390f35b610311600480360381019061030c91906122ee565b6107f1565b005b61031b6108a6565b6040516103289190611f3a565b60405180910390f35b61034b600480360381019061034691906122ee565b610938565b005b610367600480360381019061036291906123cf565b61094e565b005b610383600480360381019061037e9190611f92565b61096b565b6040516103909190611f3a565b60405180910390f35b6103b360048036038101906103ae9190612452565b61097d565b6040516103c09190612096565b60405180910390f35b6103e360048036038101906103de9190612452565b610a54565b005b6103ff60048036038101906103fa91906124ae565b610ade565b60405161040c9190611e8f565b60405180910390f35b61042f600480360381019061042a9190612295565b610b72565b005b600061043c82610bf8565b9050919050565b6060600080546104529061251d565b80601f016020809104026020016040519081016040528092919081815260200182805461047e9061251d565b80156104cb5780601f106104a0576101008083540402835291602001916104cb565b820191906000526020600020905b8154815290600101906020018083116104ae57829003601f168201915b5050505050905090565b60006104e082610c59565b506104ea82610ce1565b9050919050565b61050382826104fe610d1e565b610d26565b5050565b6000600854905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105835760006040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161057a9190612000565b60405180910390fd5b60006105978383610592610d1e565b610d38565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461060d578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016106049392919061254e565b60405180910390fd5b50505050565b61061b610f52565b6106258282610fd9565b5050565b6106448383836040518060200160405280600081525061094e565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106a357600080fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006106f282610c59565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361076c5760006040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016107639190612000565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6107bb610f52565b6107c56000611035565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461084b57600080fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6060600180546108b59061251d565b80601f01602080910402602001604051908101604052809291908181526020018280546108e19061251d565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b5050505050905090565b61094a610943610d1e565b83836110fb565b5050565b610959848484610511565b6109658484848461126a565b50505050565b606061097682611421565b9050919050565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109d557600080fd5b600854600b5411610a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a12906125d1565b60405180910390fd5b600060086000815480929190610a3090612620565b919050559050610a408482611534565b610a4a8184610fd9565b8091505092915050565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610aaa57600080fd5b600060086000815480929190610abf90612620565b919050559050610acf838261162d565b610ad98183610fd9565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610b7a610f52565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bec5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610be39190612000565b60405180910390fd5b610bf581611035565b50565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c525750610c518261164b565b5b9050919050565b600080610c658361172d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cd857826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610ccf9190612096565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b610d33838383600161176a565b505050565b600080610d448461172d565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610d8657610d8581848661192f565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e1757610dc860008560008061176a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610e9a576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b610f5a610d1e565b73ffffffffffffffffffffffffffffffffffffffff16610f786107c7565b73ffffffffffffffffffffffffffffffffffffffff1614610fd757610f9b610d1e565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610fce9190612000565b60405180910390fd5b565b80600660008481526020019081526020016000209081610ff99190612814565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7826040516110299190612096565b60405180910390a15050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361116c57816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016111639190612000565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161125d9190611e8f565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b111561141b578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026112ae610d1e565b8685856040518563ffffffff1660e01b81526004016112d0949392919061293b565b6020604051808303816000875af192505050801561130c57506040513d601f19601f82011682018060405250810190611309919061299c565b60015b611390573d806000811461133c576040519150601f19603f3d011682016040523d82523d6000602084013e611341565b606091505b50600081510361138857836040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161137f9190612000565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461141957836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016114109190612000565b60405180910390fd5b505b50505050565b606061142c82610c59565b50600060066000848152602001908152602001600020805461144d9061251d565b80601f01602080910402602001604051908101604052809291908181526020018280546114799061251d565b80156114c65780601f1061149b576101008083540402835291602001916114c6565b820191906000526020600020905b8154815290600101906020018083116114a957829003601f168201915b5050505050905060006114d76119f3565b905060008151036114ec57819250505061152f565b600082511115611521578082604051602001611509929190612a05565b6040516020818303038152906040529250505061152f565b61152a84611a0a565b925050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a65760006040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161159d9190612000565b60405180910390fd5b60006115b483836000610d38565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116285760006040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260040161161f9190612000565b60405180910390fd5b505050565b611647828260405180602001604052806000815250611a73565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061171657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611726575061172582611a8f565b5b9050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806117a35750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156118d75760006117b384610c59565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561181e57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611831575061182f8184610ade565b155b1561187357826040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815260040161186a9190612000565b60405180910390fd5b81156118d557838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b61193a838383611af9565b6119ee57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119af57806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016119a69190612096565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016119e5929190612a29565b60405180910390fd5b505050565b606060405180602001604052806000815250905090565b6060611a1582610c59565b506000611a206119f3565b90506000815111611a405760405180602001604052806000815250611a6b565b80611a4a84611bba565b604051602001611a5b929190612a05565b6040516020818303038152906040525b915050919050565b611a7d8383611534565b611a8a600084848461126a565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611bb157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b725750611b718484610ade565b5b80611bb057508273ffffffffffffffffffffffffffffffffffffffff16611b9883610ce1565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b606060006001611bc984611c88565b01905060008167ffffffffffffffff811115611be857611be761210e565b5b6040519080825280601f01601f191660200182016040528015611c1a5781602001600182028036833780820191505090505b509050600082602001820190505b600115611c7d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611c7157611c70612a52565b5b04945060008503611c28575b819350505050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611ce6577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611cdc57611cdb612a52565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611d23576d04ee2d6d415b85acef81000000008381611d1957611d18612a52565b5b0492506020810190505b662386f26fc100008310611d5257662386f26fc100008381611d4857611d47612a52565b5b0492506010810190505b6305f5e1008310611d7b576305f5e1008381611d7157611d70612a52565b5b0492506008810190505b6127108310611da0576127108381611d9657611d95612a52565b5b0492506004810190505b60648310611dc35760648381611db957611db8612a52565b5b0492506002810190505b600a8310611dd2576001810190505b80915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611e2481611def565b8114611e2f57600080fd5b50565b600081359050611e4181611e1b565b92915050565b600060208284031215611e5d57611e5c611de5565b5b6000611e6b84828501611e32565b91505092915050565b60008115159050919050565b611e8981611e74565b82525050565b6000602082019050611ea46000830184611e80565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ee4578082015181840152602081019050611ec9565b60008484015250505050565b6000601f19601f8301169050919050565b6000611f0c82611eaa565b611f168185611eb5565b9350611f26818560208601611ec6565b611f2f81611ef0565b840191505092915050565b60006020820190508181036000830152611f548184611f01565b905092915050565b6000819050919050565b611f6f81611f5c565b8114611f7a57600080fd5b50565b600081359050611f8c81611f66565b92915050565b600060208284031215611fa857611fa7611de5565b5b6000611fb684828501611f7d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611fea82611fbf565b9050919050565b611ffa81611fdf565b82525050565b60006020820190506120156000830184611ff1565b92915050565b61202481611fdf565b811461202f57600080fd5b50565b6000813590506120418161201b565b92915050565b6000806040838503121561205e5761205d611de5565b5b600061206c85828601612032565b925050602061207d85828601611f7d565b9150509250929050565b61209081611f5c565b82525050565b60006020820190506120ab6000830184612087565b92915050565b6000806000606084860312156120ca576120c9611de5565b5b60006120d886828701612032565b93505060206120e986828701612032565b92505060406120fa86828701611f7d565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61214682611ef0565b810181811067ffffffffffffffff821117156121655761216461210e565b5b80604052505050565b6000612178611ddb565b9050612184828261213d565b919050565b600067ffffffffffffffff8211156121a4576121a361210e565b5b6121ad82611ef0565b9050602081019050919050565b82818337600083830152505050565b60006121dc6121d784612189565b61216e565b9050828152602081018484840111156121f8576121f7612109565b5b6122038482856121ba565b509392505050565b600082601f8301126122205761221f612104565b5b81356122308482602086016121c9565b91505092915050565b600080604083850312156122505761224f611de5565b5b600061225e85828601611f7d565b925050602083013567ffffffffffffffff81111561227f5761227e611dea565b5b61228b8582860161220b565b9150509250929050565b6000602082840312156122ab576122aa611de5565b5b60006122b984828501612032565b91505092915050565b6122cb81611e74565b81146122d657600080fd5b50565b6000813590506122e8816122c2565b92915050565b6000806040838503121561230557612304611de5565b5b600061231385828601612032565b9250506020612324858286016122d9565b9150509250929050565b600067ffffffffffffffff8211156123495761234861210e565b5b61235282611ef0565b9050602081019050919050565b600061237261236d8461232e565b61216e565b90508281526020810184848401111561238e5761238d612109565b5b6123998482856121ba565b509392505050565b600082601f8301126123b6576123b5612104565b5b81356123c684826020860161235f565b91505092915050565b600080600080608085870312156123e9576123e8611de5565b5b60006123f787828801612032565b945050602061240887828801612032565b935050604061241987828801611f7d565b925050606085013567ffffffffffffffff81111561243a57612439611dea565b5b612446878288016123a1565b91505092959194509250565b6000806040838503121561246957612468611de5565b5b600061247785828601612032565b925050602083013567ffffffffffffffff81111561249857612497611dea565b5b6124a48582860161220b565b9150509250929050565b600080604083850312156124c5576124c4611de5565b5b60006124d385828601612032565b92505060206124e485828601612032565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061253557607f821691505b602082108103612548576125476124ee565b5b50919050565b60006060820190506125636000830186611ff1565b6125706020830185612087565b61257d6040830184611ff1565b949350505050565b7f416c6c20746f6b656e206d696e74656400000000000000000000000000000000600082015250565b60006125bb601083611eb5565b91506125c682612585565b602082019050919050565b600060208201905081810360008301526125ea816125ae565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061262b82611f5c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361265d5761265c6125f1565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026126ca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261268d565b6126d4868361268d565b95508019841693508086168417925050509392505050565b6000819050919050565b600061271161270c61270784611f5c565b6126ec565b611f5c565b9050919050565b6000819050919050565b61272b836126f6565b61273f61273782612718565b84845461269a565b825550505050565b600090565b612754612747565b61275f818484612722565b505050565b5b818110156127835761277860008261274c565b600181019050612765565b5050565b601f8211156127c85761279981612668565b6127a28461267d565b810160208510156127b1578190505b6127c56127bd8561267d565b830182612764565b50505b505050565b600082821c905092915050565b60006127eb600019846008026127cd565b1980831691505092915050565b600061280483836127da565b9150826002028217905092915050565b61281d82611eaa565b67ffffffffffffffff8111156128365761283561210e565b5b612840825461251d565b61284b828285612787565b600060209050601f83116001811461287e576000841561286c578287015190505b61287685826127f8565b8655506128de565b601f19841661288c86612668565b60005b828110156128b45784890151825560018201915060208501945060208101905061288f565b868310156128d157848901516128cd601f8916826127da565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b600082825260208201905092915050565b600061290d826128e6565b61291781856128f1565b9350612927818560208601611ec6565b61293081611ef0565b840191505092915050565b60006080820190506129506000830187611ff1565b61295d6020830186611ff1565b61296a6040830185612087565b818103606083015261297c8184612902565b905095945050505050565b60008151905061299681611e1b565b92915050565b6000602082840312156129b2576129b1611de5565b5b60006129c084828501612987565b91505092915050565b600081905092915050565b60006129df82611eaa565b6129e981856129c9565b93506129f9818560208601611ec6565b80840191505092915050565b6000612a1182856129d4565b9150612a1d82846129d4565b91508190509392505050565b6000604082019050612a3e6000830185611ff1565b612a4b6020830184612087565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea26469706673582212205e73f2afa9acfed211cb41672186ccd9eb941d0d440d298d7f7272449a8f78b464736f6c634300081800330000000000000000000000004872335a0087853fb2306abc865da2c078fa0149
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063b88d4fde1161007c578063b88d4fde1461034d578063c87b56dd14610369578063d0def52114610399578063d204c45e146103c9578063e985e9c5146103e5578063f2fde38b1461041557610142565b8063715018a6146102cf5780638da5cb5b146102d95780638e6fcd32146102f757806395d89b4114610313578063a22cb4651461033157610142565b806323b872dd1161010a57806323b872dd146101ff57806334d1c6411461021b57806342842e0e14610237578063524cad98146102535780636352211e1461026f57806370a082311461029f57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806318160ddd146101e1575b600080fd5b610161600480360381019061015c9190611e47565b610431565b60405161016e9190611e8f565b60405180910390f35b61017f610443565b60405161018c9190611f3a565b60405180910390f35b6101af60048036038101906101aa9190611f92565b6104d5565b6040516101bc9190612000565b60405180910390f35b6101df60048036038101906101da9190612047565b6104f1565b005b6101e9610507565b6040516101f69190612096565b60405180910390f35b610219600480360381019061021491906120b1565b610511565b005b61023560048036038101906102309190612239565b610613565b005b610251600480360381019061024c91906120b1565b610629565b005b61026d60048036038101906102689190612295565b610649565b005b61028960048036038101906102849190611f92565b6106e7565b6040516102969190612000565b60405180910390f35b6102b960048036038101906102b49190612295565b6106f9565b6040516102c69190612096565b60405180910390f35b6102d76107b3565b005b6102e16107c7565b6040516102ee9190612000565b60405180910390f35b610311600480360381019061030c91906122ee565b6107f1565b005b61031b6108a6565b6040516103289190611f3a565b60405180910390f35b61034b600480360381019061034691906122ee565b610938565b005b610367600480360381019061036291906123cf565b61094e565b005b610383600480360381019061037e9190611f92565b61096b565b6040516103909190611f3a565b60405180910390f35b6103b360048036038101906103ae9190612452565b61097d565b6040516103c09190612096565b60405180910390f35b6103e360048036038101906103de9190612452565b610a54565b005b6103ff60048036038101906103fa91906124ae565b610ade565b60405161040c9190611e8f565b60405180910390f35b61042f600480360381019061042a9190612295565b610b72565b005b600061043c82610bf8565b9050919050565b6060600080546104529061251d565b80601f016020809104026020016040519081016040528092919081815260200182805461047e9061251d565b80156104cb5780601f106104a0576101008083540402835291602001916104cb565b820191906000526020600020905b8154815290600101906020018083116104ae57829003601f168201915b5050505050905090565b60006104e082610c59565b506104ea82610ce1565b9050919050565b61050382826104fe610d1e565b610d26565b5050565b6000600854905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105835760006040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161057a9190612000565b60405180910390fd5b60006105978383610592610d1e565b610d38565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461060d578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016106049392919061254e565b60405180910390fd5b50505050565b61061b610f52565b6106258282610fd9565b5050565b6106448383836040518060200160405280600081525061094e565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106a357600080fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006106f282610c59565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361076c5760006040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016107639190612000565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6107bb610f52565b6107c56000611035565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461084b57600080fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6060600180546108b59061251d565b80601f01602080910402602001604051908101604052809291908181526020018280546108e19061251d565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b5050505050905090565b61094a610943610d1e565b83836110fb565b5050565b610959848484610511565b6109658484848461126a565b50505050565b606061097682611421565b9050919050565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109d557600080fd5b600854600b5411610a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a12906125d1565b60405180910390fd5b600060086000815480929190610a3090612620565b919050559050610a408482611534565b610a4a8184610fd9565b8091505092915050565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610aaa57600080fd5b600060086000815480929190610abf90612620565b919050559050610acf838261162d565b610ad98183610fd9565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610b7a610f52565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bec5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610be39190612000565b60405180910390fd5b610bf581611035565b50565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c525750610c518261164b565b5b9050919050565b600080610c658361172d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cd857826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610ccf9190612096565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b610d33838383600161176a565b505050565b600080610d448461172d565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610d8657610d8581848661192f565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e1757610dc860008560008061176a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610e9a576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b610f5a610d1e565b73ffffffffffffffffffffffffffffffffffffffff16610f786107c7565b73ffffffffffffffffffffffffffffffffffffffff1614610fd757610f9b610d1e565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610fce9190612000565b60405180910390fd5b565b80600660008481526020019081526020016000209081610ff99190612814565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7826040516110299190612096565b60405180910390a15050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361116c57816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016111639190612000565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161125d9190611e8f565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b111561141b578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026112ae610d1e565b8685856040518563ffffffff1660e01b81526004016112d0949392919061293b565b6020604051808303816000875af192505050801561130c57506040513d601f19601f82011682018060405250810190611309919061299c565b60015b611390573d806000811461133c576040519150601f19603f3d011682016040523d82523d6000602084013e611341565b606091505b50600081510361138857836040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161137f9190612000565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461141957836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016114109190612000565b60405180910390fd5b505b50505050565b606061142c82610c59565b50600060066000848152602001908152602001600020805461144d9061251d565b80601f01602080910402602001604051908101604052809291908181526020018280546114799061251d565b80156114c65780601f1061149b576101008083540402835291602001916114c6565b820191906000526020600020905b8154815290600101906020018083116114a957829003601f168201915b5050505050905060006114d76119f3565b905060008151036114ec57819250505061152f565b600082511115611521578082604051602001611509929190612a05565b6040516020818303038152906040529250505061152f565b61152a84611a0a565b925050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a65760006040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161159d9190612000565b60405180910390fd5b60006115b483836000610d38565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116285760006040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260040161161f9190612000565b60405180910390fd5b505050565b611647828260405180602001604052806000815250611a73565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061171657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611726575061172582611a8f565b5b9050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806117a35750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156118d75760006117b384610c59565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561181e57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611831575061182f8184610ade565b155b1561187357826040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815260040161186a9190612000565b60405180910390fd5b81156118d557838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b61193a838383611af9565b6119ee57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119af57806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016119a69190612096565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016119e5929190612a29565b60405180910390fd5b505050565b606060405180602001604052806000815250905090565b6060611a1582610c59565b506000611a206119f3565b90506000815111611a405760405180602001604052806000815250611a6b565b80611a4a84611bba565b604051602001611a5b929190612a05565b6040516020818303038152906040525b915050919050565b611a7d8383611534565b611a8a600084848461126a565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611bb157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b725750611b718484610ade565b5b80611bb057508273ffffffffffffffffffffffffffffffffffffffff16611b9883610ce1565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b606060006001611bc984611c88565b01905060008167ffffffffffffffff811115611be857611be761210e565b5b6040519080825280601f01601f191660200182016040528015611c1a5781602001600182028036833780820191505090505b509050600082602001820190505b600115611c7d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611c7157611c70612a52565b5b04945060008503611c28575b819350505050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611ce6577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611cdc57611cdb612a52565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611d23576d04ee2d6d415b85acef81000000008381611d1957611d18612a52565b5b0492506020810190505b662386f26fc100008310611d5257662386f26fc100008381611d4857611d47612a52565b5b0492506010810190505b6305f5e1008310611d7b576305f5e1008381611d7157611d70612a52565b5b0492506008810190505b6127108310611da0576127108381611d9657611d95612a52565b5b0492506004810190505b60648310611dc35760648381611db957611db8612a52565b5b0492506002810190505b600a8310611dd2576001810190505b80915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611e2481611def565b8114611e2f57600080fd5b50565b600081359050611e4181611e1b565b92915050565b600060208284031215611e5d57611e5c611de5565b5b6000611e6b84828501611e32565b91505092915050565b60008115159050919050565b611e8981611e74565b82525050565b6000602082019050611ea46000830184611e80565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ee4578082015181840152602081019050611ec9565b60008484015250505050565b6000601f19601f8301169050919050565b6000611f0c82611eaa565b611f168185611eb5565b9350611f26818560208601611ec6565b611f2f81611ef0565b840191505092915050565b60006020820190508181036000830152611f548184611f01565b905092915050565b6000819050919050565b611f6f81611f5c565b8114611f7a57600080fd5b50565b600081359050611f8c81611f66565b92915050565b600060208284031215611fa857611fa7611de5565b5b6000611fb684828501611f7d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611fea82611fbf565b9050919050565b611ffa81611fdf565b82525050565b60006020820190506120156000830184611ff1565b92915050565b61202481611fdf565b811461202f57600080fd5b50565b6000813590506120418161201b565b92915050565b6000806040838503121561205e5761205d611de5565b5b600061206c85828601612032565b925050602061207d85828601611f7d565b9150509250929050565b61209081611f5c565b82525050565b60006020820190506120ab6000830184612087565b92915050565b6000806000606084860312156120ca576120c9611de5565b5b60006120d886828701612032565b93505060206120e986828701612032565b92505060406120fa86828701611f7d565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61214682611ef0565b810181811067ffffffffffffffff821117156121655761216461210e565b5b80604052505050565b6000612178611ddb565b9050612184828261213d565b919050565b600067ffffffffffffffff8211156121a4576121a361210e565b5b6121ad82611ef0565b9050602081019050919050565b82818337600083830152505050565b60006121dc6121d784612189565b61216e565b9050828152602081018484840111156121f8576121f7612109565b5b6122038482856121ba565b509392505050565b600082601f8301126122205761221f612104565b5b81356122308482602086016121c9565b91505092915050565b600080604083850312156122505761224f611de5565b5b600061225e85828601611f7d565b925050602083013567ffffffffffffffff81111561227f5761227e611dea565b5b61228b8582860161220b565b9150509250929050565b6000602082840312156122ab576122aa611de5565b5b60006122b984828501612032565b91505092915050565b6122cb81611e74565b81146122d657600080fd5b50565b6000813590506122e8816122c2565b92915050565b6000806040838503121561230557612304611de5565b5b600061231385828601612032565b9250506020612324858286016122d9565b9150509250929050565b600067ffffffffffffffff8211156123495761234861210e565b5b61235282611ef0565b9050602081019050919050565b600061237261236d8461232e565b61216e565b90508281526020810184848401111561238e5761238d612109565b5b6123998482856121ba565b509392505050565b600082601f8301126123b6576123b5612104565b5b81356123c684826020860161235f565b91505092915050565b600080600080608085870312156123e9576123e8611de5565b5b60006123f787828801612032565b945050602061240887828801612032565b935050604061241987828801611f7d565b925050606085013567ffffffffffffffff81111561243a57612439611dea565b5b612446878288016123a1565b91505092959194509250565b6000806040838503121561246957612468611de5565b5b600061247785828601612032565b925050602083013567ffffffffffffffff81111561249857612497611dea565b5b6124a48582860161220b565b9150509250929050565b600080604083850312156124c5576124c4611de5565b5b60006124d385828601612032565b92505060206124e485828601612032565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061253557607f821691505b602082108103612548576125476124ee565b5b50919050565b60006060820190506125636000830186611ff1565b6125706020830185612087565b61257d6040830184611ff1565b949350505050565b7f416c6c20746f6b656e206d696e74656400000000000000000000000000000000600082015250565b60006125bb601083611eb5565b91506125c682612585565b602082019050919050565b600060208201905081810360008301526125ea816125ae565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061262b82611f5c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361265d5761265c6125f1565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026126ca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261268d565b6126d4868361268d565b95508019841693508086168417925050509392505050565b6000819050919050565b600061271161270c61270784611f5c565b6126ec565b611f5c565b9050919050565b6000819050919050565b61272b836126f6565b61273f61273782612718565b84845461269a565b825550505050565b600090565b612754612747565b61275f818484612722565b505050565b5b818110156127835761277860008261274c565b600181019050612765565b5050565b601f8211156127c85761279981612668565b6127a28461267d565b810160208510156127b1578190505b6127c56127bd8561267d565b830182612764565b50505b505050565b600082821c905092915050565b60006127eb600019846008026127cd565b1980831691505092915050565b600061280483836127da565b9150826002028217905092915050565b61281d82611eaa565b67ffffffffffffffff8111156128365761283561210e565b5b612840825461251d565b61284b828285612787565b600060209050601f83116001811461287e576000841561286c578287015190505b61287685826127f8565b8655506128de565b601f19841661288c86612668565b60005b828110156128b45784890151825560018201915060208501945060208101905061288f565b868310156128d157848901516128cd601f8916826127da565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b600082825260208201905092915050565b600061290d826128e6565b61291781856128f1565b9350612927818560208601611ec6565b61293081611ef0565b840191505092915050565b60006080820190506129506000830187611ff1565b61295d6020830186611ff1565b61296a6040830185612087565b818103606083015261297c8184612902565b905095945050505050565b60008151905061299681611e1b565b92915050565b6000602082840312156129b2576129b1611de5565b5b60006129c084828501612987565b91505092915050565b600081905092915050565b60006129df82611eaa565b6129e981856129c9565b93506129f9818560208601611ec6565b80840191505092915050565b6000612a1182856129d4565b9150612a1d82846129d4565b91508190509392505050565b6000604082019050612a3e6000830185611ff1565b612a4b6020830184612087565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea26469706673582212205e73f2afa9acfed211cb41672186ccd9eb941d0d440d298d7f7272449a8f78b464736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004872335a0087853fb2306abc865da2c078fa0149
-----Decoded View---------------
Arg [0] : initialOwner (address): 0x4872335A0087853fB2306ABc865Da2C078fa0149
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000004872335a0087853fb2306abc865da2c078fa0149
Deployed Bytecode Sourcemap
49647:2200:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51632:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31149:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32321:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32140:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51533:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32990:588;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51114:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33649:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50986:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30962:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30687:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18258:103;;;:::i;:::-;;17583:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50839:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31309:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32551:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33854:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51319:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50333:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50129:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32768:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18516:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51632:212;51771:4;51800:36;51824:11;51800:23;:36::i;:::-;51793:43;;51632:212;;;:::o;31149:91::-;31194:13;31227:5;31220:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31149:91;:::o;32321:158::-;32388:7;32408:22;32422:7;32408:13;:22::i;:::-;;32450:21;32463:7;32450:12;:21::i;:::-;32443:28;;32321:158;;;:::o;32140:115::-;32212:35;32221:2;32225:7;32234:12;:10;:12::i;:::-;32212:8;:35::i;:::-;32140:115;;:::o;51533:91::-;51577:7;51604:12;;51597:19;;51533:91;:::o;32990:588::-;33099:1;33085:16;;:2;:16;;;33081:89;;33155:1;33125:33;;;;;;;;;;;:::i;:::-;;;;;;;;33081:89;33391:21;33415:34;33423:2;33427:7;33436:12;:10;:12::i;:::-;33415:7;:34::i;:::-;33391:58;;33481:4;33464:21;;:13;:21;;;33460:111;;33530:4;33536:7;33545:13;33509:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;33460:111;33070:508;32990:588;;;:::o;51114:119::-;17469:13;:11;:13::i;:::-;51199:26:::1;51212:7;51221:3;51199:12;:26::i;:::-;51114:119:::0;;:::o;33649:134::-;33736:39;33753:4;33759:2;33763:7;33736:39;;;;;;;;;;;;:16;:39::i;:::-;33649:134;;;:::o;50986:110::-;50799:11;;;;;;;;;;;50785:25;;:10;:25;;;50777:34;;;;;;51076:12:::1;51062:11;;:26;;;;;;;;;;;;;;;;;;50986:110:::0;:::o;30962:120::-;31025:7;31052:22;31066:7;31052:13;:22::i;:::-;31045:29;;30962:120;;;:::o;30687:213::-;30750:7;30791:1;30774:19;;:5;:19;;;30770:89;;30844:1;30817:30;;;;;;;;;;;:::i;:::-;;;;;;;;30770:89;30876:9;:16;30886:5;30876:16;;;;;;;;;;;;;;;;30869:23;;30687:213;;;:::o;18258:103::-;17469:13;:11;:13::i;:::-;18323:30:::1;18350:1;18323:18;:30::i;:::-;18258:103::o:0;17583:87::-;17629:7;17656:6;;;;;;;;;;;17649:13;;17583:87;:::o;50839:139::-;50799:11;;;;;;;;;;;50785:25;;:10;:25;;;50777:34;;;;;;50962:8:::1;50928:19;:33;50948:12;50928:33;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;50839:139:::0;;:::o;31309:95::-;31356:13;31389:7;31382:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31309:95;:::o;32551:146::-;32637:52;32656:12;:10;:12::i;:::-;32670:8;32680;32637:18;:52::i;:::-;32551:146;;:::o;33854:211::-;33968:31;33981:4;33987:2;33991:7;33968:12;:31::i;:::-;34010:47;34033:4;34039:2;34043:7;34052:4;34010:22;:47::i;:::-;33854:211;;;;:::o;51319:206::-;51446:13;51494:23;51509:7;51494:14;:23::i;:::-;51487:30;;51319:206;;;:::o;50333:298::-;50413:7;50686:19;:31;50706:10;50686:31;;;;;;;;;;;;;;;;;;;;;;;;;50678:40;;;;;;50456:12:::1;;50441;;:27;50433:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;50500:15;50518:12;;:14;;;;;;;;;:::i;:::-;;;;;50500:32;;50543:18;50549:2;50553:7;50543:5;:18::i;:::-;50572:26;50585:7;50594:3;50572:12;:26::i;:::-;50616:7;50609:14;;;50333:298:::0;;;;:::o;50129:196::-;50686:19;:31;50706:10;50686:31;;;;;;;;;;;;;;;;;;;;;;;;;50678:40;;;;;;50215:15:::1;50233:12;;:14;;;;;;;;;:::i;:::-;;;;;50215:32;;50258:22;50268:2;50272:7;50258:9;:22::i;:::-;50291:26;50304:7;50313:3;50291:12;:26::i;:::-;50204:121;50129:196:::0;;:::o;32768:155::-;32856:4;32880:18;:25;32899:5;32880:25;;;;;;;;;;;;;;;:35;32906:8;32880:35;;;;;;;;;;;;;;;;;;;;;;;;;32873:42;;32768:155;;;;:::o;18516:220::-;17469:13;:11;:13::i;:::-;18621:1:::1;18601:22;;:8;:22;;::::0;18597:93:::1;;18675:1;18647:31;;;;;;;;;;;:::i;:::-;;;;;;;;18597:93;18700:28;18719:8;18700:18;:28::i;:::-;18516:220:::0;:::o;47714:209::-;47816:4;47529:10;47522:18;;47840:35;;;:11;:35;;;;:75;;;;47879:36;47903:11;47879:23;:36::i;:::-;47840:75;47833:82;;47714:209;;;:::o;45296:247::-;45359:7;45379:13;45395:17;45404:7;45395:8;:17::i;:::-;45379:33;;45444:1;45427:19;;:5;:19;;;45423:90;;45493:7;45470:31;;;;;;;;;;;:::i;:::-;;;;;;;;45423:90;45530:5;45523:12;;;45296:247;;;:::o;34827:129::-;34897:7;34924:15;:24;34940:7;34924:24;;;;;;;;;;;;;;;;;;;;;34917:31;;34827:129;;;:::o;15586:98::-;15639:7;15666:10;15659:17;;15586:98;:::o;43528:122::-;43609:33;43618:2;43622:7;43631:4;43637;43609:8;:33::i;:::-;43528:122;;;:::o;37789:824::-;37875:7;37895:12;37910:17;37919:7;37910:8;:17::i;:::-;37895:32;;38006:1;37990:18;;:4;:18;;;37986:88;;38025:37;38042:4;38048;38054:7;38025:16;:37::i;:::-;37986:88;38137:1;38121:18;;:4;:18;;;38117:263;;38239:48;38256:1;38260:7;38277:1;38281:5;38239:8;:48::i;:::-;38352:1;38333:9;:15;38343:4;38333:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;38117:263;38410:1;38396:16;;:2;:16;;;38392:111;;38475:1;38458:9;:13;38468:2;38458:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;38392:111;38534:2;38515:7;:16;38523:7;38515:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38573:7;38569:2;38554:27;;38563:4;38554:27;;;;;;;;;;;;38601:4;38594:11;;;37789:824;;;;;:::o;17748:166::-;17819:12;:10;:12::i;:::-;17808:23;;:7;:5;:7::i;:::-;:23;;;17804:103;;17882:12;:10;:12::i;:::-;17855:40;;;;;;;;;;;:::i;:::-;;;;;;;;17804:103;17748:166::o;48729:170::-;48843:9;48821:10;:19;48832:7;48821:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;48868:23;48883:7;48868:23;;;;;;:::i;:::-;;;;;;;;48729:170;;:::o;18896:191::-;18970:16;18989:6;;;;;;;;;;;18970:25;;19015:8;19006:6;;:17;;;;;;;;;;;;;;;;;;19070:8;19039:40;;19060:8;19039:40;;;;;;;;;;;;18959:128;18896:191;:::o;44735:318::-;44863:1;44843:22;;:8;:22;;;44839:93;;44911:8;44889:31;;;;;;;;;;;:::i;:::-;;;;;;;;44839:93;44980:8;44942:18;:25;44961:5;44942:25;;;;;;;;;;;;;;;:35;44968:8;44942:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45026:8;45004:41;;45019:5;45004:41;;;45036:8;45004:41;;;;;;:::i;:::-;;;;;;;;44735:318;;;:::o;46093:799::-;46227:1;46210:2;:14;;;:18;46206:679;;;46265:2;46249:36;;;46286:12;:10;:12::i;:::-;46300:4;46306:7;46315:4;46249:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46245:629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46580:1;46563:6;:13;:18;46559:300;;46635:2;46613:25;;;;;;;;;;;:::i;:::-;;;;;;;;46559:300;46809:6;46803:13;46794:6;46790:2;46786:15;46779:38;46245:629;46378:41;;;46368:51;;;:6;:51;;;;46364:132;;46473:2;46451:25;;;;;;;;;;;:::i;:::-;;;;;;;;46364:132;46321:190;46206:679;46093:799;;;;:::o;47994:609::-;48067:13;48093:22;48107:7;48093:13;:22::i;:::-;;48128:23;48154:10;:19;48165:7;48154:19;;;;;;;;;;;48128:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48184:18;48205:10;:8;:10::i;:::-;48184:31;;48313:1;48297:4;48291:18;:23;48287:72;;48338:9;48331:16;;;;;;48287:72;48486:1;48466:9;48460:23;:27;48456:97;;;48525:4;48531:9;48511:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48504:37;;;;;;48456:97;48572:23;48587:7;48572:14;:23::i;:::-;48565:30;;;;47994:609;;;;:::o;38949:335::-;39031:1;39017:16;;:2;:16;;;39013:89;;39087:1;39057:33;;;;;;;;;;;:::i;:::-;;;;;;;;39013:89;39112:21;39136:32;39144:2;39148:7;39165:1;39136:7;:32::i;:::-;39112:56;;39208:1;39183:27;;:13;:27;;;39179:98;;39262:1;39234:31;;;;;;;;;;;:::i;:::-;;;;;;;;39179:98;39002:282;38949:335;;:::o;39647:102::-;39715:26;39725:2;39729:7;39715:26;;;;;;;;;;;;:9;:26::i;:::-;39647:102;;:::o;30318:305::-;30420:4;30472:25;30457:40;;;:11;:40;;;;:105;;;;30529:33;30514:48;;;:11;:48;;;;30457:105;:158;;;;30579:36;30603:11;30579:23;:36::i;:::-;30457:158;30437:178;;30318:305;;;:::o;34589:117::-;34655:7;34682;:16;34690:7;34682:16;;;;;;;;;;;;;;;;;;;;;34675:23;;34589:117;;;:::o;43838:678::-;44000:9;:31;;;;44029:1;44013:18;;:4;:18;;;;44000:31;43996:471;;;44048:13;44064:22;44078:7;44064:13;:22::i;:::-;44048:38;;44233:1;44217:18;;:4;:18;;;;:35;;;;;44248:4;44239:13;;:5;:13;;;;44217:35;:69;;;;;44257:29;44274:5;44281:4;44257:16;:29::i;:::-;44256:30;44217:69;44213:144;;;44336:4;44314:27;;;;;;;;;;;:::i;:::-;;;;;;;;44213:144;44377:9;44373:83;;;44432:7;44428:2;44412:28;;44421:5;44412:28;;;;;;;;;;;;44373:83;44033:434;43996:471;44506:2;44479:15;:24;44495:7;44479:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43838:678;;;;:::o;35996:376::-;36109:38;36123:5;36130:7;36139;36109:13;:38::i;:::-;36104:261;;36185:1;36168:19;;:5;:19;;;36164:190;;36238:7;36215:31;;;;;;;;;;;:::i;:::-;;;;;;;;36164:190;36321:7;36330;36294:44;;;;;;;;;;;;:::i;:::-;;;;;;;;36104:261;35996:376;;;:::o;31984:94::-;32035:13;32061:9;;;;;;;;;;;;;;31984:94;:::o;31475:260::-;31539:13;31565:22;31579:7;31565:13;:22::i;:::-;;31600:21;31624:10;:8;:10::i;:::-;31600:34;;31676:1;31658:7;31652:21;:25;:75;;;;;;;;;;;;;;;;;31694:7;31703:18;:7;:16;:18::i;:::-;31680:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31652:75;31645:82;;;31475:260;;;:::o;39976:185::-;40071:18;40077:2;40081:7;40071:5;:18::i;:::-;40100:53;40131:1;40135:2;40139:7;40148:4;40100:22;:53::i;:::-;39976:185;;;:::o;22062:148::-;22138:4;22177:25;22162:40;;;:11;:40;;;;22155:47;;22062:148;;;:::o;35276:276::-;35379:4;35435:1;35416:21;;:7;:21;;;;:128;;;;;35464:7;35455:16;;:5;:16;;;:52;;;;35475:32;35492:5;35499:7;35475:16;:32::i;:::-;35455:52;:88;;;;35536:7;35511:32;;:21;35524:7;35511:12;:21::i;:::-;:32;;;35455:88;35416:128;35396:148;;35276:276;;;;;:::o;12350:718::-;12406:13;12457:14;12494:1;12474:17;12485:5;12474:10;:17::i;:::-;:21;12457:38;;12510:20;12544:6;12533:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12510:41;;12566:11;12695:6;12691:2;12687:15;12679:6;12675:28;12668:35;;12732:290;12739:4;12732:290;;;12764:5;;;;;;;;12906:10;12901:2;12894:5;12890:14;12885:32;12880:3;12872:46;12964:2;12955:11;;;;;;:::i;:::-;;;;;12998:1;12989:5;:10;12732:290;12985:21;12732:290;13043:6;13036:13;;;;;12350:718;;;:::o;8748:948::-;8801:7;8821:14;8838:1;8821:18;;8888:8;8879:5;:17;8875:106;;8926:8;8917:17;;;;;;:::i;:::-;;;;;8963:2;8953:12;;;;8875:106;9008:8;8999:5;:17;8995:106;;9046:8;9037:17;;;;;;:::i;:::-;;;;;9083:2;9073:12;;;;8995:106;9128:8;9119:5;:17;9115:106;;9166:8;9157:17;;;;;;:::i;:::-;;;;;9203:2;9193:12;;;;9115:106;9248:7;9239:5;:16;9235:103;;9285:7;9276:16;;;;;;:::i;:::-;;;;;9321:1;9311:11;;;;9235:103;9365:7;9356:5;:16;9352:103;;9402:7;9393:16;;;;;;:::i;:::-;;;;;9438:1;9428:11;;;;9352:103;9482:7;9473:5;:16;9469:103;;9519:7;9510:16;;;;;;:::i;:::-;;;;;9555:1;9545:11;;;;9469:103;9599:7;9590:5;:16;9586:68;;9637:1;9627:11;;;;9586:68;9682:6;9675:13;;;8748:948;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:180;6161:77;6158:1;6151:88;6258:4;6255:1;6248:15;6282:4;6279:1;6272:15;6299:281;6382:27;6404:4;6382:27;:::i;:::-;6374:6;6370:40;6512:6;6500:10;6497:22;6476:18;6464:10;6461:34;6458:62;6455:88;;;6523:18;;:::i;:::-;6455:88;6563:10;6559:2;6552:22;6342:238;6299:281;;:::o;6586:129::-;6620:6;6647:20;;:::i;:::-;6637:30;;6676:33;6704:4;6696:6;6676:33;:::i;:::-;6586:129;;;:::o;6721:308::-;6783:4;6873:18;6865:6;6862:30;6859:56;;;6895:18;;:::i;:::-;6859:56;6933:29;6955:6;6933:29;:::i;:::-;6925:37;;7017:4;7011;7007:15;6999:23;;6721:308;;;:::o;7035:146::-;7132:6;7127:3;7122;7109:30;7173:1;7164:6;7159:3;7155:16;7148:27;7035:146;;;:::o;7187:425::-;7265:5;7290:66;7306:49;7348:6;7306:49;:::i;:::-;7290:66;:::i;:::-;7281:75;;7379:6;7372:5;7365:21;7417:4;7410:5;7406:16;7455:3;7446:6;7441:3;7437:16;7434:25;7431:112;;;7462:79;;:::i;:::-;7431:112;7552:54;7599:6;7594:3;7589;7552:54;:::i;:::-;7271:341;7187:425;;;;;:::o;7632:340::-;7688:5;7737:3;7730:4;7722:6;7718:17;7714:27;7704:122;;7745:79;;:::i;:::-;7704:122;7862:6;7849:20;7887:79;7962:3;7954:6;7947:4;7939:6;7935:17;7887:79;:::i;:::-;7878:88;;7694:278;7632:340;;;;:::o;7978:654::-;8056:6;8064;8113:2;8101:9;8092:7;8088:23;8084:32;8081:119;;;8119:79;;:::i;:::-;8081:119;8239:1;8264:53;8309:7;8300:6;8289:9;8285:22;8264:53;:::i;:::-;8254:63;;8210:117;8394:2;8383:9;8379:18;8366:32;8425:18;8417:6;8414:30;8411:117;;;8447:79;;:::i;:::-;8411:117;8552:63;8607:7;8598:6;8587:9;8583:22;8552:63;:::i;:::-;8542:73;;8337:288;7978:654;;;;;:::o;8638:329::-;8697:6;8746:2;8734:9;8725:7;8721:23;8717:32;8714:119;;;8752:79;;:::i;:::-;8714:119;8872:1;8897:53;8942:7;8933:6;8922:9;8918:22;8897:53;:::i;:::-;8887:63;;8843:117;8638:329;;;;:::o;8973:116::-;9043:21;9058:5;9043:21;:::i;:::-;9036:5;9033:32;9023:60;;9079:1;9076;9069:12;9023:60;8973:116;:::o;9095:133::-;9138:5;9176:6;9163:20;9154:29;;9192:30;9216:5;9192:30;:::i;:::-;9095:133;;;;:::o;9234:468::-;9299:6;9307;9356:2;9344:9;9335:7;9331:23;9327:32;9324:119;;;9362:79;;:::i;:::-;9324:119;9482:1;9507:53;9552:7;9543:6;9532:9;9528:22;9507:53;:::i;:::-;9497:63;;9453:117;9609:2;9635:50;9677:7;9668:6;9657:9;9653:22;9635:50;:::i;:::-;9625:60;;9580:115;9234:468;;;;;:::o;9708:307::-;9769:4;9859:18;9851:6;9848:30;9845:56;;;9881:18;;:::i;:::-;9845:56;9919:29;9941:6;9919:29;:::i;:::-;9911:37;;10003:4;9997;9993:15;9985:23;;9708:307;;;:::o;10021:423::-;10098:5;10123:65;10139:48;10180:6;10139:48;:::i;:::-;10123:65;:::i;:::-;10114:74;;10211:6;10204:5;10197:21;10249:4;10242:5;10238:16;10287:3;10278:6;10273:3;10269:16;10266:25;10263:112;;;10294:79;;:::i;:::-;10263:112;10384:54;10431:6;10426:3;10421;10384:54;:::i;:::-;10104:340;10021:423;;;;;:::o;10463:338::-;10518:5;10567:3;10560:4;10552:6;10548:17;10544:27;10534:122;;10575:79;;:::i;:::-;10534:122;10692:6;10679:20;10717:78;10791:3;10783:6;10776:4;10768:6;10764:17;10717:78;:::i;:::-;10708:87;;10524:277;10463:338;;;;:::o;10807:943::-;10902:6;10910;10918;10926;10975:3;10963:9;10954:7;10950:23;10946:33;10943:120;;;10982:79;;:::i;:::-;10943:120;11102:1;11127:53;11172:7;11163:6;11152:9;11148:22;11127:53;:::i;:::-;11117:63;;11073:117;11229:2;11255:53;11300:7;11291:6;11280:9;11276:22;11255:53;:::i;:::-;11245:63;;11200:118;11357:2;11383:53;11428:7;11419:6;11408:9;11404:22;11383:53;:::i;:::-;11373:63;;11328:118;11513:2;11502:9;11498:18;11485:32;11544:18;11536:6;11533:30;11530:117;;;11566:79;;:::i;:::-;11530:117;11671:62;11725:7;11716:6;11705:9;11701:22;11671:62;:::i;:::-;11661:72;;11456:287;10807:943;;;;;;;:::o;11756:654::-;11834:6;11842;11891:2;11879:9;11870:7;11866:23;11862:32;11859:119;;;11897:79;;:::i;:::-;11859:119;12017:1;12042:53;12087:7;12078:6;12067:9;12063:22;12042:53;:::i;:::-;12032:63;;11988:117;12172:2;12161:9;12157:18;12144:32;12203:18;12195:6;12192:30;12189:117;;;12225:79;;:::i;:::-;12189:117;12330:63;12385:7;12376:6;12365:9;12361:22;12330:63;:::i;:::-;12320:73;;12115:288;11756:654;;;;;:::o;12416:474::-;12484:6;12492;12541:2;12529:9;12520:7;12516:23;12512:32;12509:119;;;12547:79;;:::i;:::-;12509:119;12667:1;12692:53;12737:7;12728:6;12717:9;12713:22;12692:53;:::i;:::-;12682:63;;12638:117;12794:2;12820:53;12865:7;12856:6;12845:9;12841:22;12820:53;:::i;:::-;12810:63;;12765:118;12416:474;;;;;:::o;12896:180::-;12944:77;12941:1;12934:88;13041:4;13038:1;13031:15;13065:4;13062:1;13055:15;13082:320;13126:6;13163:1;13157:4;13153:12;13143:22;;13210:1;13204:4;13200:12;13231:18;13221:81;;13287:4;13279:6;13275:17;13265:27;;13221:81;13349:2;13341:6;13338:14;13318:18;13315:38;13312:84;;13368:18;;:::i;:::-;13312:84;13133:269;13082:320;;;:::o;13408:442::-;13557:4;13595:2;13584:9;13580:18;13572:26;;13608:71;13676:1;13665:9;13661:17;13652:6;13608:71;:::i;:::-;13689:72;13757:2;13746:9;13742:18;13733:6;13689:72;:::i;:::-;13771;13839:2;13828:9;13824:18;13815:6;13771:72;:::i;:::-;13408:442;;;;;;:::o;13856:166::-;13996:18;13992:1;13984:6;13980:14;13973:42;13856:166;:::o;14028:366::-;14170:3;14191:67;14255:2;14250:3;14191:67;:::i;:::-;14184:74;;14267:93;14356:3;14267:93;:::i;:::-;14385:2;14380:3;14376:12;14369:19;;14028:366;;;:::o;14400:419::-;14566:4;14604:2;14593:9;14589:18;14581:26;;14653:9;14647:4;14643:20;14639:1;14628:9;14624:17;14617:47;14681:131;14807:4;14681:131;:::i;:::-;14673:139;;14400:419;;;:::o;14825:180::-;14873:77;14870:1;14863:88;14970:4;14967:1;14960:15;14994:4;14991:1;14984:15;15011:233;15050:3;15073:24;15091:5;15073:24;:::i;:::-;15064:33;;15119:66;15112:5;15109:77;15106:103;;15189:18;;:::i;:::-;15106:103;15236:1;15229:5;15225:13;15218:20;;15011:233;;;:::o;15250:141::-;15299:4;15322:3;15314:11;;15345:3;15342:1;15335:14;15379:4;15376:1;15366:18;15358:26;;15250:141;;;:::o;15397:93::-;15434:6;15481:2;15476;15469:5;15465:14;15461:23;15451:33;;15397:93;;;:::o;15496:107::-;15540:8;15590:5;15584:4;15580:16;15559:37;;15496:107;;;;:::o;15609:393::-;15678:6;15728:1;15716:10;15712:18;15751:97;15781:66;15770:9;15751:97;:::i;:::-;15869:39;15899:8;15888:9;15869:39;:::i;:::-;15857:51;;15941:4;15937:9;15930:5;15926:21;15917:30;;15990:4;15980:8;15976:19;15969:5;15966:30;15956:40;;15685:317;;15609:393;;;;;:::o;16008:60::-;16036:3;16057:5;16050:12;;16008:60;;;:::o;16074:142::-;16124:9;16157:53;16175:34;16184:24;16202:5;16184:24;:::i;:::-;16175:34;:::i;:::-;16157:53;:::i;:::-;16144:66;;16074:142;;;:::o;16222:75::-;16265:3;16286:5;16279:12;;16222:75;;;:::o;16303:269::-;16413:39;16444:7;16413:39;:::i;:::-;16474:91;16523:41;16547:16;16523:41;:::i;:::-;16515:6;16508:4;16502:11;16474:91;:::i;:::-;16468:4;16461:105;16379:193;16303:269;;;:::o;16578:73::-;16623:3;16578:73;:::o;16657:189::-;16734:32;;:::i;:::-;16775:65;16833:6;16825;16819:4;16775:65;:::i;:::-;16710:136;16657:189;;:::o;16852:186::-;16912:120;16929:3;16922:5;16919:14;16912:120;;;16983:39;17020:1;17013:5;16983:39;:::i;:::-;16956:1;16949:5;16945:13;16936:22;;16912:120;;;16852:186;;:::o;17044:543::-;17145:2;17140:3;17137:11;17134:446;;;17179:38;17211:5;17179:38;:::i;:::-;17263:29;17281:10;17263:29;:::i;:::-;17253:8;17249:44;17446:2;17434:10;17431:18;17428:49;;;17467:8;17452:23;;17428:49;17490:80;17546:22;17564:3;17546:22;:::i;:::-;17536:8;17532:37;17519:11;17490:80;:::i;:::-;17149:431;;17134:446;17044:543;;;:::o;17593:117::-;17647:8;17697:5;17691:4;17687:16;17666:37;;17593:117;;;;:::o;17716:169::-;17760:6;17793:51;17841:1;17837:6;17829:5;17826:1;17822:13;17793:51;:::i;:::-;17789:56;17874:4;17868;17864:15;17854:25;;17767:118;17716:169;;;;:::o;17890:295::-;17966:4;18112:29;18137:3;18131:4;18112:29;:::i;:::-;18104:37;;18174:3;18171:1;18167:11;18161:4;18158:21;18150:29;;17890:295;;;;:::o;18190:1395::-;18307:37;18340:3;18307:37;:::i;:::-;18409:18;18401:6;18398:30;18395:56;;;18431:18;;:::i;:::-;18395:56;18475:38;18507:4;18501:11;18475:38;:::i;:::-;18560:67;18620:6;18612;18606:4;18560:67;:::i;:::-;18654:1;18678:4;18665:17;;18710:2;18702:6;18699:14;18727:1;18722:618;;;;19384:1;19401:6;19398:77;;;19450:9;19445:3;19441:19;19435:26;19426:35;;19398:77;19501:67;19561:6;19554:5;19501:67;:::i;:::-;19495:4;19488:81;19357:222;18692:887;;18722:618;18774:4;18770:9;18762:6;18758:22;18808:37;18840:4;18808:37;:::i;:::-;18867:1;18881:208;18895:7;18892:1;18889:14;18881:208;;;18974:9;18969:3;18965:19;18959:26;18951:6;18944:42;19025:1;19017:6;19013:14;19003:24;;19072:2;19061:9;19057:18;19044:31;;18918:4;18915:1;18911:12;18906:17;;18881:208;;;19117:6;19108:7;19105:19;19102:179;;;19175:9;19170:3;19166:19;19160:26;19218:48;19260:4;19252:6;19248:17;19237:9;19218:48;:::i;:::-;19210:6;19203:64;19125:156;19102:179;19327:1;19323;19315:6;19311:14;19307:22;19301:4;19294:36;18729:611;;;18692:887;;18282:1303;;;18190:1395;;:::o;19591:98::-;19642:6;19676:5;19670:12;19660:22;;19591:98;;;:::o;19695:168::-;19778:11;19812:6;19807:3;19800:19;19852:4;19847:3;19843:14;19828:29;;19695:168;;;;:::o;19869:373::-;19955:3;19983:38;20015:5;19983:38;:::i;:::-;20037:70;20100:6;20095:3;20037:70;:::i;:::-;20030:77;;20116:65;20174:6;20169:3;20162:4;20155:5;20151:16;20116:65;:::i;:::-;20206:29;20228:6;20206:29;:::i;:::-;20201:3;20197:39;20190:46;;19959:283;19869:373;;;;:::o;20248:640::-;20443:4;20481:3;20470:9;20466:19;20458:27;;20495:71;20563:1;20552:9;20548:17;20539:6;20495:71;:::i;:::-;20576:72;20644:2;20633:9;20629:18;20620:6;20576:72;:::i;:::-;20658;20726:2;20715:9;20711:18;20702:6;20658:72;:::i;:::-;20777:9;20771:4;20767:20;20762:2;20751:9;20747:18;20740:48;20805:76;20876:4;20867:6;20805:76;:::i;:::-;20797:84;;20248:640;;;;;;;:::o;20894:141::-;20950:5;20981:6;20975:13;20966:22;;20997:32;21023:5;20997:32;:::i;:::-;20894:141;;;;:::o;21041:349::-;21110:6;21159:2;21147:9;21138:7;21134:23;21130:32;21127:119;;;21165:79;;:::i;:::-;21127:119;21285:1;21310:63;21365:7;21356:6;21345:9;21341:22;21310:63;:::i;:::-;21300:73;;21256:127;21041:349;;;;:::o;21396:148::-;21498:11;21535:3;21520:18;;21396:148;;;;:::o;21550:390::-;21656:3;21684:39;21717:5;21684:39;:::i;:::-;21739:89;21821:6;21816:3;21739:89;:::i;:::-;21732:96;;21837:65;21895:6;21890:3;21883:4;21876:5;21872:16;21837:65;:::i;:::-;21927:6;21922:3;21918:16;21911:23;;21660:280;21550:390;;;;:::o;21946:435::-;22126:3;22148:95;22239:3;22230:6;22148:95;:::i;:::-;22141:102;;22260:95;22351:3;22342:6;22260:95;:::i;:::-;22253:102;;22372:3;22365:10;;21946:435;;;;;:::o;22387:332::-;22508:4;22546:2;22535:9;22531:18;22523:26;;22559:71;22627:1;22616:9;22612:17;22603:6;22559:71;:::i;:::-;22640:72;22708:2;22697:9;22693:18;22684:6;22640:72;:::i;:::-;22387:332;;;;;:::o;22725:180::-;22773:77;22770:1;22763:88;22870:4;22867:1;22860:15;22894:4;22891:1;22884:15
Swarm Source
ipfs://5e73f2afa9acfed211cb41672186ccd9eb941d0d440d298d7f7272449a8f78b4
[ 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.