ERC-721
Gaming
Overview
Max Total Supply
148 RoY
Holders
82
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 RoYLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ProjectFlute
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "https://github.com/nibbstack/erc721/src/contracts/tokens/nf-token-metadata.sol"; import "https://github.com/nibbstack/erc721/src/contracts/tokens/nf-token-enumerable.sol"; import "https://github.com/nibbstack/erc721/src/contracts/ownership/ownable.sol"; import "Whitelist.sol"; /** * @dev This is an example contract implementation of NFToken with metadata extension. */ contract ProjectFlute is NFTokenEnumerable, NFTokenMetadata, ControlledAccess { address creatorAccount; /** * @dev Contract constructor. Sets metadata extension `name` and `symbol`. */ constructor() { nftName = "Reveries of Ymatar"; nftSymbol = "RoY"; creatorAccount = 0x0786B0220Eab9e7fC5A4d5b6C65BE230858b77b4; } uint256 public constant PRICE = 0.02 ether; /** * @dev Mints a new NFT. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. * @param _uri String representing RFC 3986 URI. */ function mint( address _to, uint256 _tokenId, string calldata _uri, uint8 _v, bytes32 _r, bytes32 _s ) onlyValidAccess(_v,_r,_s, _tokenId) public payable { require(msg.value >= PRICE, "Price not 0.2 eth"); super._mint(_to, _tokenId); super._setTokenUri(_tokenId, _uri); } function withdrawMoney() public { require(creatorAccount == msg.sender); address payable to = payable(msg.sender); to.transfer(address(this).balance); } /** * @dev Removes a NFT from owner. * @param _tokenId Which NFT we want to remove. */ function burn( uint256 _tokenId ) external onlyOwner { super._burn(_tokenId); } /** * @dev Mints a new NFT. * @notice This is an internal function which should be called from user-implemented external * mint function. Its purpose is to show and properly initialize data structures when using this * implementation. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. */ function _mint( address _to, uint256 _tokenId ) internal override(NFToken, NFTokenEnumerable) virtual { NFTokenEnumerable._mint(_to, _tokenId); } /** * @dev Burns a NFT. * @notice This is an internal function which should be called from user-implemented external * burn function. Its purpose is to show and properly initialize data structures when using this * implementation. Also, note that this burn implementation allows the minter to re-mint a burned * NFT. * @param _tokenId ID of the NFT to be burned. */ function _burn( uint256 _tokenId ) internal override(NFTokenMetadata, NFTokenEnumerable) virtual { NFTokenEnumerable._burn(_tokenId); if (bytes(idToUri[_tokenId]).length != 0) { delete idToUri[_tokenId]; } } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Removes a NFT from an address. * @param _from Address from wich we want to remove the NFT. * @param _tokenId Which NFT we want to remove. */ function _removeNFToken( address _from, uint256 _tokenId ) internal override(NFToken, NFTokenEnumerable) { NFTokenEnumerable._removeNFToken(_from, _tokenId); } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Assigns a new NFT to an address. * @param _to Address to wich we want to add the NFT. * @param _tokenId Which NFT we want to add. */ function _addNFToken( address _to, uint256 _tokenId ) internal override(NFToken, NFTokenEnumerable) { NFTokenEnumerable._addNFToken(_to, _tokenId); } /** * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable * extension to remove double storage(gas optimization) of owner nft count. * @param _owner Address for whom to query the count. * @return Number of _owner NFTs. */ function _getOwnerNFTCount( address _owner ) internal override(NFToken, NFTokenEnumerable) view returns (uint256) { return NFTokenEnumerable._getOwnerNFTCount(_owner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "https://github.com/nibbstack/erc721/src/contracts/ownership/ownable.sol"; contract ControlledAccess is Ownable { /* * @dev Requires msg.sender to have valid access message. * @param _v ECDSA signature parameter v. * @param _r ECDSA signature parameters r. * @param _s ECDSA signature parameters s. */ modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s, uint256 tokenId) { require( isValidAccessMessage(msg.sender,_v,_r,_s, tokenId)); _; } /* * @dev Verifies if message was signed by owner to give access to _add for this contract. * Assumes Geth signature prefix. * @param _add Address of agent with access * @param _v ECDSA signature parameter v. * @param _r ECDSA signature parameters r. * @param _s ECDSA signature parameters s. * @return Validity of access message for a given address. */ function isValidAccessMessage( address _add, uint8 _v, bytes32 _r, bytes32 _s, uint256 tokenId) view public returns (bool) { bytes32 hash = keccak256(abi.encodePacked(address(this), tokenId, _add)); return owner == ecrecover( keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev The contract has an owner address, and provides basic authorization control whitch * simplifies the implementation of user permissions. This contract is based on the source code at: * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol */ contract Ownable { /** * @dev Error constants. */ string public constant NOT_CURRENT_OWNER = "018001"; string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002"; /** * @dev Current owner address. */ address public owner; /** * @dev An event which is triggered when the owner is changed. * @param previousOwner The address of the previous owner. * @param newOwner The address of the new owner. */ event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The constructor sets the original `owner` of the contract to the sender account. */ constructor() { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner, NOT_CURRENT_OWNER); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership( address _newOwner ) public onlyOwner { require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./nf-token.sol"; import "./erc721-enumerable.sol"; /** * @dev Optional enumeration implementation for ERC-721 non-fungible token standard. */ contract NFTokenEnumerable is NFToken, ERC721Enumerable { /** * @dev List of revert message codes. Implementing dApp should handle showing the correct message. * Based on 0xcert framework error codes. */ string constant INVALID_INDEX = "005007"; /** * @dev Array of all NFT IDs. */ uint256[] internal tokens; /** * @dev Mapping from token ID to its index in global tokens array. */ mapping(uint256 => uint256) internal idToIndex; /** * @dev Mapping from owner to list of owned NFT IDs. */ mapping(address => uint256[]) internal ownerToIds; /** * @dev Mapping from NFT ID to its index in the owner tokens list. */ mapping(uint256 => uint256) internal idToOwnerIndex; /** * @dev Contract constructor. */ constructor() { supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable } /** * @dev Returns the count of all existing NFTokens. * @return Total supply of NFTs. */ function totalSupply() external override view returns (uint256) { return tokens.length; } /** * @dev Returns NFT ID by its index. * @param _index A counter less than `totalSupply()`. * @return Token id. */ function tokenByIndex( uint256 _index ) external override view returns (uint256) { require(_index < tokens.length, INVALID_INDEX); return tokens[_index]; } /** * @dev returns the n-th NFT ID from a list of owner's tokens. * @param _owner Token owner's address. * @param _index Index number representing n-th token in owner's list of tokens. * @return Token id. */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) external override view returns (uint256) { require(_index < ownerToIds[_owner].length, INVALID_INDEX); return ownerToIds[_owner][_index]; } /** * @notice This is an internal function which should be called from user-implemented external * mint function. Its purpose is to show and properly initialize data structures when using this * implementation. * @dev Mints a new NFT. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. */ function _mint( address _to, uint256 _tokenId ) internal override virtual { super._mint(_to, _tokenId); tokens.push(_tokenId); idToIndex[_tokenId] = tokens.length - 1; } /** * @notice This is an internal function which should be called from user-implemented external * burn function. Its purpose is to show and properly initialize data structures when using this * implementation. Also, note that this burn implementation allows the minter to re-mint a burned * NFT. * @dev Burns a NFT. * @param _tokenId ID of the NFT to be burned. */ function _burn( uint256 _tokenId ) internal override virtual { super._burn(_tokenId); uint256 tokenIndex = idToIndex[_tokenId]; uint256 lastTokenIndex = tokens.length - 1; uint256 lastToken = tokens[lastTokenIndex]; tokens[tokenIndex] = lastToken; tokens.pop(); // This wastes gas if you are burning the last token but saves a little gas if you are not. idToIndex[lastToken] = tokenIndex; idToIndex[_tokenId] = 0; } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Removes a NFT from an address. * @param _from Address from wich we want to remove the NFT. * @param _tokenId Which NFT we want to remove. */ function _removeNFToken( address _from, uint256 _tokenId ) internal override virtual { require(idToOwner[_tokenId] == _from, NOT_OWNER); delete idToOwner[_tokenId]; uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId]; uint256 lastTokenIndex = ownerToIds[_from].length - 1; if (lastTokenIndex != tokenToRemoveIndex) { uint256 lastToken = ownerToIds[_from][lastTokenIndex]; ownerToIds[_from][tokenToRemoveIndex] = lastToken; idToOwnerIndex[lastToken] = tokenToRemoveIndex; } ownerToIds[_from].pop(); } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Assigns a new NFT to an address. * @param _to Address to wich we want to add the NFT. * @param _tokenId Which NFT we want to add. */ function _addNFToken( address _to, uint256 _tokenId ) internal override virtual { require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); idToOwner[_tokenId] = _to; ownerToIds[_to].push(_tokenId); idToOwnerIndex[_tokenId] = ownerToIds[_to].length - 1; } /** * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable * extension to remove double storage(gas optimization) of owner NFT count. * @param _owner Address for whom to query the count. * @return Number of _owner NFTs. */ function _getOwnerNFTCount( address _owner ) internal override virtual view returns (uint256) { return ownerToIds[_owner].length; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./nf-token.sol"; import "./erc721-metadata.sol"; /** * @dev Optional metadata implementation for ERC-721 non-fungible token standard. */ contract NFTokenMetadata is NFToken, ERC721Metadata { /** * @dev A descriptive name for a collection of NFTs. */ string internal nftName; /** * @dev An abbreviated name for NFTokens. */ string internal nftSymbol; /** * @dev Mapping from NFT ID to metadata uri. */ mapping (uint256 => string) internal idToUri; /** * @notice When implementing this contract don't forget to set nftName and nftSymbol. * @dev Contract constructor. */ constructor() { supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata } /** * @dev Returns a descriptive name for a collection of NFTokens. * @return _name Representing name. */ function name() external override view returns (string memory _name) { _name = nftName; } /** * @dev Returns an abbreviated name for NFTokens. * @return _symbol Representing symbol. */ function symbol() external override view returns (string memory _symbol) { _symbol = nftSymbol; } /** * @dev A distinct URI (RFC 3986) for a given NFT. * @param _tokenId Id for which we want uri. * @return URI of _tokenId. */ function tokenURI( uint256 _tokenId ) external override view validNFToken(_tokenId) returns (string memory) { return _tokenURI(_tokenId); } /** * @notice This is an internal function that can be overriden if you want to implement a different * way to generate token URI. * @param _tokenId Id for which we want uri. * @return URI of _tokenId. */ function _tokenURI( uint256 _tokenId ) internal virtual view returns (string memory) { return idToUri[_tokenId]; } /** * @notice This is an internal function which should be called from user-implemented external * burn function. Its purpose is to show and properly initialize data structures when using this * implementation. Also, note that this burn implementation allows the minter to re-mint a burned * NFT. * @dev Burns a NFT. * @param _tokenId ID of the NFT to be burned. */ function _burn( uint256 _tokenId ) internal override virtual { super._burn(_tokenId); delete idToUri[_tokenId]; } /** * @notice This is an internal function which should be called from user-implemented external * function. Its purpose is to show and properly initialize data structures when using this * implementation. * @dev Set a distinct URI (RFC 3986) for a given NFT ID. * @param _tokenId Id for which we want URI. * @param _uri String representing RFC 3986 URI. */ function _setTokenUri( uint256 _tokenId, string memory _uri ) internal validNFToken(_tokenId) { idToUri[_tokenId] = _uri; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Optional metadata extension for ERC-721 non-fungible token standard. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721Metadata { /** * @dev Returns a descriptive name for a collection of NFTs in this contract. * @return _name Representing name. */ function name() external view returns (string memory _name); /** * @dev Returns a abbreviated name for a collection of NFTs in this contract. * @return _symbol Representing symbol. */ function symbol() external view returns (string memory _symbol); /** * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file * that conforms to the "ERC721 Metadata JSON Schema". * @return URI of _tokenId. */ function tokenURI(uint256 _tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./erc721.sol"; import "./erc721-token-receiver.sol"; import "../utils/supports-interface.sol"; import "../utils/address-utils.sol"; /** * @dev Implementation of ERC-721 non-fungible token standard. */ contract NFToken is ERC721, SupportsInterface { using AddressUtils for address; /** * @dev List of revert message codes. Implementing dApp should handle showing the correct message. * Based on 0xcert framework error codes. */ string constant ZERO_ADDRESS = "003001"; string constant NOT_VALID_NFT = "003002"; string constant NOT_OWNER_OR_OPERATOR = "003003"; string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004"; string constant NOT_ABLE_TO_RECEIVE_NFT = "003005"; string constant NFT_ALREADY_EXISTS = "003006"; string constant NOT_OWNER = "003007"; string constant IS_OWNER = "003008"; /** * @dev Magic value of a smart contract that can receive NFT. * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")). */ bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02; /** * @dev A mapping from NFT ID to the address that owns it. */ mapping (uint256 => address) internal idToOwner; /** * @dev Mapping from NFT ID to approved address. */ mapping (uint256 => address) internal idToApproval; /** * @dev Mapping from owner address to count of their tokens. */ mapping (address => uint256) private ownerToNFTokenCount; /** * @dev Mapping from owner address to mapping of operator addresses. */ mapping (address => mapping (address => bool)) internal ownerToOperators; /** * @dev Guarantees that the msg.sender is an owner or operator of the given NFT. * @param _tokenId ID of the NFT to validate. */ modifier canOperate( uint256 _tokenId ) { address tokenOwner = idToOwner[_tokenId]; require( tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender], NOT_OWNER_OR_OPERATOR ); _; } /** * @dev Guarantees that the msg.sender is allowed to transfer NFT. * @param _tokenId ID of the NFT to transfer. */ modifier canTransfer( uint256 _tokenId ) { address tokenOwner = idToOwner[_tokenId]; require( tokenOwner == msg.sender || idToApproval[_tokenId] == msg.sender || ownerToOperators[tokenOwner][msg.sender], NOT_OWNER_APPROVED_OR_OPERATOR ); _; } /** * @dev Guarantees that _tokenId is a valid Token. * @param _tokenId ID of the NFT to validate. */ modifier validNFToken( uint256 _tokenId ) { require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT); _; } /** * @dev Contract constructor. */ constructor() { supportedInterfaces[0x80ac58cd] = true; // ERC721 } /** * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this * function checks if `_to` is a smart contract (code size > 0). If so, it calls * `onERC721Received` on `_to` and throws if the return value is not * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`. * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes calldata _data ) external override { _safeTransferFrom(_from, _to, _tokenId, _data); } /** * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "". * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external override { _safeTransferFrom(_from, _to, _tokenId, ""); } /** * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they may be permanently lost. * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function transferFrom( address _from, address _to, uint256 _tokenId ) external override canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from, NOT_OWNER); require(_to != address(0), ZERO_ADDRESS); _transfer(_to, _tokenId); } /** * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is * the current NFT owner, or an authorized operator of the current owner. * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable. * @param _approved Address to be approved for the given NFT ID. * @param _tokenId ID of the token to be approved. */ function approve( address _approved, uint256 _tokenId ) external override canOperate(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(_approved != tokenOwner, IS_OWNER); idToApproval[_tokenId] = _approved; emit Approval(tokenOwner, _approved, _tokenId); } /** * @notice This works even if sender doesn't own any tokens at the time. * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @param _operator Address to add to the set of authorized operators. * @param _approved True if the operators is approved, false to revoke approval. */ function setApprovalForAll( address _operator, bool _approved ) external override { ownerToOperators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /** * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are * considered invalid, and this function throws for queries about the zero address. * @param _owner Address for whom to query the balance. * @return Balance of _owner. */ function balanceOf( address _owner ) external override view returns (uint256) { require(_owner != address(0), ZERO_ADDRESS); return _getOwnerNFTCount(_owner); } /** * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are * considered invalid, and queries about them do throw. * @param _tokenId The identifier for an NFT. * @return _owner Address of _tokenId owner. */ function ownerOf( uint256 _tokenId ) external override view returns (address _owner) { _owner = idToOwner[_tokenId]; require(_owner != address(0), NOT_VALID_NFT); } /** * @notice Throws if `_tokenId` is not a valid NFT. * @dev Get the approved address for a single NFT. * @param _tokenId ID of the NFT to query the approval of. * @return Address that _tokenId is approved for. */ function getApproved( uint256 _tokenId ) external override view validNFToken(_tokenId) returns (address) { return idToApproval[_tokenId]; } /** * @dev Checks if `_operator` is an approved operator for `_owner`. * @param _owner The address that owns the NFTs. * @param _operator The address that acts on behalf of the owner. * @return True if approved for all, false otherwise. */ function isApprovedForAll( address _owner, address _operator ) external override view returns (bool) { return ownerToOperators[_owner][_operator]; } /** * @notice Does NO checks. * @dev Actually performs the transfer. * @param _to Address of a new owner. * @param _tokenId The NFT that is being transferred. */ function _transfer( address _to, uint256 _tokenId ) internal virtual { address from = idToOwner[_tokenId]; _clearApproval(_tokenId); _removeNFToken(from, _tokenId); _addNFToken(_to, _tokenId); emit Transfer(from, _to, _tokenId); } /** * @notice This is an internal function which should be called from user-implemented external * mint function. Its purpose is to show and properly initialize data structures when using this * implementation. * @dev Mints a new NFT. * @param _to The address that will own the minted NFT. * @param _tokenId of the NFT to be minted by the msg.sender. */ function _mint( address _to, uint256 _tokenId ) internal virtual { require(_to != address(0), ZERO_ADDRESS); require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); _addNFToken(_to, _tokenId); emit Transfer(address(0), _to, _tokenId); } /** * @notice This is an internal function which should be called from user-implemented external burn * function. Its purpose is to show and properly initialize data structures when using this * implementation. Also, note that this burn implementation allows the minter to re-mint a burned * NFT. * @dev Burns a NFT. * @param _tokenId ID of the NFT to be burned. */ function _burn( uint256 _tokenId ) internal virtual validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; _clearApproval(_tokenId); _removeNFToken(tokenOwner, _tokenId); emit Transfer(tokenOwner, address(0), _tokenId); } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Removes a NFT from owner. * @param _from Address from which we want to remove the NFT. * @param _tokenId Which NFT we want to remove. */ function _removeNFToken( address _from, uint256 _tokenId ) internal virtual { require(idToOwner[_tokenId] == _from, NOT_OWNER); ownerToNFTokenCount[_from] -= 1; delete idToOwner[_tokenId]; } /** * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @dev Assigns a new NFT to owner. * @param _to Address to which we want to add the NFT. * @param _tokenId Which NFT we want to add. */ function _addNFToken( address _to, uint256 _tokenId ) internal virtual { require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); idToOwner[_tokenId] = _to; ownerToNFTokenCount[_to] += 1; } /** * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable * extension to remove double storage (gas optimization) of owner NFT count. * @param _owner Address for whom to query the count. * @return Number of _owner NFTs. */ function _getOwnerNFTCount( address _owner ) internal virtual view returns (uint256) { return ownerToNFTokenCount[_owner]; } /** * @dev Actually perform the safeTransferFrom. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function _safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes memory _data ) private canTransfer(_tokenId) validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; require(tokenOwner == _from, NOT_OWNER); require(_to != address(0), ZERO_ADDRESS); _transfer(_to, _tokenId); if (_to.isContract()) { bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data); require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT); } } /** * @dev Clears the current approval of a given NFT ID. * @param _tokenId ID of the NFT to be transferred. */ function _clearApproval( uint256 _tokenId ) private { delete idToApproval[_tokenId]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Optional enumeration extension for ERC-721 non-fungible token standard. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721Enumerable { /** * @dev Returns a count of valid NFTs tracked by this contract, where each one of them has an * assigned and queryable owner not equal to the zero address. * @return Total supply of NFTs. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token identifier for the `_index`th NFT. Sort order is not specified. * @param _index A counter less than `totalSupply()`. * @return Token id. */ function tokenByIndex( uint256 _index ) external view returns (uint256); /** * @dev Returns the token identifier for the `_index`th NFT assigned to `_owner`. Sort order is * not specified. It throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address, * representing invalid NFTs. * @param _owner An address where we are interested in NFTs owned by them. * @param _index A counter less than `balanceOf(_owner)`. * @return Token id. */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @notice Based on: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol * Requires EIP-1052. * @dev Utility library of inline functions on addresses. */ library AddressUtils { /** * @dev Returns whether the target address is a contract. * @param _addr Address to check. * @return addressCheck True if _addr is a contract, false if not. */ function isContract( address _addr ) internal view returns (bool addressCheck) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; assembly { codehash := extcodehash(_addr) } // solhint-disable-line addressCheck = (codehash != 0x0 && codehash != accountHash); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./erc165.sol"; /** * @dev Implementation of standard for detect smart contract interfaces. */ contract SupportsInterface is ERC165 { /** * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true. */ mapping(bytes4 => bool) internal supportedInterfaces; /** * @dev Contract constructor. */ constructor() { supportedInterfaces[0x01ffc9a7] = true; // ERC165 } /** * @dev Function to check which interfaces are suported by this contract. * @param _interfaceID Id of the interface. * @return True if _interfaceID is supported, false otherwise. */ function supportsInterface( bytes4 _interfaceID ) external override view returns (bool) { return supportedInterfaces[_interfaceID]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev ERC-721 interface for accepting safe transfers. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721TokenReceiver { /** * @notice The contract address is always the message sender. A wallet/broker/auction application * MUST implement the wallet interface if it will accept safe transfers. * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return * of other than the magic value MUST result in the transaction being reverted. * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing. * @param _operator The address which called `safeTransferFrom` function. * @param _from The address which previously owned the token. * @param _tokenId The NFT identifier which is being transferred. * @param _data Additional data with no specified format. * @return Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. */ function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes calldata _data ) external returns(bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev ERC-721 non-fungible token standard. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721 { /** * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any * number of NFTs may be created and assigned without emitting Transfer. At the time of any * transfer, the approved address for that NFT (if any) is reset to none. */ event Transfer( address indexed _from, address indexed _to, uint256 indexed _tokenId ); /** * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero * address indicates there is no approved address. When a Transfer event emits, this also * indicates that the approved address for that NFT (if any) is reset to none. */ event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); /** * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage * all NFTs of the owner. */ event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); /** * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this * function checks if `_to` is a smart contract (code size > 0). If so, it calls * `onERC721Received` on `_to` and throws if the return value is not * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`. * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes calldata _data ) external; /** * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "" * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external; /** * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they may be permanently lost. * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function transferFrom( address _from, address _to, uint256 _tokenId ) external; /** * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is * the current NFT owner, or an authorized operator of the current owner. * @param _approved The new approved NFT controller. * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable. * @param _tokenId The NFT to approve. */ function approve( address _approved, uint256 _tokenId ) external; /** * @notice The contract MUST allow multiple operators per owner. * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @param _operator Address to add to the set of authorized operators. * @param _approved True if the operators is approved, false to revoke approval. */ function setApprovalForAll( address _operator, bool _approved ) external; /** * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are * considered invalid, and this function throws for queries about the zero address. * @notice Count all NFTs assigned to an owner. * @param _owner Address for whom to query the balance. * @return Balance of _owner. */ function balanceOf( address _owner ) external view returns (uint256); /** * @notice Find the owner of an NFT. * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are * considered invalid, and queries about them do throw. * @param _tokenId The identifier for an NFT. * @return Address of _tokenId owner. */ function ownerOf( uint256 _tokenId ) external view returns (address); /** * @notice Throws if `_tokenId` is not a valid NFT. * @dev Get the approved address for a single NFT. * @param _tokenId The NFT to find the approved address for. * @return Address that _tokenId is approved for. */ function getApproved( uint256 _tokenId ) external view returns (address); /** * @notice Query if an address is an authorized operator for another address. * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise. * @param _owner The address that owns the NFTs. * @param _operator The address that acts on behalf of the owner. * @return True if approved for all, false otherwise. */ function isApprovedForAll( address _owner, address _operator ) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev A standard for detecting smart contract interfaces. * See: https://eips.ethereum.org/EIPS/eip-165. */ interface ERC165 { /** * @dev Checks if the smart contract includes a specific interface. * This function uses less than 30,000 gas. * @param _interfaceID The interface identifier, as specified in ERC-165. * @return True if _interfaceID is supported, false otherwise. */ function supportsInterface( bytes4 _interfaceID ) external view returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_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":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160008063780e9d6360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601281526020017f5265766572696573206f6620596d61746172000000000000000000000000000081525060099080519060200190620001e49291906200028e565b506040518060400160405280600381526020017f526f590000000000000000000000000000000000000000000000000000000000815250600a9080519060200190620002329291906200028e565b50730786b0220eab9e7fc5a4d5b6c65be230858b77b4600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003a3565b8280546200029c906200033e565b90600052602060002090601f016020900481019282620002c057600085556200030c565b82601f10620002db57805160ff19168380011785556200030c565b828001600101855582156200030c579182015b828111156200030b578251825591602001919060010190620002ee565b5b5090506200031b91906200031f565b5090565b5b808211156200033a57600081600090555060010162000320565b5090565b600060028204905060018216806200035757607f821691505b602082108114156200036e576200036d62000374565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613c5780620003b36000396000f3fe6080604052600436106101665760003560e01c806370a08231116100d1578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd14610541578063e985e9c51461057e578063f2fde38b146105bb578063f3fe3bc3146105e457610166565b8063a22cb465146104d8578063ac44600214610501578063b88d4fde1461051857610166565b806370a08231146103d3578063860d248a14610410578063864ca7171461043b5780638d859f3e146104575780638da5cb5b1461048257806395d89b41146104ad57610166565b80632f745c59116101235780632f745c591461028d57806342842e0e146102ca57806342966c68146102f35780634f6ccce71461031c5780635fc10214146103595780636352211e1461039657610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d919061355d565b61060f565b60405161019f91906137f6565b60405180910390f35b3480156101b457600080fd5b506101bd610676565b6040516101ca9190613856565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f591906135b7565b610708565b604051610207919061378f565b60405180910390f35b34801561021c57600080fd5b50610237600480360381019061023291906133f3565b610823565b005b34801561024557600080fd5b5061024e610c06565b60405161025b9190613898565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906132d8565b610c13565b005b34801561029957600080fd5b506102b460048036038101906102af91906133f3565b611065565b6040516102c19190613898565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec91906132d8565b611188565b005b3480156102ff57600080fd5b5061031a600480360381019061031591906135b7565b6111a8565b005b34801561032857600080fd5b50610343600480360381019061033e91906135b7565b61127d565b6040516103509190613898565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b91906134e2565b611325565b60405161038d91906137f6565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b891906135b7565b611426565b6040516103ca919061378f565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f5919061326b565b61150c565b6040516104079190613898565b60405180910390f35b34801561041c57600080fd5b506104256115c6565b6040516104329190613856565b60405180910390f35b61045560048036038101906104509190613433565b6115ff565b005b34801561046357600080fd5b5061046c6116c8565b6040516104799190613898565b60405180910390f35b34801561048e57600080fd5b506104976116d3565b6040516104a4919061378f565b60405180910390f35b3480156104b957600080fd5b506104c26116f9565b6040516104cf9190613856565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa91906133b3565b61178b565b005b34801561050d57600080fd5b50610516611888565b005b34801561052457600080fd5b5061053f600480360381019061053a919061332b565b611931565b005b34801561054d57600080fd5b50610568600480360381019061056391906135b7565b611988565b6040516105759190613856565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190613298565b611a78565b6040516105b291906137f6565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd919061326b565b611b0c565b005b3480156105f057600080fd5b506105f9611d3e565b6040516106069190613856565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054610685906139e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b1906139e8565b80156106fe5780601f106106d3576101008083540402835291602001916106fe565b820191906000526020600020905b8154815290600101906020018083116106e157829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906107e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dd9190613856565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061091c5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098a9190613856565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a679190613856565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b479190613856565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6000600580549050905090565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610ce457503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610d755750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de39190613856565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec09190613856565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090610fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9f9190613856565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611051576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110489190613856565b60405180910390fd5b5061105c8686611d77565b50505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082106040518060400160405280600681526020017f303035303037000000000000000000000000000000000000000000000000000081525090611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a9190613856565b60405180910390fd5b50600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061117557611174613adf565b5b9060005260206000200154905092915050565b6111a383838360405180602001604052806000815250611e2c565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112679190613856565b60405180910390fd5b5061127a816123fa565b50565b600060058054905082106040518060400160405280600681526020017f3030353030370000000000000000000000000000000000000000000000000000815250906112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f59190613856565b60405180910390fd5b506005828154811061131357611312613adf565b5b90600052602060002001549050919050565b60008030838860405160200161133d9392919061372c565b6040516020818303038152906040528051906020012090506001816040516020016113689190613769565b604051602081830303815290604052805190602001208787876040516000815260200160405260405161139e9493929190613811565b6020604051602081039080840390855afa1580156113c0573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161491505095945050505050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd9190613856565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac9190613856565b60405180910390fd5b506115bf82612425565b9050919050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b828282886116103385858585611325565b61161957600080fd5b66470de4df820000341015611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165a90613878565b60405180910390fd5b61166d8b8b612437565b6116bb8a8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612497565b5050505050505050505050565b66470de4df82000081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a8054611708906139e8565b80601f0160208091040260200160405190810160405280929190818152602001828054611734906139e8565b80156117815780601f1061175657610100808354040283529160200191611781565b820191906000526020600020905b81548152906001019060200180831161176457829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161187c91906137f6565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118e257600080fd5b60003390508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561192d573d6000803e3d6000fd5b5050565b61198185858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611e2c565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611a66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5d9190613856565b60405180910390fd5b50611a70836125a1565b915050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcb9190613856565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090611c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c749190613856565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611db882612646565b611dc2818361267f565b611dcc838361268d565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611efd57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611f8e5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffc9190613856565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906120e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d99190613856565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b89190613856565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303100000000000000000000000000000000000000000000000000008152509061226a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122619190613856565b60405180910390fd5b506122758787611d77565b6122948773ffffffffffffffffffffffffffffffffffffffff1661269b565b156123f05760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016122da94939291906137aa565b602060405180830381600087803b1580156122f457600080fd5b505af1158015612308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232c919061358a565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e49190613856565b60405180910390fd5b50505b5050505050505050565b612403816126e6565b600b600082815260200190815260200160002060006124229190613049565b50565b6000612430826127c2565b9050919050565b612441828261280e565b6005819080600181540180825580915050600190039060005260206000200160009091909190915055600160058054905061247c91906138f6565b60066000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256a9190613856565b60405180910390fd5b5081600b6000858152602001908152602001600020908051906020019061259b929190613089565b50505050565b6060600b600083815260200190815260200160002080546125c1906139e8565b80601f01602080910402602001604051908101604052809291908181526020018280546125ed906139e8565b801561263a5780601f1061260f5761010080835404028352916020019161263a565b820191906000526020600020905b81548152906001019060200180831161261d57829003601f168201915b50505050509050919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b61268982826129fc565b5050565b6126978282612cc3565b5050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156126dd5750808214155b92505050919050565b6126ef81612ec0565b6000600660008381526020019081526020016000205490506000600160058054905061271b91906138f6565b905060006005828154811061273357612732613adf565b5b90600052602060002001549050806005848154811061275557612754613adf565b5b9060005260206000200181905550600580548061277557612774613ab0565b5b600190038181906000526020600020016000905590558260066000838152602001908152602001600020819055506000600660008681526020019081526020016000208190555050505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906128b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ad9190613856565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129889190613856565b60405180910390fd5b5061299c828261268d565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acc9190613856565b60405180910390fd5b506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560006008600083815260200190815260200160002054905060006001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050612b7591906138f6565b9050818114612c58576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612bd157612bd0613adf565b5b9060005260206000200154905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110612c3057612c2f613adf565b5b9060005260206000200181905550826008600083815260200190815260200160002081905550505b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480612ca757612ca6613ab0565b5b6001900381819060005260206000200160009055905550505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d949190613856565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050612ea591906138f6565b60086000838152602001908152602001600020819055505050565b80600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f939190613856565b60405180910390fd5b5060006001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612fde83612646565b612fe8818461267f565b82600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b508054613055906139e8565b6000825580601f106130675750613086565b601f016020900490600052602060002090810190613085919061310f565b5b50565b828054613095906139e8565b90600052602060002090601f0160209004810192826130b757600085556130fe565b82601f106130d057805160ff19168380011785556130fe565b828001600101855582156130fe579182015b828111156130fd5782518255916020019190600101906130e2565b5b50905061310b919061310f565b5090565b5b80821115613128576000816000905550600101613110565b5090565b60008135905061313b81613b97565b92915050565b60008135905061315081613bae565b92915050565b60008135905061316581613bc5565b92915050565b60008135905061317a81613bdc565b92915050565b60008151905061318f81613bdc565b92915050565b60008083601f8401126131ab576131aa613b13565b5b8235905067ffffffffffffffff8111156131c8576131c7613b0e565b5b6020830191508360018202830111156131e4576131e3613b18565b5b9250929050565b60008083601f84011261320157613200613b13565b5b8235905067ffffffffffffffff81111561321e5761321d613b0e565b5b60208301915083600182028301111561323a57613239613b18565b5b9250929050565b60008135905061325081613bf3565b92915050565b60008135905061326581613c0a565b92915050565b60006020828403121561328157613280613b22565b5b600061328f8482850161312c565b91505092915050565b600080604083850312156132af576132ae613b22565b5b60006132bd8582860161312c565b92505060206132ce8582860161312c565b9150509250929050565b6000806000606084860312156132f1576132f0613b22565b5b60006132ff8682870161312c565b93505060206133108682870161312c565b925050604061332186828701613241565b9150509250925092565b60008060008060006080868803121561334757613346613b22565b5b60006133558882890161312c565b95505060206133668882890161312c565b945050604061337788828901613241565b935050606086013567ffffffffffffffff81111561339857613397613b1d565b5b6133a488828901613195565b92509250509295509295909350565b600080604083850312156133ca576133c9613b22565b5b60006133d88582860161312c565b92505060206133e985828601613141565b9150509250929050565b6000806040838503121561340a57613409613b22565b5b60006134188582860161312c565b925050602061342985828601613241565b9150509250929050565b600080600080600080600060c0888a03121561345257613451613b22565b5b60006134608a828b0161312c565b97505060206134718a828b01613241565b965050604088013567ffffffffffffffff81111561349257613491613b1d565b5b61349e8a828b016131eb565b955095505060606134b18a828b01613256565b93505060806134c28a828b01613156565b92505060a06134d38a828b01613156565b91505092959891949750929550565b600080600080600060a086880312156134fe576134fd613b22565b5b600061350c8882890161312c565b955050602061351d88828901613256565b945050604061352e88828901613156565b935050606061353f88828901613156565b925050608061355088828901613241565b9150509295509295909350565b60006020828403121561357357613572613b22565b5b60006135818482850161316b565b91505092915050565b6000602082840312156135a05761359f613b22565b5b60006135ae84828501613180565b91505092915050565b6000602082840312156135cd576135cc613b22565b5b60006135db84828501613241565b91505092915050565b6135ed8161392a565b82525050565b6136046135ff8261392a565b613a1a565b82525050565b6136138161393c565b82525050565b61362281613948565b82525050565b61363961363482613948565b613a2c565b82525050565b600061364a826138b3565b61365481856138c9565b93506136648185602086016139b5565b61366d81613b27565b840191505092915050565b6000613683826138be565b61368d81856138da565b935061369d8185602086016139b5565b6136a681613b27565b840191505092915050565b60006136be601c836138eb565b91506136c982613b45565b601c82019050919050565b60006136e16011836138da565b91506136ec82613b6e565b602082019050919050565b6137008161399e565b82525050565b6137176137128261399e565b613a48565b82525050565b613726816139a8565b82525050565b600061373882866135f3565b6014820191506137488285613706565b60208201915061375882846135f3565b601482019150819050949350505050565b6000613774826136b1565b91506137808284613628565b60208201915081905092915050565b60006020820190506137a460008301846135e4565b92915050565b60006080820190506137bf60008301876135e4565b6137cc60208301866135e4565b6137d960408301856136f7565b81810360608301526137eb818461363f565b905095945050505050565b600060208201905061380b600083018461360a565b92915050565b60006080820190506138266000830187613619565b613833602083018661371d565b6138406040830185613619565b61384d6060830184613619565b95945050505050565b600060208201905081810360008301526138708184613678565b905092915050565b60006020820190508181036000830152613891816136d4565b9050919050565b60006020820190506138ad60008301846136f7565b92915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006139018261399e565b915061390c8361399e565b92508282101561391f5761391e613a52565b5b828203905092915050565b60006139358261397e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156139d35780820151818401526020810190506139b8565b838111156139e2576000848401525b50505050565b60006002820490506001821680613a0057607f821691505b60208210811415613a1457613a13613a81565b5b50919050565b6000613a2582613a36565b9050919050565b6000819050919050565b6000613a4182613b38565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f5072696365206e6f7420302e3220657468000000000000000000000000000000600082015250565b613ba08161392a565b8114613bab57600080fd5b50565b613bb78161393c565b8114613bc257600080fd5b50565b613bce81613948565b8114613bd957600080fd5b50565b613be581613952565b8114613bf057600080fd5b50565b613bfc8161399e565b8114613c0757600080fd5b50565b613c13816139a8565b8114613c1e57600080fd5b5056fea264697066735822122064202f58635f0ed4d2ac90b6971a87b5dc54c836befa365c1f6a91e9086002ca64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101665760003560e01c806370a08231116100d1578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd14610541578063e985e9c51461057e578063f2fde38b146105bb578063f3fe3bc3146105e457610166565b8063a22cb465146104d8578063ac44600214610501578063b88d4fde1461051857610166565b806370a08231146103d3578063860d248a14610410578063864ca7171461043b5780638d859f3e146104575780638da5cb5b1461048257806395d89b41146104ad57610166565b80632f745c59116101235780632f745c591461028d57806342842e0e146102ca57806342966c68146102f35780634f6ccce71461031c5780635fc10214146103595780636352211e1461039657610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d919061355d565b61060f565b60405161019f91906137f6565b60405180910390f35b3480156101b457600080fd5b506101bd610676565b6040516101ca9190613856565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f591906135b7565b610708565b604051610207919061378f565b60405180910390f35b34801561021c57600080fd5b50610237600480360381019061023291906133f3565b610823565b005b34801561024557600080fd5b5061024e610c06565b60405161025b9190613898565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906132d8565b610c13565b005b34801561029957600080fd5b506102b460048036038101906102af91906133f3565b611065565b6040516102c19190613898565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec91906132d8565b611188565b005b3480156102ff57600080fd5b5061031a600480360381019061031591906135b7565b6111a8565b005b34801561032857600080fd5b50610343600480360381019061033e91906135b7565b61127d565b6040516103509190613898565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b91906134e2565b611325565b60405161038d91906137f6565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b891906135b7565b611426565b6040516103ca919061378f565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f5919061326b565b61150c565b6040516104079190613898565b60405180910390f35b34801561041c57600080fd5b506104256115c6565b6040516104329190613856565b60405180910390f35b61045560048036038101906104509190613433565b6115ff565b005b34801561046357600080fd5b5061046c6116c8565b6040516104799190613898565b60405180910390f35b34801561048e57600080fd5b506104976116d3565b6040516104a4919061378f565b60405180910390f35b3480156104b957600080fd5b506104c26116f9565b6040516104cf9190613856565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa91906133b3565b61178b565b005b34801561050d57600080fd5b50610516611888565b005b34801561052457600080fd5b5061053f600480360381019061053a919061332b565b611931565b005b34801561054d57600080fd5b50610568600480360381019061056391906135b7565b611988565b6040516105759190613856565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190613298565b611a78565b6040516105b291906137f6565b60405180910390f35b3480156105c757600080fd5b506105e260048036038101906105dd919061326b565b611b0c565b005b3480156105f057600080fd5b506105f9611d3e565b6040516106069190613856565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054610685906139e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b1906139e8565b80156106fe5780601f106106d3576101008083540402835291602001916106fe565b820191906000526020600020905b8154815290600101906020018083116106e157829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906107e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dd9190613856565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061091c5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098a9190613856565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a679190613856565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b479190613856565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6000600580549050905090565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610ce457503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610d755750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de39190613856565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec09190613856565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090610fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9f9190613856565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611051576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110489190613856565b60405180910390fd5b5061105c8686611d77565b50505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082106040518060400160405280600681526020017f303035303037000000000000000000000000000000000000000000000000000081525090611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a9190613856565b60405180910390fd5b50600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061117557611174613adf565b5b9060005260206000200154905092915050565b6111a383838360405180602001604052806000815250611e2c565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112679190613856565b60405180910390fd5b5061127a816123fa565b50565b600060058054905082106040518060400160405280600681526020017f3030353030370000000000000000000000000000000000000000000000000000815250906112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f59190613856565b60405180910390fd5b506005828154811061131357611312613adf565b5b90600052602060002001549050919050565b60008030838860405160200161133d9392919061372c565b6040516020818303038152906040528051906020012090506001816040516020016113689190613769565b604051602081830303815290604052805190602001208787876040516000815260200160405260405161139e9493929190613811565b6020604051602081039080840390855afa1580156113c0573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161491505095945050505050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd9190613856565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac9190613856565b60405180910390fd5b506115bf82612425565b9050919050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b828282886116103385858585611325565b61161957600080fd5b66470de4df820000341015611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165a90613878565b60405180910390fd5b61166d8b8b612437565b6116bb8a8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612497565b5050505050505050505050565b66470de4df82000081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a8054611708906139e8565b80601f0160208091040260200160405190810160405280929190818152602001828054611734906139e8565b80156117815780601f1061175657610100808354040283529160200191611781565b820191906000526020600020905b81548152906001019060200180831161176457829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161187c91906137f6565b60405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118e257600080fd5b60003390508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561192d573d6000803e3d6000fd5b5050565b61198185858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611e2c565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611a66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5d9190613856565b60405180910390fd5b50611a70836125a1565b915050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcb9190613856565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090611c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c749190613856565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611db882612646565b611dc2818361267f565b611dcc838361268d565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611efd57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611f8e5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffc9190613856565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906120e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d99190613856565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b89190613856565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303100000000000000000000000000000000000000000000000000008152509061226a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122619190613856565b60405180910390fd5b506122758787611d77565b6122948773ffffffffffffffffffffffffffffffffffffffff1661269b565b156123f05760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016122da94939291906137aa565b602060405180830381600087803b1580156122f457600080fd5b505af1158015612308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232c919061358a565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e49190613856565b60405180910390fd5b50505b5050505050505050565b612403816126e6565b600b600082815260200190815260200160002060006124229190613049565b50565b6000612430826127c2565b9050919050565b612441828261280e565b6005819080600181540180825580915050600190039060005260206000200160009091909190915055600160058054905061247c91906138f6565b60066000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256a9190613856565b60405180910390fd5b5081600b6000858152602001908152602001600020908051906020019061259b929190613089565b50505050565b6060600b600083815260200190815260200160002080546125c1906139e8565b80601f01602080910402602001604051908101604052809291908181526020018280546125ed906139e8565b801561263a5780601f1061260f5761010080835404028352916020019161263a565b820191906000526020600020905b81548152906001019060200180831161261d57829003601f168201915b50505050509050919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b61268982826129fc565b5050565b6126978282612cc3565b5050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156126dd5750808214155b92505050919050565b6126ef81612ec0565b6000600660008381526020019081526020016000205490506000600160058054905061271b91906138f6565b905060006005828154811061273357612732613adf565b5b90600052602060002001549050806005848154811061275557612754613adf565b5b9060005260206000200181905550600580548061277557612774613ab0565b5b600190038181906000526020600020016000905590558260066000838152602001908152602001600020819055506000600660008681526020019081526020016000208190555050505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906128b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ad9190613856565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129889190613856565b60405180910390fd5b5061299c828261268d565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acc9190613856565b60405180910390fd5b506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560006008600083815260200190815260200160002054905060006001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050612b7591906138f6565b9050818114612c58576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612bd157612bd0613adf565b5b9060005260206000200154905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110612c3057612c2f613adf565b5b9060005260206000200181905550826008600083815260200190815260200160002081905550505b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480612ca757612ca6613ab0565b5b6001900381819060005260206000200160009055905550505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090612d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d949190613856565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050612ea591906138f6565b60086000838152602001908152602001600020819055505050565b80600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f939190613856565b60405180910390fd5b5060006001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612fde83612646565b612fe8818461267f565b82600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b508054613055906139e8565b6000825580601f106130675750613086565b601f016020900490600052602060002090810190613085919061310f565b5b50565b828054613095906139e8565b90600052602060002090601f0160209004810192826130b757600085556130fe565b82601f106130d057805160ff19168380011785556130fe565b828001600101855582156130fe579182015b828111156130fd5782518255916020019190600101906130e2565b5b50905061310b919061310f565b5090565b5b80821115613128576000816000905550600101613110565b5090565b60008135905061313b81613b97565b92915050565b60008135905061315081613bae565b92915050565b60008135905061316581613bc5565b92915050565b60008135905061317a81613bdc565b92915050565b60008151905061318f81613bdc565b92915050565b60008083601f8401126131ab576131aa613b13565b5b8235905067ffffffffffffffff8111156131c8576131c7613b0e565b5b6020830191508360018202830111156131e4576131e3613b18565b5b9250929050565b60008083601f84011261320157613200613b13565b5b8235905067ffffffffffffffff81111561321e5761321d613b0e565b5b60208301915083600182028301111561323a57613239613b18565b5b9250929050565b60008135905061325081613bf3565b92915050565b60008135905061326581613c0a565b92915050565b60006020828403121561328157613280613b22565b5b600061328f8482850161312c565b91505092915050565b600080604083850312156132af576132ae613b22565b5b60006132bd8582860161312c565b92505060206132ce8582860161312c565b9150509250929050565b6000806000606084860312156132f1576132f0613b22565b5b60006132ff8682870161312c565b93505060206133108682870161312c565b925050604061332186828701613241565b9150509250925092565b60008060008060006080868803121561334757613346613b22565b5b60006133558882890161312c565b95505060206133668882890161312c565b945050604061337788828901613241565b935050606086013567ffffffffffffffff81111561339857613397613b1d565b5b6133a488828901613195565b92509250509295509295909350565b600080604083850312156133ca576133c9613b22565b5b60006133d88582860161312c565b92505060206133e985828601613141565b9150509250929050565b6000806040838503121561340a57613409613b22565b5b60006134188582860161312c565b925050602061342985828601613241565b9150509250929050565b600080600080600080600060c0888a03121561345257613451613b22565b5b60006134608a828b0161312c565b97505060206134718a828b01613241565b965050604088013567ffffffffffffffff81111561349257613491613b1d565b5b61349e8a828b016131eb565b955095505060606134b18a828b01613256565b93505060806134c28a828b01613156565b92505060a06134d38a828b01613156565b91505092959891949750929550565b600080600080600060a086880312156134fe576134fd613b22565b5b600061350c8882890161312c565b955050602061351d88828901613256565b945050604061352e88828901613156565b935050606061353f88828901613156565b925050608061355088828901613241565b9150509295509295909350565b60006020828403121561357357613572613b22565b5b60006135818482850161316b565b91505092915050565b6000602082840312156135a05761359f613b22565b5b60006135ae84828501613180565b91505092915050565b6000602082840312156135cd576135cc613b22565b5b60006135db84828501613241565b91505092915050565b6135ed8161392a565b82525050565b6136046135ff8261392a565b613a1a565b82525050565b6136138161393c565b82525050565b61362281613948565b82525050565b61363961363482613948565b613a2c565b82525050565b600061364a826138b3565b61365481856138c9565b93506136648185602086016139b5565b61366d81613b27565b840191505092915050565b6000613683826138be565b61368d81856138da565b935061369d8185602086016139b5565b6136a681613b27565b840191505092915050565b60006136be601c836138eb565b91506136c982613b45565b601c82019050919050565b60006136e16011836138da565b91506136ec82613b6e565b602082019050919050565b6137008161399e565b82525050565b6137176137128261399e565b613a48565b82525050565b613726816139a8565b82525050565b600061373882866135f3565b6014820191506137488285613706565b60208201915061375882846135f3565b601482019150819050949350505050565b6000613774826136b1565b91506137808284613628565b60208201915081905092915050565b60006020820190506137a460008301846135e4565b92915050565b60006080820190506137bf60008301876135e4565b6137cc60208301866135e4565b6137d960408301856136f7565b81810360608301526137eb818461363f565b905095945050505050565b600060208201905061380b600083018461360a565b92915050565b60006080820190506138266000830187613619565b613833602083018661371d565b6138406040830185613619565b61384d6060830184613619565b95945050505050565b600060208201905081810360008301526138708184613678565b905092915050565b60006020820190508181036000830152613891816136d4565b9050919050565b60006020820190506138ad60008301846136f7565b92915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006139018261399e565b915061390c8361399e565b92508282101561391f5761391e613a52565b5b828203905092915050565b60006139358261397e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156139d35780820151818401526020810190506139b8565b838111156139e2576000848401525b50505050565b60006002820490506001821680613a0057607f821691505b60208210811415613a1457613a13613a81565b5b50919050565b6000613a2582613a36565b9050919050565b6000819050919050565b6000613a4182613b38565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f5072696365206e6f7420302e3220657468000000000000000000000000000000600082015250565b613ba08161392a565b8114613bab57600080fd5b50565b613bb78161393c565b8114613bc257600080fd5b50565b613bce81613948565b8114613bd957600080fd5b50565b613be581613952565b8114613bf057600080fd5b50565b613bfc8161399e565b8114613c0757600080fd5b50565b613c13816139a8565b8114613c1e57600080fd5b5056fea264697066735822122064202f58635f0ed4d2ac90b6971a87b5dc54c836befa365c1f6a91e9086002ca64736f6c63430008070033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.