Overview
TokenID
1200
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ThugCityNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.7; /*$$$$$$$ /$$ /$$$$$$ /$$ /$$ |__ $$__/| $$ /$$__ $$|__/ | $$ | $$ | $$$$$$$ /$$ /$$ /$$$$$$ | $$ \__/ /$$ /$$$$$$ /$$ /$$ | $$ | $$__ $$| $$ | $$ /$$__ $$| $$ | $$|_ $$_/ | $$ | $$ | $$ | $$ \ $$| $$ | $$| $$ \ $$| $$ | $$ | $$ | $$ | $$ | $$ | $$ | $$| $$ | $$| $$ | $$| $$ $$| $$ | $$ /$$| $$ | $$ | $$ | $$ | $$| $$$$$$/| $$$$$$$| $$$$$$/| $$ | $$$$/| $$$$$$$ |__/ |__/ |__/ \______/ \____ $$ \______/ |__/ \___/ \____ $$ /$$ \ $$ /$$ | $$ | $$$$$$/ | $$$$$$/ \______/ \______*/ import "./Ownable.sol"; import "./MerkleProof.sol"; import "./ERC721Psi.sol"; contract ThugCityNFT is ERC721Psi, Ownable { using Strings for uint256; string public baseURI; string public baseExtension = ".json"; uint256 public cost = 0.1 ether; uint256 public immutable maxSupply = 10001; uint256 public immutable maxMintAmount = 16; uint256 public immutable maxWhitelistSupply = 1001; uint256 public immutable devSupply = 101; mapping(address => bool) public managers; bool public paused = false; bool public whitelistOnly = true; mapping(uint256 => bool) private _isCop; bytes32 public merkleRoot; mapping(address => uint256) public whitelistClaimed; constructor() ERC721Psi("ThugCity", "THUGCITY") {} function _baseURI() internal view virtual override returns (string memory) { return baseURI; } modifier callerIsUser() { require(msg.sender == tx.origin); _; } function whitelistMint(address _to, uint256 _mintAmount, bytes32[] calldata _merkleProof) external payable callerIsUser { require(whitelistOnly && !paused); require(totalSupply() + _mintAmount < maxWhitelistSupply); require(_mintAmount + whitelistClaimed[msg.sender] < maxMintAmount, "Address already claimed maximum tokens!"); // Require user doesn't exceed max mint amount bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); // Encode sender address as leaf node require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Invalid proof!"); // Confirm leaf node on merkle tree whitelistClaimed[msg.sender] += _mintAmount; // Increment number of tokens claimed by whitelist user require(msg.value >= cost * _mintAmount, "Must send more ETH!"); // Require sufficient funds sent _safeMint(_to, _mintAmount); } function mint(address _to, uint256 _mintAmount) external payable callerIsUser { require(!whitelistOnly && !paused); require(_mintAmount < maxMintAmount,"You cannot mint this many NFTs!"); require(totalSupply() + _mintAmount < maxSupply, "Not enough NFTs!"); require(msg.value >= cost * _mintAmount, "Must send more ETH!"); _safeMint(_to, _mintAmount); } function devMint(uint256 _mintAmount) external onlyOwner{ require(totalSupply() < devSupply); require(totalSupply() + _mintAmount < devSupply); _safeMint(msg.sender, _mintAmount); } function setWhitelistOnly(bool _status) public onlyOwner { whitelistOnly = _status; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } function setCost(uint256 _newCost) external onlyOwner { cost = _newCost; } function setMerkleRoot(bytes32 _root) external onlyOwner { merkleRoot = _root; } function isCop(uint256 id) public view returns (bool) { return _isCop[id]; } function setCopIds(uint256[] calldata ids) external onlyOwner { for (uint256 i = 0; i < ids.length; i++) { _isCop[ids[i]] = true; } } function setThugIds(uint256[] calldata ids) external onlyOwner { for (uint256 i = 0; i < ids.length; i++) { _isCop[ids[i]] = false; } } function transferFrom(address from, address to, uint256 tokenId) public virtual override { if (!managers[msg.sender]) require(_isApprovedOrOwner(_msgSender(), tokenId),"ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } function addManager(address _addr) external onlyOwner{ managers[_addr] = true; } function removeManager(address _addr) external onlyOwner { managers[_addr] = false; } function setBaseURI(string memory _newBaseURI) external onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function pause(bool _state) public onlyOwner { paused = _state; } function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(success); } }
// SPDX-License-Identifier: MIT 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); } } } }
/** _____ ___ ___ __ ____ _ __ / ___/____ / (_)___/ (_) /___ __ / __ )(_) /______ \__ \/ __ \/ / / __ / / __/ / / / / __ / / __/ ___/ ___/ / /_/ / / / /_/ / / /_/ /_/ / / /_/ / / /_(__ ) /____/\____/_/_/\__,_/_/\__/\__, / /_____/_/\__/____/ /____/ - npm: https://www.npmjs.com/package/solidity-bits - github: https://github.com/estarriolvetch/solidity-bits */ pragma solidity ^0.8.0; import "./BitScan.sol"; /** * @dev This Library is a modified version of Openzeppelin's BitMaps library. * Functions of finding the index of the closest set bit from a given index are added. * The indexing of each bucket is modifed to count from the MSB to the LSB instead of from the LSB to the MSB. * The modification of indexing makes finding the closest previous set bit more efficient in gas usage. */ /** * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential. * Largelly inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor]. */ library BitMaps { using BitScan for uint256; uint256 private constant MASK_INDEX_ZERO = (1 << 255); uint256 private constant MASK_FULL = type(uint256).max; struct BitMap { mapping(uint256 => uint256) _data; } /** * @dev Returns whether the bit at `index` is set. */ function get(BitMap storage bitmap, uint256 index) internal view returns (bool) { uint256 bucket = index >> 8; uint256 mask = MASK_INDEX_ZERO >> (index & 0xff); return bitmap._data[bucket] & mask != 0; } /** * @dev Sets the bit at `index` to the boolean `value`. */ function setTo( BitMap storage bitmap, uint256 index, bool value ) internal { if (value) { set(bitmap, index); } else { unset(bitmap, index); } } /** * @dev Sets the bit at `index`. */ function set(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = MASK_INDEX_ZERO >> (index & 0xff); bitmap._data[bucket] |= mask; } /** * @dev Unsets the bit at `index`. */ function unset(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = MASK_INDEX_ZERO >> (index & 0xff); bitmap._data[bucket] &= ~mask; } /** * @dev Consecutively sets `amount` of bits starting from the bit at `startIndex`. */ function setBatch(BitMap storage bitmap, uint256 startIndex, uint256 amount) internal { uint256 bucket = startIndex >> 8; uint256 bucketStartIndex = (startIndex & 0xff); unchecked { if(bucketStartIndex + amount < 256) { bitmap._data[bucket] |= MASK_FULL << (256 - amount) >> bucketStartIndex; } else { bitmap._data[bucket] |= MASK_FULL >> bucketStartIndex; amount -= (256 - bucketStartIndex); bucket++; while(amount > 256) { bitmap._data[bucket] = MASK_FULL; amount -= 256; bucket++; } bitmap._data[bucket] |= MASK_FULL << (256 - amount); } } } /** * @dev Consecutively unsets `amount` of bits starting from the bit at `startIndex`. */ function unsetBatch(BitMap storage bitmap, uint256 startIndex, uint256 amount) internal { uint256 bucket = startIndex >> 8; uint256 bucketStartIndex = (startIndex & 0xff); unchecked { if(bucketStartIndex + amount < 256) { bitmap._data[bucket] &= ~(MASK_FULL << (256 - amount) >> bucketStartIndex); } else { bitmap._data[bucket] &= ~(MASK_FULL >> bucketStartIndex); amount -= (256 - bucketStartIndex); bucket++; while(amount > 256) { bitmap._data[bucket] = 0; amount -= 256; bucket++; } bitmap._data[bucket] &= ~(MASK_FULL << (256 - amount)); } } } /** * @dev Find the closest index of the set bit before `index`. */ function scanForward(BitMap storage bitmap, uint256 index) internal view returns (uint256) { uint256 bucket = index >> 8; // index within the bucket uint256 bucketIndex = (index & 0xff); // load a bitboard from the bitmap. uint256 bb = bitmap._data[bucket]; // offset the bitboard to scan from `bucketIndex`. bb = bb >> (0xff ^ bucketIndex); // bb >> (255 - bucketIndex) if(bb > 0) { unchecked { return (bucket << 8) | (bucketIndex - bb.bitScanForward256()); } } else { while(true) { require(bucket > 0, "BitMaps: The set bit before the index doesn't exist."); unchecked { bucket--; } // No offset. Always scan from the least significiant bit now. bb = bitmap._data[bucket]; if(bb > 0) { unchecked { return (bucket << 8) | (255 - bb.bitScanForward256()); } } } } } function getBucket(BitMap storage bitmap, uint256 bucket) internal view returns (uint256) { return bitmap._data[bucket]; } }
/** _____ ___ ___ __ ____ _ __ / ___/____ / (_)___/ (_) /___ __ / __ )(_) /______ \__ \/ __ \/ / / __ / / __/ / / / / __ / / __/ ___/ ___/ / /_/ / / / /_/ / / /_/ /_/ / / /_/ / / /_(__ ) /____/\____/_/_/\__,_/_/\__/\__, / /_____/_/\__/____/ /____/ - npm: https://www.npmjs.com/package/solidity-bits - github: https://github.com/estarriolvetch/solidity-bits */ pragma solidity ^0.8.0; library BitScan { uint256 constant private DEBRUIJN_256 = 0x818283848586878898a8b8c8d8e8f929395969799a9b9d9e9faaeb6bedeeff; bytes constant private LOOKUP_TABLE_256 = hex"0001020903110a19042112290b311a3905412245134d2a550c5d32651b6d3a7506264262237d468514804e8d2b95569d0d495ea533a966b11c886eb93bc176c9071727374353637324837e9b47af86c7155181ad4fd18ed32c9096db57d59ee30e2e4a6a5f92a6be3498aae067ddb2eb1d5989b56fd7baf33ca0c2ee77e5caf7ff0810182028303840444c545c646c7425617c847f8c949c48a4a8b087b8c0c816365272829aaec650acd0d28fdad4e22d6991bd97dfdcea58b4d6f29fede4f6fe0f1f2f3f4b5b6b607b8b93a3a7b7bf357199c5abcfd9e168bcdee9b3f1ecf5fd1e3e5a7a8aa2b670c4ced8bbe8f0f4fc3d79a1c3cde7effb78cce6facbf9f8"; /** @dev Isolate the least significant set bit. */ function isolateLS1B256(uint256 bb) pure internal returns (uint256) { require(bb > 0); unchecked { return bb & (0 - bb); } } /** @dev Isolate the most significant set bit. */ function isolateMS1B256(uint256 bb) pure internal returns (uint256) { require(bb > 0); unchecked { bb |= bb >> 256; bb |= bb >> 128; bb |= bb >> 64; bb |= bb >> 32; bb |= bb >> 16; bb |= bb >> 8; bb |= bb >> 4; bb |= bb >> 2; bb |= bb >> 1; return (bb >> 1) + 1; } } /** @dev Find the index of the lest significant set bit. (trailing zero count) */ function bitScanForward256(uint256 bb) pure internal returns (uint8) { unchecked { return uint8(LOOKUP_TABLE_256[(isolateLS1B256(bb) * DEBRUIJN_256) >> 248]); } } /** @dev Find the index of the most significant set bit. */ function bitScanReverse256(uint256 bb) pure internal returns (uint8) { unchecked { return 255 - uint8(LOOKUP_TABLE_256[((isolateMS1B256(bb) * DEBRUIJN_256) >> 248)]); } } function log2(uint256 bb) pure internal returns (uint8) { unchecked { return uint8(LOOKUP_TABLE_256[(isolateMS1B256(bb) * DEBRUIJN_256) >> 248]); } } }
// SPDX-License-Identifier: MIT 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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT /** ____ ___ ___ ____ _ __ _ _ _ | ___| _ \ / ___|___ |__ \/_ | || || | | |__ | |__) | | / / ) || | \| |/ | | _| | _ /| | / / / / | |\ _/ | |____| | \ \| |____ / / / /_ | | | | |______|_| \_\\_____|/_/ |____||_| |_| */ pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; import "./Address.sol"; import "./StorageSlot.sol"; import "./BitMaps.sol"; contract ERC721Psi is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; using BitMaps for BitMaps.BitMap; BitMaps.BitMap private _batchHead; string private _name; string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; uint256 internal _minted; mapping(uint256 => address) private _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a name and a symbol to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint) { require(owner != address(0), "ERC721Psi: balance query for the zero address"); uint count; for( uint i; i < _minted; ++i ){ if(_exists(i)){ if( owner == ownerOf(i)){ ++count; } } } return count; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { (address owner, uint256 tokenIdBatchHead) = _ownerAndBatchHeadOf(tokenId); return owner; } function _ownerAndBatchHeadOf(uint256 tokenId) internal view returns (address owner, uint256 tokenIdBatchHead){ require(_exists(tokenId), "ERC721Psi: owner query for nonexistent token"); tokenIdBatchHead = _getBatchHead(tokenId); owner = _owners[tokenIdBatchHead]; } /** * @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), "ERC721Psi: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the baseURI and the tokenId. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); require(to != owner, "ERC721Psi: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721Psi: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721Psi: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721Psi: 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 virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721Psi: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721Psi: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers tokenId token from from to to, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * _data is additional data, it has no specified format and it is sent in call to to. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - from cannot be the zero address. * - to cannot be the zero address. * - tokenId token must exist and be owned by from. * - If to refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, 1,_data), "ERC721Psi: 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 virtual returns (bool) { return tokenId < _minted; } /** * @dev Returns whether spender is allowed to manage tokenId. * * Requirements: * * - tokenId must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721Psi: operator query for nonexistent token" ); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints quantity tokens and transfers them to to. * * Requirements: * * - If to refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - quantity must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ""); } function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { uint256 startTokenId = _minted; _mint(to, quantity); require( _checkOnERC721Received(address(0), to, startTokenId, quantity, _data), "ERC721Psi: transfer to non ERC721Receiver implementer" ); } function _mint( address to, uint256 quantity ) internal virtual { uint256 tokenIdBatchHead = _minted; require(quantity > 0, "ERC721Psi: quantity must be greater 0"); require(to != address(0), "ERC721Psi: mint to the zero address"); _beforeTokenTransfers(address(0), to, tokenIdBatchHead, quantity); _minted += quantity; _owners[tokenIdBatchHead] = to; _batchHead.set(tokenIdBatchHead); _afterTokenTransfers(address(0), to, tokenIdBatchHead, quantity); // Emit events for(uint256 tokenId=tokenIdBatchHead;tokenId < tokenIdBatchHead + quantity; tokenId++){ emit Transfer(address(0), to, tokenId); } } /** * @dev Transfers tokenId from from to to. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - to cannot be the zero address. * - tokenId token must be owned by from. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { (address owner, uint256 tokenIdBatchHead) = _ownerAndBatchHeadOf(tokenId); require( owner == from, "ERC721Psi: transfer of token that is not own" ); require(to != address(0), "ERC721Psi: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId); uint256 nextTokenId = tokenId + 1; if(!_batchHead.get(nextTokenId) && nextTokenId < _minted ) { _owners[nextTokenId] = from; _batchHead.set(nextTokenId); } _owners[tokenId] = to; if(tokenId != tokenIdBatchHead) { _batchHead.set(tokenId); } 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) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } /** * @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 startTokenId uint256 the first ID of the tokens to be transferred * @param quantity uint256 amount of the tokens to be transfered. * @param _data bytes optional data to send along with the call * @return r bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 startTokenId, uint256 quantity, bytes memory _data ) private returns (bool r) { if (to.isContract()) { r = true; for(uint256 tokenId = startTokenId; tokenId < startTokenId + quantity; tokenId++){ try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { r = r && retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721Psi: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } return r; } else { return true; } } function _getBatchHead(uint256 tokenId) internal view returns (uint256 tokenIdBatchHead) { tokenIdBatchHead = _batchHead.scanForward(tokenId); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _minted; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < totalSupply(), "ERC721Psi: global index out of bounds"); uint count; for(uint i; i < _minted; i++){ if(_exists(i)){ if(count == index) return i; else count++; } } } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) { uint count; for(uint i; i < _minted; i++){ if(_exists(i) && owner == ownerOf(i)){ if(count == index) return i; else count++; } } revert("ERC721Psi: owner index out of bounds"); } /** * @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 {} }
// SPDX-License-Identifier: MIT 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); }
pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; }
pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ 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 Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @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() { _setOwner(_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 { _setOwner(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" ); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } }
// SPDX-License-Identifier: MIT 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); } }
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":[{"internalType":"address","name":"_addr","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isCop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"managers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWhitelistSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"removeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"setCopIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"setThugIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setWhitelistOnly","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":"tokenId","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
610140604052600561010081905264173539b7b760d91b6101209081526200002b916009919062000154565b5067016345785d8a0000600a55612711608052601060a0526103e960c052606560e052600c805461ffff19166101001790553480156200006a57600080fd5b5060405180604001604052806008815260200167546875674369747960c01b81525060405180604001604052806008815260200167544855474349545960c01b8152508160019080519060200190620000c592919062000154565b508051620000db90600290602084019062000154565b505050620000f8620000f2620000fe60201b60201c565b62000102565b62000237565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200016290620001fa565b90600052602060002090601f016020900481019282620001865760008555620001d1565b82601f10620001a157805160ff1916838001178555620001d1565b82800160010185558215620001d1579182015b82811115620001d1578251825591602001919060010190620001b4565b50620001df929150620001e3565b5090565b5b80821115620001df5760008155600101620001e4565b600181811c908216806200020f57607f821691505b602082108114156200023157634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051612e256200029b600039600081816104be01528181610d9a0152610dce01526000818161069301526111290152600081816103d901528181610ec901526111780152600081816107710152610f380152612e256000f3fe6080604052600436106102885760003560e01c806355f804b31161015a578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c5146107e0578063ea03ddcb14610829578063ea05a8c614610849578063eee94bf114610869578063f2fde38b14610889578063fdff9b4d146108a957600080fd5b8063b88d4fde1461070a578063c66828621461072a578063c87b56dd1461073f578063d5abeb011461075f578063da3ef23f14610793578063db4bec44146107b357600080fd5b80637cb64759116101135780637cb64759146106435780638da5cb5b14610663578063953f049d1461068157806395d89b41146106b5578063a22cb465146106ca578063ac18de43146106ea57600080fd5b806355f804b31461059f5780635c975abb146105bf5780636352211e146105d95780636c0360eb146105f957806370a082311461060e578063715018a61461062e57600080fd5b80632eb4a7ab116101fe57806342842e0e116101b757806342842e0e146104e0578063438b63001461050057806344a0d68a1461052d5780634b11faaf1461054d5780634b4687b5146105605780634f6ccce71461057f57600080fd5b80632eb4a7ab1461043b5780632f745c5914610451578063375a069a146104715780633ccfd60b1461049157806340c10f191461049957806341c66d0a146104ac57600080fd5b8063095ea7b311610250578063095ea7b31461036e57806313faede61461038e57806318160ddd146103b2578063239c70ae146103c757806323b872dd146103fb5780632d06177a1461041b57600080fd5b806301ffc9a71461028d57806302329a29146102c257806306fdde03146102e45780630796895d14610306578063081812fc14610336575b600080fd5b34801561029957600080fd5b506102ad6102a83660046128f8565b6108d9565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd3660046128c4565b610946565b005b3480156102f057600080fd5b506102f961098c565b6040516102b99190612aec565b34801561031257600080fd5b506102ad6103213660046128df565b6000908152600d602052604090205460ff1690565b34801561034257600080fd5b506103566103513660046128df565b610a1e565b6040516001600160a01b0390911681526020016102b9565b34801561037a57600080fd5b506102e26103893660046127fe565b610aab565b34801561039a57600080fd5b506103a4600a5481565b6040519081526020016102b9565b3480156103be57600080fd5b506004546103a4565b3480156103d357600080fd5b506103a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561040757600080fd5b506102e261041636600461271c565b610bc3565b34801561042757600080fd5b506102e26104363660046126ce565b610c55565b34801561044757600080fd5b506103a4600e5481565b34801561045d57600080fd5b506103a461046c3660046127fe565b610ca3565b34801561047d57600080fd5b506102e261048c3660046128df565b610d6e565b6102e2610e18565b6102e26104a73660046127fe565b610e97565b3480156104b857600080fd5b506103a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ec57600080fd5b506102e26104fb36600461271c565b61100c565b34801561050c57600080fd5b5061052061051b3660046126ce565b611027565b6040516102b99190612aa8565b34801561053957600080fd5b506102e26105483660046128df565b6110c9565b6102e261055b366004612828565b6110f8565b34801561056c57600080fd5b50600c546102ad90610100900460ff1681565b34801561058b57600080fd5b506103a461059a3660046128df565b61133e565b3480156105ab57600080fd5b506102e26105ba366004612932565b6113f9565b3480156105cb57600080fd5b50600c546102ad9060ff1681565b3480156105e557600080fd5b506103566105f43660046128df565b611436565b34801561060557600080fd5b506102f961144d565b34801561061a57600080fd5b506103a46106293660046126ce565b6114db565b34801561063a57600080fd5b506102e26115ac565b34801561064f57600080fd5b506102e261065e3660046128df565b6115e2565b34801561066f57600080fd5b506007546001600160a01b0316610356565b34801561068d57600080fd5b506103a47f000000000000000000000000000000000000000000000000000000000000000081565b3480156106c157600080fd5b506102f9611611565b3480156106d657600080fd5b506102e26106e53660046127d4565b611620565b3480156106f657600080fd5b506102e26107053660046126ce565b6116e5565b34801561071657600080fd5b506102e2610725366004612758565b611730565b34801561073657600080fd5b506102f96117b5565b34801561074b57600080fd5b506102f961075a3660046128df565b6117c2565b34801561076b57600080fd5b506103a47f000000000000000000000000000000000000000000000000000000000000000081565b34801561079f57600080fd5b506102e26107ae366004612932565b611892565b3480156107bf57600080fd5b506103a46107ce3660046126ce565b600f6020526000908152604090205481565b3480156107ec57600080fd5b506102ad6107fb3660046126e9565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561083557600080fd5b506102e2610844366004612882565b6118cf565b34801561085557600080fd5b506102e26108643660046128c4565b61195b565b34801561087557600080fd5b506102e2610884366004612882565b61199f565b34801561089557600080fd5b506102e26108a43660046126ce565b611a2b565b3480156108b557600080fd5b506102ad6108c43660046126ce565b600b6020526000908152604090205460ff1681565b60006001600160e01b031982166380ac58cd60e01b148061090a57506001600160e01b03198216635b5e139f60e01b145b8061092557506001600160e01b0319821663780e9d6360e01b145b8061094057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b031633146109795760405162461bcd60e51b815260040161097090612b54565b60405180910390fd5b600c805460ff1916911515919091179055565b60606001805461099b90612c17565b80601f01602080910402602001604051908101604052809291908181526020018280546109c790612c17565b8015610a145780601f106109e957610100808354040283529160200191610a14565b820191906000526020600020905b8154815290600101906020018083116109f757829003601f168201915b5050505050905090565b6000610a2b826004541190565b610a8f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732315073693a20617070726f76656420717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610970565b506000908152600560205260409020546001600160a01b031690565b6000610ab682611436565b9050806001600160a01b0316836001600160a01b03161415610b265760405162461bcd60e51b8152602060048201526024808201527f4552433732315073693a20617070726f76616c20746f2063757272656e74206f6044820152633bb732b960e11b6064820152608401610970565b336001600160a01b0382161480610b425750610b4281336107fb565b610bb45760405162461bcd60e51b815260206004820152603b60248201527f4552433732315073693a20617070726f76652063616c6c6572206973206e6f7460448201527f206f776e6572206e6f7220617070726f76656420666f7220616c6c00000000006064820152608401610970565b610bbe8383611ac3565b505050565b336000908152600b602052604090205460ff16610c4a57610be43382611b31565b610c4a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610970565b610bbe838383611c20565b6007546001600160a01b03163314610c7f5760405162461bcd60e51b815260040161097090612b54565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b60008060005b600454811015610d1957610cbe816004541190565b8015610ce35750610cce81611436565b6001600160a01b0316856001600160a01b0316145b15610d075783821415610cf95791506109409050565b81610d0381612c52565b9250505b80610d1181612c52565b915050610ca9565b5060405162461bcd60e51b8152602060048201526024808201527f4552433732315073693a206f776e657220696e646578206f7574206f6620626f604482015263756e647360e01b6064820152608401610970565b6007546001600160a01b03163314610d985760405162461bcd60e51b815260040161097090612b54565b7f0000000000000000000000000000000000000000000000000000000000000000610dc260045490565b10610dcc57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000081610df760045490565b610e019190612b89565b10610e0b57600080fd5b610e153382611e0c565b50565b6007546001600160a01b03163314610e425760405162461bcd60e51b815260040161097090612b54565b604051600090339047908381818185875af1925050503d8060008114610e84576040519150601f19603f3d011682016040523d82523d6000602084013e610e89565b606091505b5050905080610e1557600080fd5b333214610ea357600080fd5b600c54610100900460ff16158015610ebe5750600c5460ff16155b610ec757600080fd5b7f00000000000000000000000000000000000000000000000000000000000000008110610f365760405162461bcd60e51b815260206004820152601f60248201527f596f752063616e6e6f74206d696e742074686973206d616e79204e46547321006044820152606401610970565b7f000000000000000000000000000000000000000000000000000000000000000081610f6160045490565b610f6b9190612b89565b10610fab5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f756768204e4654732160801b6044820152606401610970565b80600a54610fb99190612bb5565b341015610ffe5760405162461bcd60e51b81526020600482015260136024820152724d7573742073656e64206d6f7265204554482160681b6044820152606401610970565b6110088282611e0c565b5050565b610bbe83838360405180602001604052806000815250611730565b60606000611034836114db565b905060008167ffffffffffffffff81111561105157611051612cc3565b60405190808252806020026020018201604052801561107a578160200160208202803683370190505b50905060005b828110156110c1576110928582610ca3565b8282815181106110a4576110a4612cad565b6020908102919091010152806110b981612c52565b915050611080565b509392505050565b6007546001600160a01b031633146110f35760405162461bcd60e51b815260040161097090612b54565b600a55565b33321461110457600080fd5b600c54610100900460ff16801561111e5750600c5460ff16155b61112757600080fd5b7f00000000000000000000000000000000000000000000000000000000000000008361115260045490565b61115c9190612b89565b1061116657600080fd5b336000908152600f60205260409020547f0000000000000000000000000000000000000000000000000000000000000000906111a29085612b89565b106111ff5760405162461bcd60e51b815260206004820152602760248201527f4164647265737320616c726561647920636c61696d6564206d6178696d756d20604482015266746f6b656e732160c81b6064820152608401610970565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061127983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050611e26565b6112b65760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610970565b336000908152600f6020526040812080548692906112d5908490612b89565b9091555050600a546112e8908590612bb5565b34101561132d5760405162461bcd60e51b81526020600482015260136024820152724d7573742073656e64206d6f7265204554482160681b6044820152606401610970565b6113378585611e0c565b5050505050565b600061134960045490565b82106113a55760405162461bcd60e51b815260206004820152602560248201527f4552433732315073693a20676c6f62616c20696e646578206f7574206f6620626044820152646f756e647360d81b6064820152608401610970565b6000805b6004548110156113f2576113be816004541190565b156113e057838214156113d2579392505050565b816113dc81612c52565b9250505b806113ea81612c52565b9150506113a9565b5050919050565b6007546001600160a01b031633146114235760405162461bcd60e51b815260040161097090612b54565b8051611008906008906020840190612547565b600080600061144484611e3c565b50949350505050565b6008805461145a90612c17565b80601f016020809104026020016040519081016040528092919081815260200182805461148690612c17565b80156114d35780601f106114a8576101008083540402835291602001916114d3565b820191906000526020600020905b8154815290600101906020018083116114b657829003601f168201915b505050505081565b60006001600160a01b0382166115495760405162461bcd60e51b815260206004820152602d60248201527f4552433732315073693a2062616c616e636520717565727920666f722074686560448201526c207a65726f206164647265737360981b6064820152608401610970565b6000805b6004548110156115a557611562816004541190565b156115955761157081611436565b6001600160a01b0316846001600160a01b031614156115955761159282612c52565b91505b61159e81612c52565b905061154d565b5092915050565b6007546001600160a01b031633146115d65760405162461bcd60e51b815260040161097090612b54565b6115e06000611ed5565b565b6007546001600160a01b0316331461160c5760405162461bcd60e51b815260040161097090612b54565b600e55565b60606002805461099b90612c17565b6001600160a01b0382163314156116795760405162461bcd60e51b815260206004820152601c60248201527f4552433732315073693a20617070726f766520746f2063616c6c6572000000006044820152606401610970565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b0316331461170f5760405162461bcd60e51b815260040161097090612b54565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b61173a3383611b31565b6117a35760405162461bcd60e51b815260206004820152603460248201527f4552433732315073693a207472616e736665722063616c6c6572206973206e6f6044820152731d081bdddb995c881b9bdc88185c1c1c9bdd995960621b6064820152608401610970565b6117af84848484611f27565b50505050565b6009805461145a90612c17565b60606117cf826004541190565b6118335760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610970565b600061183d611f5c565b9050600081511161185d576040518060200160405280600081525061188b565b8061186784611f6b565b600960405160200161187b939291906129a7565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146118bc5760405162461bcd60e51b815260040161097090612b54565b8051611008906009906020840190612547565b6007546001600160a01b031633146118f95760405162461bcd60e51b815260040161097090612b54565b60005b81811015610bbe576000600d600085858581811061191c5761191c612cad565b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061195390612c52565b9150506118fc565b6007546001600160a01b031633146119855760405162461bcd60e51b815260040161097090612b54565b600c80549115156101000261ff0019909216919091179055565b6007546001600160a01b031633146119c95760405162461bcd60e51b815260040161097090612b54565b60005b81811015610bbe576001600d60008585858181106119ec576119ec612cad565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611a2390612c52565b9150506119cc565b6007546001600160a01b03163314611a555760405162461bcd60e51b815260040161097090612b54565b6001600160a01b038116611aba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610970565b610e1581611ed5565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611af882611436565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b3e826004541190565b611ba25760405162461bcd60e51b815260206004820152602f60248201527f4552433732315073693a206f70657261746f7220717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610970565b6000611bad83611436565b9050806001600160a01b0316846001600160a01b03161480611be85750836001600160a01b0316611bdd84610a1e565b6001600160a01b0316145b80611c1857506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b600080611c2c83611e3c565b91509150846001600160a01b0316826001600160a01b031614611ca65760405162461bcd60e51b815260206004820152602c60248201527f4552433732315073693a207472616e73666572206f6620746f6b656e2074686160448201526b3a1034b9903737ba1037bbb760a11b6064820152608401610970565b6001600160a01b038416611d0c5760405162461bcd60e51b815260206004820152602760248201527f4552433732315073693a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b6064820152608401610970565b611d17600084611ac3565b6000611d24846001612b89565b600881901c600090815260208190526040902054909150600160ff1b60ff83161c16158015611d54575060045481105b15611d8a57600081815260036020526040812080546001600160a01b0319166001600160a01b038916179055611d8a9082612069565b600084815260036020526040902080546001600160a01b0319166001600160a01b038716179055818414611dc357611dc3600085612069565b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b611008828260405180602001604052806000815250612095565b600082611e3385846120b0565b14949350505050565b600080611e4a836004541190565b611eab5760405162461bcd60e51b815260206004820152602c60248201527f4552433732315073693a206f776e657220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610970565b611eb48361211c565b6000818152600360205260409020546001600160a01b031694909350915050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611f32848484611c20565b611f40848484600185612128565b6117af5760405162461bcd60e51b815260040161097090612aff565b60606008805461099b90612c17565b606081611f8f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fb95780611fa381612c52565b9150611fb29050600a83612ba1565b9150611f93565b60008167ffffffffffffffff811115611fd457611fd4612cc3565b6040519080825280601f01601f191660200182016040528015611ffe576020820181803683370190505b5090505b8415611c1857612013600183612bd4565b9150612020600a86612c6d565b61202b906030612b89565b60f81b81838151811061204057612040612cad565b60200101906001600160f81b031916908160001a905350612062600a86612ba1565b9450612002565b600881901c600090815260209290925260409091208054600160ff1b60ff9093169290921c9091179055565b6004546120a2848461226b565b611f40600085838686612128565b600081815b84518110156110c15760008582815181106120d2576120d2612cad565b602002602001015190508083116120f85760008381526020829052604090209250612109565b600081815260208490526040902092505b508061211481612c52565b9150506120b5565b600061094081836123d0565b60006001600160a01b0385163b1561225e57506001835b6121498486612b89565b81101561225857604051630a85bd0160e11b81526001600160a01b0387169063150b7a02906121829033908b9086908990600401612a6b565b602060405180830381600087803b15801561219c57600080fd5b505af19250505080156121cc575060408051601f3d908101601f191682019092526121c991810190612915565b60015b612226573d8080156121fa576040519150601f19603f3d011682016040523d82523d6000602084013e6121ff565b606091505b50805161221e5760405162461bcd60e51b815260040161097090612aff565b805181602001fd5b82801561224357506001600160e01b03198116630a85bd0160e11b145b9250508061225081612c52565b91505061213f565b50612262565b5060015b95945050505050565b600454816122c95760405162461bcd60e51b815260206004820152602560248201527f4552433732315073693a207175616e74697479206d7573742062652067726561604482015264074657220360dc1b6064820152608401610970565b6001600160a01b03831661232b5760405162461bcd60e51b815260206004820152602360248201527f4552433732315073693a206d696e7420746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610970565b816004600082825461233d9190612b89565b9091555050600081815260036020526040812080546001600160a01b0319166001600160a01b0386161790556123739082612069565b805b61237f8383612b89565b8110156117af5760405181906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4806123c881612c52565b915050612375565b600881901c60008181526020849052604081205490919060ff808516919082181c801561241557612400816124c5565b60ff168203600884901b179350505050610940565b600083116124825760405162461bcd60e51b815260206004820152603460248201527f4269744d6170733a205468652073657420626974206265666f7265207468652060448201527334b73232bc103237b2b9b713ba1032bc34b9ba1760611b6064820152608401610970565b5060001990910160008181526020869052604090205490919080156124c0576124aa816124c5565b60ff0360ff16600884901b179350505050610940565b612415565b60006040518061012001604052806101008152602001612cf0610100913960f87e818283848586878898a8b8c8d8e8f929395969799a9b9d9e9faaeb6bedeeff61250e8561252f565b02901c8151811061252157612521612cad565b016020015160f81c92915050565b600080821161253d57600080fd5b5060008190031690565b82805461255390612c17565b90600052602060002090601f01602090048101928261257557600085556125bb565b82601f1061258e57805160ff19168380011785556125bb565b828001600101855582156125bb579182015b828111156125bb5782518255916020019190600101906125a0565b506125c79291506125cb565b5090565b5b808211156125c757600081556001016125cc565b600067ffffffffffffffff808411156125fb576125fb612cc3565b604051601f8501601f19908116603f0116810190828211818310171561262357612623612cc3565b8160405280935085815286868601111561263c57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461266d57600080fd5b919050565b60008083601f84011261268457600080fd5b50813567ffffffffffffffff81111561269c57600080fd5b6020830191508360208260051b85010111156126b757600080fd5b9250929050565b8035801515811461266d57600080fd5b6000602082840312156126e057600080fd5b61188b82612656565b600080604083850312156126fc57600080fd5b61270583612656565b915061271360208401612656565b90509250929050565b60008060006060848603121561273157600080fd5b61273a84612656565b925061274860208501612656565b9150604084013590509250925092565b6000806000806080858703121561276e57600080fd5b61277785612656565b935061278560208601612656565b925060408501359150606085013567ffffffffffffffff8111156127a857600080fd5b8501601f810187136127b957600080fd5b6127c8878235602084016125e0565b91505092959194509250565b600080604083850312156127e757600080fd5b6127f083612656565b9150612713602084016126be565b6000806040838503121561281157600080fd5b61281a83612656565b946020939093013593505050565b6000806000806060858703121561283e57600080fd5b61284785612656565b935060208501359250604085013567ffffffffffffffff81111561286a57600080fd5b61287687828801612672565b95989497509550505050565b6000806020838503121561289557600080fd5b823567ffffffffffffffff8111156128ac57600080fd5b6128b885828601612672565b90969095509350505050565b6000602082840312156128d657600080fd5b61188b826126be565b6000602082840312156128f157600080fd5b5035919050565b60006020828403121561290a57600080fd5b813561188b81612cd9565b60006020828403121561292757600080fd5b815161188b81612cd9565b60006020828403121561294457600080fd5b813567ffffffffffffffff81111561295b57600080fd5b8201601f8101841361296c57600080fd5b611c18848235602084016125e0565b60008151808452612993816020860160208601612beb565b601f01601f19169290920160200192915050565b6000845160206129ba8285838a01612beb565b8551918401916129cd8184848a01612beb565b8554920191600090600181811c90808316806129ea57607f831692505b858310811415612a0857634e487b7160e01b85526022600452602485fd5b808015612a1c5760018114612a2d57612a5a565b60ff19851688528388019550612a5a565b60008b81526020902060005b85811015612a525781548a820152908401908801612a39565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a9e9083018461297b565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ae057835183529284019291840191600101612ac4565b50909695505050505050565b60208152600061188b602083018461297b565b60208082526035908201527f4552433732315073693a207472616e7366657220746f206e6f6e20455243373260408201527418a932b1b2b4bb32b91034b6b83632b6b2b73a32b960591b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115612b9c57612b9c612c81565b500190565b600082612bb057612bb0612c97565b500490565b6000816000190483118215151615612bcf57612bcf612c81565b500290565b600082821015612be657612be6612c81565b500390565b60005b83811015612c06578181015183820152602001612bee565b838111156117af5750506000910152565b600181811c90821680612c2b57607f821691505b60208210811415612c4c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c6657612c66612c81565b5060010190565b600082612c7c57612c7c612c97565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e1557600080fdfe0001020903110a19042112290b311a3905412245134d2a550c5d32651b6d3a7506264262237d468514804e8d2b95569d0d495ea533a966b11c886eb93bc176c9071727374353637324837e9b47af86c7155181ad4fd18ed32c9096db57d59ee30e2e4a6a5f92a6be3498aae067ddb2eb1d5989b56fd7baf33ca0c2ee77e5caf7ff0810182028303840444c545c646c7425617c847f8c949c48a4a8b087b8c0c816365272829aaec650acd0d28fdad4e22d6991bd97dfdcea58b4d6f29fede4f6fe0f1f2f3f4b5b6b607b8b93a3a7b7bf357199c5abcfd9e168bcdee9b3f1ecf5fd1e3e5a7a8aa2b670c4ced8bbe8f0f4fc3d79a1c3cde7effb78cce6facbf9f8a26469706673582212208462a13d03228290dcce37b95e7f60fd955bc0f099f7e69ffd264c2001d3b83a64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102885760003560e01c806355f804b31161015a578063b88d4fde116100c1578063e985e9c51161007a578063e985e9c5146107e0578063ea03ddcb14610829578063ea05a8c614610849578063eee94bf114610869578063f2fde38b14610889578063fdff9b4d146108a957600080fd5b8063b88d4fde1461070a578063c66828621461072a578063c87b56dd1461073f578063d5abeb011461075f578063da3ef23f14610793578063db4bec44146107b357600080fd5b80637cb64759116101135780637cb64759146106435780638da5cb5b14610663578063953f049d1461068157806395d89b41146106b5578063a22cb465146106ca578063ac18de43146106ea57600080fd5b806355f804b31461059f5780635c975abb146105bf5780636352211e146105d95780636c0360eb146105f957806370a082311461060e578063715018a61461062e57600080fd5b80632eb4a7ab116101fe57806342842e0e116101b757806342842e0e146104e0578063438b63001461050057806344a0d68a1461052d5780634b11faaf1461054d5780634b4687b5146105605780634f6ccce71461057f57600080fd5b80632eb4a7ab1461043b5780632f745c5914610451578063375a069a146104715780633ccfd60b1461049157806340c10f191461049957806341c66d0a146104ac57600080fd5b8063095ea7b311610250578063095ea7b31461036e57806313faede61461038e57806318160ddd146103b2578063239c70ae146103c757806323b872dd146103fb5780632d06177a1461041b57600080fd5b806301ffc9a71461028d57806302329a29146102c257806306fdde03146102e45780630796895d14610306578063081812fc14610336575b600080fd5b34801561029957600080fd5b506102ad6102a83660046128f8565b6108d9565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd3660046128c4565b610946565b005b3480156102f057600080fd5b506102f961098c565b6040516102b99190612aec565b34801561031257600080fd5b506102ad6103213660046128df565b6000908152600d602052604090205460ff1690565b34801561034257600080fd5b506103566103513660046128df565b610a1e565b6040516001600160a01b0390911681526020016102b9565b34801561037a57600080fd5b506102e26103893660046127fe565b610aab565b34801561039a57600080fd5b506103a4600a5481565b6040519081526020016102b9565b3480156103be57600080fd5b506004546103a4565b3480156103d357600080fd5b506103a47f000000000000000000000000000000000000000000000000000000000000001081565b34801561040757600080fd5b506102e261041636600461271c565b610bc3565b34801561042757600080fd5b506102e26104363660046126ce565b610c55565b34801561044757600080fd5b506103a4600e5481565b34801561045d57600080fd5b506103a461046c3660046127fe565b610ca3565b34801561047d57600080fd5b506102e261048c3660046128df565b610d6e565b6102e2610e18565b6102e26104a73660046127fe565b610e97565b3480156104b857600080fd5b506103a47f000000000000000000000000000000000000000000000000000000000000006581565b3480156104ec57600080fd5b506102e26104fb36600461271c565b61100c565b34801561050c57600080fd5b5061052061051b3660046126ce565b611027565b6040516102b99190612aa8565b34801561053957600080fd5b506102e26105483660046128df565b6110c9565b6102e261055b366004612828565b6110f8565b34801561056c57600080fd5b50600c546102ad90610100900460ff1681565b34801561058b57600080fd5b506103a461059a3660046128df565b61133e565b3480156105ab57600080fd5b506102e26105ba366004612932565b6113f9565b3480156105cb57600080fd5b50600c546102ad9060ff1681565b3480156105e557600080fd5b506103566105f43660046128df565b611436565b34801561060557600080fd5b506102f961144d565b34801561061a57600080fd5b506103a46106293660046126ce565b6114db565b34801561063a57600080fd5b506102e26115ac565b34801561064f57600080fd5b506102e261065e3660046128df565b6115e2565b34801561066f57600080fd5b506007546001600160a01b0316610356565b34801561068d57600080fd5b506103a47f00000000000000000000000000000000000000000000000000000000000003e981565b3480156106c157600080fd5b506102f9611611565b3480156106d657600080fd5b506102e26106e53660046127d4565b611620565b3480156106f657600080fd5b506102e26107053660046126ce565b6116e5565b34801561071657600080fd5b506102e2610725366004612758565b611730565b34801561073657600080fd5b506102f96117b5565b34801561074b57600080fd5b506102f961075a3660046128df565b6117c2565b34801561076b57600080fd5b506103a47f000000000000000000000000000000000000000000000000000000000000271181565b34801561079f57600080fd5b506102e26107ae366004612932565b611892565b3480156107bf57600080fd5b506103a46107ce3660046126ce565b600f6020526000908152604090205481565b3480156107ec57600080fd5b506102ad6107fb3660046126e9565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561083557600080fd5b506102e2610844366004612882565b6118cf565b34801561085557600080fd5b506102e26108643660046128c4565b61195b565b34801561087557600080fd5b506102e2610884366004612882565b61199f565b34801561089557600080fd5b506102e26108a43660046126ce565b611a2b565b3480156108b557600080fd5b506102ad6108c43660046126ce565b600b6020526000908152604090205460ff1681565b60006001600160e01b031982166380ac58cd60e01b148061090a57506001600160e01b03198216635b5e139f60e01b145b8061092557506001600160e01b0319821663780e9d6360e01b145b8061094057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b031633146109795760405162461bcd60e51b815260040161097090612b54565b60405180910390fd5b600c805460ff1916911515919091179055565b60606001805461099b90612c17565b80601f01602080910402602001604051908101604052809291908181526020018280546109c790612c17565b8015610a145780601f106109e957610100808354040283529160200191610a14565b820191906000526020600020905b8154815290600101906020018083116109f757829003601f168201915b5050505050905090565b6000610a2b826004541190565b610a8f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732315073693a20617070726f76656420717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610970565b506000908152600560205260409020546001600160a01b031690565b6000610ab682611436565b9050806001600160a01b0316836001600160a01b03161415610b265760405162461bcd60e51b8152602060048201526024808201527f4552433732315073693a20617070726f76616c20746f2063757272656e74206f6044820152633bb732b960e11b6064820152608401610970565b336001600160a01b0382161480610b425750610b4281336107fb565b610bb45760405162461bcd60e51b815260206004820152603b60248201527f4552433732315073693a20617070726f76652063616c6c6572206973206e6f7460448201527f206f776e6572206e6f7220617070726f76656420666f7220616c6c00000000006064820152608401610970565b610bbe8383611ac3565b505050565b336000908152600b602052604090205460ff16610c4a57610be43382611b31565b610c4a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610970565b610bbe838383611c20565b6007546001600160a01b03163314610c7f5760405162461bcd60e51b815260040161097090612b54565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b60008060005b600454811015610d1957610cbe816004541190565b8015610ce35750610cce81611436565b6001600160a01b0316856001600160a01b0316145b15610d075783821415610cf95791506109409050565b81610d0381612c52565b9250505b80610d1181612c52565b915050610ca9565b5060405162461bcd60e51b8152602060048201526024808201527f4552433732315073693a206f776e657220696e646578206f7574206f6620626f604482015263756e647360e01b6064820152608401610970565b6007546001600160a01b03163314610d985760405162461bcd60e51b815260040161097090612b54565b7f0000000000000000000000000000000000000000000000000000000000000065610dc260045490565b10610dcc57600080fd5b7f000000000000000000000000000000000000000000000000000000000000006581610df760045490565b610e019190612b89565b10610e0b57600080fd5b610e153382611e0c565b50565b6007546001600160a01b03163314610e425760405162461bcd60e51b815260040161097090612b54565b604051600090339047908381818185875af1925050503d8060008114610e84576040519150601f19603f3d011682016040523d82523d6000602084013e610e89565b606091505b5050905080610e1557600080fd5b333214610ea357600080fd5b600c54610100900460ff16158015610ebe5750600c5460ff16155b610ec757600080fd5b7f00000000000000000000000000000000000000000000000000000000000000108110610f365760405162461bcd60e51b815260206004820152601f60248201527f596f752063616e6e6f74206d696e742074686973206d616e79204e46547321006044820152606401610970565b7f000000000000000000000000000000000000000000000000000000000000271181610f6160045490565b610f6b9190612b89565b10610fab5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f756768204e4654732160801b6044820152606401610970565b80600a54610fb99190612bb5565b341015610ffe5760405162461bcd60e51b81526020600482015260136024820152724d7573742073656e64206d6f7265204554482160681b6044820152606401610970565b6110088282611e0c565b5050565b610bbe83838360405180602001604052806000815250611730565b60606000611034836114db565b905060008167ffffffffffffffff81111561105157611051612cc3565b60405190808252806020026020018201604052801561107a578160200160208202803683370190505b50905060005b828110156110c1576110928582610ca3565b8282815181106110a4576110a4612cad565b6020908102919091010152806110b981612c52565b915050611080565b509392505050565b6007546001600160a01b031633146110f35760405162461bcd60e51b815260040161097090612b54565b600a55565b33321461110457600080fd5b600c54610100900460ff16801561111e5750600c5460ff16155b61112757600080fd5b7f00000000000000000000000000000000000000000000000000000000000003e98361115260045490565b61115c9190612b89565b1061116657600080fd5b336000908152600f60205260409020547f0000000000000000000000000000000000000000000000000000000000000010906111a29085612b89565b106111ff5760405162461bcd60e51b815260206004820152602760248201527f4164647265737320616c726561647920636c61696d6564206d6178696d756d20604482015266746f6b656e732160c81b6064820152608401610970565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061127983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050611e26565b6112b65760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610970565b336000908152600f6020526040812080548692906112d5908490612b89565b9091555050600a546112e8908590612bb5565b34101561132d5760405162461bcd60e51b81526020600482015260136024820152724d7573742073656e64206d6f7265204554482160681b6044820152606401610970565b6113378585611e0c565b5050505050565b600061134960045490565b82106113a55760405162461bcd60e51b815260206004820152602560248201527f4552433732315073693a20676c6f62616c20696e646578206f7574206f6620626044820152646f756e647360d81b6064820152608401610970565b6000805b6004548110156113f2576113be816004541190565b156113e057838214156113d2579392505050565b816113dc81612c52565b9250505b806113ea81612c52565b9150506113a9565b5050919050565b6007546001600160a01b031633146114235760405162461bcd60e51b815260040161097090612b54565b8051611008906008906020840190612547565b600080600061144484611e3c565b50949350505050565b6008805461145a90612c17565b80601f016020809104026020016040519081016040528092919081815260200182805461148690612c17565b80156114d35780601f106114a8576101008083540402835291602001916114d3565b820191906000526020600020905b8154815290600101906020018083116114b657829003601f168201915b505050505081565b60006001600160a01b0382166115495760405162461bcd60e51b815260206004820152602d60248201527f4552433732315073693a2062616c616e636520717565727920666f722074686560448201526c207a65726f206164647265737360981b6064820152608401610970565b6000805b6004548110156115a557611562816004541190565b156115955761157081611436565b6001600160a01b0316846001600160a01b031614156115955761159282612c52565b91505b61159e81612c52565b905061154d565b5092915050565b6007546001600160a01b031633146115d65760405162461bcd60e51b815260040161097090612b54565b6115e06000611ed5565b565b6007546001600160a01b0316331461160c5760405162461bcd60e51b815260040161097090612b54565b600e55565b60606002805461099b90612c17565b6001600160a01b0382163314156116795760405162461bcd60e51b815260206004820152601c60248201527f4552433732315073693a20617070726f766520746f2063616c6c6572000000006044820152606401610970565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b0316331461170f5760405162461bcd60e51b815260040161097090612b54565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b61173a3383611b31565b6117a35760405162461bcd60e51b815260206004820152603460248201527f4552433732315073693a207472616e736665722063616c6c6572206973206e6f6044820152731d081bdddb995c881b9bdc88185c1c1c9bdd995960621b6064820152608401610970565b6117af84848484611f27565b50505050565b6009805461145a90612c17565b60606117cf826004541190565b6118335760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610970565b600061183d611f5c565b9050600081511161185d576040518060200160405280600081525061188b565b8061186784611f6b565b600960405160200161187b939291906129a7565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146118bc5760405162461bcd60e51b815260040161097090612b54565b8051611008906009906020840190612547565b6007546001600160a01b031633146118f95760405162461bcd60e51b815260040161097090612b54565b60005b81811015610bbe576000600d600085858581811061191c5761191c612cad565b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061195390612c52565b9150506118fc565b6007546001600160a01b031633146119855760405162461bcd60e51b815260040161097090612b54565b600c80549115156101000261ff0019909216919091179055565b6007546001600160a01b031633146119c95760405162461bcd60e51b815260040161097090612b54565b60005b81811015610bbe576001600d60008585858181106119ec576119ec612cad565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611a2390612c52565b9150506119cc565b6007546001600160a01b03163314611a555760405162461bcd60e51b815260040161097090612b54565b6001600160a01b038116611aba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610970565b610e1581611ed5565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611af882611436565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b3e826004541190565b611ba25760405162461bcd60e51b815260206004820152602f60248201527f4552433732315073693a206f70657261746f7220717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610970565b6000611bad83611436565b9050806001600160a01b0316846001600160a01b03161480611be85750836001600160a01b0316611bdd84610a1e565b6001600160a01b0316145b80611c1857506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b600080611c2c83611e3c565b91509150846001600160a01b0316826001600160a01b031614611ca65760405162461bcd60e51b815260206004820152602c60248201527f4552433732315073693a207472616e73666572206f6620746f6b656e2074686160448201526b3a1034b9903737ba1037bbb760a11b6064820152608401610970565b6001600160a01b038416611d0c5760405162461bcd60e51b815260206004820152602760248201527f4552433732315073693a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b6064820152608401610970565b611d17600084611ac3565b6000611d24846001612b89565b600881901c600090815260208190526040902054909150600160ff1b60ff83161c16158015611d54575060045481105b15611d8a57600081815260036020526040812080546001600160a01b0319166001600160a01b038916179055611d8a9082612069565b600084815260036020526040902080546001600160a01b0319166001600160a01b038716179055818414611dc357611dc3600085612069565b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b611008828260405180602001604052806000815250612095565b600082611e3385846120b0565b14949350505050565b600080611e4a836004541190565b611eab5760405162461bcd60e51b815260206004820152602c60248201527f4552433732315073693a206f776e657220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610970565b611eb48361211c565b6000818152600360205260409020546001600160a01b031694909350915050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611f32848484611c20565b611f40848484600185612128565b6117af5760405162461bcd60e51b815260040161097090612aff565b60606008805461099b90612c17565b606081611f8f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fb95780611fa381612c52565b9150611fb29050600a83612ba1565b9150611f93565b60008167ffffffffffffffff811115611fd457611fd4612cc3565b6040519080825280601f01601f191660200182016040528015611ffe576020820181803683370190505b5090505b8415611c1857612013600183612bd4565b9150612020600a86612c6d565b61202b906030612b89565b60f81b81838151811061204057612040612cad565b60200101906001600160f81b031916908160001a905350612062600a86612ba1565b9450612002565b600881901c600090815260209290925260409091208054600160ff1b60ff9093169290921c9091179055565b6004546120a2848461226b565b611f40600085838686612128565b600081815b84518110156110c15760008582815181106120d2576120d2612cad565b602002602001015190508083116120f85760008381526020829052604090209250612109565b600081815260208490526040902092505b508061211481612c52565b9150506120b5565b600061094081836123d0565b60006001600160a01b0385163b1561225e57506001835b6121498486612b89565b81101561225857604051630a85bd0160e11b81526001600160a01b0387169063150b7a02906121829033908b9086908990600401612a6b565b602060405180830381600087803b15801561219c57600080fd5b505af19250505080156121cc575060408051601f3d908101601f191682019092526121c991810190612915565b60015b612226573d8080156121fa576040519150601f19603f3d011682016040523d82523d6000602084013e6121ff565b606091505b50805161221e5760405162461bcd60e51b815260040161097090612aff565b805181602001fd5b82801561224357506001600160e01b03198116630a85bd0160e11b145b9250508061225081612c52565b91505061213f565b50612262565b5060015b95945050505050565b600454816122c95760405162461bcd60e51b815260206004820152602560248201527f4552433732315073693a207175616e74697479206d7573742062652067726561604482015264074657220360dc1b6064820152608401610970565b6001600160a01b03831661232b5760405162461bcd60e51b815260206004820152602360248201527f4552433732315073693a206d696e7420746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610970565b816004600082825461233d9190612b89565b9091555050600081815260036020526040812080546001600160a01b0319166001600160a01b0386161790556123739082612069565b805b61237f8383612b89565b8110156117af5760405181906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4806123c881612c52565b915050612375565b600881901c60008181526020849052604081205490919060ff808516919082181c801561241557612400816124c5565b60ff168203600884901b179350505050610940565b600083116124825760405162461bcd60e51b815260206004820152603460248201527f4269744d6170733a205468652073657420626974206265666f7265207468652060448201527334b73232bc103237b2b9b713ba1032bc34b9ba1760611b6064820152608401610970565b5060001990910160008181526020869052604090205490919080156124c0576124aa816124c5565b60ff0360ff16600884901b179350505050610940565b612415565b60006040518061012001604052806101008152602001612cf0610100913960f87e818283848586878898a8b8c8d8e8f929395969799a9b9d9e9faaeb6bedeeff61250e8561252f565b02901c8151811061252157612521612cad565b016020015160f81c92915050565b600080821161253d57600080fd5b5060008190031690565b82805461255390612c17565b90600052602060002090601f01602090048101928261257557600085556125bb565b82601f1061258e57805160ff19168380011785556125bb565b828001600101855582156125bb579182015b828111156125bb5782518255916020019190600101906125a0565b506125c79291506125cb565b5090565b5b808211156125c757600081556001016125cc565b600067ffffffffffffffff808411156125fb576125fb612cc3565b604051601f8501601f19908116603f0116810190828211818310171561262357612623612cc3565b8160405280935085815286868601111561263c57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461266d57600080fd5b919050565b60008083601f84011261268457600080fd5b50813567ffffffffffffffff81111561269c57600080fd5b6020830191508360208260051b85010111156126b757600080fd5b9250929050565b8035801515811461266d57600080fd5b6000602082840312156126e057600080fd5b61188b82612656565b600080604083850312156126fc57600080fd5b61270583612656565b915061271360208401612656565b90509250929050565b60008060006060848603121561273157600080fd5b61273a84612656565b925061274860208501612656565b9150604084013590509250925092565b6000806000806080858703121561276e57600080fd5b61277785612656565b935061278560208601612656565b925060408501359150606085013567ffffffffffffffff8111156127a857600080fd5b8501601f810187136127b957600080fd5b6127c8878235602084016125e0565b91505092959194509250565b600080604083850312156127e757600080fd5b6127f083612656565b9150612713602084016126be565b6000806040838503121561281157600080fd5b61281a83612656565b946020939093013593505050565b6000806000806060858703121561283e57600080fd5b61284785612656565b935060208501359250604085013567ffffffffffffffff81111561286a57600080fd5b61287687828801612672565b95989497509550505050565b6000806020838503121561289557600080fd5b823567ffffffffffffffff8111156128ac57600080fd5b6128b885828601612672565b90969095509350505050565b6000602082840312156128d657600080fd5b61188b826126be565b6000602082840312156128f157600080fd5b5035919050565b60006020828403121561290a57600080fd5b813561188b81612cd9565b60006020828403121561292757600080fd5b815161188b81612cd9565b60006020828403121561294457600080fd5b813567ffffffffffffffff81111561295b57600080fd5b8201601f8101841361296c57600080fd5b611c18848235602084016125e0565b60008151808452612993816020860160208601612beb565b601f01601f19169290920160200192915050565b6000845160206129ba8285838a01612beb565b8551918401916129cd8184848a01612beb565b8554920191600090600181811c90808316806129ea57607f831692505b858310811415612a0857634e487b7160e01b85526022600452602485fd5b808015612a1c5760018114612a2d57612a5a565b60ff19851688528388019550612a5a565b60008b81526020902060005b85811015612a525781548a820152908401908801612a39565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a9e9083018461297b565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ae057835183529284019291840191600101612ac4565b50909695505050505050565b60208152600061188b602083018461297b565b60208082526035908201527f4552433732315073693a207472616e7366657220746f206e6f6e20455243373260408201527418a932b1b2b4bb32b91034b6b83632b6b2b73a32b960591b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115612b9c57612b9c612c81565b500190565b600082612bb057612bb0612c97565b500490565b6000816000190483118215151615612bcf57612bcf612c81565b500290565b600082821015612be657612be6612c81565b500390565b60005b83811015612c06578181015183820152602001612bee565b838111156117af5750506000910152565b600181811c90821680612c2b57607f821691505b60208210811415612c4c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612c6657612c66612c81565b5060010190565b600082612c7c57612c7c612c97565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610e1557600080fdfe0001020903110a19042112290b311a3905412245134d2a550c5d32651b6d3a7506264262237d468514804e8d2b95569d0d495ea533a966b11c886eb93bc176c9071727374353637324837e9b47af86c7155181ad4fd18ed32c9096db57d59ee30e2e4a6a5f92a6be3498aae067ddb2eb1d5989b56fd7baf33ca0c2ee77e5caf7ff0810182028303840444c545c646c7425617c847f8c949c48a4a8b087b8c0c816365272829aaec650acd0d28fdad4e22d6991bd97dfdcea58b4d6f29fede4f6fe0f1f2f3f4b5b6b607b8b93a3a7b7bf357199c5abcfd9e168bcdee9b3f1ecf5fd1e3e5a7a8aa2b670c4ced8bbe8f0f4fc3d79a1c3cde7effb78cce6facbf9f8a26469706673582212208462a13d03228290dcce37b95e7f60fd955bc0f099f7e69ffd264c2001d3b83a64736f6c63430008070033
Deployed Bytecode Sourcemap
979:5335:15:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1588:422:5;;;;;;;;;;-1:-1:-1;1588:422:5;;;;;:::i;:::-;;:::i;:::-;;;9624:14:16;;9617:22;9599:41;;9587:2;9572:18;1588:422:5;;;;;;;;6032:79:15;;;;;;;;;;-1:-1:-1;6032:79:15;;;;;:::i;:::-;;:::i;:::-;;3220:100:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4799:90:15:-;;;;;;;;;;-1:-1:-1;4799:90:15;;;;;:::i;:::-;4847:4;4871:10;;;:6;:10;;;;;;;;;4799:90;4771:311:5;;;;;;;;;;-1:-1:-1;4771:311:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8285:32:16;;;8267:51;;8255:2;8240:18;4771:311:5;8121:203:16;4295:410:5;;;;;;;;;;-1:-1:-1;4295:410:5;;;;;:::i;:::-;;:::i;1139:31:15:-;;;;;;;;;;;;;;;;;;;9797:25:16;;;9785:2;9770:18;1139:31:15;9651:177:16;14309:103:5;;;;;;;;;;-1:-1:-1;14397:7:5;;14309:103;;1226:43:15;;;;;;;;;;;;;;;5253:289;;;;;;;;;;-1:-1:-1;5253:289:15;;;;;:::i;:::-;;:::i;5550:94::-;;;;;;;;;;-1:-1:-1;5550:94:15;;;;;:::i;:::-;;:::i;1545:25::-;;;;;;;;;;;;;;;;14940:397:5;;;;;;;;;;-1:-1:-1;14940:397:5;;;;;:::i;:::-;;:::i;3215:223:15:-;;;;;;;;;;-1:-1:-1;3215:223:15;;;;;:::i;:::-;;:::i;6119:192::-;;;:::i;2804:403::-;;;;;;:::i;:::-;;:::i;1333:40::-;;;;;;;;;;;;;;;6286:185:5;;;;;;;;;;-1:-1:-1;6286:185:5;;;;;:::i;:::-;;:::i;3553:390:15:-;;;;;;;;;;-1:-1:-1;3553:390:15;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4601:88::-;;;;;;;;;;-1:-1:-1;4601:88:15;;;;;:::i;:::-;;:::i;1906:890::-;;;;;;:::i;:::-;;:::i;1460:32::-;;;;;;;;;;-1:-1:-1;1460:32:15;;;;;;;;;;;14489:367:5;;;;;;;;;;-1:-1:-1;14489:367:5;;;;;:::i;:::-;;:::i;5759:106:15:-;;;;;;;;;;-1:-1:-1;5759:106:15;;;;;:::i;:::-;;:::i;1427:26::-;;;;;;;;;;-1:-1:-1;1427:26:15;;;;;;;;2601:246:5;;;;;;;;;;-1:-1:-1;2601:246:5;;;;;:::i;:::-;;:::i;1067:21:15:-;;;;;;;;;;;;;:::i;2074:465:5:-;;;;;;;;;;-1:-1:-1;2074:465:5;;;;;:::i;:::-;;:::i;1620:92:12:-;;;;;;;;;;;;;:::i;4697:94:15:-;;;;;;;;;;-1:-1:-1;4697:94:15;;;;;:::i;:::-;;:::i;988:85:12:-;;;;;;;;;;-1:-1:-1;1060:6:12;;-1:-1:-1;;;;;1060:6:12;988:85;;1276:50:15;;;;;;;;;;;;;;;3389:104:5;;;;;;;;;;;;;:::i;5154:330::-;;;;;;;;;;-1:-1:-1;5154:330:5;;;;;:::i;:::-;;:::i;5652:99:15:-;;;;;;;;;;-1:-1:-1;5652:99:15;;;;;:::i;:::-;;:::i;6542:368:5:-;;;;;;;;;;-1:-1:-1;6542:368:5;;;;;:::i;:::-;;:::i;1095:37:15:-;;;;;;;;;;;;;:::i;3951:642::-;;;;;;;;;;-1:-1:-1;3951:642:15;;;;;:::i;:::-;;:::i;1177:42::-;;;;;;;;;;;;;;;5873:151;;;;;;;;;;-1:-1:-1;5873:151:15;;;;;:::i;:::-;;:::i;1577:51::-;;;;;;;;;;-1:-1:-1;1577:51:15;;;;;:::i;:::-;;;;;;;;;;;;;;5555:214:5;;;;;;;;;;-1:-1:-1;5555:214:5;;;;;:::i;:::-;-1:-1:-1;;;;;5726:25:5;;;5697:4;5726:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;5555:214;5074:171:15;;;;;;;;;;-1:-1:-1;5074:171:15;;;;;:::i;:::-;;:::i;3446:99::-;;;;;;;;;;-1:-1:-1;3446:99:15;;;;;:::i;:::-;;:::i;4897:169::-;;;;;;;;;;-1:-1:-1;4897:169:15;;;;;:::i;:::-;;:::i;1861:223:12:-;;;;;;;;;;-1:-1:-1;1861:223:12;;;;;:::i;:::-;;:::i;1380:40:15:-;;;;;;;;;;-1:-1:-1;1380:40:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;1588:422:5;1735:4;-1:-1:-1;;;;;;1777:40:5;;-1:-1:-1;;;1777:40:5;;:105;;-1:-1:-1;;;;;;;1834:48:5;;-1:-1:-1;;;1834:48:5;1777:105;:172;;;-1:-1:-1;;;;;;;1899:50:5;;-1:-1:-1;;;1899:50:5;1777:172;:225;;;-1:-1:-1;;;;;;;;;;915:40:4;;;1966:36:5;1757:245;1588:422;-1:-1:-1;;1588:422:5:o;6032:79:15:-;1060:6:12;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;;;;;;;;;6088:6:15::1;:15:::0;;-1:-1:-1;;6088:15:15::1;::::0;::::1;;::::0;;;::::1;::::0;;6032:79::o;3220:100:5:-;3274:13;3307:5;3300:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3220:100;:::o;4771:311::-;4892:7;4939:16;4947:7;8479;;-1:-1:-1;8469:17:5;8380:114;4939:16;4917:113;;;;-1:-1:-1;;;4917:113:5;;11760:2:16;4917:113:5;;;11742:21:16;11799:2;11779:18;;;11772:30;11838:34;11818:18;;;11811:62;-1:-1:-1;;;11889:18:16;;;11882:45;11944:19;;4917:113:5;11558:411:16;4917:113:5;-1:-1:-1;5050:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;5050:24:5;;4771:311::o;4295:410::-;4376:13;4392:16;4400:7;4392;:16::i;:::-;4376:32;;4433:5;-1:-1:-1;;;;;4427:11:5;:2;-1:-1:-1;;;;;4427:11:5;;;4419:60;;;;-1:-1:-1;;;4419:60:5;;15702:2:16;4419:60:5;;;15684:21:16;15741:2;15721:18;;;15714:30;15780:34;15760:18;;;15753:62;-1:-1:-1;;;15831:18:16;;;15824:34;15875:19;;4419:60:5;15500:400:16;4419:60:5;666:10:3;-1:-1:-1;;;;;4514:21:5;;;;:62;;-1:-1:-1;4539:37:5;4556:5;666:10:3;5555:214:5;:::i;4539:37::-;4492:171;;;;-1:-1:-1;;;4492:171:5;;19379:2:16;4492:171:5;;;19361:21:16;19418:2;19398:18;;;19391:30;19457:34;19437:18;;;19430:62;19528:29;19508:18;;;19501:57;19575:19;;4492:171:5;19177:423:16;4492:171:5;4676:21;4685:2;4689:7;4676:8;:21::i;:::-;4365:340;4295:410;;:::o;5253:289:15:-;5367:10;5358:20;;;;:8;:20;;;;;;;;5353:142;;5401:41;666:10:3;5434:7:15;5401:18;:41::i;:::-;5393:102;;;;-1:-1:-1;;;5393:102:15;;18961:2:16;5393:102:15;;;18943:21:16;19000:2;18980:18;;;18973:30;19039:34;19019:18;;;19012:62;-1:-1:-1;;;19090:18:16;;;19083:47;19147:19;;5393:102:15;18759:413:16;5393:102:15;5506:28;5516:4;5522:2;5526:7;5506:9;:28::i;5550:94::-;1060:6:12;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;5614:15:15::1;;::::0;;;:8:::1;:15;::::0;;;;:22;;-1:-1:-1;;5614:22:15::1;5632:4;5614:22;::::0;;5550:94::o;14940:397:5:-;15037:15;15065:10;15090:6;15086:185;15102:7;;15098:1;:11;15086:185;;;15133:10;15141:1;8479:7;;-1:-1:-1;8469:17:5;8380:114;15133:10;:33;;;;;15156:10;15164:1;15156:7;:10::i;:::-;-1:-1:-1;;;;;15147:19:5;:5;-1:-1:-1;;;;;15147:19:5;;15133:33;15130:130;;;15198:5;15189;:14;15186:58;;;15212:1;-1:-1:-1;15205:8:5;;-1:-1:-1;15205:8:5;15186:58;15237:7;;;;:::i;:::-;;;;15186:58;15111:3;;;;:::i;:::-;;;;15086:185;;;-1:-1:-1;15283:46:5;;-1:-1:-1;;;15283:46:5;;14181:2:16;15283:46:5;;;14163:21:16;14220:2;14200:18;;;14193:30;14259:34;14239:18;;;14232:62;-1:-1:-1;;;14310:18:16;;;14303:34;14354:19;;15283:46:5;13979:400:16;3215:223:15;1060:6:12;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;3306:9:15::1;3290:13;14397:7:5::0;;;14309:103;3290:13:15::1;:25;3282:34;;;::::0;::::1;;3365:9;3351:11;3335:13;14397:7:5::0;;;14309:103;3335:13:15::1;:27;;;;:::i;:::-;:39;3327:48;;;::::0;::::1;;3386:34;3396:10;3408:11;3386:9;:34::i;:::-;3215:223:::0;:::o;6119:192::-;1060:6:12;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;6194:82:15::1;::::0;6176:12:::1;::::0;6202:10:::1;::::0;6240:21:::1;::::0;6176:12;6194:82;6176:12;6194:82;6240:21;6202:10;6194:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6175:101;;;6295:7;6287:16;;;::::0;::::1;2804:403:::0;1854:10;1868:9;1854:23;1846:32;;;;;;2902:13:::1;::::0;::::1;::::0;::::1;;;2901:14;:25:::0;::::1;;;-1:-1:-1::0;2920:6:15::1;::::0;::::1;;2919:7;2901:25;2893:34;;;::::0;::::1;;2960:13;2946:11;:27;2938:70;;;::::0;-1:-1:-1;;;2938:70:15;;14934:2:16;2938:70:15::1;::::0;::::1;14916:21:16::0;14973:2;14953:18;;;14946:30;15012:33;14992:18;;;14985:61;15063:18;;2938:70:15::1;14732:355:16::0;2938:70:15::1;3057:9;3043:11;3027:13;14397:7:5::0;;;14309:103;3027:13:15::1;:27;;;;:::i;:::-;:39;3019:68;;;::::0;-1:-1:-1;;;3019:68:15;;11008:2:16;3019:68:15::1;::::0;::::1;10990:21:16::0;11047:2;11027:18;;;11020:30;-1:-1:-1;;;11066:18:16;;;11059:46;11122:18;;3019:68:15::1;10806:340:16::0;3019:68:15::1;3126:11;3119:4;;:18;;;;:::i;:::-;3106:9;:31;;3098:63;;;::::0;-1:-1:-1;;;3098:63:15;;14586:2:16;3098:63:15::1;::::0;::::1;14568:21:16::0;14625:2;14605:18;;;14598:30;-1:-1:-1;;;14644:18:16;;;14637:49;14703:18;;3098:63:15::1;14384:343:16::0;3098:63:15::1;3172:27;3182:3;3187:11;3172:9;:27::i;:::-;2804:403:::0;;:::o;6286:185:5:-;6424:39;6441:4;6447:2;6451:7;6424:39;;;;;;;;;;;;:16;:39::i;3553:390:15:-;3640:16;3674:23;3700:17;3710:6;3700:9;:17::i;:::-;3674:43;;3728:25;3770:15;3756:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3756:30:15;;3728:58;;3802:9;3797:113;3817:15;3813:1;:19;3797:113;;;3868:30;3888:6;3896:1;3868:19;:30::i;:::-;3854:8;3863:1;3854:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;3834:3;;;;:::i;:::-;;;;3797:113;;;-1:-1:-1;3927:8:15;3553:390;-1:-1:-1;;;3553:390:15:o;4601:88::-;1060:6:12;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;4666:4:15::1;:15:::0;4601:88::o;1906:890::-;1854:10;1868:9;1854:23;1846:32;;;;;;2045:13:::1;::::0;::::1;::::0;::::1;;;:24:::0;::::1;;;-1:-1:-1::0;2063:6:15::1;::::0;::::1;;2062:7;2045:24;2037:33;;;::::0;::::1;;2119:18;2105:11;2089:13;14397:7:5::0;;;14309:103;2089:13:15::1;:27;;;;:::i;:::-;:48;2081:57;;;::::0;::::1;;2188:10;2171:28;::::0;;;:16:::1;:28;::::0;;;;;2202:13:::1;::::0;2157:42:::1;::::0;:11;:42:::1;:::i;:::-;:58;2149:110;;;::::0;-1:-1:-1;;;2149:110:15;;12176:2:16;2149:110:15::1;::::0;::::1;12158:21:16::0;12215:2;12195:18;;;12188:30;12254:34;12234:18;;;12227:62;-1:-1:-1;;;12305:18:16;;;12298:37;12352:19;;2149:110:15::1;11974:403:16::0;2149:110:15::1;2342:28;::::0;-1:-1:-1;;2359:10:15::1;6294:2:16::0;6290:15;6286:53;2342:28:15::1;::::0;::::1;6274:66:16::0;2317:12:15::1;::::0;6356::16;;2342:28:15::1;;;;;;;;;;;;2332:39;;;;;;2317:54;;2428:50;2447:12;;2428:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;2461:10:15::1;::::0;;-1:-1:-1;2473:4:15;;-1:-1:-1;2428:18:15::1;:50::i;:::-;2420:77;;;::::0;-1:-1:-1;;;2420:77:15;;10665:2:16;2420:77:15::1;::::0;::::1;10647:21:16::0;10704:2;10684:18;;;10677:30;-1:-1:-1;;;10723:18:16;;;10716:44;10777:18;;2420:77:15::1;10463:338:16::0;2420:77:15::1;2561:10;2544:28;::::0;;;:16:::1;:28;::::0;;;;:43;;2576:11;;2544:28;:43:::1;::::0;2576:11;;2544:43:::1;:::i;:::-;::::0;;;-1:-1:-1;;2675:4:15::1;::::0;:18:::1;::::0;2682:11;;2675:18:::1;:::i;:::-;2662:9;:31;;2654:63;;;::::0;-1:-1:-1;;;2654:63:15;;14586:2:16;2654:63:15::1;::::0;::::1;14568:21:16::0;14625:2;14605:18;;;14598:30;-1:-1:-1;;;14644:18:16;;;14637:49;14703:18;;2654:63:15::1;14384:343:16::0;2654:63:15::1;2761:27;2771:3;2776:11;2761:9;:27::i;:::-;2026:770;1906:890:::0;;;;:::o;14489:367:5:-;14564:7;14600:13;14397:7;;;14309:103;14600:13;14592:5;:21;14584:71;;;;-1:-1:-1;;;14584:71:5;;10259:2:16;14584:71:5;;;10241:21:16;10298:2;10278:18;;;10271:30;10337:34;10317:18;;;10310:62;-1:-1:-1;;;10388:18:16;;;10381:35;10433:19;;14584:71:5;10057:401:16;14584:71:5;14666:10;14691:6;14687:162;14703:7;;14699:1;:11;14687:162;;;14734:10;14742:1;8479:7;;-1:-1:-1;8469:17:5;8380:114;14734:10;14731:107;;;14776:5;14767;:14;14764:58;;;14790:1;14489:367;-1:-1:-1;;;14489:367:5:o;14764:58::-;14815:7;;;;:::i;:::-;;;;14764:58;14712:3;;;;:::i;:::-;;;;14687:162;;;;14573:283;14489:367;;;:::o;5759:106:15:-;1060:6:12;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;5836:21:15;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;2601:246:5:-:0;2718:7;2744:13;2759:24;2787:29;2808:7;2787:20;:29::i;:::-;-1:-1:-1;2743:73:5;2601:246;-1:-1:-1;;;;2601:246:5:o;1067:21:15:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2074:465:5:-;2196:4;-1:-1:-1;;;;;2227:19:5;;2219:77;;;;-1:-1:-1;;;2219:77:5;;12584:2:16;2219:77:5;;;12566:21:16;12623:2;12603:18;;;12596:30;12662:34;12642:18;;;12635:62;-1:-1:-1;;;12713:18:16;;;12706:43;12766:19;;2219:77:5;12382:409:16;2219:77:5;2309:10;2335:6;2330:179;2347:7;;2343:1;:11;2330:179;;;2379:10;2387:1;8479:7;;-1:-1:-1;8469:17:5;8380:114;2379:10;2376:122;;;2422:10;2430:1;2422:7;:10::i;:::-;-1:-1:-1;;;;;2413:19:5;:5;-1:-1:-1;;;;;2413:19:5;;2409:74;;;2456:7;;;:::i;:::-;;;2409:74;2356:3;;;:::i;:::-;;;2330:179;;;-1:-1:-1;2526:5:5;2074:465;-1:-1:-1;;2074:465:5:o;1620:92:12:-;1060:6;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;1684:21:::1;1702:1;1684:9;:21::i;:::-;1620:92::o:0;4697:94:15:-;1060:6:12;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;4765:10:15::1;:18:::0;4697:94::o;3389:104:5:-;3445:13;3478:7;3471:14;;;;;:::i;5154:330::-;-1:-1:-1;;;;;5289:24:5;;666:10:3;5289:24:5;;5281:65;;;;-1:-1:-1;;;5281:65:5;;12998:2:16;5281:65:5;;;12980:21:16;13037:2;13017:18;;;13010:30;13076;13056:18;;;13049:58;13124:18;;5281:65:5;12796:352:16;5281:65:5;666:10:3;5359:32:5;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;5359:42:5;;;;;;;;;;;;:53;;-1:-1:-1;;5359:53:5;;;;;;;;;;5428:48;;9599:41:16;;;5359:42:5;;666:10:3;5428:48:5;;9572:18:16;5428:48:5;;;;;;;5154:330;;:::o;5652:99:15:-;1060:6:12;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;5720:15:15::1;5738:5;5720:15:::0;;;:8:::1;:15;::::0;;;;:23;;-1:-1:-1;;5720:23:15::1;::::0;;5652:99::o;6542:368:5:-;6731:41;666:10:3;6764:7:5;6731:18;:41::i;:::-;6709:143;;;;-1:-1:-1;;;6709:143:5;;17305:2:16;6709:143:5;;;17287:21:16;17344:2;17324:18;;;17317:30;17383:34;17363:18;;;17356:62;-1:-1:-1;;;17434:18:16;;;17427:50;17494:19;;6709:143:5;17103:416:16;6709:143:5;6863:39;6877:4;6883:2;6887:7;6896:5;6863:13;:39::i;:::-;6542:368;;;;:::o;1095:37:15:-;;;;;;;:::i;3951:642::-;4069:13;4122:16;4130:7;8479::5;;-1:-1:-1;8469:17:5;8380:114;4122:16:15;4100:113;;;;-1:-1:-1;;;4100:113:15;;16468:2:16;4100:113:15;;;16450:21:16;16507:2;16487:18;;;16480:30;16546:34;16526:18;;;16519:62;-1:-1:-1;;;16597:18:16;;;16590:45;16652:19;;4100:113:15;16266:411:16;4100:113:15;4226:28;4257:10;:8;:10::i;:::-;4226:41;;4329:1;4304:14;4298:28;:32;:287;;;;;;;;;;;;;;;;;4422:14;4463:18;:7;:16;:18::i;:::-;4508:13;4379:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4298:287;4278:307;3951:642;-1:-1:-1;;;3951:642:15:o;5873:151::-;1060:6:12;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;5983:33:15;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;5074:171::-:0;1060:6:12;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;5153:9:15::1;5148:90;5168:14:::0;;::::1;5148:90;;;5221:5;5204:6;:14;5211:3;;5215:1;5211:6;;;;;;;:::i;:::-;;;;;;;5204:14;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;5184:3;;;;;:::i;:::-;;;;5148:90;;3446:99:::0;1060:6:12;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;3514:13:15::1;:23:::0;;;::::1;;;;-1:-1:-1::0;;3514:23:15;;::::1;::::0;;;::::1;::::0;;3446:99::o;4897:169::-;1060:6:12;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;4975:9:15::1;4970:89;4990:14:::0;;::::1;4970:89;;;5043:4;5026:6;:14;5033:3;;5037:1;5033:6;;;;;;;:::i;:::-;;;;;;;5026:14;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;5006:3;;;;;:::i;:::-;;;;4970:89;;1861:223:12::0;1060:6;;-1:-1:-1;;;;;1060:6:12;666:10:3;1200:23:12;1192:68;;;;-1:-1:-1;;;1192:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;1962:22:12;::::1;1941:107;;;::::0;-1:-1:-1;;;1941:107:12;;11353:2:16;1941:107:12::1;::::0;::::1;11335:21:16::0;11392:2;11372:18;;;11365:30;11431:34;11411:18;;;11404:62;-1:-1:-1;;;11482:18:16;;;11475:36;11528:19;;1941:107:12::1;11151:402:16::0;1941:107:12::1;2058:19;2068:8;2058:9;:19::i;12206:167:5:-:0;12281:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;12281:29:5;-1:-1:-1;;;;;12281:29:5;;;;;;;;:24;;12335:16;12281:24;12335:7;:16::i;:::-;-1:-1:-1;;;;;12326:39:5;;;;;;;;;;;12206:167;;:::o;8655:448::-;8784:4;8828:16;8836:7;8479;;-1:-1:-1;8469:17:5;8380:114;8828:16;8806:113;;;;-1:-1:-1;;;8806:113:5;;18545:2:16;8806:113:5;;;18527:21:16;18584:2;18564:18;;;18557:30;18623:34;18603:18;;;18596:62;-1:-1:-1;;;18674:18:16;;;18667:45;18729:19;;8806:113:5;18343:411:16;8806:113:5;8930:13;8946:16;8954:7;8946;:16::i;:::-;8930:32;;8992:5;-1:-1:-1;;;;;8981:16:5;:7;-1:-1:-1;;;;;8981:16:5;;:64;;;;9038:7;-1:-1:-1;;;;;9014:31:5;:20;9026:7;9014:11;:20::i;:::-;-1:-1:-1;;;;;9014:31:5;;8981:64;:113;;;-1:-1:-1;;;;;;5726:25:5;;;5697:4;5726:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;9062:32;8973:122;8655:448;-1:-1:-1;;;;8655:448:5:o;11072:1020::-;11197:13;11212:24;11240:29;11261:7;11240:20;:29::i;:::-;11196:73;;;;11313:4;-1:-1:-1;;;;;11304:13:5;:5;-1:-1:-1;;;;;11304:13:5;;11282:107;;;;-1:-1:-1;;;11282:107:5;;18132:2:16;11282:107:5;;;18114:21:16;18171:2;18151:18;;;18144:30;18210:34;18190:18;;;18183:62;-1:-1:-1;;;18261:18:16;;;18254:42;18313:19;;11282:107:5;17930:408:16;11282:107:5;-1:-1:-1;;;;;11408:16:5;;11400:68;;;;-1:-1:-1;;;11400:68:5;;15294:2:16;11400:68:5;;;15276:21:16;15333:2;15313:18;;;15306:30;15372:34;15352:18;;;15345:62;-1:-1:-1;;;15423:18:16;;;15416:37;15470:19;;11400:68:5;15092:403:16;11400:68:5;11589:29;11606:1;11610:7;11589:8;:29::i;:::-;11634:19;11656:11;:7;11666:1;11656:11;:::i;:::-;1604:1:1;1595:10;;;11684::5;1680:20:1;;;;;;;;;;;1595:10;;-1:-1:-1;;;;1658:4:1;1650:12;;1630:33;1680:27;:32;;;11683:68:5;;;11744:7;;11730:11;:21;11683:68;11680:179;;;11778:20;;;;:7;:20;;;;;:27;;-1:-1:-1;;;;;;11778:27:5;-1:-1:-1;;;;;11778:27:5;;;;;11820;;11778:20;11820:14;:27::i;:::-;11871:16;;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;11871:21:5;-1:-1:-1;;;;;11871:21:5;;;;;11906:27;;;11903:82;;11950:23;:10;11965:7;11950:14;:23::i;:::-;12021:7;12017:2;-1:-1:-1;;;;;12002:27:5;12011:4;-1:-1:-1;;;;;12002:27:5;;;;;;;;;;;11185:907;;;11072:1020;;;:::o;9458:112::-;9535:27;9545:2;9549:8;9535:27;;;;;;;;;;;;:9;:27::i;1154:184:11:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;;1154:184;-1:-1:-1;;;;1154:184:11:o;2855:298:5:-;2925:13;2940:24;2984:16;2992:7;8479;;-1:-1:-1;8469:17:5;8380:114;2984:16;2976:73;;;;-1:-1:-1;;;2976:73:5;;19807:2:16;2976:73:5;;;19789:21:16;19846:2;19826:18;;;19819:30;19885:34;19865:18;;;19858:62;-1:-1:-1;;;19936:18:16;;;19929:42;19988:19;;2976:73:5;19605:408:16;2976:73:5;3079:22;3093:7;3079:13;:22::i;:::-;3120:25;;;;:7;:25;;;;;;-1:-1:-1;;;;;3120:25:5;;3060:41;;-1:-1:-1;2855:298:5;-1:-1:-1;;2855:298:5:o;2090:169:12:-;2164:6;;;-1:-1:-1;;;;;2180:17:12;;;-1:-1:-1;;;;;;2180:17:12;;;;;;;2212:40;;2164:6;;;2180:17;2164:6;;2212:40;;2145:16;;2212:40;2135:124;2090:169;:::o;7772:357:5:-;7929:28;7939:4;7945:2;7949:7;7929:9;:28::i;:::-;7990:50;8013:4;8019:2;8023:7;8032:1;8034:5;7990:22;:50::i;:::-;7968:153;;;;-1:-1:-1;;;7968:153:5;;;;;;;:::i;1695:108:15:-;1755:13;1788:7;1781:14;;;;;:::i;275:703:14:-;331:13;548:10;544:51;;-1:-1:-1;;574:10:14;;;;;;;;;;;;-1:-1:-1;;;574:10:14;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:14;;-1:-1:-1;720:2:14;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:14;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:14;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;849:56:14;;;;;;;;-1:-1:-1;919:11:14;928:2;919:11;;:::i;:::-;;;791:150;;2085:200:1;2181:1;2172:10;;;2155:14;2250:20;;;;;;;;;;;;:28;;-1:-1:-1;;;2235:4:1;2227:12;;;2207:33;;;;2250:28;;;;;2085:200::o;9584:382:5:-;9738:7;;9756:19;9762:2;9766:8;9756:5;:19::i;:::-;9808:69;9839:1;9843:2;9847:12;9861:8;9871:5;9808:22;:69::i;1689:662:11:-;1772:7;1814:4;1772:7;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;:::i;:::-;;;;;;;1885:31;;1950:12;1934;:28;1930:376;;2425:13;2473:15;;;2508:4;2501:15;;;2554:4;2538:21;;2060:57;;1930:376;;;2425:13;2473:15;;;2508:4;2501:15;;;2554:4;2538:21;;2234:57;;1930:376;-1:-1:-1;1866:3:11;;;;:::i;:::-;;;;1828:488;;14074:159:5;14137:24;14193:31;14137:24;14216:7;14193:22;:31::i;13027:1039::-;13214:6;-1:-1:-1;;;;;13237:13:5;;1034:20:0;1080:8;13233:826:5;;-1:-1:-1;13273:4:5;13314:12;13292:689;13338:23;13353:8;13338:12;:23;:::i;:::-;13328:7;:33;13292:689;;;13396:72;;-1:-1:-1;;;13396:72:5;;-1:-1:-1;;;;;13396:36:5;;;;;:72;;666:10:3;;13447:4:5;;13453:7;;13462:5;;13396:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13396:72:5;;;;;;;;-1:-1:-1;;13396:72:5;;;;;;;;;;;;:::i;:::-;;;13392:574;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13652:13:5;;13648:299;;13699:63;;-1:-1:-1;;;13699:63:5;;;;;;;:::i;13648:299::-;13889:6;13883:13;13874:6;13870:2;13866:15;13859:38;13392:574;13520:1;:56;;;;-1:-1:-1;;;;;;;13525:51:5;;-1:-1:-1;;;13525:51:5;13520:56;13516:60;;13469:127;13363:9;;;;:::i;:::-;;;;13292:689;;;;13995:8;;13233:826;-1:-1:-1;14043:4:5;13233:826;13027:1039;;;;;;;:::o;9976:769::-;10101:7;;10137:12;10129:62;;;;-1:-1:-1;;;10129:62:5;;17726:2:16;10129:62:5;;;17708:21:16;17765:2;17745:18;;;17738:30;17804:34;17784:18;;;17777:62;-1:-1:-1;;;17855:18:16;;;17848:35;17900:19;;10129:62:5;17524:401:16;10129:62:5;-1:-1:-1;;;;;10210:16:5;;10202:64;;;;-1:-1:-1;;;10202:64:5;;13777:2:16;10202:64:5;;;13759:21:16;13816:2;13796:18;;;13789:30;13855:34;13835:18;;;13828:62;-1:-1:-1;;;13906:18:16;;;13899:33;13949:19;;10202:64:5;13575:399:16;10202:64:5;10374:8;10363:7;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;10393:25:5;;;;:7;:25;;;;;:30;;-1:-1:-1;;;;;;10393:30:5;-1:-1:-1;;;;;10393:30:5;;;;;10434:32;;10393:25;10434:14;:32::i;:::-;10606:16;10586:151;10633:27;10652:8;10633:16;:27;:::i;:::-;10623:7;:37;10586:151;;;10692:33;;10717:7;;-1:-1:-1;;;;;10692:33:5;;;10709:1;;10692:33;;10709:1;;10692:33;10662:9;;;;:::i;:::-;;;;10586:151;;4455:1148:1;4582:1;4573:10;;;4537:7;4733:20;;;;;;;;;;;4537:7;;4573:10;4660:4;4652:12;;;;4835:18;;;4828:26;4905:6;;4902:695;;4994:22;:2;:20;:22::i;:::-;4979:37;;:11;:37;4973:1;4963:6;:11;;4962:55;4955:62;;;;;;;4902:695;5113:1;5104:6;:10;5096:75;;;;-1:-1:-1;;;5096:75:1;;16884:2:16;5096:75:1;;;16866:21:16;16923:2;16903:18;;;16896:30;16962:34;16942:18;;;16935:62;-1:-1:-1;;;17013:18:16;;;17006:50;17073:19;;5096:75:1;16682:416:16;5096:75:1;-1:-1:-1;;;5221:8:1;;;5349:12;:20;;;;;;;;;;;5221:8;;-1:-1:-1;5407:6:1;;5404:168;;5504:22;:2;:20;:22::i;:::-;5497:3;:29;5480:47;;5491:1;5481:6;:11;;5480:47;5473:54;;;;;;;5404:168;5066:521;;2029:197:2;2091:5;2145:16;;;;;;;;;;;;;;;;;2201:3;551:64;2163:18;2178:2;2163:14;:18::i;:::-;:33;2162:42;;2145:60;;;;;;;;:::i;:::-;;;;;;;;2029:197;-1:-1:-1;;2029:197:2:o;1256:164::-;1315:7;1347:1;1342:2;:6;1334:15;;;;;;-1:-1:-1;1396:1:2;:6;;;1390:13;;1256:164::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:16;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:16;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:16;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:367::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:55;;973:1;970;963:12;922:55;-1:-1:-1;996:20:16;;1039:18;1028:30;;1025:50;;;1071:1;1068;1061:12;1025:50;1108:4;1100:6;1096:17;1084:29;;1168:3;1161:4;1151:6;1148:1;1144:14;1136:6;1132:27;1128:38;1125:47;1122:67;;;1185:1;1182;1175:12;1122:67;828:367;;;;;:::o;1200:160::-;1265:20;;1321:13;;1314:21;1304:32;;1294:60;;1350:1;1347;1340:12;1365:186;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;1516:29;1535:9;1516:29;:::i;1556:260::-;1624:6;1632;1685:2;1673:9;1664:7;1660:23;1656:32;1653:52;;;1701:1;1698;1691:12;1653:52;1724:29;1743:9;1724:29;:::i;:::-;1714:39;;1772:38;1806:2;1795:9;1791:18;1772:38;:::i;:::-;1762:48;;1556:260;;;;;:::o;1821:328::-;1898:6;1906;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2006:29;2025:9;2006:29;:::i;:::-;1996:39;;2054:38;2088:2;2077:9;2073:18;2054:38;:::i;:::-;2044:48;;2139:2;2128:9;2124:18;2111:32;2101:42;;1821:328;;;;;:::o;2154:666::-;2249:6;2257;2265;2273;2326:3;2314:9;2305:7;2301:23;2297:33;2294:53;;;2343:1;2340;2333:12;2294:53;2366:29;2385:9;2366:29;:::i;:::-;2356:39;;2414:38;2448:2;2437:9;2433:18;2414:38;:::i;:::-;2404:48;;2499:2;2488:9;2484:18;2471:32;2461:42;;2554:2;2543:9;2539:18;2526:32;2581:18;2573:6;2570:30;2567:50;;;2613:1;2610;2603:12;2567:50;2636:22;;2689:4;2681:13;;2677:27;-1:-1:-1;2667:55:16;;2718:1;2715;2708:12;2667:55;2741:73;2806:7;2801:2;2788:16;2783:2;2779;2775:11;2741:73;:::i;:::-;2731:83;;;2154:666;;;;;;;:::o;2825:254::-;2890:6;2898;2951:2;2939:9;2930:7;2926:23;2922:32;2919:52;;;2967:1;2964;2957:12;2919:52;2990:29;3009:9;2990:29;:::i;:::-;2980:39;;3038:35;3069:2;3058:9;3054:18;3038:35;:::i;3084:254::-;3152:6;3160;3213:2;3201:9;3192:7;3188:23;3184:32;3181:52;;;3229:1;3226;3219:12;3181:52;3252:29;3271:9;3252:29;:::i;:::-;3242:39;3328:2;3313:18;;;;3300:32;;-1:-1:-1;;;3084:254:16:o;3343:579::-;3447:6;3455;3463;3471;3524:2;3512:9;3503:7;3499:23;3495:32;3492:52;;;3540:1;3537;3530:12;3492:52;3563:29;3582:9;3563:29;:::i;:::-;3553:39;;3639:2;3628:9;3624:18;3611:32;3601:42;;3694:2;3683:9;3679:18;3666:32;3721:18;3713:6;3710:30;3707:50;;;3753:1;3750;3743:12;3707:50;3792:70;3854:7;3845:6;3834:9;3830:22;3792:70;:::i;:::-;3343:579;;;;-1:-1:-1;3881:8:16;-1:-1:-1;;;;3343:579:16:o;3927:437::-;4013:6;4021;4074:2;4062:9;4053:7;4049:23;4045:32;4042:52;;;4090:1;4087;4080:12;4042:52;4130:9;4117:23;4163:18;4155:6;4152:30;4149:50;;;4195:1;4192;4185:12;4149:50;4234:70;4296:7;4287:6;4276:9;4272:22;4234:70;:::i;:::-;4323:8;;4208:96;;-1:-1:-1;3927:437:16;-1:-1:-1;;;;3927:437:16:o;4369:180::-;4425:6;4478:2;4466:9;4457:7;4453:23;4449:32;4446:52;;;4494:1;4491;4484:12;4446:52;4517:26;4533:9;4517:26;:::i;4554:180::-;4613:6;4666:2;4654:9;4645:7;4641:23;4637:32;4634:52;;;4682:1;4679;4672:12;4634:52;-1:-1:-1;4705:23:16;;4554:180;-1:-1:-1;4554:180:16:o;4739:245::-;4797:6;4850:2;4838:9;4829:7;4825:23;4821:32;4818:52;;;4866:1;4863;4856:12;4818:52;4905:9;4892:23;4924:30;4948:5;4924:30;:::i;4989:249::-;5058:6;5111:2;5099:9;5090:7;5086:23;5082:32;5079:52;;;5127:1;5124;5117:12;5079:52;5159:9;5153:16;5178:30;5202:5;5178:30;:::i;5243:450::-;5312:6;5365:2;5353:9;5344:7;5340:23;5336:32;5333:52;;;5381:1;5378;5371:12;5333:52;5421:9;5408:23;5454:18;5446:6;5443:30;5440:50;;;5486:1;5483;5476:12;5440:50;5509:22;;5562:4;5554:13;;5550:27;-1:-1:-1;5540:55:16;;5591:1;5588;5581:12;5540:55;5614:73;5679:7;5674:2;5661:16;5656:2;5652;5648:11;5614:73;:::i;5883:257::-;5924:3;5962:5;5956:12;5989:6;5984:3;5977:19;6005:63;6061:6;6054:4;6049:3;6045:14;6038:4;6031:5;6027:16;6005:63;:::i;:::-;6122:2;6101:15;-1:-1:-1;;6097:29:16;6088:39;;;;6129:4;6084:50;;5883:257;-1:-1:-1;;5883:257:16:o;6379:1527::-;6603:3;6641:6;6635:13;6667:4;6680:51;6724:6;6719:3;6714:2;6706:6;6702:15;6680:51;:::i;:::-;6794:13;;6753:16;;;;6816:55;6794:13;6753:16;6838:15;;;6816:55;:::i;:::-;6960:13;;6893:20;;;6933:1;;7020;7042:18;;;;7095;;;;7122:93;;7200:4;7190:8;7186:19;7174:31;;7122:93;7263:2;7253:8;7250:16;7230:18;7227:40;7224:167;;;-1:-1:-1;;;7290:33:16;;7346:4;7343:1;7336:15;7376:4;7297:3;7364:17;7224:167;7407:18;7434:110;;;;7558:1;7553:328;;;;7400:481;;7434:110;-1:-1:-1;;7469:24:16;;7455:39;;7514:20;;;;-1:-1:-1;7434:110:16;;7553:328;20273:1;20266:14;;;20310:4;20297:18;;7648:1;7662:169;7676:8;7673:1;7670:15;7662:169;;;7758:14;;7743:13;;;7736:37;7801:16;;;;7693:10;;7662:169;;;7666:3;;7862:8;7855:5;7851:20;7844:27;;7400:481;-1:-1:-1;7897:3:16;;6379:1527;-1:-1:-1;;;;;;;;;;;6379:1527:16:o;8329:488::-;-1:-1:-1;;;;;8598:15:16;;;8580:34;;8650:15;;8645:2;8630:18;;8623:43;8697:2;8682:18;;8675:34;;;8745:3;8740:2;8725:18;;8718:31;;;8523:4;;8766:45;;8791:19;;8783:6;8766:45;:::i;:::-;8758:53;8329:488;-1:-1:-1;;;;;;8329:488:16:o;8822:632::-;8993:2;9045:21;;;9115:13;;9018:18;;;9137:22;;;8964:4;;8993:2;9216:15;;;;9190:2;9175:18;;;8964:4;9259:169;9273:6;9270:1;9267:13;9259:169;;;9334:13;;9322:26;;9403:15;;;;9368:12;;;;9295:1;9288:9;9259:169;;;-1:-1:-1;9445:3:16;;8822:632;-1:-1:-1;;;;;;8822:632:16:o;9833:219::-;9982:2;9971:9;9964:21;9945:4;10002:44;10042:2;10031:9;10027:18;10019:6;10002:44;:::i;13153:417::-;13355:2;13337:21;;;13394:2;13374:18;;;13367:30;13433:34;13428:2;13413:18;;13406:62;-1:-1:-1;;;13499:2:16;13484:18;;13477:51;13560:3;13545:19;;13153:417::o;15905:356::-;16107:2;16089:21;;;16126:18;;;16119:30;16185:34;16180:2;16165:18;;16158:62;16252:2;16237:18;;15905:356::o;20326:128::-;20366:3;20397:1;20393:6;20390:1;20387:13;20384:39;;;20403:18;;:::i;:::-;-1:-1:-1;20439:9:16;;20326:128::o;20459:120::-;20499:1;20525;20515:35;;20530:18;;:::i;:::-;-1:-1:-1;20564:9:16;;20459:120::o;20584:168::-;20624:7;20690:1;20686;20682:6;20678:14;20675:1;20672:21;20667:1;20660:9;20653:17;20649:45;20646:71;;;20697:18;;:::i;:::-;-1:-1:-1;20737:9:16;;20584:168::o;20757:125::-;20797:4;20825:1;20822;20819:8;20816:34;;;20830:18;;:::i;:::-;-1:-1:-1;20867:9:16;;20757:125::o;20887:258::-;20959:1;20969:113;20983:6;20980:1;20977:13;20969:113;;;21059:11;;;21053:18;21040:11;;;21033:39;21005:2;20998:10;20969:113;;;21100:6;21097:1;21094:13;21091:48;;;-1:-1:-1;;21135:1:16;21117:16;;21110:27;20887:258::o;21150:380::-;21229:1;21225:12;;;;21272;;;21293:61;;21347:4;21339:6;21335:17;21325:27;;21293:61;21400:2;21392:6;21389:14;21369:18;21366:38;21363:161;;;21446:10;21441:3;21437:20;21434:1;21427:31;21481:4;21478:1;21471:15;21509:4;21506:1;21499:15;21363:161;;21150:380;;;:::o;21535:135::-;21574:3;-1:-1:-1;;21595:17:16;;21592:43;;;21615:18;;:::i;:::-;-1:-1:-1;21662:1:16;21651:13;;21535:135::o;21675:112::-;21707:1;21733;21723:35;;21738:18;;:::i;:::-;-1:-1:-1;21772:9:16;;21675:112::o;21792:127::-;21853:10;21848:3;21844:20;21841:1;21834:31;21884:4;21881:1;21874:15;21908:4;21905:1;21898:15;21924:127;21985:10;21980:3;21976:20;21973:1;21966:31;22016:4;22013:1;22006:15;22040:4;22037:1;22030:15;22056:127;22117:10;22112:3;22108:20;22105:1;22098:31;22148:4;22145:1;22138:15;22172:4;22169:1;22162:15;22188:127;22249:10;22244:3;22240:20;22237:1;22230:31;22280:4;22277:1;22270:15;22304:4;22301:1;22294:15;22320:131;-1:-1:-1;;;;;;22394:32:16;;22384:43;;22374:71;;22441:1;22438;22431:12
Swarm Source
ipfs://8462a13d03228290dcce37b95e7f60fd955bc0f099f7e69ffd264c2001d3b83a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.