Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
4,445 DV
Holders
750
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 DVLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Doggo
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-15 */ // Sources flattened with hardhat v2.7.1 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // // 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 @openzeppelin/contracts/security/[email protected] // // 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/cryptography/[email protected] // // OpenZeppelin Contracts v4.4.1 (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 = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // File @openzeppelin/contracts/utils/[email protected] // // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // // 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/token/ERC721/[email protected] // // 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/[email protected] // // 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/token/ERC721/extensions/[email protected] // // 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/token/ERC721/extensions/[email protected] // // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/utils/[email protected] // // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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/utils/introspection/[email protected] // // 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 contracts/utils/ERC721A.sol // // Creators: locationtba.eth, 2pmflow.eth pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable maxBatchSize; // 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) private _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; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_ ) { require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @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) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _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 override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } 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); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, 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; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > currentIndex - 1) { endIndex = currentIndex - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * 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`. */ 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. * * 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` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File contracts/utils/Pausable.sol // // Creators: ngenator.eth pragma solidity ^0.8.0; // a basic contract to provide modifiers and functions and enable pausing of an inheriting contract abstract contract Pausable { bool private _paused; constructor() { _paused = true; } function paused() public view virtual returns (bool) { return _paused; } modifier whenNotPaused() { require(!paused(), "Pausable: contract is paused"); _; } modifier whenPaused() { require(paused(), "Pausable: contract is not paused"); _; } function _pause() internal virtual whenNotPaused { _paused = true; } function _resume() internal virtual whenPaused { _paused = false; } } // File contracts/utils/PreSaleAware.sol // // Creators: ngenator.eth pragma solidity ^0.8.0; abstract contract PreSaleAware { bool private _presale; constructor() { _presale = true; } function preSale() public view virtual returns (bool) { return _presale; } modifier whenNotPreSale() { require(!preSale(), "PreSaleAware: presale must not be active"); _; } modifier whenPreSale() { require(preSale(), "PreSaleAware: presale must be active"); _; } function _enablePreSale() internal virtual whenNotPreSale { _presale = true; } function _disablePreSale() internal virtual whenPreSale { _presale = false; } } // File contracts/Doggo.sol // // Creators: ngenator.eth pragma solidity ^0.8.0; /* `..:`. ``.-/.::/..```.-----:-` ```....````.-.` `...-:+------..:. `.:-..``..---` ./+//-`./`+ `/. ``` :: /-`+`+ `+` .::+ /. :+::` .: `/ -+ `+ `/ /. `o /.` ::` + `o `:-:` `:---:- `+: ``::` ````` `o. `+ -: :- +` :- -: `+` `/- `-:` `::. `..-:---...-:-.` `-:-.....-+-..//`.....` `......+ -/ `.::-. .:-` `-:-` .::` `./- `:-` `://` `+/` `/:/` .++` `+-/ .+/ ________ ________ ________ ________ ________ ___ ___ _______ ________ ________ _______ |\ ___ \|\ __ \|\ ____\|\ ____\|\ __ \ |\ \ / /|\ ___ \ |\ __ \|\ ____\|\ ___ \ \ \ \_|\ \ \ \|\ \ \ \___|\ \ \___|\ \ \|\ \ \ \ \ / / | \ __/|\ \ \|\ \ \ \___|\ \ __/| \ \ \ \\ \ \ \\\ \ \ \ __\ \ \ __\ \ \\\ \ \ \ \/ / / \ \ \_|/_\ \ _ _\ \_____ \ \ \_|/__ \ \ \_\\ \ \ \\\ \ \ \|\ \ \ \|\ \ \ \\\ \ \ \ / / \ \ \_|\ \ \ \\ \\|____|\ \ \ \_|\ \ \ \_______\ \_______\ \_______\ \_______\ \_______\ \ \__/ / \ \_______\ \__\\ _\ ____\_\ \ \_______\ \|_______|\|_______|\|_______|\|_______|\|_______| \|__|/ \|_______|\|__|\|__|\_________\|_______| \|_________| */ contract Doggo is ERC721A, Ownable, Pausable, PreSaleAware, ReentrancyGuard { using Strings for uint256; uint256 public constant COST = 0.08 ether; // the cost per doggo // the merkle root used for verifying proofs during presale bytes32 public constant PRE_SALE_MERKLE_ROOT = 0x9f93df4f70710b1cc9fa86ee3c87cc30f77a6709363ccd6bdddeae109330be37; // packing the next variables as uint16 (max 65535, 2 bytes each, less than 32 bytes = 1 slot) uint16 public constant MAX_SUPPLY = 8888; // the max total supply uint16 public constant MAX_PUBLIC_SUPPLY = 8388; // the max public supply uint16 public constant MAX_MINT_AMOUNT = 10; // the max amount an address can mint uint16 public constant PRE_SALE_MAX_MINT_AMOUNT = 5; // the max amount an address can mint during presale // the address of the DAO treasury that will receive percentage of all withdrawls address public constant DAO_TREASURY_ADDRESS = 0x8C3b934E904b25455F53eFC2beCA8693406E15b1; string public hiddenMetadataUri; string public uriPrefix = ""; bool public revealed = false; // determines whether the artwork is revealed constructor() ERC721A("Doggo Verse", "DV", 500) { setHiddenMetadataUri("ipfs://QmU3iVT84VGGY5T2jDfgTzqG8VtcRPdtND5Ma6568Pgfhs/unreaveled"); } /* * Base URI for computing {tokenURI}. The resulting URI for each token will be * the concatenation of the `baseURI` and the `tokenId`. */ function _baseURI() internal view override(ERC721A) returns (string memory) { return uriPrefix; } function tokenURI(uint256 _tokenId) public view override(ERC721A) returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString())) : ""; } // The following functions are available only to the owner /* * @dev Pauses the contract. */ function pause() public onlyOwner { _pause(); } /* * @dev Resumes the contract. */ function resume() public onlyOwner { _resume(); } /* * @dev Disables presale. */ function disablePreSale() public onlyOwner { _disablePreSale(); } /* * @dev Enables presale. */ function enablePreSale() public onlyOwner { _enablePreSale(); } /* * @dev Withdraws the contracts balance to owner and DAO. */ function withdraw() public onlyOwner { // Reserve 30% for DAO treasury (bool hs, ) = payable(DAO_TREASURY_ADDRESS).call{ value: (address(this).balance * 30) / 100 }(""); require(hs, "DAO tranfer failed"); // owner only (bool os, ) = payable(owner()).call{ value: address(this).balance }(""); require(os, "owner transfer failed"); } /* * @dev Reveals the artwork. */ function reveal() public onlyOwner { revealed = true; } /* * @dev Hides the artwork. */ function hide() public onlyOwner { revealed = false; } /* * @dev Sets uri prefix for revealed tokens */ function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } /* * @dev Sets uri prefix for hidden tokens */ function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } /* * @dev Mints a doggo to an address */ function _mintDoggo(address to, uint256 quantity) private { _safeMint(to, quantity); } /* * @dev Mints doggos when presale is enabled. */ function presaleMintDoggo(uint256 quantity, bytes32[] calldata merkleProof) external payable whenNotPaused whenPreSale nonReentrant { require(totalSupply() + quantity < MAX_SUPPLY, "max supply reached"); if (_msgSender() != owner()) { require(totalSupply() + quantity < MAX_PUBLIC_SUPPLY, "max public supply reached"); require( MerkleProof.verify(merkleProof, PRE_SALE_MERKLE_ROOT, keccak256(abi.encodePacked(_msgSender()))), "Address not on the list" ); require(_numberMinted(_msgSender()) + quantity <= PRE_SALE_MAX_MINT_AMOUNT, "presale mint limit reached"); require(msg.value >= COST * quantity, "incorrect ether value"); } _mintDoggo(_msgSender(), quantity); } /* * @dev Mints doggos when presale is disabled. */ function mintDoggo(uint256 quantity) external payable whenNotPaused whenNotPreSale nonReentrant { require(totalSupply() + quantity < MAX_SUPPLY, "max supply reached"); if (_msgSender() != owner()) { require(totalSupply() + quantity < MAX_PUBLIC_SUPPLY, "max public supply reached"); require(_numberMinted(_msgSender()) + quantity <= MAX_MINT_AMOUNT, "mint limit reached"); require(msg.value >= COST * quantity, "incorrect ether value"); } _mintDoggo(_msgSender(), quantity); } /* * @dev Returns the number of tokens minted by an address */ function numberMinted(address _owner) public view returns (uint256) { return _numberMinted(_owner); } // The following functions are overrides required by Solidity. function supportsInterface(bytes4 interfaceId) public view override(ERC721A) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAO_TREASURY_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_AMOUNT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_SALE_MAX_MINT_AMOUNT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_SALE_MERKLE_ROOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disablePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePreSale","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":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hide","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintDoggo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"presaleMintDoggo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6000808055600781905560c0604081905260a08290526200002491600b91906200022a565b50600c805460ff191690553480156200003c57600080fd5b506040518060400160405280600b81526020016a446f67676f20566572736560a81b81525060405180604001604052806002815260200161222b60f11b8152506101f460008111620000e55760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b60648201526084015b60405180910390fd5b8251620000fa9060019060208601906200022a565b508151620001109060029060208501906200022a565b50608052506200012290503362000163565b6008805461ffff60a01b191661010160a01b1790556001600955604080516060810182528181526200015d916200373a6020830139620001b5565b6200030d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620002115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000dc565b80516200022690600a9060208401906200022a565b5050565b8280546200023890620002d0565b90600052602060002090601f0160209004810192826200025c5760008555620002a7565b82601f106200027757805160ff1916838001178555620002a7565b82800160010185558215620002a7579182015b82811115620002a75782518255916020019190600101906200028a565b50620002b5929150620002b9565b5090565b5b80821115620002b55760008155600101620002ba565b600181811c90821680620002e557607f821691505b602082108114156200030757634e487b7160e01b600052602260045260246000fd5b50919050565b60805161340362000337600039600081816123d7015281816124010152612b0401526134036000f3fe6080604052600436106102e75760003560e01c8063715018a611610184578063b62a7625116100d6578063c9e908601161008a578063e985e9c511610064578063e985e9c5146107a1578063f2fde38b146107ea578063fa9b70181461080a57600080fd5b8063c9e9086014610743578063d7224ba01461076b578063dc33e6811461078157600080fd5b8063bf8fbbd2116100bb578063bf8fbbd2146106f2578063c80becb61461070e578063c87b56dd1461072357600080fd5b8063b62a7625146106bd578063b88d4fde146106d257600080fd5b806395d89b4111610138578063a45ba8e711610112578063a45ba8e71461067e578063a475b5dd14610693578063adf6431e146106a857600080fd5b806395d89b41146106155780639fc6808f1461062a578063a22cb4651461065e57600080fd5b80638456cb59116101695780638456cb59146105cd57806386ef3eca146105e25780638da5cb5b146105f757600080fd5b8063715018a6146105985780637ec4a659146105ad57600080fd5b80633ccfd60b1161023d57806351830227116101f157806362b99ad4116101cb57806362b99ad4146105435780636352211e1461055857806370a082311461057857600080fd5b806351830227146104eb5780635a7adf7f146105055780635c975abb1461052457600080fd5b8063460400321161022257806346040032146104985780634f6ccce7146104ab5780634fdd43cb146104cb57600080fd5b80633ccfd60b1461046357806342842e0e1461047857600080fd5b806318160ddd1161029f5780632a47f799116102795780632a47f799146104045780632f745c591461042d57806332cb6b0c1461044d57600080fd5b806318160ddd146103b257806323b872dd146103d15780632456e91c146103f157600080fd5b806306fdde03116102d057806306fdde0314610338578063081812fc1461035a578063095ea7b31461039257600080fd5b806301ffc9a7146102ec578063046f7da214610321575b600080fd5b3480156102f857600080fd5b5061030c610307366004612e39565b61081f565b60405190151581526020015b60405180910390f35b34801561032d57600080fd5b50610336610830565b005b34801561034457600080fd5b5061034d610887565b6040516103189190612eae565b34801561036657600080fd5b5061037a610375366004612ec1565b610919565b6040516001600160a01b039091168152602001610318565b34801561039e57600080fd5b506103366103ad366004612ef6565b6109b4565b3480156103be57600080fd5b506000545b604051908152602001610318565b3480156103dd57600080fd5b506103366103ec366004612f20565b610ae7565b6103366103ff366004612ec1565b610af2565b34801561041057600080fd5b5061041a6120c481565b60405161ffff9091168152602001610318565b34801561043957600080fd5b506103c3610448366004612ef6565b610dc0565b34801561045957600080fd5b5061041a6122b881565b34801561046f57600080fd5b50610336610f58565b34801561048457600080fd5b50610336610493366004612f20565b611118565b6103366104a6366004612f5c565b611133565b3480156104b757600080fd5b506103c36104c6366004612ec1565b6114ee565b3480156104d757600080fd5b506103366104e6366004613067565b61156a565b3480156104f757600080fd5b50600c5461030c9060ff1681565b34801561051157600080fd5b50600854600160a81b900460ff1661030c565b34801561053057600080fd5b50600854600160a01b900460ff1661030c565b34801561054f57600080fd5b5061034d6115c5565b34801561056457600080fd5b5061037a610573366004612ec1565b611653565b34801561058457600080fd5b506103c36105933660046130b0565b611665565b3480156105a457600080fd5b50610336611708565b3480156105b957600080fd5b506103366105c8366004613067565b61175a565b3480156105d957600080fd5b506103366117b5565b3480156105ee57600080fd5b5061041a600581565b34801561060357600080fd5b506008546001600160a01b031661037a565b34801561062157600080fd5b5061034d611805565b34801561063657600080fd5b506103c37f9f93df4f70710b1cc9fa86ee3c87cc30f77a6709363ccd6bdddeae109330be3781565b34801561066a57600080fd5b506103366106793660046130cb565b611814565b34801561068a57600080fd5b5061034d6118d9565b34801561069f57600080fd5b506103366118e6565b3480156106b457600080fd5b5061033661193d565b3480156106c957600080fd5b5061033661198d565b3480156106de57600080fd5b506103366106ed366004613107565b6119e1565b3480156106fe57600080fd5b506103c367011c37937e08000081565b34801561071a57600080fd5b50610336611a70565b34801561072f57600080fd5b5061034d61073e366004612ec1565b611ac0565b34801561074f57600080fd5b5061037a738c3b934e904b25455f53efc2beca8693406e15b181565b34801561077757600080fd5b506103c360075481565b34801561078d57600080fd5b506103c361079c3660046130b0565b611c37565b3480156107ad57600080fd5b5061030c6107bc366004613183565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156107f657600080fd5b506103366108053660046130b0565b611c42565b34801561081657600080fd5b5061041a600a81565b600061082a82611d12565b92915050565b6008546001600160a01b0316331461087d5760405162461bcd60e51b815260206004820181905260248201526000805160206133ae83398151915260448201526064015b60405180910390fd5b610885611de5565b565b606060018054610896906131b6565b80601f01602080910402602001604051908101604052809291908181526020018280546108c2906131b6565b801561090f5780601f106108e45761010080835404028352916020019161090f565b820191906000526020600020905b8154815290600101906020018083116108f257829003601f168201915b5050505050905090565b6000610926826000541190565b6109985760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e000000000000000000000000000000000000006064820152608401610874565b506000908152600560205260409020546001600160a01b031690565b60006109bf82611653565b9050806001600160a01b0316836001600160a01b03161415610a495760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610874565b336001600160a01b0382161480610a655750610a6581336107bc565b610ad75760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610874565b610ae2838383611e4d565b505050565b610ae2838383611eb6565b600854600160a01b900460ff1615610b4c5760405162461bcd60e51b815260206004820152601c60248201527f5061757361626c653a20636f6e747261637420697320706175736564000000006044820152606401610874565b600854600160a81b900460ff1615610bb75760405162461bcd60e51b815260206004820152602860248201527f50726553616c6541776172653a2070726573616c65206d757374206e6f742062604482015267652061637469766560c01b6064820152608401610874565b60026009541415610c0a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610874565b60026009556122b881610c1c60005490565b610c269190613207565b10610c735760405162461bcd60e51b815260206004820152601260248201527f6d617820737570706c79207265616368656400000000000000000000000000006044820152606401610874565b6008546001600160a01b03163314610dae576120c481610c9260005490565b610c9c9190613207565b10610ce95760405162461bcd60e51b815260206004820152601960248201527f6d6178207075626c696320737570706c792072656163686564000000000000006044820152606401610874565b600a81610cf533612278565b610cff9190613207565b1115610d4d5760405162461bcd60e51b815260206004820152601260248201527f6d696e74206c696d6974207265616368656400000000000000000000000000006044820152606401610874565b610d5f8167011c37937e08000061321f565b341015610dae5760405162461bcd60e51b815260206004820152601560248201527f696e636f72726563742065746865722076616c756500000000000000000000006044820152606401610874565b610db83382612322565b506001600955565b6000610dcb83611665565b8210610e3f5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610874565b600080549080805b83811015610ee9576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610e9a57805192505b876001600160a01b0316836001600160a01b03161415610ed65786841415610ec85750935061082a92505050565b83610ed28161323e565b9450505b5080610ee18161323e565b915050610e47565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e6465780000000000000000000000000000000000006064820152608401610874565b6008546001600160a01b03163314610fa05760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b6000738c3b934e904b25455f53efc2beca8693406e15b16064610fc447601e61321f565b610fce919061326f565b604051600081818185875af1925050503d806000811461100a576040519150601f19603f3d011682016040523d82523d6000602084013e61100f565b606091505b50509050806110605760405162461bcd60e51b815260206004820152601260248201527f44414f207472616e666572206661696c656400000000000000000000000000006044820152606401610874565b60006110746008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146110be576040519150601f19603f3d011682016040523d82523d6000602084013e6110c3565b606091505b50509050806111145760405162461bcd60e51b815260206004820152601560248201527f6f776e6572207472616e73666572206661696c656400000000000000000000006044820152606401610874565b5050565b610ae2838383604051806020016040528060008152506119e1565b600854600160a01b900460ff161561118d5760405162461bcd60e51b815260206004820152601c60248201527f5061757361626c653a20636f6e747261637420697320706175736564000000006044820152606401610874565b600854600160a81b900460ff166111f25760405162461bcd60e51b8152602060048201526024808201527f50726553616c6541776172653a2070726573616c65206d7573742062652061636044820152637469766560e01b6064820152608401610874565b600260095414156112455760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610874565b60026009556122b88361125760005490565b6112619190613207565b106112ae5760405162461bcd60e51b815260206004820152601260248201527f6d617820737570706c79207265616368656400000000000000000000000000006044820152606401610874565b6008546001600160a01b031633146114da576120c4836112cd60005490565b6112d79190613207565b106113245760405162461bcd60e51b815260206004820152601960248201527f6d6178207075626c696320737570706c792072656163686564000000000000006044820152606401610874565b6113c98282808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f9f93df4f70710b1cc9fa86ee3c87cc30f77a6709363ccd6bdddeae109330be3792506113869150611de19050565b6040516020016113ae919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528051906020012061232c565b6114155760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f74206f6e20746865206c6973740000000000000000006044820152606401610874565b60058361142133612278565b61142b9190613207565b11156114795760405162461bcd60e51b815260206004820152601a60248201527f70726573616c65206d696e74206c696d697420726561636865640000000000006044820152606401610874565b61148b8367011c37937e08000061321f565b3410156114da5760405162461bcd60e51b815260206004820152601560248201527f696e636f72726563742065746865722076616c756500000000000000000000006044820152606401610874565b6114e43384612322565b5050600160095550565b6000805482106115665760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e647300000000000000000000000000000000000000000000000000000000006064820152608401610874565b5090565b6008546001600160a01b031633146115b25760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b805161111490600a906020840190612d93565b600b80546115d2906131b6565b80601f01602080910402602001604051908101604052809291908181526020018280546115fe906131b6565b801561164b5780601f106116205761010080835404028352916020019161164b565b820191906000526020600020905b81548152906001019060200180831161162e57829003601f168201915b505050505081565b600061165e82612342565b5192915050565b60006001600160a01b0382166116e35760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610874565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b610885600061250d565b6008546001600160a01b031633146117a25760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b805161111490600b906020840190612d93565b6008546001600160a01b031633146117fd5760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b61088561256c565b606060028054610896906131b6565b6001600160a01b03821633141561186d5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610874565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a80546115d2906131b6565b6008546001600160a01b0316331461192e5760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b600c805460ff19166001179055565b6008546001600160a01b031633146119855760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b6108856125db565b6008546001600160a01b031633146119d55760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b600c805460ff19169055565b6119ec848484611eb6565b6119f88484848461264f565b611a6a5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610874565b50505050565b6008546001600160a01b03163314611ab85760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b6108856127a4565b6060611acd826000541190565b611b3f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610874565b600c5460ff16611bdb57600a8054611b56906131b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611b82906131b6565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b50505050509050919050565b6000611be5612824565b90506000815111611c055760405180602001604052806000815250611c30565b80611c0f84612833565b604051602001611c20929190613283565b6040516020818303038152906040525b9392505050565b600061082a82612278565b6008546001600160a01b03163314611c8a5760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b6001600160a01b038116611d065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610874565b611d0f8161250d565b50565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480611d7557506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80611da957506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b8061082a57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461082a565b3390565b600854600160a01b900460ff16611e3e5760405162461bcd60e51b815260206004820181905260248201527f5061757361626c653a20636f6e7472616374206973206e6f74207061757365646044820152606401610874565b6008805460ff60a01b19169055565b600082815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611ec182612342565b80519091506000906001600160a01b0316336001600160a01b03161480611ef8575033611eed84610919565b6001600160a01b0316145b80611f0a57508151611f0a90336107bc565b905080611f7f5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610874565b846001600160a01b031682600001516001600160a01b03161461200a5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e657200000000000000000000000000000000000000000000000000006064820152608401610874565b6001600160a01b0384166120865760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610874565b6120966000848460000151611e4d565b6001600160a01b03851660009081526004602052604081208054600192906120c89084906001600160801b03166132b2565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092612114918591166132da565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561219c846001613207565b6000818152600360205260409020549091506001600160a01b031661222e576121c6816000541190565b1561222e5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60006001600160a01b0382166122f65760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527f20746865207a65726f20616464726573730000000000000000000000000000006064820152608401610874565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b6111148282612965565b600082612339858461297f565b14949350505050565b6040805180820190915260008082526020820152612361826000541190565b6123d35760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e000000000000000000000000000000000000000000006064820152608401610874565b60007f00000000000000000000000000000000000000000000000000000000000000008310612434576124267f0000000000000000000000000000000000000000000000000000000000000000846132fc565b612431906001613207565b90505b825b81811061249e576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561248b57949350505050565b508061249681613313565b915050612436565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006064820152608401610874565b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600854600160a01b900460ff16156125c65760405162461bcd60e51b815260206004820152601c60248201527f5061757361626c653a20636f6e747261637420697320706175736564000000006044820152606401610874565b6008805460ff60a01b1916600160a01b179055565b600854600160a81b900460ff166126405760405162461bcd60e51b8152602060048201526024808201527f50726553616c6541776172653a2070726573616c65206d7573742062652061636044820152637469766560e01b6064820152608401610874565b6008805460ff60a81b19169055565b60006001600160a01b0384163b1561279857604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061269390339089908890889060040161332a565b6020604051808303816000875af19250505080156126ce575060408051601f3d908101601f191682019092526126cb91810190613366565b60015b61277e573d8080156126fc576040519150601f19603f3d011682016040523d82523d6000602084013e612701565b606091505b5080516127765760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610874565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061279c565b5060015b949350505050565b600854600160a81b900460ff161561280f5760405162461bcd60e51b815260206004820152602860248201527f50726553616c6541776172653a2070726573616c65206d757374206e6f742062604482015267652061637469766560c01b6064820152608401610874565b6008805460ff60a81b1916600160a81b179055565b6060600b8054610896906131b6565b60608161287357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561289d57806128878161323e565b91506128969050600a8361326f565b9150612877565b60008167ffffffffffffffff8111156128b8576128b8612fdb565b6040519080825280601f01601f1916602001820160405280156128e2576020820181803683370190505b5090505b841561279c576128f76001836132fc565b9150612904600a86613383565b61290f906030613207565b60f81b81838151811061292457612924613397565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061295e600a8661326f565b94506128e6565b611114828260405180602001604052806000815250612a2b565b600081815b8451811015612a235760008582815181106129a1576129a1613397565b602002602001015190508083116129e3576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612a10565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612a1b8161323e565b915050612984565b509392505050565b6000546001600160a01b038416612aaa5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610874565b612ab5816000541190565b15612b025760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610874565b7f0000000000000000000000000000000000000000000000000000000000000000831115612b985760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960448201527f67680000000000000000000000000000000000000000000000000000000000006064820152608401610874565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612bf49087906132da565b6001600160801b03168152602001858360200151612c1291906132da565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612d885760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612cf6600088848861264f565b612d685760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610874565b81612d728161323e565b9250508080612d809061323e565b915050612ca9565b506000819055612270565b828054612d9f906131b6565b90600052602060002090601f016020900481019282612dc15760008555612e07565b82601f10612dda57805160ff1916838001178555612e07565b82800160010185558215612e07579182015b82811115612e07578251825591602001919060010190612dec565b506115669291505b808211156115665760008155600101612e0f565b6001600160e01b031981168114611d0f57600080fd5b600060208284031215612e4b57600080fd5b8135611c3081612e23565b60005b83811015612e71578181015183820152602001612e59565b83811115611a6a5750506000910152565b60008151808452612e9a816020860160208601612e56565b601f01601f19169290920160200192915050565b602081526000611c306020830184612e82565b600060208284031215612ed357600080fd5b5035919050565b80356001600160a01b0381168114612ef157600080fd5b919050565b60008060408385031215612f0957600080fd5b612f1283612eda565b946020939093013593505050565b600080600060608486031215612f3557600080fd5b612f3e84612eda565b9250612f4c60208501612eda565b9150604084013590509250925092565b600080600060408486031215612f7157600080fd5b83359250602084013567ffffffffffffffff80821115612f9057600080fd5b818601915086601f830112612fa457600080fd5b813581811115612fb357600080fd5b8760208260051b8501011115612fc857600080fd5b6020830194508093505050509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561300c5761300c612fdb565b604051601f8501601f19908116603f0116810190828211818310171561303457613034612fdb565b8160405280935085815286868601111561304d57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561307957600080fd5b813567ffffffffffffffff81111561309057600080fd5b8201601f810184136130a157600080fd5b61279c84823560208401612ff1565b6000602082840312156130c257600080fd5b611c3082612eda565b600080604083850312156130de57600080fd5b6130e783612eda565b9150602083013580151581146130fc57600080fd5b809150509250929050565b6000806000806080858703121561311d57600080fd5b61312685612eda565b935061313460208601612eda565b925060408501359150606085013567ffffffffffffffff81111561315757600080fd5b8501601f8101871361316857600080fd5b61317787823560208401612ff1565b91505092959194509250565b6000806040838503121561319657600080fd5b61319f83612eda565b91506131ad60208401612eda565b90509250929050565b600181811c908216806131ca57607f821691505b602082108114156131eb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561321a5761321a6131f1565b500190565b6000816000190483118215151615613239576132396131f1565b500290565b6000600019821415613252576132526131f1565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261327e5761327e613259565b500490565b60008351613295818460208801612e56565b8351908301906132a9818360208801612e56565b01949350505050565b60006001600160801b03838116908316818110156132d2576132d26131f1565b039392505050565b60006001600160801b038083168185168083038211156132a9576132a96131f1565b60008282101561330e5761330e6131f1565b500390565b600081613322576133226131f1565b506000190190565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261335c6080830184612e82565b9695505050505050565b60006020828403121561337857600080fd5b8151611c3081612e23565b60008261339257613392613259565b500690565b634e487b7160e01b600052603260045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220b7bbd7ee9ab1542a8a2cb4bb6c14579b679e08db33719593c8b0618bf852ee9964736f6c634300080b0033697066733a2f2f516d55336956543834564747593554326a446667547a714738567463525064744e44354d613635363850676668732f756e72656176656c6564
Deployed Bytecode
0x6080604052600436106102e75760003560e01c8063715018a611610184578063b62a7625116100d6578063c9e908601161008a578063e985e9c511610064578063e985e9c5146107a1578063f2fde38b146107ea578063fa9b70181461080a57600080fd5b8063c9e9086014610743578063d7224ba01461076b578063dc33e6811461078157600080fd5b8063bf8fbbd2116100bb578063bf8fbbd2146106f2578063c80becb61461070e578063c87b56dd1461072357600080fd5b8063b62a7625146106bd578063b88d4fde146106d257600080fd5b806395d89b4111610138578063a45ba8e711610112578063a45ba8e71461067e578063a475b5dd14610693578063adf6431e146106a857600080fd5b806395d89b41146106155780639fc6808f1461062a578063a22cb4651461065e57600080fd5b80638456cb59116101695780638456cb59146105cd57806386ef3eca146105e25780638da5cb5b146105f757600080fd5b8063715018a6146105985780637ec4a659146105ad57600080fd5b80633ccfd60b1161023d57806351830227116101f157806362b99ad4116101cb57806362b99ad4146105435780636352211e1461055857806370a082311461057857600080fd5b806351830227146104eb5780635a7adf7f146105055780635c975abb1461052457600080fd5b8063460400321161022257806346040032146104985780634f6ccce7146104ab5780634fdd43cb146104cb57600080fd5b80633ccfd60b1461046357806342842e0e1461047857600080fd5b806318160ddd1161029f5780632a47f799116102795780632a47f799146104045780632f745c591461042d57806332cb6b0c1461044d57600080fd5b806318160ddd146103b257806323b872dd146103d15780632456e91c146103f157600080fd5b806306fdde03116102d057806306fdde0314610338578063081812fc1461035a578063095ea7b31461039257600080fd5b806301ffc9a7146102ec578063046f7da214610321575b600080fd5b3480156102f857600080fd5b5061030c610307366004612e39565b61081f565b60405190151581526020015b60405180910390f35b34801561032d57600080fd5b50610336610830565b005b34801561034457600080fd5b5061034d610887565b6040516103189190612eae565b34801561036657600080fd5b5061037a610375366004612ec1565b610919565b6040516001600160a01b039091168152602001610318565b34801561039e57600080fd5b506103366103ad366004612ef6565b6109b4565b3480156103be57600080fd5b506000545b604051908152602001610318565b3480156103dd57600080fd5b506103366103ec366004612f20565b610ae7565b6103366103ff366004612ec1565b610af2565b34801561041057600080fd5b5061041a6120c481565b60405161ffff9091168152602001610318565b34801561043957600080fd5b506103c3610448366004612ef6565b610dc0565b34801561045957600080fd5b5061041a6122b881565b34801561046f57600080fd5b50610336610f58565b34801561048457600080fd5b50610336610493366004612f20565b611118565b6103366104a6366004612f5c565b611133565b3480156104b757600080fd5b506103c36104c6366004612ec1565b6114ee565b3480156104d757600080fd5b506103366104e6366004613067565b61156a565b3480156104f757600080fd5b50600c5461030c9060ff1681565b34801561051157600080fd5b50600854600160a81b900460ff1661030c565b34801561053057600080fd5b50600854600160a01b900460ff1661030c565b34801561054f57600080fd5b5061034d6115c5565b34801561056457600080fd5b5061037a610573366004612ec1565b611653565b34801561058457600080fd5b506103c36105933660046130b0565b611665565b3480156105a457600080fd5b50610336611708565b3480156105b957600080fd5b506103366105c8366004613067565b61175a565b3480156105d957600080fd5b506103366117b5565b3480156105ee57600080fd5b5061041a600581565b34801561060357600080fd5b506008546001600160a01b031661037a565b34801561062157600080fd5b5061034d611805565b34801561063657600080fd5b506103c37f9f93df4f70710b1cc9fa86ee3c87cc30f77a6709363ccd6bdddeae109330be3781565b34801561066a57600080fd5b506103366106793660046130cb565b611814565b34801561068a57600080fd5b5061034d6118d9565b34801561069f57600080fd5b506103366118e6565b3480156106b457600080fd5b5061033661193d565b3480156106c957600080fd5b5061033661198d565b3480156106de57600080fd5b506103366106ed366004613107565b6119e1565b3480156106fe57600080fd5b506103c367011c37937e08000081565b34801561071a57600080fd5b50610336611a70565b34801561072f57600080fd5b5061034d61073e366004612ec1565b611ac0565b34801561074f57600080fd5b5061037a738c3b934e904b25455f53efc2beca8693406e15b181565b34801561077757600080fd5b506103c360075481565b34801561078d57600080fd5b506103c361079c3660046130b0565b611c37565b3480156107ad57600080fd5b5061030c6107bc366004613183565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156107f657600080fd5b506103366108053660046130b0565b611c42565b34801561081657600080fd5b5061041a600a81565b600061082a82611d12565b92915050565b6008546001600160a01b0316331461087d5760405162461bcd60e51b815260206004820181905260248201526000805160206133ae83398151915260448201526064015b60405180910390fd5b610885611de5565b565b606060018054610896906131b6565b80601f01602080910402602001604051908101604052809291908181526020018280546108c2906131b6565b801561090f5780601f106108e45761010080835404028352916020019161090f565b820191906000526020600020905b8154815290600101906020018083116108f257829003601f168201915b5050505050905090565b6000610926826000541190565b6109985760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e000000000000000000000000000000000000006064820152608401610874565b506000908152600560205260409020546001600160a01b031690565b60006109bf82611653565b9050806001600160a01b0316836001600160a01b03161415610a495760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610874565b336001600160a01b0382161480610a655750610a6581336107bc565b610ad75760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610874565b610ae2838383611e4d565b505050565b610ae2838383611eb6565b600854600160a01b900460ff1615610b4c5760405162461bcd60e51b815260206004820152601c60248201527f5061757361626c653a20636f6e747261637420697320706175736564000000006044820152606401610874565b600854600160a81b900460ff1615610bb75760405162461bcd60e51b815260206004820152602860248201527f50726553616c6541776172653a2070726573616c65206d757374206e6f742062604482015267652061637469766560c01b6064820152608401610874565b60026009541415610c0a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610874565b60026009556122b881610c1c60005490565b610c269190613207565b10610c735760405162461bcd60e51b815260206004820152601260248201527f6d617820737570706c79207265616368656400000000000000000000000000006044820152606401610874565b6008546001600160a01b03163314610dae576120c481610c9260005490565b610c9c9190613207565b10610ce95760405162461bcd60e51b815260206004820152601960248201527f6d6178207075626c696320737570706c792072656163686564000000000000006044820152606401610874565b600a81610cf533612278565b610cff9190613207565b1115610d4d5760405162461bcd60e51b815260206004820152601260248201527f6d696e74206c696d6974207265616368656400000000000000000000000000006044820152606401610874565b610d5f8167011c37937e08000061321f565b341015610dae5760405162461bcd60e51b815260206004820152601560248201527f696e636f72726563742065746865722076616c756500000000000000000000006044820152606401610874565b610db83382612322565b506001600955565b6000610dcb83611665565b8210610e3f5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610874565b600080549080805b83811015610ee9576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610e9a57805192505b876001600160a01b0316836001600160a01b03161415610ed65786841415610ec85750935061082a92505050565b83610ed28161323e565b9450505b5080610ee18161323e565b915050610e47565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e6465780000000000000000000000000000000000006064820152608401610874565b6008546001600160a01b03163314610fa05760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b6000738c3b934e904b25455f53efc2beca8693406e15b16064610fc447601e61321f565b610fce919061326f565b604051600081818185875af1925050503d806000811461100a576040519150601f19603f3d011682016040523d82523d6000602084013e61100f565b606091505b50509050806110605760405162461bcd60e51b815260206004820152601260248201527f44414f207472616e666572206661696c656400000000000000000000000000006044820152606401610874565b60006110746008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146110be576040519150601f19603f3d011682016040523d82523d6000602084013e6110c3565b606091505b50509050806111145760405162461bcd60e51b815260206004820152601560248201527f6f776e6572207472616e73666572206661696c656400000000000000000000006044820152606401610874565b5050565b610ae2838383604051806020016040528060008152506119e1565b600854600160a01b900460ff161561118d5760405162461bcd60e51b815260206004820152601c60248201527f5061757361626c653a20636f6e747261637420697320706175736564000000006044820152606401610874565b600854600160a81b900460ff166111f25760405162461bcd60e51b8152602060048201526024808201527f50726553616c6541776172653a2070726573616c65206d7573742062652061636044820152637469766560e01b6064820152608401610874565b600260095414156112455760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610874565b60026009556122b88361125760005490565b6112619190613207565b106112ae5760405162461bcd60e51b815260206004820152601260248201527f6d617820737570706c79207265616368656400000000000000000000000000006044820152606401610874565b6008546001600160a01b031633146114da576120c4836112cd60005490565b6112d79190613207565b106113245760405162461bcd60e51b815260206004820152601960248201527f6d6178207075626c696320737570706c792072656163686564000000000000006044820152606401610874565b6113c98282808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f9f93df4f70710b1cc9fa86ee3c87cc30f77a6709363ccd6bdddeae109330be3792506113869150611de19050565b6040516020016113ae919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040528051906020012061232c565b6114155760405162461bcd60e51b815260206004820152601760248201527f41646472657373206e6f74206f6e20746865206c6973740000000000000000006044820152606401610874565b60058361142133612278565b61142b9190613207565b11156114795760405162461bcd60e51b815260206004820152601a60248201527f70726573616c65206d696e74206c696d697420726561636865640000000000006044820152606401610874565b61148b8367011c37937e08000061321f565b3410156114da5760405162461bcd60e51b815260206004820152601560248201527f696e636f72726563742065746865722076616c756500000000000000000000006044820152606401610874565b6114e43384612322565b5050600160095550565b6000805482106115665760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e647300000000000000000000000000000000000000000000000000000000006064820152608401610874565b5090565b6008546001600160a01b031633146115b25760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b805161111490600a906020840190612d93565b600b80546115d2906131b6565b80601f01602080910402602001604051908101604052809291908181526020018280546115fe906131b6565b801561164b5780601f106116205761010080835404028352916020019161164b565b820191906000526020600020905b81548152906001019060200180831161162e57829003601f168201915b505050505081565b600061165e82612342565b5192915050565b60006001600160a01b0382166116e35760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610874565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b610885600061250d565b6008546001600160a01b031633146117a25760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b805161111490600b906020840190612d93565b6008546001600160a01b031633146117fd5760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b61088561256c565b606060028054610896906131b6565b6001600160a01b03821633141561186d5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610874565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a80546115d2906131b6565b6008546001600160a01b0316331461192e5760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b600c805460ff19166001179055565b6008546001600160a01b031633146119855760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b6108856125db565b6008546001600160a01b031633146119d55760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b600c805460ff19169055565b6119ec848484611eb6565b6119f88484848461264f565b611a6a5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610874565b50505050565b6008546001600160a01b03163314611ab85760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b6108856127a4565b6060611acd826000541190565b611b3f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610874565b600c5460ff16611bdb57600a8054611b56906131b6565b80601f0160208091040260200160405190810160405280929190818152602001828054611b82906131b6565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b50505050509050919050565b6000611be5612824565b90506000815111611c055760405180602001604052806000815250611c30565b80611c0f84612833565b604051602001611c20929190613283565b6040516020818303038152906040525b9392505050565b600061082a82612278565b6008546001600160a01b03163314611c8a5760405162461bcd60e51b815260206004820181905260248201526000805160206133ae8339815191526044820152606401610874565b6001600160a01b038116611d065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610874565b611d0f8161250d565b50565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480611d7557506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80611da957506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b8061082a57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461082a565b3390565b600854600160a01b900460ff16611e3e5760405162461bcd60e51b815260206004820181905260248201527f5061757361626c653a20636f6e7472616374206973206e6f74207061757365646044820152606401610874565b6008805460ff60a01b19169055565b600082815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611ec182612342565b80519091506000906001600160a01b0316336001600160a01b03161480611ef8575033611eed84610919565b6001600160a01b0316145b80611f0a57508151611f0a90336107bc565b905080611f7f5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610874565b846001600160a01b031682600001516001600160a01b03161461200a5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e657200000000000000000000000000000000000000000000000000006064820152608401610874565b6001600160a01b0384166120865760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610874565b6120966000848460000151611e4d565b6001600160a01b03851660009081526004602052604081208054600192906120c89084906001600160801b03166132b2565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092612114918591166132da565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561219c846001613207565b6000818152600360205260409020549091506001600160a01b031661222e576121c6816000541190565b1561222e5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60006001600160a01b0382166122f65760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527f20746865207a65726f20616464726573730000000000000000000000000000006064820152608401610874565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b6111148282612965565b600082612339858461297f565b14949350505050565b6040805180820190915260008082526020820152612361826000541190565b6123d35760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e000000000000000000000000000000000000000000006064820152608401610874565b60007f00000000000000000000000000000000000000000000000000000000000001f48310612434576124267f00000000000000000000000000000000000000000000000000000000000001f4846132fc565b612431906001613207565b90505b825b81811061249e576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561248b57949350505050565b508061249681613313565b915050612436565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006064820152608401610874565b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600854600160a01b900460ff16156125c65760405162461bcd60e51b815260206004820152601c60248201527f5061757361626c653a20636f6e747261637420697320706175736564000000006044820152606401610874565b6008805460ff60a01b1916600160a01b179055565b600854600160a81b900460ff166126405760405162461bcd60e51b8152602060048201526024808201527f50726553616c6541776172653a2070726573616c65206d7573742062652061636044820152637469766560e01b6064820152608401610874565b6008805460ff60a81b19169055565b60006001600160a01b0384163b1561279857604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061269390339089908890889060040161332a565b6020604051808303816000875af19250505080156126ce575060408051601f3d908101601f191682019092526126cb91810190613366565b60015b61277e573d8080156126fc576040519150601f19603f3d011682016040523d82523d6000602084013e612701565b606091505b5080516127765760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610874565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061279c565b5060015b949350505050565b600854600160a81b900460ff161561280f5760405162461bcd60e51b815260206004820152602860248201527f50726553616c6541776172653a2070726573616c65206d757374206e6f742062604482015267652061637469766560c01b6064820152608401610874565b6008805460ff60a81b1916600160a81b179055565b6060600b8054610896906131b6565b60608161287357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561289d57806128878161323e565b91506128969050600a8361326f565b9150612877565b60008167ffffffffffffffff8111156128b8576128b8612fdb565b6040519080825280601f01601f1916602001820160405280156128e2576020820181803683370190505b5090505b841561279c576128f76001836132fc565b9150612904600a86613383565b61290f906030613207565b60f81b81838151811061292457612924613397565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061295e600a8661326f565b94506128e6565b611114828260405180602001604052806000815250612a2b565b600081815b8451811015612a235760008582815181106129a1576129a1613397565b602002602001015190508083116129e3576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612a10565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612a1b8161323e565b915050612984565b509392505050565b6000546001600160a01b038416612aaa5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610874565b612ab5816000541190565b15612b025760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610874565b7f00000000000000000000000000000000000000000000000000000000000001f4831115612b985760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960448201527f67680000000000000000000000000000000000000000000000000000000000006064820152608401610874565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612bf49087906132da565b6001600160801b03168152602001858360200151612c1291906132da565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612d885760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612cf6600088848861264f565b612d685760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e746572000000000000000000000000006064820152608401610874565b81612d728161323e565b9250508080612d809061323e565b915050612ca9565b506000819055612270565b828054612d9f906131b6565b90600052602060002090601f016020900481019282612dc15760008555612e07565b82601f10612dda57805160ff1916838001178555612e07565b82800160010185558215612e07579182015b82811115612e07578251825591602001919060010190612dec565b506115669291505b808211156115665760008155600101612e0f565b6001600160e01b031981168114611d0f57600080fd5b600060208284031215612e4b57600080fd5b8135611c3081612e23565b60005b83811015612e71578181015183820152602001612e59565b83811115611a6a5750506000910152565b60008151808452612e9a816020860160208601612e56565b601f01601f19169290920160200192915050565b602081526000611c306020830184612e82565b600060208284031215612ed357600080fd5b5035919050565b80356001600160a01b0381168114612ef157600080fd5b919050565b60008060408385031215612f0957600080fd5b612f1283612eda565b946020939093013593505050565b600080600060608486031215612f3557600080fd5b612f3e84612eda565b9250612f4c60208501612eda565b9150604084013590509250925092565b600080600060408486031215612f7157600080fd5b83359250602084013567ffffffffffffffff80821115612f9057600080fd5b818601915086601f830112612fa457600080fd5b813581811115612fb357600080fd5b8760208260051b8501011115612fc857600080fd5b6020830194508093505050509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561300c5761300c612fdb565b604051601f8501601f19908116603f0116810190828211818310171561303457613034612fdb565b8160405280935085815286868601111561304d57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561307957600080fd5b813567ffffffffffffffff81111561309057600080fd5b8201601f810184136130a157600080fd5b61279c84823560208401612ff1565b6000602082840312156130c257600080fd5b611c3082612eda565b600080604083850312156130de57600080fd5b6130e783612eda565b9150602083013580151581146130fc57600080fd5b809150509250929050565b6000806000806080858703121561311d57600080fd5b61312685612eda565b935061313460208601612eda565b925060408501359150606085013567ffffffffffffffff81111561315757600080fd5b8501601f8101871361316857600080fd5b61317787823560208401612ff1565b91505092959194509250565b6000806040838503121561319657600080fd5b61319f83612eda565b91506131ad60208401612eda565b90509250929050565b600181811c908216806131ca57607f821691505b602082108114156131eb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561321a5761321a6131f1565b500190565b6000816000190483118215151615613239576132396131f1565b500290565b6000600019821415613252576132526131f1565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261327e5761327e613259565b500490565b60008351613295818460208801612e56565b8351908301906132a9818360208801612e56565b01949350505050565b60006001600160801b03838116908316818110156132d2576132d26131f1565b039392505050565b60006001600160801b038083168185168083038211156132a9576132a96131f1565b60008282101561330e5761330e6131f1565b500390565b600081613322576133226131f1565b506000190190565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261335c6080830184612e82565b9695505050505050565b60006020828403121561337857600080fd5b8151611c3081612e23565b60008261339257613392613259565b500690565b634e487b7160e01b600052603260045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220b7bbd7ee9ab1542a8a2cb4bb6c14579b679e08db33719593c8b0618bf852ee9964736f6c634300080b0033
Deployed Bytecode Sourcemap
48276:5326:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53454:145;;;;;;;;;;-1:-1:-1;53454:145:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;53454:145:0;;;;;;;;50423:54;;;;;;;;;;;;;:::i;:::-;;33700:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35225:204::-;;;;;;;;;;-1:-1:-1;35225:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1738:55:1;;;1720:74;;1708:2;1693:18;35225:204:0;1574:226:1;34788:379:0;;;;;;;;;;-1:-1:-1;34788:379:0;;;;;:::i;:::-;;:::i;30538:94::-;;;;;;;;;;-1:-1:-1;30591:7:0;30614:12;30538:94;;;2411:25:1;;;2399:2;2384:18;30538:94:0;2265:177:1;36075:142:0;;;;;;;;;;-1:-1:-1;36075:142:0;;;;;:::i;:::-;;:::i;52694:506::-;;;;;;:::i;:::-;;:::i;48802:47::-;;;;;;;;;;;;48845:4;48802:47;;;;;2954:6:1;2942:19;;;2924:38;;2912:2;2897:18;48802:47:0;2780:188:1;31166:744:0;;;;;;;;;;-1:-1:-1;31166:744:0;;;;;:::i;:::-;;:::i;48734:40::-;;;;;;;;;;;;48770:4;48734:40;;50778:353;;;;;;;;;;;;;:::i;36280:157::-;;;;;;;;;;-1:-1:-1;36280:157:0;;;;;:::i;:::-;;:::i;51899:730::-;;;;;;:::i;:::-;;:::i;30701:177::-;;;;;;;;;;-1:-1:-1;30701:177:0;;;;;:::i;:::-;;:::i;51561:129::-;;;;;;;;;;-1:-1:-1;51561:129:0;;;;;:::i;:::-;;:::i;49321:28::-;;;;;;;;;;-1:-1:-1;49321:28:0;;;;;;;;45138:79;;;;;;;;;;-1:-1:-1;45204:8:0;;-1:-1:-1;;;45204:8:0;;;;45138:79;;44494:77;;;;;;;;;;-1:-1:-1;44559:7:0;;-1:-1:-1;;;44559:7:0;;;;44494:77;;49287:28;;;;;;;;;;;;;:::i;33523:118::-;;;;;;;;;;-1:-1:-1;33523:118:0;;;;;:::i;:::-;;:::i;32400:211::-;;;;;;;;;;-1:-1:-1;32400:211:0;;;;;:::i;:::-;;:::i;2716:103::-;;;;;;;;;;;;;:::i;51404:97::-;;;;;;;;;;-1:-1:-1;51404:97:0;;;;;:::i;:::-;;:::i;50323:52::-;;;;;;;;;;;;;:::i;48963:51::-;;;;;;;;;;;;49013:1;48963:51;;2065:87;;;;;;;;;;-1:-1:-1;2138:6:0;;-1:-1:-1;;;;;2138:6:0;2065:87;;33855:98;;;;;;;;;;;;;:::i;48518:113::-;;;;;;;;;;-1:-1:-1;48518:113:0;48565:66;48518:113;;35493:274;;;;;;;;;;-1:-1:-1;35493:274:0;;;;;:::i;:::-;;:::i;49252:31::-;;;;;;;;;;;;;:::i;51178:60::-;;;;;;;;;;;;;:::i;50521:70::-;;;;;;;;;;;;;:::i;51283:59::-;;;;;;;;;;;;;:::i;36500:311::-;;;;;;;;;;-1:-1:-1;36500:311:0;;;;;:::i;:::-;;:::i;48387:41::-;;;;;;;;;;;;48418:10;48387:41;;50634:68;;;;;;;;;;;;;:::i;49810:403::-;;;;;;;;;;-1:-1:-1;49810:403:0;;;;;:::i;:::-;;:::i;49157:89::-;;;;;;;;;;;;49204:42;49157:89;;40831:43;;;;;;;;;;;;;;;;53276:106;;;;;;;;;;-1:-1:-1;53276:106:0;;;;;:::i;:::-;;:::i;35830:186::-;;;;;;;;;;-1:-1:-1;35830:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;35975:25:0;;;35952:4;35975:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;35830:186;2974:201;;;;;;;;;;-1:-1:-1;2974:201:0;;;;;:::i;:::-;;:::i;48878:43::-;;;;;;;;;;;;48919:2;48878:43;;53454:145;53540:4;53558:36;53582:11;53558:23;:36::i;:::-;53551:43;53454:145;-1:-1:-1;;53454:145:0:o;50423:54::-;2138:6;;-1:-1:-1;;;;;2138:6:0;860:10;2285:23;2277:68;;;;-1:-1:-1;;;2277:68:0;;6807:2:1;2277:68:0;;;6789:21:1;;;6826:18;;;6819:30;-1:-1:-1;;;;;;;;;;;6865:18:1;;;6858:62;6937:18;;2277:68:0;;;;;;;;;50463:9:::1;:7;:9::i;:::-;50423:54::o:0;33700:94::-;33754:13;33783:5;33776:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33700:94;:::o;35225:204::-;35293:7;35317:16;35325:7;37107:4;37137:12;-1:-1:-1;37127:22:0;37050:105;35317:16;35309:74;;;;-1:-1:-1;;;35309:74:0;;7610:2:1;35309:74:0;;;7592:21:1;7649:2;7629:18;;;7622:30;7688:34;7668:18;;;7661:62;7759:15;7739:18;;;7732:43;7792:19;;35309:74:0;7408:409:1;35309:74:0;-1:-1:-1;35399:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;35399:24:0;;35225:204::o;34788:379::-;34857:13;34873:24;34889:7;34873:15;:24::i;:::-;34857:40;;34918:5;-1:-1:-1;;;;;34912:11:0;:2;-1:-1:-1;;;;;34912:11:0;;;34904:58;;;;-1:-1:-1;;;34904:58:0;;8024:2:1;34904:58:0;;;8006:21:1;8063:2;8043:18;;;8036:30;8102:34;8082:18;;;8075:62;8173:4;8153:18;;;8146:32;8195:19;;34904:58:0;7822:398:1;34904:58:0;860:10;-1:-1:-1;;;;;34987:21:0;;;;:62;;-1:-1:-1;35012:37:0;35029:5;860:10;35830:186;:::i;35012:37::-;34971:153;;;;-1:-1:-1;;;34971:153:0;;8427:2:1;34971:153:0;;;8409:21:1;8466:2;8446:18;;;8439:30;8505:34;8485:18;;;8478:62;8576:27;8556:18;;;8549:55;8621:19;;34971:153:0;8225:421:1;34971:153:0;35133:28;35142:2;35146:7;35155:5;35133:8;:28::i;:::-;34850:317;34788:379;;:::o;36075:142::-;36183:28;36193:4;36199:2;36203:7;36183:9;:28::i;52694:506::-;44559:7;;-1:-1:-1;;;44559:7:0;;;;44614:9;44606:50;;;;-1:-1:-1;;;44606:50:0;;8853:2:1;44606:50:0;;;8835:21:1;8892:2;8872:18;;;8865:30;8931;8911:18;;;8904:58;8979:18;;44606:50:0;8651:352:1;44606:50:0;45204:8;;-1:-1:-1;;;45204:8:0;;;;45261:10:::1;45253:63;;;::::0;-1:-1:-1;;;45253:63:0;;9210:2:1;45253:63:0::1;::::0;::::1;9192:21:1::0;9249:2;9229:18;;;9222:30;9288:34;9268:18;;;9261:62;-1:-1:-1;;;9339:18:1;;;9332:38;9387:19;;45253:63:0::1;9008:404:1::0;45253:63:0::1;5356:1:::2;5954:7;;:19;;5946:63;;;::::0;-1:-1:-1;;;5946:63:0;;9619:2:1;5946:63:0::2;::::0;::::2;9601:21:1::0;9658:2;9638:18;;;9631:30;9697:33;9677:18;;;9670:61;9748:18;;5946:63:0::2;9417:355:1::0;5946:63:0::2;5356:1;6087:7;:18:::0;48770:4:::3;52819:8:::0;52803:13:::3;30591:7:::0;30614:12;;30538:94;52803:13:::3;:24;;;;:::i;:::-;:37;52795:68;;;::::0;-1:-1:-1;;;52795:68:0;;10301:2:1;52795:68:0::3;::::0;::::3;10283:21:1::0;10340:2;10320:18;;;10313:30;10379:20;10359:18;;;10352:48;10417:18;;52795:68:0::3;10099:342:1::0;52795:68:0::3;2138:6:::0;;-1:-1:-1;;;;;2138:6:0;860:10;52874:23:::3;52870:285;;48845:4;52929:8:::0;52913:13:::3;30591:7:::0;30614:12;;30538:94;52913:13:::3;:24;;;;:::i;:::-;:44;52905:82;;;::::0;-1:-1:-1;;;52905:82:0;;10648:2:1;52905:82:0::3;::::0;::::3;10630:21:1::0;10687:2;10667:18;;;10660:30;10726:27;10706:18;;;10699:55;10771:18;;52905:82:0::3;10446:349:1::0;52905:82:0::3;48919:2;53031:8:::0;53001:27:::3;860:10:::0;53001:13:::3;:27::i;:::-;:38;;;;:::i;:::-;:57;;52993:88;;;::::0;-1:-1:-1;;;52993:88:0;;11002:2:1;52993:88:0::3;::::0;::::3;10984:21:1::0;11041:2;11021:18;;;11014:30;11080:20;11060:18;;;11053:48;11118:18;;52993:88:0::3;10800:342:1::0;52993:88:0::3;53108:15;53115:8:::0;48418:10:::3;53108:15;:::i;:::-;53095:9;:28;;53087:62;;;::::0;-1:-1:-1;;;53087:62:0;;11522:2:1;53087:62:0::3;::::0;::::3;11504:21:1::0;11561:2;11541:18;;;11534:30;11600:23;11580:18;;;11573:51;11641:18;;53087:62:0::3;11320:345:1::0;53087:62:0::3;53161:34;860:10:::0;53186:8:::3;53161:10;:34::i;:::-;-1:-1:-1::0;5312:1:0::2;6266:7;:22:::0;52694:506::o;31166:744::-;31275:7;31310:16;31320:5;31310:9;:16::i;:::-;31302:5;:24;31294:71;;;;-1:-1:-1;;;31294:71:0;;11872:2:1;31294:71:0;;;11854:21:1;11911:2;11891:18;;;11884:30;11950:34;11930:18;;;11923:62;12021:4;12001:18;;;11994:32;12043:19;;31294:71:0;11670:398:1;31294:71:0;31372:22;30614:12;;;31372:22;;31492:350;31516:14;31512:1;:18;31492:350;;;31546:31;31580:14;;;:11;:14;;;;;;;;;31546:48;;;;;;;;;-1:-1:-1;;;;;31546:48:0;;;;;-1:-1:-1;;;31546:48:0;;;;;;;;;;;;31607:28;31603:89;;31668:14;;;-1:-1:-1;31603:89:0;31725:5;-1:-1:-1;;;;;31704:26:0;:17;-1:-1:-1;;;;;31704:26:0;;31700:135;;;31762:5;31747:11;:20;31743:59;;;-1:-1:-1;31789:1:0;-1:-1:-1;31782:8:0;;-1:-1:-1;;;31782:8:0;31743:59;31812:13;;;;:::i;:::-;;;;31700:135;-1:-1:-1;31532:3:0;;;;:::i;:::-;;;;31492:350;;;-1:-1:-1;31848:56:0;;-1:-1:-1;;;31848:56:0;;12415:2:1;31848:56:0;;;12397:21:1;12454:2;12434:18;;;12427:30;12493:34;12473:18;;;12466:62;12564:16;12544:18;;;12537:44;12598:19;;31848:56:0;12213:410:1;50778:353:0;2138:6;;-1:-1:-1;;;;;2138:6:0;860:10;2285:23;2277:68;;;;-1:-1:-1;;;2277:68:0;;6807:2:1;2277:68:0;;;6789:21:1;;;6826:18;;;6819:30;-1:-1:-1;;;;;;;;;;;6865:18:1;;;6858:62;6937:18;;2277:68:0;6605:356:1;2277:68:0;50856:7:::1;49204:42;50943:3;50913:26;:21;50937:2;50913:26;:::i;:::-;50912:34;;;;:::i;:::-;50869:83;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50855:97;;;50965:2;50957:33;;;::::0;-1:-1:-1;;;50957:33:0;;13354:2:1;50957:33:0::1;::::0;::::1;13336:21:1::0;13393:2;13373:18;;;13366:30;13432:20;13412:18;;;13405:48;13470:18;;50957:33:0::1;13152:342:1::0;50957:33:0::1;51015:7;51036;2138:6:::0;;-1:-1:-1;;;;;2138:6:0;;2065:87;51036:7:::1;-1:-1:-1::0;;;;;51028:21:0::1;51058;51028:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51014:71;;;51098:2;51090:36;;;::::0;-1:-1:-1;;;51090:36:0;;13701:2:1;51090:36:0::1;::::0;::::1;13683:21:1::0;13740:2;13720:18;;;13713:30;13779:23;13759:18;;;13752:51;13820:18;;51090:36:0::1;13499:345:1::0;51090:36:0::1;50815:316;;50778:353::o:0;36280:157::-;36392:39;36409:4;36415:2;36419:7;36392:39;;;;;;;;;;;;:16;:39::i;51899:730::-;44559:7;;-1:-1:-1;;;44559:7:0;;;;44614:9;44606:50;;;;-1:-1:-1;;;44606:50:0;;8853:2:1;44606:50:0;;;8835:21:1;8892:2;8872:18;;;8865:30;8931;8911:18;;;8904:58;8979:18;;44606:50:0;8651:352:1;44606:50:0;45204:8;;-1:-1:-1;;;45204:8:0;;;;45360:58:::1;;;::::0;-1:-1:-1;;;45360:58:0;;14051:2:1;45360:58:0::1;::::0;::::1;14033:21:1::0;14090:2;14070:18;;;14063:30;14129:34;14109:18;;;14102:62;-1:-1:-1;;;14180:18:1;;;14173:34;14224:19;;45360:58:0::1;13849:400:1::0;45360:58:0::1;5356:1:::2;5954:7;;:19;;5946:63;;;::::0;-1:-1:-1;;;5946:63:0;;9619:2:1;5946:63:0::2;::::0;::::2;9601:21:1::0;9658:2;9638:18;;;9631:30;9697:33;9677:18;;;9670:61;9748:18;;5946:63:0::2;9417:355:1::0;5946:63:0::2;5356:1;6087:7;:18:::0;48770:4:::3;52077:8:::0;52061:13:::3;30591:7:::0;30614:12;;30538:94;52061:13:::3;:24;;;;:::i;:::-;:37;52053:68;;;::::0;-1:-1:-1;;;52053:68:0;;10301:2:1;52053:68:0::3;::::0;::::3;10283:21:1::0;10340:2;10320:18;;;10313:30;10379:20;10359:18;;;10352:48;10417:18;;52053:68:0::3;10099:342:1::0;52053:68:0::3;2138:6:::0;;-1:-1:-1;;;;;2138:6:0;860:10;52132:23:::3;52128:456;;48845:4;52187:8:::0;52171:13:::3;30591:7:::0;30614:12;;30538:94;52171:13:::3;:24;;;;:::i;:::-;:44;52163:82;;;::::0;-1:-1:-1;;;52163:82:0;;10648:2:1;52163:82:0::3;::::0;::::3;10630:21:1::0;10687:2;10667:18;;;10660:30;10726:27;10706:18;;;10699:55;10771:18;;52163:82:0::3;10446:349:1::0;52163:82:0::3;52265:96;52284:11;;52265:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;::::0;;;;-1:-1:-1;48565:66:0::3;::::0;-1:-1:-1;52346:12:0::3;::::0;-1:-1:-1;52346:10:0::3;::::0;-1:-1:-1;52346:12:0:i:3;:::-;52329:30;;;;;;;14403:2:1::0;14399:15;;;;-1:-1:-1;;14395:53:1;14383:66;;14474:2;14465:12;;14254:229;52329:30:0::3;;;;;;;;;;;;;52319:41;;;;;;52265:18;:96::i;:::-;52251:148;;;::::0;-1:-1:-1;;;52251:148:0;;14690:2:1;52251:148:0::3;::::0;::::3;14672:21:1::0;14729:2;14709:18;;;14702:30;14768:25;14748:18;;;14741:53;14811:18;;52251:148:0::3;14488:347:1::0;52251:148:0::3;49013:1;52443:8:::0;52413:27:::3;860:10:::0;53001:13:::3;:27::i;52413:::-;:38;;;;:::i;:::-;:66;;52405:105;;;::::0;-1:-1:-1;;;52405:105:0;;15042:2:1;52405:105:0::3;::::0;::::3;15024:21:1::0;15081:2;15061:18;;;15054:30;15120:28;15100:18;;;15093:56;15166:18;;52405:105:0::3;14840:350:1::0;52405:105:0::3;52537:15;52544:8:::0;48418:10:::3;52537:15;:::i;:::-;52524:9;:28;;52516:62;;;::::0;-1:-1:-1;;;52516:62:0;;11522:2:1;52516:62:0::3;::::0;::::3;11504:21:1::0;11561:2;11541:18;;;11534:30;11600:23;11580:18;;;11573:51;11641:18;;52516:62:0::3;11320:345:1::0;52516:62:0::3;52590:34;860:10:::0;52615:8:::3;52590:10;:34::i;:::-;-1:-1:-1::0;;5312:1:0::2;6266:7;:22:::0;-1:-1:-1;51899:730:0:o;30701:177::-;30768:7;30614:12;;30792:5;:21;30784:69;;;;-1:-1:-1;;;30784:69:0;;15397:2:1;30784:69:0;;;15379:21:1;15436:2;15416:18;;;15409:30;15475:34;15455:18;;;15448:62;15546:5;15526:18;;;15519:33;15569:19;;30784:69:0;15195:399:1;30784:69:0;-1:-1:-1;30867:5:0;30701:177::o;51561:129::-;2138:6;;-1:-1:-1;;;;;2138:6:0;860:10;2285:23;2277:68;;;;-1:-1:-1;;;2277:68:0;;6807:2:1;2277:68:0;;;6789:21:1;;;6826:18;;;6819:30;-1:-1:-1;;;;;;;;;;;6865:18:1;;;6858:62;6937:18;;2277:68:0;6605:356:1;2277:68:0;51647:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;49287:28::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33523:118::-;33587:7;33610:20;33622:7;33610:11;:20::i;:::-;:25;;33523:118;-1:-1:-1;;33523:118:0:o;32400:211::-;32464:7;-1:-1:-1;;;;;32488:19:0;;32480:75;;;;-1:-1:-1;;;32480:75:0;;15801:2:1;32480:75:0;;;15783:21:1;15840:2;15820:18;;;15813:30;15879:34;15859:18;;;15852:62;15950:13;15930:18;;;15923:41;15981:19;;32480:75:0;15599:407:1;32480:75:0;-1:-1:-1;;;;;;32577:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;32577:27:0;;32400:211::o;2716:103::-;2138:6;;-1:-1:-1;;;;;2138:6:0;860:10;2285:23;2277:68;;;;-1:-1:-1;;;2277:68:0;;6807:2:1;2277:68:0;;;6789:21:1;;;6826:18;;;6819:30;-1:-1:-1;;;;;;;;;;;6865:18:1;;;6858:62;6937:18;;2277:68:0;6605:356:1;2277:68:0;2781:30:::1;2808:1;2781:18;:30::i;51404:97::-:0;2138:6;;-1:-1:-1;;;;;2138:6:0;860:10;2285:23;2277:68;;;;-1:-1:-1;;;2277:68:0;;6807:2:1;2277:68:0;;;6789:21:1;;;6826:18;;;6819:30;-1:-1:-1;;;;;;;;;;;6865:18:1;;;6858:62;6937:18;;2277:68:0;6605:356:1;2277:68:0;51474:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;50323:52::-:0;2138:6;;-1:-1:-1;;;;;2138:6:0;860:10;2285:23;2277:68;;;;-1:-1:-1;;;2277:68:0;;6807:2:1;2277:68:0;;;6789:21:1;;;6826:18;;;6819:30;-1:-1:-1;;;;;;;;;;;6865:18:1;;;6858:62;6937:18;;2277:68:0;6605:356:1;2277:68:0;50362:8:::1;:6;:8::i;33855:98::-:0;33911:13;33940:7;33933:14;;;;;:::i;35493:274::-;-1:-1:-1;;;;;35584:24:0;;860:10;35584:24;;35576:63;;;;-1:-1:-1;;;35576:63:0;;16213:2:1;35576:63:0;;;16195:21:1;16252:2;16232:18;;;16225:30;16291:28;16271:18;;;16264:56;16337:18;;35576:63:0;16011:350:1;35576:63:0;860:10;35648:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;35648:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;35648:53:0;;;;;;;;;;35713:48;;586:41:1;;;35648:42:0;;860:10;35713:48;;559:18:1;35713:48:0;;;;;;;35493:274;;:::o;49252:31::-;;;;;;;:::i;51178:60::-;2138:6;;-1:-1:-1;;;;;2138:6:0;860:10;2285:23;2277:68;;;;-1:-1:-1;;;2277:68:0;;6807:2:1;2277:68:0;;;6789:21:1;;;6826:18;;;6819:30;-1:-1:-1;;;;;;;;;;;6865:18:1;;;6858:62;6937:18;;2277:68:0;6605:356:1;2277:68:0;51218:8:::1;:15:::0;;-1:-1:-1;;51218:15:0::1;51229:4;51218:15;::::0;;51178:60::o;50521:70::-;2138:6;;-1:-1:-1;;;;;2138:6:0;860:10;2285:23;2277:68;;;;-1:-1:-1;;;2277:68:0;;6807:2:1;2277:68:0;;;6789:21:1;;;6826:18;;;6819:30;-1:-1:-1;;;;;;;;;;;6865:18:1;;;6858:62;6937:18;;2277:68:0;6605:356:1;2277:68:0;50569:17:::1;:15;:17::i;51283:59::-:0;2138:6;;-1:-1:-1;;;;;2138:6:0;860:10;2285:23;2277:68;;;;-1:-1:-1;;;2277:68:0;;6807:2:1;2277:68:0;;;6789:21:1;;;6826:18;;;6819:30;-1:-1:-1;;;;;;;;;;;6865:18:1;;;6858:62;6937:18;;2277:68:0;6605:356:1;2277:68:0;51321:8:::1;:16:::0;;-1:-1:-1;;51321:16:0::1;::::0;;51283:59::o;36500:311::-;36637:28;36647:4;36653:2;36657:7;36637:9;:28::i;:::-;36688:48;36711:4;36717:2;36721:7;36730:5;36688:22;:48::i;:::-;36672:133;;;;-1:-1:-1;;;36672:133:0;;16568:2:1;36672:133:0;;;16550:21:1;16607:2;16587:18;;;16580:30;16646:34;16626:18;;;16619:62;16717:21;16697:18;;;16690:49;16756:19;;36672:133:0;16366:415:1;36672:133:0;36500:311;;;;:::o;50634:68::-;2138:6;;-1:-1:-1;;;;;2138:6:0;860:10;2285:23;2277:68;;;;-1:-1:-1;;;2277:68:0;;6807:2:1;2277:68:0;;;6789:21:1;;;6826:18;;;6819:30;-1:-1:-1;;;;;;;;;;;6865:18:1;;;6858:62;6937:18;;2277:68:0;6605:356:1;2277:68:0;50681:16:::1;:14;:16::i;49810:403::-:0;49885:13;49913:17;49921:8;37107:4;37137:12;-1:-1:-1;37127:22:0;37050:105;49913:17;49905:77;;;;-1:-1:-1;;;49905:77:0;;16988:2:1;49905:77:0;;;16970:21:1;17027:2;17007:18;;;17000:30;17066:34;17046:18;;;17039:62;17137:17;17117:18;;;17110:45;17172:19;;49905:77:0;16786:411:1;49905:77:0;49993:8;;;;49989:59;;50025:17;50018:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49810:403;;;:::o;49989:59::-;50054:28;50085:10;:8;:10::i;:::-;50054:41;;50138:1;50113:14;50107:28;:32;:101;;;;;;;;;;;;;;;;;50166:14;50182:19;:8;:17;:19::i;:::-;50149:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50107:101;50100:108;49810:403;-1:-1:-1;;;49810:403:0:o;53276:106::-;53335:7;53356:21;53370:6;53356:13;:21::i;2974:201::-;2138:6;;-1:-1:-1;;;;;2138:6:0;860:10;2285:23;2277:68;;;;-1:-1:-1;;;2277:68:0;;6807:2:1;2277:68:0;;;6789:21:1;;;6826:18;;;6819:30;-1:-1:-1;;;;;;;;;;;6865:18:1;;;6858:62;6937:18;;2277:68:0;6605:356:1;2277:68:0;-1:-1:-1;;;;;3063:22:0;::::1;3055:73;;;::::0;-1:-1:-1;;;3055:73:0;;17879:2:1;3055:73:0::1;::::0;::::1;17861:21:1::0;17918:2;17898:18;;;17891:30;17957:34;17937:18;;;17930:62;18028:8;18008:18;;;18001:36;18054:19;;3055:73:0::1;17677:402:1::0;3055:73:0::1;3139:28;3158:8;3139:18;:28::i;:::-;2974:201:::0;:::o;31974:370::-;32101:4;-1:-1:-1;;;;;;32131:40:0;;32146:25;32131:40;;:99;;-1:-1:-1;;;;;;;32182:48:0;;32197:33;32182:48;32131:99;:160;;;-1:-1:-1;;;;;;;32241:50:0;;32256:35;32241:50;32131:160;:207;;;-1:-1:-1;28522:25:0;-1:-1:-1;;;;;;28507:40:0;;;32302:36;28398:157;780:98;860:10;;780:98::o;44846:72::-;44559:7;;-1:-1:-1;;;44559:7:0;;;;44699:53;;;;-1:-1:-1;;;44699:53:0;;18286:2:1;44699:53:0;;;18268:21:1;;;18305:18;;;18298:30;18364:34;18344:18;;;18337:62;18416:18;;44699:53:0;18084:356:1;44699:53:0;44898:7:::1;:15:::0;;-1:-1:-1;;;;44898:15:0::1;::::0;;44846:72::o;40653:172::-;40750:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;40750:29:0;-1:-1:-1;;;;;40750:29:0;;;;;;;;;40791:28;;40750:24;;40791:28;;;;;;;40653:172;;;:::o;39018:1529::-;39115:35;39153:20;39165:7;39153:11;:20::i;:::-;39224:18;;39115:58;;-1:-1:-1;39182:22:0;;-1:-1:-1;;;;;39208:34:0;860:10;-1:-1:-1;;;;;39208:34:0;;:81;;;-1:-1:-1;860:10:0;39253:20;39265:7;39253:11;:20::i;:::-;-1:-1:-1;;;;;39253:36:0;;39208:81;:142;;;-1:-1:-1;39317:18:0;;39300:50;;860:10;35830:186;:::i;39300:50::-;39182:169;;39376:17;39360:101;;;;-1:-1:-1;;;39360:101:0;;18647:2:1;39360:101:0;;;18629:21:1;18686:2;18666:18;;;18659:30;18725:34;18705:18;;;18698:62;18796:20;18776:18;;;18769:48;18834:19;;39360:101:0;18445:414:1;39360:101:0;39508:4;-1:-1:-1;;;;;39486:26:0;:13;:18;;;-1:-1:-1;;;;;39486:26:0;;39470:98;;;;-1:-1:-1;;;39470:98:0;;19066:2:1;39470:98:0;;;19048:21:1;19105:2;19085:18;;;19078:30;19144:34;19124:18;;;19117:62;19215:8;19195:18;;;19188:36;19241:19;;39470:98:0;18864:402:1;39470:98:0;-1:-1:-1;;;;;39583:16:0;;39575:66;;;;-1:-1:-1;;;39575:66:0;;19473:2:1;39575:66:0;;;19455:21:1;19512:2;19492:18;;;19485:30;19551:34;19531:18;;;19524:62;19622:7;19602:18;;;19595:35;19647:19;;39575:66:0;19271:401:1;39575:66:0;39750:49;39767:1;39771:7;39780:13;:18;;;39750:8;:49::i;:::-;-1:-1:-1;;;;;39808:18:0;;;;;;:12;:18;;;;;:31;;39838:1;;39808:18;:31;;39838:1;;-1:-1:-1;;;;;39808:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;39808:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39846:16:0;;-1:-1:-1;39846:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;39846:16:0;;:29;;-1:-1:-1;;39846:29:0;;:::i;:::-;;;-1:-1:-1;;;;;39846:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39905:43:0;;;;;;;;-1:-1:-1;;;;;39905:43:0;;;;;;39931:15;39905:43;;;;;;;;;-1:-1:-1;39882:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;39882:66:0;-1:-1:-1;;;;;;39882:66:0;;;;;;;;;;;40198:11;39894:7;-1:-1:-1;40198:11:0;:::i;:::-;40261:1;40220:24;;;:11;:24;;;;;:29;40176:33;;-1:-1:-1;;;;;;40220:29:0;40216:236;;40278:20;40286:11;37107:4;37137:12;-1:-1:-1;37127:22:0;37050:105;40278:20;40274:171;;;40338:97;;;;;;;;40365:18;;-1:-1:-1;;;;;40338:97:0;;;;;;40396:28;;;;40338:97;;;;;;;;;;-1:-1:-1;40311:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;40311:124:0;-1:-1:-1;;;;;;40311:124:0;;;;;;;;;;;;40274:171;40484:7;40480:2;-1:-1:-1;;;;;40465:27:0;40474:4;-1:-1:-1;;;;;40465:27:0;;;;;;;;;;;40499:42;39108:1439;;;39018:1529;;;:::o;32617:240::-;32678:7;-1:-1:-1;;;;;32710:19:0;;32694:102;;;;-1:-1:-1;;;32694:102:0;;20388:2:1;32694:102:0;;;20370:21:1;20427:2;20407:18;;;20400:30;20466:34;20446:18;;;20439:62;20537:19;20517:18;;;20510:47;20574:19;;32694:102:0;20186:413:1;32694:102:0;-1:-1:-1;;;;;;32818:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;32818:32:0;;-1:-1:-1;;;;;32818:32:0;;32617:240::o;51744:91::-;51807:23;51817:2;51821:8;51807:9;:23::i;7222:190::-;7347:4;7400;7371:25;7384:5;7391:4;7371:12;:25::i;:::-;:33;;7222:190;-1:-1:-1;;;;7222:190:0:o;32863:606::-;-1:-1:-1;;;;;;;;;;;;;;;;;32980:16:0;32988:7;37107:4;37137:12;-1:-1:-1;37127:22:0;37050:105;32980:16;32972:71;;;;-1:-1:-1;;;32972:71:0;;20806:2:1;32972:71:0;;;20788:21:1;20845:2;20825:18;;;20818:30;20884:34;20864:18;;;20857:62;20955:12;20935:18;;;20928:40;20985:19;;32972:71:0;20604:406:1;32972:71:0;33052:26;33100:12;33089:7;:23;33085:93;;33144:22;33154:12;33144:7;:22;:::i;:::-;:26;;33169:1;33144:26;:::i;:::-;33123:47;;33085:93;33206:7;33186:212;33223:18;33215:4;:26;33186:212;;33260:31;33294:17;;;:11;:17;;;;;;;;;33260:51;;;;;;;;;-1:-1:-1;;;;;33260:51:0;;;;;-1:-1:-1;;;33260:51:0;;;;;;;;;;;;33324:28;33320:71;;33372:9;32863:606;-1:-1:-1;;;;32863:606:0:o;33320:71::-;-1:-1:-1;33243:6:0;;;;:::i;:::-;;;;33186:212;;;-1:-1:-1;33406:57:0;;-1:-1:-1;;;33406:57:0;;21488:2:1;33406:57:0;;;21470:21:1;21527:2;21507:18;;;21500:30;21566:34;21546:18;;;21539:62;21637:17;21617:18;;;21610:45;21672:19;;33406:57:0;21286:411:1;3335:191:0;3428:6;;;-1:-1:-1;;;;;3445:17:0;;;-1:-1:-1;;3445:17:0;;;;;;;3478:40;;3428:6;;;3445:17;3428:6;;3478:40;;3409:16;;3478:40;3398:128;3335:191;:::o;44768:73::-;44559:7;;-1:-1:-1;;;44559:7:0;;;;44614:9;44606:50;;;;-1:-1:-1;;;44606:50:0;;8853:2:1;44606:50:0;;;8835:21:1;8892:2;8872:18;;;8865:30;8931;8911:18;;;8904:58;8979:18;;44606:50:0;8651:352:1;44606:50:0;44822:7:::1;:14:::0;;-1:-1:-1;;;;44822:14:0::1;-1:-1:-1::0;;;44822:14:0::1;::::0;;44768:73::o;45522:82::-;45204:8;;-1:-1:-1;;;45204:8:0;;;;45360:58;;;;-1:-1:-1;;;45360:58:0;;14051:2:1;45360:58:0;;;14033:21:1;14090:2;14070:18;;;14063:30;14129:34;14109:18;;;14102:62;-1:-1:-1;;;14180:18:1;;;14173:34;14224:19;;45360:58:0;13849:400:1;45360:58:0;45583:8:::1;:16:::0;;-1:-1:-1;;;;45583:16:0::1;::::0;;45522:82::o;42364:690::-;42501:4;-1:-1:-1;;;;;42518:13:0;;20516:20;20564:8;42514:535;;42557:72;;-1:-1:-1;;;42557:72:0;;-1:-1:-1;;;;;42557:36:0;;;;;:72;;860:10;;42608:4;;42614:7;;42623:5;;42557:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42557:72:0;;;;;;;;-1:-1:-1;;42557:72:0;;;;;;;;;;;;:::i;:::-;;;42544:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42788:13:0;;42784:215;;42821:61;;-1:-1:-1;;;42821:61:0;;16568:2:1;42821:61:0;;;16550:21:1;16607:2;16587:18;;;16580:30;16646:34;16626:18;;;16619:62;16717:21;16697:18;;;16690:49;16756:19;;42821:61:0;16366:415:1;42784:215:0;42967:6;42961:13;42952:6;42948:2;42944:15;42937:38;42544:464;-1:-1:-1;;;;;;42679:55:0;-1:-1:-1;;;42679:55:0;;-1:-1:-1;42672:62:0;;42514:535;-1:-1:-1;43037:4:0;42514:535;42364:690;;;;;;:::o;45434:83::-;45204:8;;-1:-1:-1;;;45204:8:0;;;;45261:10;45253:63;;;;-1:-1:-1;;;45253:63:0;;9210:2:1;45253:63:0;;;9192:21:1;9249:2;9229:18;;;9222:30;9288:34;9268:18;;;9261:62;-1:-1:-1;;;9339:18:1;;;9332:38;9387:19;;45253:63:0;9008:404:1;45253:63:0;45497:8:::1;:15:::0;;-1:-1:-1;;;;45497:15:0::1;-1:-1:-1::0;;;45497:15:0::1;::::0;;45434:83::o;49703:102::-;49764:13;49791:9;49784:16;;;;;:::i;8858:723::-;8914:13;9135:10;9131:53;;-1:-1:-1;;9162:10:0;;;;;;;;;;;;;;;;;;8858:723::o;9131:53::-;9209:5;9194:12;9250:78;9257:9;;9250:78;;9283:8;;;;:::i;:::-;;-1:-1:-1;9306:10:0;;-1:-1:-1;9314:2:0;9306:10;;:::i;:::-;;;9250:78;;;9338:19;9370:6;9360:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9360:17:0;;9338:39;;9388:154;9395:10;;9388:154;;9422:11;9432:1;9422:11;;:::i;:::-;;-1:-1:-1;9491:10:0;9499:2;9491:5;:10;:::i;:::-;9478:24;;:2;:24;:::i;:::-;9465:39;;9448:6;9455;9448:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;9519:11:0;9528:2;9519:11;;:::i;:::-;;;9388:154;;37161:98;37226:27;37236:2;37240:8;37226:27;;;;;;;;;;;;:9;:27::i;7774:701::-;7857:7;7900:4;7857:7;7915:523;7939:5;:12;7935:1;:16;7915:523;;;7973:20;7996:5;8002:1;7996:8;;;;;;;;:::i;:::-;;;;;;;7973:31;;8039:12;8023;:28;8019:408;;8176:44;;;;;;22936:19:1;;;22971:12;;;22964:28;;;23008:12;;8176:44:0;;;;;;;;;;;;8166:55;;;;;;8151:70;;8019:408;;;8366:44;;;;;;22936:19:1;;;22971:12;;;22964:28;;;23008:12;;8366:44:0;;;;;;;;;;;;8356:55;;;;;;8341:70;;8019:408;-1:-1:-1;7953:3:0;;;;:::i;:::-;;;;7915:523;;;-1:-1:-1;8455:12:0;7774:701;-1:-1:-1;;;7774:701:0:o;37514:1272::-;37619:20;37642:12;-1:-1:-1;;;;;37669:16:0;;37661:62;;;;-1:-1:-1;;;37661:62:0;;23233:2:1;37661:62:0;;;23215:21:1;23272:2;23252:18;;;23245:30;23311:34;23291:18;;;23284:62;23382:3;23362:18;;;23355:31;23403:19;;37661:62:0;23031:397:1;37661:62:0;37860:21;37868:12;37107:4;37137:12;-1:-1:-1;37127:22:0;37050:105;37860:21;37859:22;37851:64;;;;-1:-1:-1;;;37851:64:0;;23635:2:1;37851:64:0;;;23617:21:1;23674:2;23654:18;;;23647:30;23713:31;23693:18;;;23686:59;23762:18;;37851:64:0;23433:353:1;37851:64:0;37942:12;37930:8;:24;;37922:71;;;;-1:-1:-1;;;37922:71:0;;23993:2:1;37922:71:0;;;23975:21:1;24032:2;24012:18;;;24005:30;24071:34;24051:18;;;24044:62;24142:4;24122:18;;;24115:32;24164:19;;37922:71:0;23791:398:1;37922:71:0;-1:-1:-1;;;;;38105:16:0;;38072:30;38105:16;;;:12;:16;;;;;;;;;38072:49;;;;;;;;;-1:-1:-1;;;;;38072:49:0;;;;;-1:-1:-1;;;38072:49:0;;;;;;;;;;;38147:119;;;;;;;;38167:19;;38072:49;;38147:119;;;38167:39;;38197:8;;38167:39;:::i;:::-;-1:-1:-1;;;;;38147:119:0;;;;;38250:8;38215:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;38147:119:0;;;;;;-1:-1:-1;;;;;38128:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;38128:138:0;;;;;;;;;;;;38301:43;;;;;;;;;;;38327:15;38301:43;;;;;;;;38273:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;38273:71:0;-1:-1:-1;;;;;;38273:71:0;;;;;;;;;;;;;;;;;;38285:12;;38397:281;38421:8;38417:1;:12;38397:281;;;38450:38;;38475:12;;-1:-1:-1;;;;;38450:38:0;;;38467:1;;38450:38;;38467:1;;38450:38;38515:59;38546:1;38550:2;38554:12;38568:5;38515:22;:59::i;:::-;38497:150;;;;-1:-1:-1;;;38497:150:0;;16568:2:1;38497:150:0;;;16550:21:1;16607:2;16587:18;;;16580:30;16646:34;16626:18;;;16619:62;16717:21;16697:18;;;16690:49;16756:19;;38497:150:0;16366:415:1;38497:150:0;38656:14;;;;:::i;:::-;;;;38431:3;;;;;:::i;:::-;;;;38397:281;;;-1:-1:-1;38686:12:0;:27;;;38720:60;36500:311;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:1;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1141:2;1120:15;-1:-1:-1;;1116:29:1;1107:39;;;;1148:4;1103:50;;901:258;-1:-1:-1;;901:258:1:o;1164:220::-;1313:2;1302:9;1295:21;1276:4;1333:45;1374:2;1363:9;1359:18;1351:6;1333:45;:::i;1389:180::-;1448:6;1501:2;1489:9;1480:7;1476:23;1472:32;1469:52;;;1517:1;1514;1507:12;1469:52;-1:-1:-1;1540:23:1;;1389:180;-1:-1:-1;1389:180:1:o;1805:196::-;1873:20;;-1:-1:-1;;;;;1922:54:1;;1912:65;;1902:93;;1991:1;1988;1981:12;1902:93;1805:196;;;:::o;2006:254::-;2074:6;2082;2135:2;2123:9;2114:7;2110:23;2106:32;2103:52;;;2151:1;2148;2141:12;2103:52;2174:29;2193:9;2174:29;:::i;:::-;2164:39;2250:2;2235:18;;;;2222:32;;-1:-1:-1;;;2006:254:1:o;2447:328::-;2524:6;2532;2540;2593:2;2581:9;2572:7;2568:23;2564:32;2561:52;;;2609:1;2606;2599:12;2561:52;2632:29;2651:9;2632:29;:::i;:::-;2622:39;;2680:38;2714:2;2703:9;2699:18;2680:38;:::i;:::-;2670:48;;2765:2;2754:9;2750:18;2737:32;2727:42;;2447:328;;;;;:::o;2973:683::-;3068:6;3076;3084;3137:2;3125:9;3116:7;3112:23;3108:32;3105:52;;;3153:1;3150;3143:12;3105:52;3189:9;3176:23;3166:33;;3250:2;3239:9;3235:18;3222:32;3273:18;3314:2;3306:6;3303:14;3300:34;;;3330:1;3327;3320:12;3300:34;3368:6;3357:9;3353:22;3343:32;;3413:7;3406:4;3402:2;3398:13;3394:27;3384:55;;3435:1;3432;3425:12;3384:55;3475:2;3462:16;3501:2;3493:6;3490:14;3487:34;;;3517:1;3514;3507:12;3487:34;3570:7;3565:2;3555:6;3552:1;3548:14;3544:2;3540:23;3536:32;3533:45;3530:65;;;3591:1;3588;3581:12;3530:65;3622:2;3618;3614:11;3604:21;;3644:6;3634:16;;;;;2973:683;;;;;:::o;3661:184::-;-1:-1:-1;;;3710:1:1;3703:88;3810:4;3807:1;3800:15;3834:4;3831:1;3824:15;3850:632;3915:5;3945:18;3986:2;3978:6;3975:14;3972:40;;;3992:18;;:::i;:::-;4067:2;4061:9;4035:2;4121:15;;-1:-1:-1;;4117:24:1;;;4143:2;4113:33;4109:42;4097:55;;;4167:18;;;4187:22;;;4164:46;4161:72;;;4213:18;;:::i;:::-;4253:10;4249:2;4242:22;4282:6;4273:15;;4312:6;4304;4297:22;4352:3;4343:6;4338:3;4334:16;4331:25;4328:45;;;4369:1;4366;4359:12;4328:45;4419:6;4414:3;4407:4;4399:6;4395:17;4382:44;4474:1;4467:4;4458:6;4450;4446:19;4442:30;4435:41;;;;3850:632;;;;;:::o;4487:451::-;4556:6;4609:2;4597:9;4588:7;4584:23;4580:32;4577:52;;;4625:1;4622;4615:12;4577:52;4665:9;4652:23;4698:18;4690:6;4687:30;4684:50;;;4730:1;4727;4720:12;4684:50;4753:22;;4806:4;4798:13;;4794:27;-1:-1:-1;4784:55:1;;4835:1;4832;4825:12;4784:55;4858:74;4924:7;4919:2;4906:16;4901:2;4897;4893:11;4858:74;:::i;4943:186::-;5002:6;5055:2;5043:9;5034:7;5030:23;5026:32;5023:52;;;5071:1;5068;5061:12;5023:52;5094:29;5113:9;5094:29;:::i;5316:347::-;5381:6;5389;5442:2;5430:9;5421:7;5417:23;5413:32;5410:52;;;5458:1;5455;5448:12;5410:52;5481:29;5500:9;5481:29;:::i;:::-;5471:39;;5560:2;5549:9;5545:18;5532:32;5607:5;5600:13;5593:21;5586:5;5583:32;5573:60;;5629:1;5626;5619:12;5573:60;5652:5;5642:15;;;5316:347;;;;;:::o;5668:667::-;5763:6;5771;5779;5787;5840:3;5828:9;5819:7;5815:23;5811:33;5808:53;;;5857:1;5854;5847:12;5808:53;5880:29;5899:9;5880:29;:::i;:::-;5870:39;;5928:38;5962:2;5951:9;5947:18;5928:38;:::i;:::-;5918:48;;6013:2;6002:9;5998:18;5985:32;5975:42;;6068:2;6057:9;6053:18;6040:32;6095:18;6087:6;6084:30;6081:50;;;6127:1;6124;6117:12;6081:50;6150:22;;6203:4;6195:13;;6191:27;-1:-1:-1;6181:55:1;;6232:1;6229;6222:12;6181:55;6255:74;6321:7;6316:2;6303:16;6298:2;6294;6290:11;6255:74;:::i;:::-;6245:84;;;5668:667;;;;;;;:::o;6340:260::-;6408:6;6416;6469:2;6457:9;6448:7;6444:23;6440:32;6437:52;;;6485:1;6482;6475:12;6437:52;6508:29;6527:9;6508:29;:::i;:::-;6498:39;;6556:38;6590:2;6579:9;6575:18;6556:38;:::i;:::-;6546:48;;6340:260;;;;;:::o;6966:437::-;7045:1;7041:12;;;;7088;;;7109:61;;7163:4;7155:6;7151:17;7141:27;;7109:61;7216:2;7208:6;7205:14;7185:18;7182:38;7179:218;;;-1:-1:-1;;;7250:1:1;7243:88;7354:4;7351:1;7344:15;7382:4;7379:1;7372:15;7179:218;;6966:437;;;:::o;9777:184::-;-1:-1:-1;;;9826:1:1;9819:88;9926:4;9923:1;9916:15;9950:4;9947:1;9940:15;9966:128;10006:3;10037:1;10033:6;10030:1;10027:13;10024:39;;;10043:18;;:::i;:::-;-1:-1:-1;10079:9:1;;9966:128::o;11147:168::-;11187:7;11253:1;11249;11245:6;11241:14;11238:1;11235:21;11230:1;11223:9;11216:17;11212:45;11209:71;;;11260:18;;:::i;:::-;-1:-1:-1;11300:9:1;;11147:168::o;12073:135::-;12112:3;-1:-1:-1;;12133:17:1;;12130:43;;;12153:18;;:::i;:::-;-1:-1:-1;12200:1:1;12189:13;;12073:135::o;12628:184::-;-1:-1:-1;;;12677:1:1;12670:88;12777:4;12774:1;12767:15;12801:4;12798:1;12791:15;12817:120;12857:1;12883;12873:35;;12888:18;;:::i;:::-;-1:-1:-1;12922:9:1;;12817:120::o;17202:470::-;17381:3;17419:6;17413:13;17435:53;17481:6;17476:3;17469:4;17461:6;17457:17;17435:53;:::i;:::-;17551:13;;17510:16;;;;17573:57;17551:13;17510:16;17607:4;17595:17;;17573:57;:::i;:::-;17646:20;;17202:470;-1:-1:-1;;;;17202:470:1:o;19677:246::-;19717:4;-1:-1:-1;;;;;19830:10:1;;;;19800;;19852:12;;;19849:38;;;19867:18;;:::i;:::-;19904:13;;19677:246;-1:-1:-1;;;19677:246:1:o;19928:253::-;19968:3;-1:-1:-1;;;;;20057:2:1;20054:1;20050:10;20087:2;20084:1;20080:10;20118:3;20114:2;20110:12;20105:3;20102:21;20099:47;;;20126:18;;:::i;21015:125::-;21055:4;21083:1;21080;21077:8;21074:34;;;21088:18;;:::i;:::-;-1:-1:-1;21125:9:1;;21015:125::o;21145:136::-;21184:3;21212:5;21202:39;;21221:18;;:::i;:::-;-1:-1:-1;;;21257:18:1;;21145:136::o;21702:512::-;21896:4;-1:-1:-1;;;;;22006:2:1;21998:6;21994:15;21983:9;21976:34;22058:2;22050:6;22046:15;22041:2;22030:9;22026:18;22019:43;;22098:6;22093:2;22082:9;22078:18;22071:34;22141:3;22136:2;22125:9;22121:18;22114:31;22162:46;22203:3;22192:9;22188:19;22180:6;22162:46;:::i;:::-;22154:54;21702:512;-1:-1:-1;;;;;;21702:512:1:o;22219:249::-;22288:6;22341:2;22329:9;22320:7;22316:23;22312:32;22309:52;;;22357:1;22354;22347:12;22309:52;22389:9;22383:16;22408:30;22432:5;22408:30;:::i;22473:112::-;22505:1;22531;22521:35;;22536:18;;:::i;:::-;-1:-1:-1;22570:9:1;;22473:112::o;22590:184::-;-1:-1:-1;;;22639:1:1;22632:88;22739:4;22736:1;22729:15;22763:4;22760:1;22753:15
Swarm Source
ipfs://b7bbd7ee9ab1542a8a2cb4bb6c14579b679e08db33719593c8b0618bf852ee99
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.