Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
3,950 JIDORI
Holders
1,218
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 JIDORILoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Jidori
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-03 */ // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: erc721a/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/jidori.sol /* ┌───────┐ ┌─┐ ┌────────┐ └──┐ ┌──┘ | | | ○ | | | | | | | | | __| | ___ _ __ | | | | ● / __ | / _ \ | |/ / ● | FIND | __ | | ┌─┐ / / | | | | | | | / ┌─┐ | YOUR | \ \/ / | | | \__| | | |_| | | | | | | SELFIE | \__/ |_| \_____| \___/ |_| |_| └────────┘ */ pragma solidity ^0.8.4; contract Jidori is Ownable, ERC721A, ReentrancyGuard { mapping(address => uint256) public whitelistPurchased; struct JidoriConfig { bytes32 rootHash; bool paused; bool isPublicSale; bool isPreSale; uint256 preSaleMaxMint; uint256 publicSaleMaxMint; uint256 publicSalePrice; uint256 preSalePrice; uint256 maxSupply; uint256 devMintAmount; uint256 freeSlots; } JidoriConfig public jidoriConfig; constructor() ERC721A("Jidori", "JIDORI") { initConfig( 0x0000000000000000000000000000000000000000000000000000000000000000, true, false, true, 2, 8, 9000000000000000, 0, 4000, 50, 0 ); } function initConfig( bytes32 rootHash, bool paused, bool isPublicSale, bool isPreSale, uint256 preSaleMaxMint, uint256 publicSaleMaxMint, uint256 publicSalePrice, uint256 preSalePrice, uint256 maxSupply, uint256 devMintAmount, uint256 freeSlots ) private onlyOwner { jidoriConfig.rootHash = rootHash; jidoriConfig.paused = paused; jidoriConfig.isPublicSale = isPublicSale; jidoriConfig.isPreSale = isPreSale; jidoriConfig.preSaleMaxMint = preSaleMaxMint; jidoriConfig.publicSaleMaxMint = publicSaleMaxMint; jidoriConfig.publicSalePrice = publicSalePrice; jidoriConfig.preSalePrice = preSalePrice; jidoriConfig.maxSupply = maxSupply; jidoriConfig.devMintAmount = devMintAmount; jidoriConfig.freeSlots = freeSlots; } function preSaleMint(uint256 quantity, bytes32[] calldata proof) external payable { JidoriConfig memory config = jidoriConfig; bytes32 rootHash = bytes32(config.rootHash); bool paused = bool(config.paused); bool isPreSale = bool(config.isPreSale); uint256 preSaleMaxMint = uint256(config.preSaleMaxMint); uint256 devMintAmount = uint256(config.devMintAmount); uint256 maxSupply = uint256(config.maxSupply); require(!paused, "Sale paused or not start."); require(isPreSale, "Pre-sale not yet started."); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(proof, rootHash, leaf), "Proof invalid."); require( whitelistPurchased[msg.sender] + quantity <= preSaleMaxMint, "Reached the maximum amount of whitelisted wallet." ); require( totalSupply() + quantity + devMintAmount <= maxSupply, "Insufficient quantity left." ); whitelistPurchased[msg.sender] += quantity; _safeMint(msg.sender, quantity); } function publicSaleMint(uint256 quantity) external payable { JidoriConfig memory config = jidoriConfig; bool paused = bool(config.paused); bool isPublicSale = bool(config.isPublicSale); uint256 publicSalePrice = uint256(config.publicSalePrice); uint256 publicSaleMaxMint = uint256(config.publicSaleMaxMint); uint256 preSaleMaxMint = uint256(config.preSaleMaxMint); uint256 devMintAmount = uint256(config.devMintAmount); uint256 maxSupply = uint256(config.maxSupply); uint256 freeSlots = uint256(config.freeSlots); require(!paused, "Sale paused or not start."); require(isPublicSale, "Public-sale not yet started."); require( totalSupply() + quantity + devMintAmount <= maxSupply, "Insufficient quantity left." ); if (whitelistPurchased[msg.sender] == preSaleMaxMint) { require( addressMinted(msg.sender) + quantity <= publicSaleMaxMint + preSaleMaxMint, "Exceeds the maximum number per wallet." ); } else { require( addressMinted(msg.sender) + quantity <= publicSaleMaxMint, "Exceeds the maximum number per wallet." ); } if (totalSupply() + quantity <= freeSlots) { _safeMint(msg.sender, quantity); } else { require( quantity * publicSalePrice <= msg.value, "Insufficient balance." ); _safeMint(msg.sender, quantity); } } function flipSaleStatus() public onlyOwner { jidoriConfig.isPreSale = !jidoriConfig.isPreSale; jidoriConfig.isPublicSale = !jidoriConfig.isPublicSale; } function setPaused(bool _state) public onlyOwner { jidoriConfig.paused = _state; } function setRootHash(bytes32 _hash) public onlyOwner { jidoriConfig.rootHash = _hash; } function setFreeSlots(uint256 _slots) public onlyOwner { jidoriConfig.freeSlots = _slots; } function addressMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function devMint(uint256 quantity) external onlyOwner { JidoriConfig memory config = jidoriConfig; uint256 maxSupply = uint256(config.maxSupply); require(totalSupply() + quantity <= maxSupply, "Insufficient quantity left." ); uint256 numChunks = quantity / 5; for (uint256 i = 0; i < numChunks; i++) { _safeMint(msg.sender, 5); } } string private _baseTokenURI; function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function withdraw() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":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":"owner","type":"address"}],"name":"addressMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleStatus","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":[],"name":"jidoriConfig","outputs":[{"internalType":"bytes32","name":"rootHash","type":"bytes32"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"bool","name":"isPublicSale","type":"bool"},{"internalType":"bool","name":"isPreSale","type":"bool"},{"internalType":"uint256","name":"preSaleMaxMint","type":"uint256"},{"internalType":"uint256","name":"publicSaleMaxMint","type":"uint256"},{"internalType":"uint256","name":"publicSalePrice","type":"uint256"},{"internalType":"uint256","name":"preSalePrice","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"devMintAmount","type":"uint256"},{"internalType":"uint256","name":"freeSlots","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slots","type":"uint256"}],"name":"setFreeSlots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"setRootHash","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"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051806040016040528060068152602001654a69646f726960d01b815250604051806040016040528060068152602001654a49444f524960d01b8152506200006a62000064620000ca60201b60201c565b620000ce565b81516200007f906003906020850190620001de565b50805162000095906004906020840190620001de565b5050600060018181556009819055620000c49250818160026008661ff973cafa800084610fa06032826200011e565b620002c1565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146200017d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b600b9a909a55600c805461ffff191699151561ff00191699909917610100981515989098029790971762ff00001916620100009615159690960295909517909655600d92909255600e55600f55601092909255601191909155601255601355565b828054620001ec9062000284565b90600052602060002090601f0160209004810192826200021057600085556200025b565b82601f106200022b57805160ff19168380011785556200025b565b828001600101855582156200025b579182015b828111156200025b5782518255916020019190600101906200023e565b50620002699291506200026d565b5090565b5b808211156200026957600081556001016200026e565b600181811c908216806200029957607f821691505b60208210811415620002bb57634e487b7160e01b600052602260045260246000fd5b50919050565b6122ea80620002d16000396000f3fe6080604052600436106101c25760003560e01c806367d949a6116100f7578063b3ab66b011610095578063e985e9c511610064578063e985e9c5146104e0578063f2fde38b14610529578063f92134c714610549578063fa30297e146105f657600080fd5b8063b3ab66b014610478578063b88d4fde1461048b578063c87b56dd146104ab578063ce03ec93146104cb57600080fd5b80637e237e2e116100d15780637e237e2e146104055780638da5cb5b1461042557806395d89b4114610443578063a22cb4651461045857600080fd5b806367d949a6146103a357806370a08231146103d0578063715018a6146103f057600080fd5b80632d7eae661161016457806342842e0e1161013e57806342842e0e146103305780634c220f6e1461035057806355f804b3146103635780636352211e1461038357600080fd5b80632d7eae66146102db578063375a069a146102fb5780633ccfd60b1461031b57600080fd5b8063095ea7b3116101a0578063095ea7b31461025657806316c38b3c1461027857806318160ddd1461029857806323b872dd146102bb57600080fd5b806301ffc9a7146101c757806306fdde03146101fc578063081812fc1461021e575b600080fd5b3480156101d357600080fd5b506101e76101e2366004611ec6565b610616565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b50610211610668565b6040516101f39190612089565b34801561022a57600080fd5b5061023e610239366004611ead565b6106fa565b6040516001600160a01b0390911681526020016101f3565b34801561026257600080fd5b50610276610271366004611e68565b61073e565b005b34801561028457600080fd5b50610276610293366004611e92565b6107cc565b3480156102a457600080fd5b50600254600154035b6040519081526020016101f3565b3480156102c757600080fd5b506102766102d6366004611d26565b610812565b3480156102e757600080fd5b506102766102f6366004611ead565b61081d565b34801561030757600080fd5b50610276610316366004611ead565b61084c565b34801561032757600080fd5b50610276610966565b34801561033c57600080fd5b5061027661034b366004611d26565b610a7b565b61027661035e366004611f72565b610a96565b34801561036f57600080fd5b5061027661037e366004611f00565b610d77565b34801561038f57600080fd5b5061023e61039e366004611ead565b610dad565b3480156103af57600080fd5b506102ad6103be366004611cd8565b600a6020526000908152604090205481565b3480156103dc57600080fd5b506102ad6103eb366004611cd8565b610dbf565b3480156103fc57600080fd5b50610276610e0e565b34801561041157600080fd5b50610276610420366004611ead565b610e44565b34801561043157600080fd5b506000546001600160a01b031661023e565b34801561044f57600080fd5b50610211610e73565b34801561046457600080fd5b50610276610473366004611e3e565b610e82565b610276610486366004611ead565b610f18565b34801561049757600080fd5b506102766104a6366004611d62565b6111a3565b3480156104b757600080fd5b506102116104c6366004611ead565b6111f4565b3480156104d757600080fd5b50610276611279565b3480156104ec57600080fd5b506101e76104fb366004611cf3565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561053557600080fd5b50610276610544366004611cd8565b6112e2565b34801561055557600080fd5b50600b54600c54600d54600e54600f5460105460115460125460135461059d989760ff808216986101008304821698620100009093049091169690959194909391929091908b565b604080519b8c5299151560208c0152971515988a01989098529415156060890152608088019390935260a087019190915260c086015260e0850152610100840152610120830191909152610140820152610160016101f3565b34801561060257600080fd5b506102ad610611366004611cd8565b61137d565b60006001600160e01b031982166380ac58cd60e01b148061064757506001600160e01b03198216635b5e139f60e01b145b8061066257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610677906121dc565b80601f01602080910402602001604051908101604052809291908181526020018280546106a3906121dc565b80156106f05780601f106106c5576101008083540402835291602001916106f0565b820191906000526020600020905b8154815290600101906020018083116106d357829003601f168201915b5050505050905090565b6000610705826113ac565b610722576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061074982610dad565b9050806001600160a01b0316836001600160a01b0316141561077e5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061079e575061079c81336104fb565b155b156107bc576040516367d9dca160e11b815260040160405180910390fd5b6107c78383836113d8565b505050565b6000546001600160a01b031633146107ff5760405162461bcd60e51b81526004016107f69061209c565b60405180910390fd5b600c805460ff1916911515919091179055565b6107c7838383611434565b6000546001600160a01b031633146108475760405162461bcd60e51b81526004016107f69061209c565b600b55565b6000546001600160a01b031633146108765760405162461bcd60e51b81526004016107f69061209c565b6040805161016081018252600b548152600c5460ff808216151560208401526101008083048216151594840194909452620100009091041615156060820152600d546080820152600e5460a0820152600f5460c082015260105460e08201526011549181018290526012546101208201526013546101408201529080836109006002546001540390565b61090a919061214e565b11156109285760405162461bcd60e51b81526004016107f6906120d1565b6000610935600585612166565b905060005b8181101561095f5761094d336005611621565b8061095781612217565b91505061093a565b5050505050565b6000546001600160a01b031633146109905760405162461bcd60e51b81526004016107f69061209c565b600260095414156109e35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107f6565b6002600955604051600090339047908381818185875af1925050503d8060008114610a2a576040519150601f19603f3d011682016040523d82523d6000602084013e610a2f565b606091505b5050905080610a735760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016107f6565b506001600955565b6107c7838383604051806020016040528060008152506111a3565b6040805161016081018252600b54808252600c5460ff80821615801560208601819052610100808504841615159787019790975262010000909304909116151560608501819052600d5460808601819052600e5460a0870152600f5460c087015260105460e0870152601154968601879052601254610120870181905260135461014088015295969495939491939092909190610b715760405162461bcd60e51b815260206004820152601960248201527829b0b632903830bab9b2b21037b9103737ba1039ba30b93a1760391b60448201526064016107f6565b83610bbe5760405162461bcd60e51b815260206004820152601960248201527f5072652d73616c65206e6f742079657420737461727465642e0000000000000060448201526064016107f6565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610c378a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925085915061163f9050565b610c745760405162461bcd60e51b815260206004820152600e60248201526d283937b7b31034b73b30b634b21760911b60448201526064016107f6565b336000908152600a60205260409020548490610c91908d9061214e565b1115610cf95760405162461bcd60e51b815260206004820152603160248201527f5265616368656420746865206d6178696d756d20616d6f756e74206f6620776860448201527034ba32b634b9ba32b2103bb0b63632ba1760791b60648201526084016107f6565b81838c610d096002546001540390565b610d13919061214e565b610d1d919061214e565b1115610d3b5760405162461bcd60e51b81526004016107f6906120d1565b336000908152600a6020526040812080548d9290610d5a90849061214e565b90915550610d6a9050338c611621565b5050505050505050505050565b6000546001600160a01b03163314610da15760405162461bcd60e51b81526004016107f69061209c565b6107c760148383611c13565b6000610db882611655565b5192915050565b60006001600160a01b038216610de8576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b03163314610e385760405162461bcd60e51b81526004016107f69061209c565b610e426000611771565b565b6000546001600160a01b03163314610e6e5760405162461bcd60e51b81526004016107f69061209c565b601355565b606060048054610677906121dc565b6001600160a01b038216331415610eac5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040805161016081018252600b548152600c5460ff80821615801560208501819052610100808504841615159686018790526201000090940490921615156060850152600d5460808501819052600e5460a08601819052600f5460c0870181905260105460e08801526011549587018690526012546101208801819052601354610140890181905297989597959691959294909290610ff55760405162461bcd60e51b815260206004820152601960248201527829b0b632903830bab9b2b21037b9103737ba1039ba30b93a1760391b60448201526064016107f6565b866110425760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632d73616c65206e6f742079657420737461727465642e0000000060448201526064016107f6565b81838b6110526002546001540390565b61105c919061214e565b611066919061214e565b11156110845760405162461bcd60e51b81526004016107f6906120d1565b336000908152600a60205260409020548414156110dc576110a5848661214e565b8a6110af3361137d565b6110b9919061214e565b11156110d75760405162461bcd60e51b81526004016107f690612108565b61110f565b848a6110e73361137d565b6110f1919061214e565b111561110f5760405162461bcd60e51b81526004016107f690612108565b808a61111e6002546001540390565b611128919061214e565b1161113c57611137338b611621565b611197565b34611147878c61217a565b111561118d5760405162461bcd60e51b815260206004820152601560248201527424b739bab33334b1b4b2b73a103130b630b731b29760591b60448201526064016107f6565b611197338b611621565b50505050505050505050565b6111ae848484611434565b6001600160a01b0383163b151580156111d057506111ce848484846117c1565b155b156111ee576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606111ff826113ac565b61121c57604051630a14c4b560e41b815260040160405180910390fd5b60006112266118b9565b90508051600014156112475760405180602001604052806000815250611272565b80611251846118c8565b60405160200161126292919061201d565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146112a35760405162461bcd60e51b81526004016107f69061209c565b600c805461010060ff620100008084048216150262ff000019841681178390049091161590910261ff001990911662ffff001990921691909117179055565b6000546001600160a01b0316331461130c5760405162461bcd60e51b81526004016107f69061209c565b6001600160a01b0381166113715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f6565b61137a81611771565b50565b6001600160a01b038116600090815260066020526040812054600160401b900467ffffffffffffffff16610662565b600060015482108015610662575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061143f82611655565b9050836001600160a01b031681600001516001600160a01b0316146114765760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611494575061149485336104fb565b806114af5750336114a4846106fa565b6001600160a01b0316145b9050806114cf57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166114f657604051633a954ecd60e21b815260040160405180910390fd5b611502600084876113d8565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166115d85760015482146115d8578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461095f565b61163b8282604051806020016040528060008152506119c6565b5050565b60008261164c85846119d3565b14949350505050565b60408051606081018252600080825260208201819052918101919091528160015481101561175857600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906117565780516001600160a01b0316156116ec579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611751579392505050565b6116ec565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906117f690339089908890889060040161204c565b602060405180830381600087803b15801561181057600080fd5b505af1925050508015611840575060408051601f3d908101601f1916820190925261183d91810190611ee3565b60015b61189b573d80801561186e576040519150601f19603f3d011682016040523d82523d6000602084013e611873565b606091505b508051611893576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060148054610677906121dc565b6060816118ec5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611916578061190081612217565b915061190f9050600a83612166565b91506118f0565b60008167ffffffffffffffff81111561193157611931612288565b6040519080825280601f01601f19166020018201604052801561195b576020820181803683370190505b5090505b84156118b157611970600183612199565b915061197d600a86612232565b61198890603061214e565b60f81b81838151811061199d5761199d612272565b60200101906001600160f81b031916908160001a9053506119bf600a86612166565b945061195f565b6107c78383836001611a47565b600081815b8451811015611a3f5760008582815181106119f5576119f5612272565b60200260200101519050808311611a1b5760008381526020829052604090209250611a2c565b600081815260208490526040902092505b5080611a3781612217565b9150506119d8565b509392505050565b6001546001600160a01b038516611a7057604051622e076360e81b815260040160405180910390fd5b83611a8e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611b3b57506001600160a01b0387163b15155b15611bc4575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611b8c60008884806001019550886117c1565b611ba9576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611b41578260015414611bbf57600080fd5b611c0a565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611bc5575b5060015561095f565b828054611c1f906121dc565b90600052602060002090601f016020900481019282611c415760008555611c87565b82601f10611c5a5782800160ff19823516178555611c87565b82800160010185558215611c87579182015b82811115611c87578235825591602001919060010190611c6c565b50611c93929150611c97565b5090565b5b80821115611c935760008155600101611c98565b80356001600160a01b0381168114611cc357600080fd5b919050565b80358015158114611cc357600080fd5b600060208284031215611cea57600080fd5b61127282611cac565b60008060408385031215611d0657600080fd5b611d0f83611cac565b9150611d1d60208401611cac565b90509250929050565b600080600060608486031215611d3b57600080fd5b611d4484611cac565b9250611d5260208501611cac565b9150604084013590509250925092565b60008060008060808587031215611d7857600080fd5b611d8185611cac565b9350611d8f60208601611cac565b925060408501359150606085013567ffffffffffffffff80821115611db357600080fd5b818701915087601f830112611dc757600080fd5b813581811115611dd957611dd9612288565b604051601f8201601f19908116603f01168101908382118183101715611e0157611e01612288565b816040528281528a6020848701011115611e1a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611e5157600080fd5b611e5a83611cac565b9150611d1d60208401611cc8565b60008060408385031215611e7b57600080fd5b611e8483611cac565b946020939093013593505050565b600060208284031215611ea457600080fd5b61127282611cc8565b600060208284031215611ebf57600080fd5b5035919050565b600060208284031215611ed857600080fd5b81356112728161229e565b600060208284031215611ef557600080fd5b81516112728161229e565b60008060208385031215611f1357600080fd5b823567ffffffffffffffff80821115611f2b57600080fd5b818501915085601f830112611f3f57600080fd5b813581811115611f4e57600080fd5b866020828501011115611f6057600080fd5b60209290920196919550909350505050565b600080600060408486031215611f8757600080fd5b83359250602084013567ffffffffffffffff80821115611fa657600080fd5b818601915086601f830112611fba57600080fd5b813581811115611fc957600080fd5b8760208260051b8501011115611fde57600080fd5b6020830194508093505050509250925092565b600081518084526120098160208601602086016121b0565b601f01601f19169290920160200192915050565b6000835161202f8184602088016121b0565b8351908301906120438183602088016121b0565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207f90830184611ff1565b9695505050505050565b6020815260006112726020830184611ff1565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f496e73756666696369656e74207175616e74697479206c6566742e0000000000604082015260600190565b60208082526026908201527f4578636565647320746865206d6178696d756d206e756d62657220706572207760408201526530b63632ba1760d11b606082015260800190565b6000821982111561216157612161612246565b500190565b6000826121755761217561225c565b500490565b600081600019048311821515161561219457612194612246565b500290565b6000828210156121ab576121ab612246565b500390565b60005b838110156121cb5781810151838201526020016121b3565b838111156111ee5750506000910152565b600181811c908216806121f057607f821691505b6020821081141561221157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561222b5761222b612246565b5060010190565b6000826122415761224161225c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461137a57600080fdfea2646970667358221220057aa10e56b96bfb70136bd6eceddd77b4c0847b72e49a1d7a79c2da802b5b9d64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101c25760003560e01c806367d949a6116100f7578063b3ab66b011610095578063e985e9c511610064578063e985e9c5146104e0578063f2fde38b14610529578063f92134c714610549578063fa30297e146105f657600080fd5b8063b3ab66b014610478578063b88d4fde1461048b578063c87b56dd146104ab578063ce03ec93146104cb57600080fd5b80637e237e2e116100d15780637e237e2e146104055780638da5cb5b1461042557806395d89b4114610443578063a22cb4651461045857600080fd5b806367d949a6146103a357806370a08231146103d0578063715018a6146103f057600080fd5b80632d7eae661161016457806342842e0e1161013e57806342842e0e146103305780634c220f6e1461035057806355f804b3146103635780636352211e1461038357600080fd5b80632d7eae66146102db578063375a069a146102fb5780633ccfd60b1461031b57600080fd5b8063095ea7b3116101a0578063095ea7b31461025657806316c38b3c1461027857806318160ddd1461029857806323b872dd146102bb57600080fd5b806301ffc9a7146101c757806306fdde03146101fc578063081812fc1461021e575b600080fd5b3480156101d357600080fd5b506101e76101e2366004611ec6565b610616565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b50610211610668565b6040516101f39190612089565b34801561022a57600080fd5b5061023e610239366004611ead565b6106fa565b6040516001600160a01b0390911681526020016101f3565b34801561026257600080fd5b50610276610271366004611e68565b61073e565b005b34801561028457600080fd5b50610276610293366004611e92565b6107cc565b3480156102a457600080fd5b50600254600154035b6040519081526020016101f3565b3480156102c757600080fd5b506102766102d6366004611d26565b610812565b3480156102e757600080fd5b506102766102f6366004611ead565b61081d565b34801561030757600080fd5b50610276610316366004611ead565b61084c565b34801561032757600080fd5b50610276610966565b34801561033c57600080fd5b5061027661034b366004611d26565b610a7b565b61027661035e366004611f72565b610a96565b34801561036f57600080fd5b5061027661037e366004611f00565b610d77565b34801561038f57600080fd5b5061023e61039e366004611ead565b610dad565b3480156103af57600080fd5b506102ad6103be366004611cd8565b600a6020526000908152604090205481565b3480156103dc57600080fd5b506102ad6103eb366004611cd8565b610dbf565b3480156103fc57600080fd5b50610276610e0e565b34801561041157600080fd5b50610276610420366004611ead565b610e44565b34801561043157600080fd5b506000546001600160a01b031661023e565b34801561044f57600080fd5b50610211610e73565b34801561046457600080fd5b50610276610473366004611e3e565b610e82565b610276610486366004611ead565b610f18565b34801561049757600080fd5b506102766104a6366004611d62565b6111a3565b3480156104b757600080fd5b506102116104c6366004611ead565b6111f4565b3480156104d757600080fd5b50610276611279565b3480156104ec57600080fd5b506101e76104fb366004611cf3565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561053557600080fd5b50610276610544366004611cd8565b6112e2565b34801561055557600080fd5b50600b54600c54600d54600e54600f5460105460115460125460135461059d989760ff808216986101008304821698620100009093049091169690959194909391929091908b565b604080519b8c5299151560208c0152971515988a01989098529415156060890152608088019390935260a087019190915260c086015260e0850152610100840152610120830191909152610140820152610160016101f3565b34801561060257600080fd5b506102ad610611366004611cd8565b61137d565b60006001600160e01b031982166380ac58cd60e01b148061064757506001600160e01b03198216635b5e139f60e01b145b8061066257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610677906121dc565b80601f01602080910402602001604051908101604052809291908181526020018280546106a3906121dc565b80156106f05780601f106106c5576101008083540402835291602001916106f0565b820191906000526020600020905b8154815290600101906020018083116106d357829003601f168201915b5050505050905090565b6000610705826113ac565b610722576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061074982610dad565b9050806001600160a01b0316836001600160a01b0316141561077e5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061079e575061079c81336104fb565b155b156107bc576040516367d9dca160e11b815260040160405180910390fd5b6107c78383836113d8565b505050565b6000546001600160a01b031633146107ff5760405162461bcd60e51b81526004016107f69061209c565b60405180910390fd5b600c805460ff1916911515919091179055565b6107c7838383611434565b6000546001600160a01b031633146108475760405162461bcd60e51b81526004016107f69061209c565b600b55565b6000546001600160a01b031633146108765760405162461bcd60e51b81526004016107f69061209c565b6040805161016081018252600b548152600c5460ff808216151560208401526101008083048216151594840194909452620100009091041615156060820152600d546080820152600e5460a0820152600f5460c082015260105460e08201526011549181018290526012546101208201526013546101408201529080836109006002546001540390565b61090a919061214e565b11156109285760405162461bcd60e51b81526004016107f6906120d1565b6000610935600585612166565b905060005b8181101561095f5761094d336005611621565b8061095781612217565b91505061093a565b5050505050565b6000546001600160a01b031633146109905760405162461bcd60e51b81526004016107f69061209c565b600260095414156109e35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107f6565b6002600955604051600090339047908381818185875af1925050503d8060008114610a2a576040519150601f19603f3d011682016040523d82523d6000602084013e610a2f565b606091505b5050905080610a735760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016107f6565b506001600955565b6107c7838383604051806020016040528060008152506111a3565b6040805161016081018252600b54808252600c5460ff80821615801560208601819052610100808504841615159787019790975262010000909304909116151560608501819052600d5460808601819052600e5460a0870152600f5460c087015260105460e0870152601154968601879052601254610120870181905260135461014088015295969495939491939092909190610b715760405162461bcd60e51b815260206004820152601960248201527829b0b632903830bab9b2b21037b9103737ba1039ba30b93a1760391b60448201526064016107f6565b83610bbe5760405162461bcd60e51b815260206004820152601960248201527f5072652d73616c65206e6f742079657420737461727465642e0000000000000060448201526064016107f6565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610c378a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925085915061163f9050565b610c745760405162461bcd60e51b815260206004820152600e60248201526d283937b7b31034b73b30b634b21760911b60448201526064016107f6565b336000908152600a60205260409020548490610c91908d9061214e565b1115610cf95760405162461bcd60e51b815260206004820152603160248201527f5265616368656420746865206d6178696d756d20616d6f756e74206f6620776860448201527034ba32b634b9ba32b2103bb0b63632ba1760791b60648201526084016107f6565b81838c610d096002546001540390565b610d13919061214e565b610d1d919061214e565b1115610d3b5760405162461bcd60e51b81526004016107f6906120d1565b336000908152600a6020526040812080548d9290610d5a90849061214e565b90915550610d6a9050338c611621565b5050505050505050505050565b6000546001600160a01b03163314610da15760405162461bcd60e51b81526004016107f69061209c565b6107c760148383611c13565b6000610db882611655565b5192915050565b60006001600160a01b038216610de8576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b03163314610e385760405162461bcd60e51b81526004016107f69061209c565b610e426000611771565b565b6000546001600160a01b03163314610e6e5760405162461bcd60e51b81526004016107f69061209c565b601355565b606060048054610677906121dc565b6001600160a01b038216331415610eac5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040805161016081018252600b548152600c5460ff80821615801560208501819052610100808504841615159686018790526201000090940490921615156060850152600d5460808501819052600e5460a08601819052600f5460c0870181905260105460e08801526011549587018690526012546101208801819052601354610140890181905297989597959691959294909290610ff55760405162461bcd60e51b815260206004820152601960248201527829b0b632903830bab9b2b21037b9103737ba1039ba30b93a1760391b60448201526064016107f6565b866110425760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632d73616c65206e6f742079657420737461727465642e0000000060448201526064016107f6565b81838b6110526002546001540390565b61105c919061214e565b611066919061214e565b11156110845760405162461bcd60e51b81526004016107f6906120d1565b336000908152600a60205260409020548414156110dc576110a5848661214e565b8a6110af3361137d565b6110b9919061214e565b11156110d75760405162461bcd60e51b81526004016107f690612108565b61110f565b848a6110e73361137d565b6110f1919061214e565b111561110f5760405162461bcd60e51b81526004016107f690612108565b808a61111e6002546001540390565b611128919061214e565b1161113c57611137338b611621565b611197565b34611147878c61217a565b111561118d5760405162461bcd60e51b815260206004820152601560248201527424b739bab33334b1b4b2b73a103130b630b731b29760591b60448201526064016107f6565b611197338b611621565b50505050505050505050565b6111ae848484611434565b6001600160a01b0383163b151580156111d057506111ce848484846117c1565b155b156111ee576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606111ff826113ac565b61121c57604051630a14c4b560e41b815260040160405180910390fd5b60006112266118b9565b90508051600014156112475760405180602001604052806000815250611272565b80611251846118c8565b60405160200161126292919061201d565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146112a35760405162461bcd60e51b81526004016107f69061209c565b600c805461010060ff620100008084048216150262ff000019841681178390049091161590910261ff001990911662ffff001990921691909117179055565b6000546001600160a01b0316331461130c5760405162461bcd60e51b81526004016107f69061209c565b6001600160a01b0381166113715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f6565b61137a81611771565b50565b6001600160a01b038116600090815260066020526040812054600160401b900467ffffffffffffffff16610662565b600060015482108015610662575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061143f82611655565b9050836001600160a01b031681600001516001600160a01b0316146114765760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611494575061149485336104fb565b806114af5750336114a4846106fa565b6001600160a01b0316145b9050806114cf57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166114f657604051633a954ecd60e21b815260040160405180910390fd5b611502600084876113d8565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166115d85760015482146115d8578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461095f565b61163b8282604051806020016040528060008152506119c6565b5050565b60008261164c85846119d3565b14949350505050565b60408051606081018252600080825260208201819052918101919091528160015481101561175857600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906117565780516001600160a01b0316156116ec579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611751579392505050565b6116ec565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906117f690339089908890889060040161204c565b602060405180830381600087803b15801561181057600080fd5b505af1925050508015611840575060408051601f3d908101601f1916820190925261183d91810190611ee3565b60015b61189b573d80801561186e576040519150601f19603f3d011682016040523d82523d6000602084013e611873565b606091505b508051611893576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060148054610677906121dc565b6060816118ec5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611916578061190081612217565b915061190f9050600a83612166565b91506118f0565b60008167ffffffffffffffff81111561193157611931612288565b6040519080825280601f01601f19166020018201604052801561195b576020820181803683370190505b5090505b84156118b157611970600183612199565b915061197d600a86612232565b61198890603061214e565b60f81b81838151811061199d5761199d612272565b60200101906001600160f81b031916908160001a9053506119bf600a86612166565b945061195f565b6107c78383836001611a47565b600081815b8451811015611a3f5760008582815181106119f5576119f5612272565b60200260200101519050808311611a1b5760008381526020829052604090209250611a2c565b600081815260208490526040902092505b5080611a3781612217565b9150506119d8565b509392505050565b6001546001600160a01b038516611a7057604051622e076360e81b815260040160405180910390fd5b83611a8e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611b3b57506001600160a01b0387163b15155b15611bc4575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611b8c60008884806001019550886117c1565b611ba9576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611b41578260015414611bbf57600080fd5b611c0a565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611bc5575b5060015561095f565b828054611c1f906121dc565b90600052602060002090601f016020900481019282611c415760008555611c87565b82601f10611c5a5782800160ff19823516178555611c87565b82800160010185558215611c87579182015b82811115611c87578235825591602001919060010190611c6c565b50611c93929150611c97565b5090565b5b80821115611c935760008155600101611c98565b80356001600160a01b0381168114611cc357600080fd5b919050565b80358015158114611cc357600080fd5b600060208284031215611cea57600080fd5b61127282611cac565b60008060408385031215611d0657600080fd5b611d0f83611cac565b9150611d1d60208401611cac565b90509250929050565b600080600060608486031215611d3b57600080fd5b611d4484611cac565b9250611d5260208501611cac565b9150604084013590509250925092565b60008060008060808587031215611d7857600080fd5b611d8185611cac565b9350611d8f60208601611cac565b925060408501359150606085013567ffffffffffffffff80821115611db357600080fd5b818701915087601f830112611dc757600080fd5b813581811115611dd957611dd9612288565b604051601f8201601f19908116603f01168101908382118183101715611e0157611e01612288565b816040528281528a6020848701011115611e1a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611e5157600080fd5b611e5a83611cac565b9150611d1d60208401611cc8565b60008060408385031215611e7b57600080fd5b611e8483611cac565b946020939093013593505050565b600060208284031215611ea457600080fd5b61127282611cc8565b600060208284031215611ebf57600080fd5b5035919050565b600060208284031215611ed857600080fd5b81356112728161229e565b600060208284031215611ef557600080fd5b81516112728161229e565b60008060208385031215611f1357600080fd5b823567ffffffffffffffff80821115611f2b57600080fd5b818501915085601f830112611f3f57600080fd5b813581811115611f4e57600080fd5b866020828501011115611f6057600080fd5b60209290920196919550909350505050565b600080600060408486031215611f8757600080fd5b83359250602084013567ffffffffffffffff80821115611fa657600080fd5b818601915086601f830112611fba57600080fd5b813581811115611fc957600080fd5b8760208260051b8501011115611fde57600080fd5b6020830194508093505050509250925092565b600081518084526120098160208601602086016121b0565b601f01601f19169290920160200192915050565b6000835161202f8184602088016121b0565b8351908301906120438183602088016121b0565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207f90830184611ff1565b9695505050505050565b6020815260006112726020830184611ff1565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f496e73756666696369656e74207175616e74697479206c6566742e0000000000604082015260600190565b60208082526026908201527f4578636565647320746865206d6178696d756d206e756d62657220706572207760408201526530b63632ba1760d11b606082015260800190565b6000821982111561216157612161612246565b500190565b6000826121755761217561225c565b500490565b600081600019048311821515161561219457612194612246565b500290565b6000828210156121ab576121ab612246565b500390565b60005b838110156121cb5781810151838201526020016121b3565b838111156111ee5750506000910152565b600181811c908216806121f057607f821691505b6020821081141561221157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561222b5761222b612246565b5060010190565b6000826122415761224161225c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461137a57600080fdfea2646970667358221220057aa10e56b96bfb70136bd6eceddd77b4c0847b72e49a1d7a79c2da802b5b9d64736f6c63430008070033
Deployed Bytecode Sourcemap
50513:6123:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29590:305;;;;;;;;;;-1:-1:-1;29590:305:0;;;;;:::i;:::-;;:::i;:::-;;;7198:14:1;;7191:22;7173:41;;7161:2;7146:18;29590:305:0;;;;;;;;32703:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34206:204::-;;;;;;;;;;-1:-1:-1;34206:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6496:32:1;;;6478:51;;6466:2;6451:18;34206:204:0;6332:203:1;33769:371:0;;;;;;;;;;-1:-1:-1;33769:371:0;;;;;:::i;:::-;;:::i;:::-;;55285:96;;;;;;;;;;-1:-1:-1;55285:96:0;;;;;:::i;:::-;;:::i;28839:303::-;;;;;;;;;;-1:-1:-1;29093:12:0;;29077:13;;:28;28839:303;;;12939:25:1;;;12927:2;12912:18;28839:303:0;12793:177:1;35071:170:0;;;;;;;;;;-1:-1:-1;35071:170:0;;;;;:::i;:::-;;:::i;55389:101::-;;;;;;;;;;-1:-1:-1;55389:101:0;;;;;:::i;:::-;;:::i;55737:429::-;;;;;;;;;;-1:-1:-1;55737:429:0;;;;;:::i;:::-;;:::i;56447:186::-;;;;;;;;;;;;;:::i;35312:185::-;;;;;;;;;;-1:-1:-1;35312:185:0;;;;;:::i;:::-;;:::i;52293:1168::-;;;;;;:::i;:::-;;:::i;56333:106::-;;;;;;;;;;-1:-1:-1;56333:106:0;;;;;:::i;:::-;;:::i;32511:125::-;;;;;;;;;;-1:-1:-1;32511:125:0;;;;;:::i;:::-;;:::i;50573:53::-;;;;;;;;;;-1:-1:-1;50573:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;29959:206;;;;;;;;;;-1:-1:-1;29959:206:0;;;;;:::i;:::-;;:::i;49061:103::-;;;;;;;;;;;;;:::i;55498:105::-;;;;;;;;;;-1:-1:-1;55498:105:0;;;;;:::i;:::-;;:::i;48410:87::-;;;;;;;;;;-1:-1:-1;48456:7:0;48483:6;-1:-1:-1;;;;;48483:6:0;48410:87;;32872:104;;;;;;;;;;;;;:::i;34482:287::-;;;;;;;;;;-1:-1:-1;34482:287:0;;;;;:::i;:::-;;:::i;53469:1625::-;;;;;;:::i;:::-;;:::i;35568:369::-;;;;;;;;;;-1:-1:-1;35568:369:0;;;;;:::i;:::-;;:::i;33047:318::-;;;;;;;;;;-1:-1:-1;33047:318:0;;;;;:::i;:::-;;:::i;55102:175::-;;;;;;;;;;;;;:::i;34840:164::-;;;;;;;;;;-1:-1:-1;34840:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34961:25:0;;;34937:4;34961:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34840:164;49319:201;;;;;;;;;;-1:-1:-1;49319:201:0;;;;;:::i;:::-;;:::i;50995:32::-;;;;;;;;;;-1:-1:-1;50995:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7635:25:1;;;7703:14;;7696:22;7691:2;7676:18;;7669:50;7762:14;;7755:22;7735:18;;;7728:50;;;;7821:14;;7814:22;7809:2;7794:18;;7787:50;7868:3;7853:19;;7846:35;;;;7912:3;7897:19;;7890:35;;;;7956:3;7941:19;;7934:35;8000:3;7985:19;;7978:35;8044:3;8029:19;;8022:35;8088:3;8073:19;;8066:35;;;;8132:3;8117:19;;8110:36;7622:3;7607:19;50995:32:0;7225:927:1;55615:114:0;;;;;;;;;;-1:-1:-1;55615:114:0;;;;;:::i;:::-;;:::i;29590:305::-;29692:4;-1:-1:-1;;;;;;29729:40:0;;-1:-1:-1;;;29729:40:0;;:105;;-1:-1:-1;;;;;;;29786:48:0;;-1:-1:-1;;;29786:48:0;29729:105;:158;;;-1:-1:-1;;;;;;;;;;11425:40:0;;;29851:36;29709:178;29590:305;-1:-1:-1;;29590:305:0:o;32703:100::-;32757:13;32790:5;32783:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32703:100;:::o;34206:204::-;34274:7;34299:16;34307:7;34299;:16::i;:::-;34294:64;;34324:34;;-1:-1:-1;;;34324:34:0;;;;;;;;;;;34294:64;-1:-1:-1;34378:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34378:24:0;;34206:204::o;33769:371::-;33842:13;33858:24;33874:7;33858:15;:24::i;:::-;33842:40;;33903:5;-1:-1:-1;;;;;33897:11:0;:2;-1:-1:-1;;;;;33897:11:0;;33893:48;;;33917:24;;-1:-1:-1;;;33917:24:0;;;;;;;;;;;33893:48;25186:10;-1:-1:-1;;;;;33958:21:0;;;;;;:63;;-1:-1:-1;33984:37:0;34001:5;25186:10;34840:164;:::i;33984:37::-;33983:38;33958:63;33954:138;;;34045:35;;-1:-1:-1;;;34045:35:0;;;;;;;;;;;33954:138;34104:28;34113:2;34117:7;34126:5;34104:8;:28::i;:::-;33831:309;33769:371;;:::o;55285:96::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;;;;;;;;;55345:19;:28;;-1:-1:-1;;55345:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55285:96::o;35071:170::-;35205:28;35215:4;35221:2;35225:7;35205:9;:28::i;55389:101::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;55453:12:::1;:29:::0;55389:101::o;55737:429::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;55802:41:::1;::::0;;::::1;::::0;::::1;::::0;;55831:12:::1;55802:41:::0;;;;;::::1;::::0;;::::1;;;;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;;::::0;;;;;;;;;;::::1;;;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55936:8;55920:13:::1;29093:12:::0;;29077:13;;:28;;28839:303;55920:13:::1;:24;;;;:::i;:::-;:37;;55912:100;;;;-1:-1:-1::0;;;55912:100:0::1;;;;;;;:::i;:::-;56025:17;56045:12;56056:1;56045:8:::0;:12:::1;:::i;:::-;56025:32;;56073:9;56068:91;56092:9;56088:1;:13;56068:91;;;56123:24;56133:10;56145:1;56123:9;:24::i;:::-;56103:3:::0;::::1;::::0;::::1;:::i;:::-;;;;56068:91;;;;55791:375;;;55737:429:::0;:::o;56447:186::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;23480:1:::1;24078:7;;:19;;24070:63;;;::::0;-1:-1:-1;;;24070:63:0;;11518:2:1;24070:63:0::1;::::0;::::1;11500:21:1::0;11557:2;11537:18;;;11530:30;11596:33;11576:18;;;11569:61;11647:18;;24070:63:0::1;11316:355:1::0;24070:63:0::1;23480:1;24211:7;:18:::0;56529:49:::2;::::0;56511:12:::2;::::0;56529:10:::2;::::0;56552:21:::2;::::0;56511:12;56529:49;56511:12;56529:49;56552:21;56529:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56510:68;;;56597:7;56589:36;;;::::0;-1:-1:-1;;;56589:36:0;;11173:2:1;56589:36:0::2;::::0;::::2;11155:21:1::0;11212:2;11192:18;;;11185:30;-1:-1:-1;;;11231:18:1;;;11224:46;11287:18;;56589:36:0::2;10971:340:1::0;56589:36:0::2;-1:-1:-1::0;23436:1:0::1;24390:7;:22:::0;56447:186::o;35312:185::-;35450:39;35467:4;35473:2;35477:7;35450:39;;;;;;;;;;;;:16;:39::i;52293:1168::-;52409:41;;;;;;;;52438:12;52409:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52799:45;;;;-1:-1:-1;;;52799:45:0;;12641:2:1;52799:45:0;;;12623:21:1;12680:2;12660:18;;;12653:30;-1:-1:-1;;;12699:18:1;;;12692:55;12764:18;;52799:45:0;12439:349:1;52799:45:0;52863:9;52855:47;;;;-1:-1:-1;;;52855:47:0;;8990:2:1;52855:47:0;;;8972:21:1;9029:2;9009:18;;;9002:30;9068:27;9048:18;;;9041:55;9113:18;;52855:47:0;8788:349:1;52855:47:0;52940:28;;-1:-1:-1;;52957:10:0;5562:2:1;5558:15;5554:53;52940:28:0;;;5542:66:1;52915:12:0;;5624::1;;52940:28:0;;;;;;;;;;;;52930:39;;;;;;52915:54;;52988:41;53007:5;;52988:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53014:8:0;;-1:-1:-1;53024:4:0;;-1:-1:-1;52988:18:0;;-1:-1:-1;52988:41:0:i;:::-;52980:68;;;;-1:-1:-1;;;52980:68:0;;9344:2:1;52980:68:0;;;9326:21:1;9383:2;9363:18;;;9356:30;-1:-1:-1;;;9402:18:1;;;9395:44;9456:18;;52980:68:0;9142:338:1;52980:68:0;53100:10;53081:30;;;;:18;:30;;;;;;53126:14;;53081:41;;53114:8;;53081:41;:::i;:::-;:59;;53059:158;;;;-1:-1:-1;;;53059:158:0;;10398:2:1;53059:158:0;;;10380:21:1;10437:2;10417:18;;;10410:30;10476:34;10456:18;;;10449:62;-1:-1:-1;;;10527:18:1;;;10520:47;10584:19;;53059:158:0;10196:413:1;53059:158:0;53294:9;53277:13;53266:8;53250:13;29093:12;;29077:13;;:28;;28839:303;53250:13;:24;;;;:::i;:::-;:40;;;;:::i;:::-;:53;;53228:130;;;;-1:-1:-1;;;53228:130:0;;;;;;;:::i;:::-;53388:10;53369:30;;;;:18;:30;;;;;:42;;53403:8;;53369:30;:42;;53403:8;;53369:42;:::i;:::-;;;;-1:-1:-1;53422:31:0;;-1:-1:-1;53432:10:0;53444:8;53422:9;:31::i;:::-;52398:1063;;;;;;;;52293:1168;;;:::o;56333:106::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;56408:23:::1;:13;56424:7:::0;;56408:23:::1;:::i;32511:125::-:0;32575:7;32602:21;32615:7;32602:12;:21::i;:::-;:26;;32511:125;-1:-1:-1;;32511:125:0:o;29959:206::-;30023:7;-1:-1:-1;;;;;30047:19:0;;30043:60;;30075:28;;-1:-1:-1;;;30075:28:0;;;;;;;;;;;30043:60;-1:-1:-1;;;;;;30129:19:0;;;;;:12;:19;;;;;:27;;;;29959:206::o;49061:103::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;49126:30:::1;49153:1;49126:18;:30::i;:::-;49061:103::o:0;55498:105::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;55564:22;:31;55498:105::o;32872:104::-;32928:13;32961:7;32954:14;;;;;:::i;34482:287::-;-1:-1:-1;;;;;34581:24:0;;25186:10;34581:24;34577:54;;;34614:17;;-1:-1:-1;;;34614:17:0;;;;;;;;;;;34577:54;25186:10;34644:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34644:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34644:53:0;;;;;;;;;;34713:48;;7173:41:1;;;34644:42:0;;25186:10;34713:48;;7146:18:1;34713:48:0;;;;;;;34482:287;;:::o;53469:1625::-;53541:41;;;;;;;;53570:12;53541:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54079:45;;;;-1:-1:-1;;;54079:45:0;;12641:2:1;54079:45:0;;;12623:21:1;12680:2;12660:18;;;12653:30;-1:-1:-1;;;12699:18:1;;;12692:55;12764:18;;54079:45:0;12439:349:1;54079:45:0;54143:12;54135:53;;;;-1:-1:-1;;;54135:53:0;;10816:2:1;54135:53:0;;;10798:21:1;10855:2;10835:18;;;10828:30;10894;10874:18;;;10867:58;10942:18;;54135:53:0;10614:352:1;54135:53:0;54265:9;54248:13;54237:8;54221:13;29093:12;;29077:13;;:28;;28839:303;54221:13;:24;;;;:::i;:::-;:40;;;;:::i;:::-;:53;;54199:130;;;;-1:-1:-1;;;54199:130:0;;;;;;;:::i;:::-;54365:10;54346:30;;;;:18;:30;;;;;;:48;;54342:429;;;54473:34;54493:14;54473:17;:34;:::i;:::-;54461:8;54433:25;54447:10;54433:13;:25::i;:::-;:36;;;;:::i;:::-;:74;;54409:168;;;;-1:-1:-1;;;54409:168:0;;;;;;;:::i;:::-;54342:429;;;54672:17;54660:8;54632:25;54646:10;54632:13;:25::i;:::-;:36;;;;:::i;:::-;:57;;54608:151;;;;-1:-1:-1;;;54608:151:0;;;;;;;:::i;:::-;54815:9;54803:8;54787:13;29093:12;;29077:13;;:28;;28839:303;54787:13;:24;;;;:::i;:::-;:37;54783:302;;54841:31;54851:10;54863:8;54841:9;:31::i;:::-;54783:302;;;54961:9;54931:26;54942:15;54931:8;:26;:::i;:::-;:39;;54905:122;;;;-1:-1:-1;;;54905:122:0;;9687:2:1;54905:122:0;;;9669:21:1;9726:2;9706:18;;;9699:30;-1:-1:-1;;;9745:18:1;;;9738:51;9806:18;;54905:122:0;9485:345:1;54905:122:0;55042:31;55052:10;55064:8;55042:9;:31::i;:::-;53528:1566;;;;;;;;;53469:1625;:::o;35568:369::-;35735:28;35745:4;35751:2;35755:7;35735:9;:28::i;:::-;-1:-1:-1;;;;;35778:13:0;;1528:19;:23;;35778:76;;;;;35798:56;35829:4;35835:2;35839:7;35848:5;35798:30;:56::i;:::-;35797:57;35778:76;35774:156;;;35878:40;;-1:-1:-1;;;35878:40:0;;;;;;;;;;;35774:156;35568:369;;;;:::o;33047:318::-;33120:13;33151:16;33159:7;33151;:16::i;:::-;33146:59;;33176:29;;-1:-1:-1;;;33176:29:0;;;;;;;;;;;33146:59;33218:21;33242:10;:8;:10::i;:::-;33218:34;;33276:7;33270:21;33295:1;33270:26;;:87;;;;;;;;;;;;;;;;;33323:7;33332:18;:7;:16;:18::i;:::-;33306:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33270:87;33263:94;33047:318;-1:-1:-1;;;33047:318:0:o;55102:175::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;55182:22;;;::::1;;::::0;;;::::1;::::0;::::1;55181:23;55156:48;-1:-1:-1::0;;55156:48:0;::::1;::::0;::::1;55244:25:::0;;::::1;::::0;;::::1;55243:26;55215:54:::0;;::::1;-1:-1:-1::0;;55215:54:0;;;-1:-1:-1;;55215:54:0;;;;;;;::::1;::::0;;55102:175::o;49319:201::-;48456:7;48483:6;-1:-1:-1;;;;;48483:6:0;25186:10;48630:23;48622:68;;;;-1:-1:-1;;;48622:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49408:22:0;::::1;49400:73;;;::::0;-1:-1:-1;;;49400:73:0;;8583:2:1;49400:73:0::1;::::0;::::1;8565:21:1::0;8622:2;8602:18;;;8595:30;8661:34;8641:18;;;8634:62;-1:-1:-1;;;8712:18:1;;;8705:36;8758:19;;49400:73:0::1;8381:402:1::0;49400:73:0::1;49484:28;49503:8;49484:18;:28::i;:::-;49319:201:::0;:::o;55615:114::-;-1:-1:-1;;;;;30343:19:0;;55674:7;30343:19;;;:12;:19;;;;;:32;-1:-1:-1;;;30343:32:0;;;;55701:20;30247:137;36192:187;36249:4;36313:13;;36303:7;:23;36273:98;;;;-1:-1:-1;;36344:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;36344:27:0;;;;36343:28;;36192:187::o;44362:196::-;44477:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;44477:29:0;-1:-1:-1;;;;;44477:29:0;;;;;;;;;44522:28;;44477:24;;44522:28;;;;;;;44362:196;;;:::o;39305:2130::-;39420:35;39458:21;39471:7;39458:12;:21::i;:::-;39420:59;;39518:4;-1:-1:-1;;;;;39496:26:0;:13;:18;;;-1:-1:-1;;;;;39496:26:0;;39492:67;;39531:28;;-1:-1:-1;;;39531:28:0;;;;;;;;;;;39492:67;39572:22;25186:10;-1:-1:-1;;;;;39598:20:0;;;;:73;;-1:-1:-1;39635:36:0;39652:4;25186:10;34840:164;:::i;39635:36::-;39598:126;;;-1:-1:-1;25186:10:0;39688:20;39700:7;39688:11;:20::i;:::-;-1:-1:-1;;;;;39688:36:0;;39598:126;39572:153;;39743:17;39738:66;;39769:35;;-1:-1:-1;;;39769:35:0;;;;;;;;;;;39738:66;-1:-1:-1;;;;;39819:16:0;;39815:52;;39844:23;;-1:-1:-1;;;39844:23:0;;;;;;;;;;;39815:52;39988:35;40005:1;40009:7;40018:4;39988:8;:35::i;:::-;-1:-1:-1;;;;;40319:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;40319:31:0;;;;;;;-1:-1:-1;;40319:31:0;;;;;;;40365:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;40365:29:0;;;;;;;;;;;40445:20;;;:11;:20;;;;;;40480:18;;-1:-1:-1;;;;;;40513:49:0;;;;-1:-1:-1;;;40546:15:0;40513:49;;;;;;;;;;40836:11;;40896:24;;;;;40939:13;;40445:20;;40896:24;;40939:13;40935:384;;41149:13;;41134:11;:28;41130:174;;41187:20;;41256:28;;;;41230:54;;-1:-1:-1;;;41230:54:0;-1:-1:-1;;;;;;41230:54:0;;;-1:-1:-1;;;;;41187:20:0;;41230:54;;;;41130:174;40294:1036;;;41366:7;41362:2;-1:-1:-1;;;;;41347:27:0;41356:4;-1:-1:-1;;;;;41347:27:0;;;;;;;;;;;41385:42;35568:369;36387:104;36456:27;36466:2;36470:8;36456:27;;;;;;;;;;;;:9;:27::i;:::-;36387:104;;:::o;18078:190::-;18203:4;18256;18227:25;18240:5;18247:4;18227:12;:25::i;:::-;:33;;18078:190;-1:-1:-1;;;;18078:190:0:o;31340:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;31451:7:0;31534:13;;31527:4;:20;31496:886;;;31568:31;31602:17;;;:11;:17;;;;;;;;;31568:51;;;;;;;;;-1:-1:-1;;;;;31568:51:0;;;;-1:-1:-1;;;31568:51:0;;;;;;;;;;;-1:-1:-1;;;31568:51:0;;;;;;;;;;;;;;31638:729;;31688:14;;-1:-1:-1;;;;;31688:28:0;;31684:101;;31752:9;31340:1109;-1:-1:-1;;;31340:1109:0:o;31684:101::-;-1:-1:-1;;;32127:6:0;32172:17;;;;:11;:17;;;;;;;;;32160:29;;;;;;;;;-1:-1:-1;;;;;32160:29:0;;;;;-1:-1:-1;;;32160:29:0;;;;;;;;;;;-1:-1:-1;;;32160:29:0;;;;;;;;;;;;;32220:28;32216:109;;32288:9;31340:1109;-1:-1:-1;;;31340:1109:0:o;32216:109::-;32087:261;;;31549:833;31496:886;32410:31;;-1:-1:-1;;;32410:31:0;;;;;;;;;;;49680:191;49754:16;49773:6;;-1:-1:-1;;;;;49790:17:0;;;-1:-1:-1;;;;;;49790:17:0;;;;;;49823:40;;49773:6;;;;;;;49823:40;;49754:16;49823:40;49743:128;49680:191;:::o;45050:667::-;45234:72;;-1:-1:-1;;;45234:72:0;;45213:4;;-1:-1:-1;;;;;45234:36:0;;;;;:72;;25186:10;;45285:4;;45291:7;;45300:5;;45234:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45234:72:0;;;;;;;;-1:-1:-1;;45234:72:0;;;;;;;;;;;;:::i;:::-;;;45230:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45468:13:0;;45464:235;;45514:40;;-1:-1:-1;;;45514:40:0;;;;;;;;;;;45464:235;45657:6;45651:13;45642:6;45638:2;45634:15;45627:38;45230:480;-1:-1:-1;;;;;;45353:55:0;-1:-1:-1;;;45353:55:0;;-1:-1:-1;45230:480:0;45050:667;;;;;;:::o;56211:114::-;56271:13;56304;56297:20;;;;;:::i;19909:723::-;19965:13;20186:10;20182:53;;-1:-1:-1;;20213:10:0;;;;;;;;;;;;-1:-1:-1;;;20213:10:0;;;;;19909:723::o;20182:53::-;20260:5;20245:12;20301:78;20308:9;;20301:78;;20334:8;;;;:::i;:::-;;-1:-1:-1;20357:10:0;;-1:-1:-1;20365:2:0;20357:10;;:::i;:::-;;;20301:78;;;20389:19;20421:6;20411:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20411:17:0;;20389:39;;20439:154;20446:10;;20439:154;;20473:11;20483:1;20473:11;;:::i;:::-;;-1:-1:-1;20542:10:0;20550:2;20542:5;:10;:::i;:::-;20529:24;;:2;:24;:::i;:::-;20516:39;;20499:6;20506;20499:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20499:56:0;;;;;;;;-1:-1:-1;20570:11:0;20579:2;20570:11;;:::i;:::-;;;20439:154;;36854:163;36977:32;36983:2;36987:8;36997:5;37004:4;36977:5;:32::i;18630:675::-;18713:7;18756:4;18713:7;18771:497;18795:5;:12;18791:1;:16;18771:497;;;18829:20;18852:5;18858:1;18852:8;;;;;;;;:::i;:::-;;;;;;;18829:31;;18895:12;18879;:28;18875:382;;19381:13;19431:15;;;19467:4;19460:15;;;19514:4;19498:21;;19007:57;;18875:382;;;19381:13;19431:15;;;19467:4;19460:15;;;19514:4;19498:21;;19184:57;;18875:382;-1:-1:-1;18809:3:0;;;;:::i;:::-;;;;18771:497;;;-1:-1:-1;19285:12:0;18630:675;-1:-1:-1;;;18630:675:0:o;37276:1775::-;37438:13;;-1:-1:-1;;;;;37466:16:0;;37462:48;;37491:19;;-1:-1:-1;;;37491:19:0;;;;;;;;;;;37462:48;37525:13;37521:44;;37547:18;;-1:-1:-1;;;37547:18:0;;;;;;;;;;;37521:44;-1:-1:-1;;;;;37916:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;37975:49:0;;37916:44;;;;;;;;37975:49;;;-1:-1:-1;;;;;37916:44:0;;;;;;37975:49;;;;;;;;;;;;;;;;38041:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;38091:66:0;;;;-1:-1:-1;;;38141:15:0;38091:66;;;;;;;;;;38041:25;38238:23;;;38282:4;:23;;;;-1:-1:-1;;;;;;38290:13:0;;1528:19;:23;;38290:15;38278:641;;;38326:314;38357:38;;38382:12;;-1:-1:-1;;;;;38357:38:0;;;38374:1;;38357:38;;38374:1;;38357:38;38423:69;38462:1;38466:2;38470:14;;;;;;38486:5;38423:30;:69::i;:::-;38418:174;;38528:40;;-1:-1:-1;;;38528:40:0;;;;;;;;;;;38418:174;38635:3;38619:12;:19;;38326:314;;38721:12;38704:13;;:29;38700:43;;38735:8;;;38700:43;38278:641;;;38784:120;38815:40;;38840:14;;;;;-1:-1:-1;;;;;38815:40:0;;;38832:1;;38815:40;;38832:1;;38815:40;38899:3;38883:12;:19;;38784:120;;38278:641;-1:-1:-1;38933:13:0;:28;38983:60;35568:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:186;416:6;469:2;457:9;448:7;444:23;440:32;437:52;;;485:1;482;475:12;437:52;508:29;527:9;508:29;:::i;548:260::-;616:6;624;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;716:29;735:9;716:29;:::i;:::-;706:39;;764:38;798:2;787:9;783:18;764:38;:::i;:::-;754:48;;548:260;;;;;:::o;813:328::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;998:29;1017:9;998:29;:::i;:::-;988:39;;1046:38;1080:2;1069:9;1065:18;1046:38;:::i;:::-;1036:48;;1131:2;1120:9;1116:18;1103:32;1093:42;;813:328;;;;;:::o;1146:1138::-;1241:6;1249;1257;1265;1318:3;1306:9;1297:7;1293:23;1289:33;1286:53;;;1335:1;1332;1325:12;1286:53;1358:29;1377:9;1358:29;:::i;:::-;1348:39;;1406:38;1440:2;1429:9;1425:18;1406:38;:::i;:::-;1396:48;;1491:2;1480:9;1476:18;1463:32;1453:42;;1546:2;1535:9;1531:18;1518:32;1569:18;1610:2;1602:6;1599:14;1596:34;;;1626:1;1623;1616:12;1596:34;1664:6;1653:9;1649:22;1639:32;;1709:7;1702:4;1698:2;1694:13;1690:27;1680:55;;1731:1;1728;1721:12;1680:55;1767:2;1754:16;1789:2;1785;1782:10;1779:36;;;1795:18;;:::i;:::-;1870:2;1864:9;1838:2;1924:13;;-1:-1:-1;;1920:22:1;;;1944:2;1916:31;1912:40;1900:53;;;1968:18;;;1988:22;;;1965:46;1962:72;;;2014:18;;:::i;:::-;2054:10;2050:2;2043:22;2089:2;2081:6;2074:18;2129:7;2124:2;2119;2115;2111:11;2107:20;2104:33;2101:53;;;2150:1;2147;2140:12;2101:53;2206:2;2201;2197;2193:11;2188:2;2180:6;2176:15;2163:46;2251:1;2246:2;2241;2233:6;2229:15;2225:24;2218:35;2272:6;2262:16;;;;;;;1146:1138;;;;;;;:::o;2289:254::-;2354:6;2362;2415:2;2403:9;2394:7;2390:23;2386:32;2383:52;;;2431:1;2428;2421:12;2383:52;2454:29;2473:9;2454:29;:::i;:::-;2444:39;;2502:35;2533:2;2522:9;2518:18;2502:35;:::i;2548:254::-;2616:6;2624;2677:2;2665:9;2656:7;2652:23;2648:32;2645:52;;;2693:1;2690;2683:12;2645:52;2716:29;2735:9;2716:29;:::i;:::-;2706:39;2792:2;2777:18;;;;2764:32;;-1:-1:-1;;;2548:254:1:o;2807:180::-;2863:6;2916:2;2904:9;2895:7;2891:23;2887:32;2884:52;;;2932:1;2929;2922:12;2884:52;2955:26;2971:9;2955:26;:::i;2992:180::-;3051:6;3104:2;3092:9;3083:7;3079:23;3075:32;3072:52;;;3120:1;3117;3110:12;3072:52;-1:-1:-1;3143:23:1;;2992:180;-1:-1:-1;2992:180:1:o;3177:245::-;3235:6;3288:2;3276:9;3267:7;3263:23;3259:32;3256:52;;;3304:1;3301;3294:12;3256:52;3343:9;3330:23;3362:30;3386:5;3362:30;:::i;3427:249::-;3496:6;3549:2;3537:9;3528:7;3524:23;3520:32;3517:52;;;3565:1;3562;3555:12;3517:52;3597:9;3591:16;3616:30;3640:5;3616:30;:::i;3681:592::-;3752:6;3760;3813:2;3801:9;3792:7;3788:23;3784:32;3781:52;;;3829:1;3826;3819:12;3781:52;3869:9;3856:23;3898:18;3939:2;3931:6;3928:14;3925:34;;;3955:1;3952;3945:12;3925:34;3993:6;3982:9;3978:22;3968:32;;4038:7;4031:4;4027:2;4023:13;4019:27;4009:55;;4060:1;4057;4050:12;4009:55;4100:2;4087:16;4126:2;4118:6;4115:14;4112:34;;;4142:1;4139;4132:12;4112:34;4187:7;4182:2;4173:6;4169:2;4165:15;4161:24;4158:37;4155:57;;;4208:1;4205;4198:12;4155:57;4239:2;4231:11;;;;;4261:6;;-1:-1:-1;3681:592:1;;-1:-1:-1;;;;3681:592:1:o;4463:683::-;4558:6;4566;4574;4627:2;4615:9;4606:7;4602:23;4598:32;4595:52;;;4643:1;4640;4633:12;4595:52;4679:9;4666:23;4656:33;;4740:2;4729:9;4725:18;4712:32;4763:18;4804:2;4796:6;4793:14;4790:34;;;4820:1;4817;4810:12;4790:34;4858:6;4847:9;4843:22;4833:32;;4903:7;4896:4;4892:2;4888:13;4884:27;4874:55;;4925:1;4922;4915:12;4874:55;4965:2;4952:16;4991:2;4983:6;4980:14;4977:34;;;5007:1;5004;4997:12;4977:34;5060:7;5055:2;5045:6;5042:1;5038:14;5034:2;5030:23;5026:32;5023:45;5020:65;;;5081:1;5078;5071:12;5020:65;5112:2;5108;5104:11;5094:21;;5134:6;5124:16;;;;;4463:683;;;;;:::o;5151:257::-;5192:3;5230:5;5224:12;5257:6;5252:3;5245:19;5273:63;5329:6;5322:4;5317:3;5313:14;5306:4;5299:5;5295:16;5273:63;:::i;:::-;5390:2;5369:15;-1:-1:-1;;5365:29:1;5356:39;;;;5397:4;5352:50;;5151:257;-1:-1:-1;;5151:257:1:o;5647:470::-;5826:3;5864:6;5858:13;5880:53;5926:6;5921:3;5914:4;5906:6;5902:17;5880:53;:::i;:::-;5996:13;;5955:16;;;;6018:57;5996:13;5955:16;6052:4;6040:17;;6018:57;:::i;:::-;6091:20;;5647:470;-1:-1:-1;;;;5647:470:1:o;6540:488::-;-1:-1:-1;;;;;6809:15:1;;;6791:34;;6861:15;;6856:2;6841:18;;6834:43;6908:2;6893:18;;6886:34;;;6956:3;6951:2;6936:18;;6929:31;;;6734:4;;6977:45;;7002:19;;6994:6;6977:45;:::i;:::-;6969:53;6540:488;-1:-1:-1;;;;;;6540:488:1:o;8157:219::-;8306:2;8295:9;8288:21;8269:4;8326:44;8366:2;8355:9;8351:18;8343:6;8326:44;:::i;9835:356::-;10037:2;10019:21;;;10056:18;;;10049:30;10115:34;10110:2;10095:18;;10088:62;10182:2;10167:18;;9835:356::o;11676:351::-;11878:2;11860:21;;;11917:2;11897:18;;;11890:30;11956:29;11951:2;11936:18;;11929:57;12018:2;12003:18;;11676:351::o;12032:402::-;12234:2;12216:21;;;12273:2;12253:18;;;12246:30;12312:34;12307:2;12292:18;;12285:62;-1:-1:-1;;;12378:2:1;12363:18;;12356:36;12424:3;12409:19;;12032:402::o;12975:128::-;13015:3;13046:1;13042:6;13039:1;13036:13;13033:39;;;13052:18;;:::i;:::-;-1:-1:-1;13088:9:1;;12975:128::o;13108:120::-;13148:1;13174;13164:35;;13179:18;;:::i;:::-;-1:-1:-1;13213:9:1;;13108:120::o;13233:168::-;13273:7;13339:1;13335;13331:6;13327:14;13324:1;13321:21;13316:1;13309:9;13302:17;13298:45;13295:71;;;13346:18;;:::i;:::-;-1:-1:-1;13386:9:1;;13233:168::o;13406:125::-;13446:4;13474:1;13471;13468:8;13465:34;;;13479:18;;:::i;:::-;-1:-1:-1;13516:9:1;;13406:125::o;13536:258::-;13608:1;13618:113;13632:6;13629:1;13626:13;13618:113;;;13708:11;;;13702:18;13689:11;;;13682:39;13654:2;13647:10;13618:113;;;13749:6;13746:1;13743:13;13740:48;;;-1:-1:-1;;13784:1:1;13766:16;;13759:27;13536:258::o;13799:380::-;13878:1;13874:12;;;;13921;;;13942:61;;13996:4;13988:6;13984:17;13974:27;;13942:61;14049:2;14041:6;14038:14;14018:18;14015:38;14012:161;;;14095:10;14090:3;14086:20;14083:1;14076:31;14130:4;14127:1;14120:15;14158:4;14155:1;14148:15;14012:161;;13799:380;;;:::o;14184:135::-;14223:3;-1:-1:-1;;14244:17:1;;14241:43;;;14264:18;;:::i;:::-;-1:-1:-1;14311:1:1;14300:13;;14184:135::o;14324:112::-;14356:1;14382;14372:35;;14387:18;;:::i;:::-;-1:-1:-1;14421:9:1;;14324:112::o;14441:127::-;14502:10;14497:3;14493:20;14490:1;14483:31;14533:4;14530:1;14523:15;14557:4;14554:1;14547:15;14573:127;14634:10;14629:3;14625:20;14622:1;14615:31;14665:4;14662:1;14655:15;14689:4;14686:1;14679:15;14705:127;14766:10;14761:3;14757:20;14754:1;14747:31;14797:4;14794:1;14787:15;14821:4;14818:1;14811:15;14837:127;14898:10;14893:3;14889:20;14886:1;14879:31;14929:4;14926:1;14919:15;14953:4;14950:1;14943:15;14969:131;-1:-1:-1;;;;;;15043:32:1;;15033:43;;15023:71;;15090:1;15087;15080:12
Swarm Source
ipfs://057aa10e56b96bfb70136bd6eceddd77b4c0847b72e49a1d7a79c2da802b5b9d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.