Overview
TokenID
942633137
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
EmblemVault
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-30 */ // File: browser/github/0xcert/ethereum-erc721/src/contracts/ownership/ownable.sol pragma solidity 0.6.2; /** * @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() public { 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; } } // File: browser/github/0xcert/ethereum-erc721/src/contracts/tokens/erc721-enumerable.sol pragma solidity 0.6.2; /** * @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); } // File: browser/github/0xcert/ethereum-erc721/src/contracts/tokens/erc721-metadata.sol pragma solidity 0.6.2; /** * @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); } // File: browser/github/0xcert/ethereum-erc721/src/contracts/utils/address-utils.sol pragma solidity 0.6.2; /** * @dev Utility library of inline functions on addresses. * @notice Based on: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol * Requires EIP-1052. */ 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); } } // File: browser/github/0xcert/ethereum-erc721/src/contracts/utils/erc165.sol pragma solidity 0.6.2; /** * @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. * @notice 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); } // File: browser/github/0xcert/ethereum-erc721/src/contracts/utils/supports-interface.sol pragma solidity 0.6.2; /** * @dev Implementation of standard for detect smart contract interfaces. */ contract SupportsInterface is ERC165 { /** * @dev Mapping of supported intefraces. * @notice You must not set element 0xffffffff to true. */ mapping(bytes4 => bool) internal supportedInterfaces; /** * @dev Contract constructor. */ constructor() public { 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]; } } // File: browser/github/0xcert/ethereum-erc721/src/contracts/math/safe-math.sol pragma solidity 0.6.2; /** * @dev Math operations with safety checks that throw on error. This contract is based on the * source code at: * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol. */ library SafeMath { /** * List of revert message codes. Implementing dApp should handle showing the correct message. * Based on 0xcert framework error codes. */ string constant OVERFLOW = "008001"; string constant SUBTRAHEND_GREATER_THEN_MINUEND = "008002"; string constant DIVISION_BY_ZERO = "008003"; /** * @dev Multiplies two numbers, reverts on overflow. * @param _factor1 Factor number. * @param _factor2 Factor number. * @return product The product of the two factors. */ function mul( uint256 _factor1, uint256 _factor2 ) internal pure returns (uint256 product) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (_factor1 == 0) { return 0; } product = _factor1 * _factor2; require(product / _factor1 == _factor2, OVERFLOW); } /** * @dev Integer division of two numbers, truncating the quotient, reverts on division by zero. * @param _dividend Dividend number. * @param _divisor Divisor number. * @return quotient The quotient. */ function div( uint256 _dividend, uint256 _divisor ) internal pure returns (uint256 quotient) { // Solidity automatically asserts when dividing by 0, using all gas. require(_divisor > 0, DIVISION_BY_ZERO); quotient = _dividend / _divisor; // assert(_dividend == _divisor * quotient + _dividend % _divisor); // There is no case in which this doesn't hold. } /** * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). * @param _minuend Minuend number. * @param _subtrahend Subtrahend number. * @return difference Difference. */ function sub( uint256 _minuend, uint256 _subtrahend ) internal pure returns (uint256 difference) { require(_subtrahend <= _minuend, SUBTRAHEND_GREATER_THEN_MINUEND); difference = _minuend - _subtrahend; } /** * @dev Adds two numbers, reverts on overflow. * @param _addend1 Number. * @param _addend2 Number. * @return sum Sum. */ function add( uint256 _addend1, uint256 _addend2 ) internal pure returns (uint256 sum) { sum = _addend1 + _addend2; require(sum >= _addend1, OVERFLOW); } /** * @dev Divides two numbers and returns the remainder (unsigned integer modulo), reverts when * dividing by zero. * @param _dividend Number. * @param _divisor Number. * @return remainder Remainder. */ function mod( uint256 _dividend, uint256 _divisor ) internal pure returns (uint256 remainder) { require(_divisor != 0, DIVISION_BY_ZERO); remainder = _dividend % _divisor; } } // File: browser/github/0xcert/ethereum-erc721/src/contracts/tokens/erc721-token-receiver.sol pragma solidity 0.6.2; /** * @dev ERC-721 interface for accepting safe transfers. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721TokenReceiver { /** * @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. * @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. * @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); } // File: browser/github/0xcert/ethereum-erc721/src/contracts/tokens/erc721.sol pragma solidity 0.6.2; /** * @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 ); /** * @dev Transfers the ownership of an NFT from one address to another address. * @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)"))`. * @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; /** * @dev Transfers the ownership of an NFT from one address to another address. * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "" * @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; /** * @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. * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they mayb be permanently lost. * @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; /** * @dev Set or reaffirm the approved address for an NFT. * @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. * @param _tokenId The NFT to approve. */ function approve( address _approved, uint256 _tokenId ) external; /** * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @notice The contract MUST allow multiple operators per owner. * @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. * @param _owner Address for whom to query the balance. * @return Balance of _owner. */ function balanceOf( address _owner ) external view returns (uint256); /** * @dev Returns the address of the owner of the NFT. NFTs assigned to 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); /** * @dev Get the approved address for a single NFT. * @notice Throws if `_tokenId` is not a valid 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); /** * @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); } // File: browser/github/0xcert/ethereum-erc721/src/contracts/tokens/nf-token.sol pragma solidity 0.6.2; /** * @dev Implementation of ERC-721 non-fungible token standard. */ contract NFToken is ERC721, SupportsInterface { using SafeMath for uint256; using AddressUtils for address; /** * 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_APPROWED_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 recieve 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 his tokens. */ mapping (address => uint256) private ownerToNFTokenCount; /** * @dev Mapping from owner address to mapping of operator addresses. */ mapping (address => mapping (address => bool)) internal ownerToOperators; /** * @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. * @param _from Sender of NFT (if address is zero address it indicates token creation). * @param _to Receiver of NFT (if address is zero address it indicates token destruction). * @param _tokenId The NFT that got transfered. */ 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. * @param _owner Owner of NFT. * @param _approved Address that we are approving. * @param _tokenId NFT which we are approving. */ 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. * @param _owner Owner of NFT. * @param _operator Address to which we are setting operator rights. * @param _approved Status of operator rights(true if operator rights are given and false if * revoked). */ event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); /** * @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_APPROWED_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() public { supportedInterfaces[0x80ac58cd] = true; // ERC721 } /** * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @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)"))`. * @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); } /** * @dev Transfers the ownership of an NFT from one address to another address. This function can * be changed to payable. * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "" * @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, ""); } /** * @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. * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they maybe be permanently lost. * @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); } /** * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable. * @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 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); } /** * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @notice This works even if sender doesn't own any tokens at the time. * @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 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); } /** * @dev Get the approved address for a single NFT. * @notice Throws if `_tokenId` is not a valid 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]; } /** * @dev Actually preforms the transfer. * @notice Does NO checks. * @param _to Address of a new owner. * @param _tokenId The NFT that is being transferred. */ function _transfer( address _to, uint256 _tokenId ) internal { address from = idToOwner[_tokenId]; _clearApproval(_tokenId); _removeNFToken(from, _tokenId); _addNFToken(_to, _tokenId); emit Transfer(from, _to, _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 virtual { require(_to != address(0), ZERO_ADDRESS); require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); _addNFToken(_to, _tokenId); emit Transfer(address(0), _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 virtual validNFToken(_tokenId) { address tokenOwner = idToOwner[_tokenId]; _clearApproval(_tokenId); _removeNFToken(tokenOwner, _tokenId); emit Transfer(tokenOwner, address(0), _tokenId); } /** * @dev Removes a NFT from owner. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @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 virtual { require(idToOwner[_tokenId] == _from, NOT_OWNER); ownerToNFTokenCount[_from] = ownerToNFTokenCount[_from] - 1; delete idToOwner[_tokenId]; } /** * @dev Assignes a new NFT to owner. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @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 virtual { require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS); idToOwner[_tokenId] = _to; ownerToNFTokenCount[_to] = ownerToNFTokenCount[_to].add(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 { if (idToApproval[_tokenId] != address(0)) { delete idToApproval[_tokenId]; } } } // File: browser/github/0xcert/ethereum-erc721/src/contracts/tokens/nf-token-enumerable-metadata.sol pragma solidity 0.6.2; /** * @dev Optional metadata implementation for ERC-721 non-fungible token standard. */ abstract contract NFTokenEnumerableMetadata is NFToken, ERC721Metadata, ERC721Enumerable { /** * @dev A descriptive name for a collection of NFTs. */ string internal nftName; /** * @dev An abbreviated name for NFTokens. */ string internal nftSymbol; /** * @dev An uri to represent the metadata for this contract. */ string internal nftContractMetadataUri; /** * @dev Mapping from NFT ID to metadata uri. */ mapping (uint256 => string) internal idToUri; /** * @dev Mapping from NFT ID to encrypted value. */ mapping (uint256 => string) internal idToPayload; /** * @dev Contract constructor. * @notice When implementing this contract don't forget to set nftName and nftSymbol. */ constructor() public { supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable } /** * @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 idToUri[_tokenId]; } /** * @dev A distinct URI (RFC 3986) for a given NFT. * @param _tokenId Id for which we want uri. * @return URI of _tokenId. */ function tokenPayload( uint256 _tokenId ) external view validNFToken(_tokenId) returns (string memory) { return idToPayload[_tokenId]; } /** * @dev Set a distinct URI (RFC 3986) for a given NFT ID. * @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. * @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; } function _setTokenPayload( uint256 _tokenId, string memory _uri ) internal validNFToken(_tokenId) { idToPayload[_tokenId] = _uri; } /** * 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 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]; } /** * @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 virtual { super._mint(_to, _tokenId); tokens.push(_tokenId); idToIndex[_tokenId] = tokens.length - 1; } /** * @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 virtual { super._burn(_tokenId); if (bytes(idToUri[_tokenId]).length != 0) { delete idToUri[_tokenId]; } if (bytes(idToPayload[_tokenId]).length != 0) { delete idToPayload[_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; } /** * @dev Removes a NFT from an address. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @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(); } /** * @dev Assignes a new NFT to an address. * @notice Use and override this function with caution. Wrong usage can have serious consequences. * @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; } } // File: browser/EmblemVault_v2.sol pragma experimental ABIEncoderV2; pragma solidity 0.6.2; /** * @dev This is an example contract implementation of NFToken with metadata extension. */ contract EmblemVault is NFTokenEnumerableMetadata, Ownable { /** * @dev Contract constructor. Sets metadata extension `name` and `symbol`. */ constructor() public { nftName = "Emblem Vault V2"; nftSymbol = "Emblem.pro"; } function changeName(string calldata name, string calldata symbol) external onlyOwner { nftName = name; nftSymbol = symbol; } /** * @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, string calldata _payload) external onlyOwner { super._mint(_to, _tokenId); super._setTokenUri(_tokenId, _uri); super._setTokenPayload(_tokenId, _payload); } function burn(uint256 _tokenId) external canTransfer(_tokenId) { super._burn(_tokenId); } function contractURI() public view returns (string memory) { return nftContractMetadataUri; } event UpdatedContractURI(string _from, string _to); function updateContractURI(string memory uri) public onlyOwner { emit UpdatedContractURI(nftContractMetadataUri, uri); nftContractMetadataUri = uri; } function getOwnerNFTCount(address _owner) public view returns (uint256) { return NFTokenEnumerableMetadata._getOwnerNFTCount(_owner); } function updateTokenUri( uint256 _tokenId, string memory _uri ) public validNFToken(_tokenId) onlyOwner { idToUri[_tokenId] = _uri; } }
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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_from","type":"string"},{"indexed":false,"internalType":"string","name":"_to","type":"string"}],"name":"UpdatedContractURI","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":[{"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":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getOwnerNFTCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_payload","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":"tokenPayload","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"updateContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160008063780e9d6360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600f81526020017f456d626c656d205661756c74205632000000000000000000000000000000000081525060059080519060200190620001e492919062000239565b506040518060400160405280600a81526020017f456d626c656d2e70726f00000000000000000000000000000000000000000000815250600690805190602001906200023292919062000239565b50620002e8565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200027c57805160ff1916838001178555620002ad565b82800160010185558215620002ad579182015b82811115620002ac5782518255916020019190600101906200028f565b5b509050620002bc9190620002c0565b5090565b620002e591905b80821115620002e1576000816000905550600101620002c7565b5090565b90565b6142f080620002f86000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063860d248a116100f9578063bd7f4c8d11610097578063e8a3d48511610071578063e8a3d48514610527578063e985e9c514610545578063f2fde38b14610575578063f3fe3bc314610591576101c4565b8063bd7f4c8d146104ab578063c87b56dd146104db578063d31af4841461050b576101c4565b806395d89b41116100d357806395d89b41146104255780639ad9523214610443578063a22cb46514610473578063b88d4fde1461048f576101c4565b8063860d248a146103cd57806386575e40146103eb5780638da5cb5b14610407576101c4565b80632fb102cf116101665780634f6ccce7116101405780634f6ccce7146103215780636352211e1461035157806370a08231146103815780637e5b1e24146103b1576101c4565b80632fb102cf146102cd57806342842e0e146102e957806342966c6814610305576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806318160ddd1461026357806323b872dd146102815780632f745c591461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036036101de9190810190613c9d565b6105af565b6040516101f09190613fff565b60405180910390f35b610201610616565b60405161020e919061403c565b60405180910390f35b610231600480360361022c9190810190613da5565b6106b8565b60405161023e9190613f98565b60405180910390f35b610261600480360361025c9190810190613bc6565b6107d3565b005b61026b610bb6565b6040516102789190614095565b60405180910390f35b61029b60048036036102969190810190613abb565b610bc3565b005b6102b760048036036102b29190810190613bc6565b611015565b6040516102c49190614095565b60405180910390f35b6102e760048036036102e29190810190613c02565b611131565b005b61030360048036036102fe9190810190613abb565b6112a8565b005b61031f600480360361031a9190810190613da5565b6112c8565b005b61033b60048036036103369190810190613da5565b6114b0565b6040516103489190614095565b60405180910390f35b61036b60048036036103669190810190613da5565b611551565b6040516103789190613f98565b60405180910390f35b61039b60048036036103969190810190613a56565b611637565b6040516103a89190614095565b60405180910390f35b6103cb60048036036103c69190810190613d64565b6116f1565b005b6103d561180e565b6040516103e2919061401a565b60405180910390f35b61040560048036036104009190810190613cef565b611847565b005b61040f61193a565b60405161041c9190613f98565b60405180910390f35b61042d611960565b60405161043a919061403c565b60405180910390f35b61045d60048036036104589190810190613da5565b611a02565b60405161046a919061403c565b60405180910390f35b61048d60048036036104889190810190613b8a565b611b95565b005b6104a960048036036104a49190810190613b0a565b611c92565b005b6104c560048036036104c09190810190613a56565b611ce9565b6040516104d29190614095565b60405180910390f35b6104f560048036036104f09190810190613da5565b611cfb565b604051610502919061403c565b60405180910390f35b61052560048036036105209190810190613dce565b611e8e565b005b61052f612061565b60405161053c919061403c565b60405180910390f35b61055f600480360361055a9190810190613a7f565b612103565b60405161056c9190613fff565b60405180910390f35b61058f600480360361058a9190810190613a56565b612197565b005b6105996123c9565b6040516105a6919061401a565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106ae5780601f10610683576101008083540402835291602001916106ae565b820191906000526020600020905b81548152906001019060200180831161069157829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078d919061401a565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806108cc5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093a919061401a565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a17919061401a565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af7919061401a565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6000600a80549050905090565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610c9457503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610d255750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d93919061401a565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e70919061401a565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f919061401a565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff8919061401a565b60405180910390fd5b5061100c8686612402565b50505050505050565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082106040518060400160405280600681526020017f3030353030370000000000000000000000000000000000000000000000000000815250906110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca919061401a565b60405180910390fd5b50600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061111e57fe5b9060005260206000200154905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f0919061401a565b60405180910390fd5b5061120486866124b7565b6112528585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061250e565b6112a08583838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612618565b505050505050565b6112c383838360405180602001604052806000815250612722565b505050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061139957503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061142a5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030340000000000000000000000000000000000000000000000000000815250906114a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611498919061401a565b60405180910390fd5b506114ab83612cf0565b505050565b6000600a8054905082106040518060400160405280600681526020017f303035303037000000000000000000000000000000000000000000000000000081525090611531576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611528919061401a565b60405180910390fd5b50600a828154811061153f57fe5b90600052602060002001549050919050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611631576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611628919061401a565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d7919061401a565b60405180910390fd5b506116ea82612e4c565b9050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906117b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b0919061401a565b60405180910390fd5b507fc4761b87ec5248fbb0deaff2d6b1651b8dd04322c6597549eefe44d799d480ce6007826040516117ec92919061405e565b60405180910390a1806007908051906020019061180a929190613798565b5050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061190f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611906919061401a565b60405180910390fd5b50838360059190611921929190613818565b50818160069190611933929190613818565b5050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119f85780601f106119cd576101008083540402835291602001916119f8565b820191906000526020600020905b8154815290600101906020018083116119db57829003601f168201915b5050505050905090565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad7919061401a565b60405180910390fd5b50600960008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b885780601f10611b5d57610100808354040283529160200191611b88565b820191906000526020600020905b815481529060010190602001808311611b6b57829003601f168201915b5050505050915050919050565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c869190613fff565b60405180910390a35050565b611ce285858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612722565b5050505050565b6000611cf482612e4c565b9050919050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd0919061401a565b60405180910390fd5b50600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e815780601f10611e5657610100808354040283529160200191611e81565b820191906000526020600020905b815481529060010190602001808311611e6457829003601f168201915b5050505050915050919050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f61919061401a565b60405180910390fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a919061401a565b60405180910390fd5b508160086000858152602001908152602001600020908051906020019061205b929190613798565b50505050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120f95780601f106120ce576101008083540402835291602001916120f9565b820191906000526020600020905b8154815290600101906020018083116120dc57829003601f168201915b5050505050905090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061225f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612256919061401a565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff919061401a565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061244382612e98565b61244d8183612f39565b61245783836131e2565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6124c182826133d6565b600a8190806001815401808255809150506001900390600052602060002001600090919091909150556001600a8054905003600b6000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e1919061401a565b60405180910390fd5b5081600860008581526020019081526020016000209080519060200190612612929190613798565b50505050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb919061401a565b60405180910390fd5b508160096000858152602001908152602001600020908051906020019061271c929190613798565b50505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806127f357503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806128845750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030340000000000000000000000000000000000000000000000000000815250906128fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f2919061401a565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906129d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cf919061401a565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae919061401a565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b57919061401a565b60405180910390fd5b50612b6b8787612402565b612b8a8773ffffffffffffffffffffffffffffffffffffffff166135c4565b15612ce65760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401612bd09493929190613fb3565b602060405180830381600087803b158015612bea57600080fd5b505af1158015612bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c229190810190613cc6565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f303033303035000000000000000000000000000000000000000000000000000081525090612ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cda919061401a565b60405180910390fd5b50505b5050505050505050565b612cf98161360f565b60006008600083815260200190815260200160002080546001816001161561010002031660029004905014612d4857600860008281526020019081526020016000206000612d479190613898565b5b60006009600083815260200190815260200160002080546001816001161561010002031660029004905014612d9757600960008281526020019081526020016000206000612d969190613898565b5b6000600b600083815260200190815260200160002054905060006001600a805490500390506000600a8281548110612dcb57fe5b9060005260206000200154905080600a8481548110612de657fe5b9060005260206000200181905550600a805480612dff57fe5b6001900381819060005260206000200160009055905582600b6000838152602001908152602001600020819055506000600b60008681526020019081526020016000208190555050505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f36576002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090613012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613009919061401a565b60405180910390fd5b506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000600d600083815260200190815260200160002054905060006001600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003905081811461317e576000600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106130fe57fe5b9060005260206000200154905080600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061315657fe5b906000526020600020018190555082600d600083815260200190815260200160002081905550505b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806131c657fe5b6001900381819060005260206000200160009055905550505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906132bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b3919061401a565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003600d6000838152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303100000000000000000000000000000000000000000000000000008152509061347e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613475919061401a565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613559576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613550919061401a565b60405180910390fd5b5061356482826131e2565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156136065750808214155b92505050919050565b80600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906136eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e2919061401a565b60405180910390fd5b5060006001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061372d83612e98565b6137378184612f39565b82600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106137d957805160ff1916838001178555613807565b82800160010185558215613807579182015b828111156138065782518255916020019190600101906137eb565b5b50905061381491906138e0565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061385957803560ff1916838001178555613887565b82800160010185558215613887579182015b8281111561388657823582559160200191906001019061386b565b5b50905061389491906138e0565b5090565b50805460018160011615610100020316600290046000825580601f106138be57506138dd565b601f0160209004906000526020600020908101906138dc91906138e0565b5b50565b61390291905b808211156138fe5760008160009055506001016138e6565b5090565b90565b6000813590506139148161425e565b92915050565b60008135905061392981614275565b92915050565b60008135905061393e8161428c565b92915050565b6000815190506139538161428c565b92915050565b60008083601f84011261396b57600080fd5b8235905067ffffffffffffffff81111561398457600080fd5b60208301915083600182028301111561399c57600080fd5b9250929050565b60008083601f8401126139b557600080fd5b8235905067ffffffffffffffff8111156139ce57600080fd5b6020830191508360018202830111156139e657600080fd5b9250929050565b600082601f8301126139fe57600080fd5b8135613a11613a0c826140dd565b6140b0565b91508082526020830160208301858383011115613a2d57600080fd5b613a3883828461420b565b50505092915050565b600081359050613a50816142a3565b92915050565b600060208284031215613a6857600080fd5b6000613a7684828501613905565b91505092915050565b60008060408385031215613a9257600080fd5b6000613aa085828601613905565b9250506020613ab185828601613905565b9150509250929050565b600080600060608486031215613ad057600080fd5b6000613ade86828701613905565b9350506020613aef86828701613905565b9250506040613b0086828701613a41565b9150509250925092565b600080600080600060808688031215613b2257600080fd5b6000613b3088828901613905565b9550506020613b4188828901613905565b9450506040613b5288828901613a41565b935050606086013567ffffffffffffffff811115613b6f57600080fd5b613b7b88828901613959565b92509250509295509295909350565b60008060408385031215613b9d57600080fd5b6000613bab85828601613905565b9250506020613bbc8582860161391a565b9150509250929050565b60008060408385031215613bd957600080fd5b6000613be785828601613905565b9250506020613bf885828601613a41565b9150509250929050565b60008060008060008060808789031215613c1b57600080fd5b6000613c2989828a01613905565b9650506020613c3a89828a01613a41565b955050604087013567ffffffffffffffff811115613c5757600080fd5b613c6389828a016139a3565b9450945050606087013567ffffffffffffffff811115613c8257600080fd5b613c8e89828a016139a3565b92509250509295509295509295565b600060208284031215613caf57600080fd5b6000613cbd8482850161392f565b91505092915050565b600060208284031215613cd857600080fd5b6000613ce684828501613944565b91505092915050565b60008060008060408587031215613d0557600080fd5b600085013567ffffffffffffffff811115613d1f57600080fd5b613d2b878288016139a3565b9450945050602085013567ffffffffffffffff811115613d4a57600080fd5b613d56878288016139a3565b925092505092959194509250565b600060208284031215613d7657600080fd5b600082013567ffffffffffffffff811115613d9057600080fd5b613d9c848285016139ed565b91505092915050565b600060208284031215613db757600080fd5b6000613dc584828501613a41565b91505092915050565b60008060408385031215613de157600080fd5b6000613def85828601613a41565b925050602083013567ffffffffffffffff811115613e0c57600080fd5b613e18858286016139ed565b9150509250929050565b613e2b816141d5565b82525050565b613e3a81614161565b82525050565b613e4981614173565b82525050565b6000613e5a8261411e565b613e64818561413f565b9350613e7481856020860161421a565b613e7d8161424d565b840191505092915050565b6000613e9382614134565b613e9d8185614150565b9350613ead81856020860161421a565b613eb68161424d565b840191505092915050565b6000613ecc82614129565b613ed68185614150565b9350613ee681856020860161421a565b613eef8161424d565b840191505092915050565b600081546001811660008114613f175760018114613f3d57613f81565b607f6002830416613f288187614150565b955060ff198316865260208601935050613f81565b60028204613f4b8187614150565b9550613f5685614109565b60005b82811015613f7857815481890152600182019150602081019050613f59565b80880195505050505b505092915050565b613f92816141cb565b82525050565b6000602082019050613fad6000830184613e31565b92915050565b6000608082019050613fc86000830187613e22565b613fd56020830186613e31565b613fe26040830185613f89565b8181036060830152613ff48184613e4f565b905095945050505050565b60006020820190506140146000830184613e40565b92915050565b600060208201905081810360008301526140348184613ec1565b905092915050565b600060208201905081810360008301526140568184613e88565b905092915050565b600060408201905081810360008301526140788185613efa565b9050818103602083015261408c8184613e88565b90509392505050565b60006020820190506140aa6000830184613f89565b92915050565b6000604051905081810181811067ffffffffffffffff821117156140d357600080fd5b8060405250919050565b600067ffffffffffffffff8211156140f457600080fd5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061416c826141ab565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006141e0826141e7565b9050919050565b60006141f2826141f9565b9050919050565b6000614204826141ab565b9050919050565b82818337600083830152505050565b60005b8381101561423857808201518184015260208101905061421d565b83811115614247576000848401525b50505050565b6000601f19601f8301169050919050565b61426781614161565b811461427257600080fd5b50565b61427e81614173565b811461428957600080fd5b50565b6142958161417f565b81146142a057600080fd5b50565b6142ac816141cb565b81146142b757600080fd5b5056fea26469706673582212203e598397dad3f217c54ee7af9a444519b31a292ab82839c894b782a0e4623eb164736f6c63430006020033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063860d248a116100f9578063bd7f4c8d11610097578063e8a3d48511610071578063e8a3d48514610527578063e985e9c514610545578063f2fde38b14610575578063f3fe3bc314610591576101c4565b8063bd7f4c8d146104ab578063c87b56dd146104db578063d31af4841461050b576101c4565b806395d89b41116100d357806395d89b41146104255780639ad9523214610443578063a22cb46514610473578063b88d4fde1461048f576101c4565b8063860d248a146103cd57806386575e40146103eb5780638da5cb5b14610407576101c4565b80632fb102cf116101665780634f6ccce7116101405780634f6ccce7146103215780636352211e1461035157806370a08231146103815780637e5b1e24146103b1576101c4565b80632fb102cf146102cd57806342842e0e146102e957806342966c6814610305576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806318160ddd1461026357806323b872dd146102815780632f745c591461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036036101de9190810190613c9d565b6105af565b6040516101f09190613fff565b60405180910390f35b610201610616565b60405161020e919061403c565b60405180910390f35b610231600480360361022c9190810190613da5565b6106b8565b60405161023e9190613f98565b60405180910390f35b610261600480360361025c9190810190613bc6565b6107d3565b005b61026b610bb6565b6040516102789190614095565b60405180910390f35b61029b60048036036102969190810190613abb565b610bc3565b005b6102b760048036036102b29190810190613bc6565b611015565b6040516102c49190614095565b60405180910390f35b6102e760048036036102e29190810190613c02565b611131565b005b61030360048036036102fe9190810190613abb565b6112a8565b005b61031f600480360361031a9190810190613da5565b6112c8565b005b61033b60048036036103369190810190613da5565b6114b0565b6040516103489190614095565b60405180910390f35b61036b60048036036103669190810190613da5565b611551565b6040516103789190613f98565b60405180910390f35b61039b60048036036103969190810190613a56565b611637565b6040516103a89190614095565b60405180910390f35b6103cb60048036036103c69190810190613d64565b6116f1565b005b6103d561180e565b6040516103e2919061401a565b60405180910390f35b61040560048036036104009190810190613cef565b611847565b005b61040f61193a565b60405161041c9190613f98565b60405180910390f35b61042d611960565b60405161043a919061403c565b60405180910390f35b61045d60048036036104589190810190613da5565b611a02565b60405161046a919061403c565b60405180910390f35b61048d60048036036104889190810190613b8a565b611b95565b005b6104a960048036036104a49190810190613b0a565b611c92565b005b6104c560048036036104c09190810190613a56565b611ce9565b6040516104d29190614095565b60405180910390f35b6104f560048036036104f09190810190613da5565b611cfb565b604051610502919061403c565b60405180910390f35b61052560048036036105209190810190613dce565b611e8e565b005b61052f612061565b60405161053c919061403c565b60405180910390f35b61055f600480360361055a9190810190613a7f565b612103565b60405161056c9190613fff565b60405180910390f35b61058f600480360361058a9190810190613a56565b612197565b005b6105996123c9565b6040516105a6919061401a565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106ae5780601f10610683576101008083540402835291602001916106ae565b820191906000526020600020905b81548152906001019060200180831161069157829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078d919061401a565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806108cc5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093a919061401a565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a17919061401a565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610b00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af7919061401a565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6000600a80549050905090565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610c9457503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80610d255750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d93919061401a565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e70919061401a565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f919061401a565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff8919061401a565b60405180910390fd5b5061100c8686612402565b50505050505050565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082106040518060400160405280600681526020017f3030353030370000000000000000000000000000000000000000000000000000815250906110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca919061401a565b60405180910390fd5b50600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061111e57fe5b9060005260206000200154905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f0919061401a565b60405180910390fd5b5061120486866124b7565b6112528585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061250e565b6112a08583838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612618565b505050505050565b6112c383838360405180602001604052806000815250612722565b505050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061139957503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061142a5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030340000000000000000000000000000000000000000000000000000815250906114a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611498919061401a565b60405180910390fd5b506114ab83612cf0565b505050565b6000600a8054905082106040518060400160405280600681526020017f303035303037000000000000000000000000000000000000000000000000000081525090611531576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611528919061401a565b60405180910390fd5b50600a828154811061153f57fe5b90600052602060002001549050919050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611631576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611628919061401a565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d7919061401a565b60405180910390fd5b506116ea82612e4c565b9050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906117b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b0919061401a565b60405180910390fd5b507fc4761b87ec5248fbb0deaff2d6b1651b8dd04322c6597549eefe44d799d480ce6007826040516117ec92919061405e565b60405180910390a1806007908051906020019061180a929190613798565b5050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061190f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611906919061401a565b60405180910390fd5b50838360059190611921929190613818565b50818160069190611933929190613818565b5050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119f85780601f106119cd576101008083540402835291602001916119f8565b820191906000526020600020905b8154815290600101906020018083116119db57829003601f168201915b5050505050905090565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad7919061401a565b60405180910390fd5b50600960008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b885780601f10611b5d57610100808354040283529160200191611b88565b820191906000526020600020905b815481529060010190602001808311611b6b57829003601f168201915b5050505050915050919050565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c869190613fff565b60405180910390a35050565b611ce285858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612722565b5050505050565b6000611cf482612e4c565b9050919050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd0919061401a565b60405180910390fd5b50600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e815780601f10611e5657610100808354040283529160200191611e81565b820191906000526020600020905b815481529060010190602001808311611e6457829003601f168201915b5050505050915050919050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f61919061401a565b60405180910390fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a919061401a565b60405180910390fd5b508160086000858152602001908152602001600020908051906020019061205b929190613798565b50505050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120f95780601f106120ce576101008083540402835291602001916120f9565b820191906000526020600020905b8154815290600101906020018083116120dc57829003601f168201915b5050505050905090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061225f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612256919061401a565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff919061401a565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061244382612e98565b61244d8183612f39565b61245783836131e2565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6124c182826133d6565b600a8190806001815401808255809150506001900390600052602060002001600090919091909150556001600a8054905003600b6000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e1919061401a565b60405180910390fd5b5081600860008581526020019081526020016000209080519060200190612612929190613798565b50505050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb919061401a565b60405180910390fd5b508160096000858152602001908152602001600020908051906020019061271c929190613798565b50505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806127f357503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806128845750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030340000000000000000000000000000000000000000000000000000815250906128fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f2919061401a565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906129d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cf919061401a565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae919061401a565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b57919061401a565b60405180910390fd5b50612b6b8787612402565b612b8a8773ffffffffffffffffffffffffffffffffffffffff166135c4565b15612ce65760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401612bd09493929190613fb3565b602060405180830381600087803b158015612bea57600080fd5b505af1158015612bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c229190810190613cc6565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f303033303035000000000000000000000000000000000000000000000000000081525090612ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cda919061401a565b60405180910390fd5b50505b5050505050505050565b612cf98161360f565b60006008600083815260200190815260200160002080546001816001161561010002031660029004905014612d4857600860008281526020019081526020016000206000612d479190613898565b5b60006009600083815260200190815260200160002080546001816001161561010002031660029004905014612d9757600960008281526020019081526020016000206000612d969190613898565b5b6000600b600083815260200190815260200160002054905060006001600a805490500390506000600a8281548110612dcb57fe5b9060005260206000200154905080600a8481548110612de657fe5b9060005260206000200181905550600a805480612dff57fe5b6001900381819060005260206000200160009055905582600b6000838152602001908152602001600020819055506000600b60008681526020019081526020016000208190555050505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612f36576002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090613012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613009919061401a565b60405180910390fd5b506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000600d600083815260200190815260200160002054905060006001600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003905081811461317e576000600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106130fe57fe5b9060005260206000200154905080600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061315657fe5b906000526020600020018190555082600d600083815260200190815260200160002081905550505b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806131c657fe5b6001900381819060005260206000200160009055905550505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906132bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b3919061401a565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003600d6000838152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303100000000000000000000000000000000000000000000000000008152509061347e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613475919061401a565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613559576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613550919061401a565b60405180910390fd5b5061356482826131e2565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156136065750808214155b92505050919050565b80600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906136eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e2919061401a565b60405180910390fd5b5060006001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061372d83612e98565b6137378184612f39565b82600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106137d957805160ff1916838001178555613807565b82800160010185558215613807579182015b828111156138065782518255916020019190600101906137eb565b5b50905061381491906138e0565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061385957803560ff1916838001178555613887565b82800160010185558215613887579182015b8281111561388657823582559160200191906001019061386b565b5b50905061389491906138e0565b5090565b50805460018160011615610100020316600290046000825580601f106138be57506138dd565b601f0160209004906000526020600020908101906138dc91906138e0565b5b50565b61390291905b808211156138fe5760008160009055506001016138e6565b5090565b90565b6000813590506139148161425e565b92915050565b60008135905061392981614275565b92915050565b60008135905061393e8161428c565b92915050565b6000815190506139538161428c565b92915050565b60008083601f84011261396b57600080fd5b8235905067ffffffffffffffff81111561398457600080fd5b60208301915083600182028301111561399c57600080fd5b9250929050565b60008083601f8401126139b557600080fd5b8235905067ffffffffffffffff8111156139ce57600080fd5b6020830191508360018202830111156139e657600080fd5b9250929050565b600082601f8301126139fe57600080fd5b8135613a11613a0c826140dd565b6140b0565b91508082526020830160208301858383011115613a2d57600080fd5b613a3883828461420b565b50505092915050565b600081359050613a50816142a3565b92915050565b600060208284031215613a6857600080fd5b6000613a7684828501613905565b91505092915050565b60008060408385031215613a9257600080fd5b6000613aa085828601613905565b9250506020613ab185828601613905565b9150509250929050565b600080600060608486031215613ad057600080fd5b6000613ade86828701613905565b9350506020613aef86828701613905565b9250506040613b0086828701613a41565b9150509250925092565b600080600080600060808688031215613b2257600080fd5b6000613b3088828901613905565b9550506020613b4188828901613905565b9450506040613b5288828901613a41565b935050606086013567ffffffffffffffff811115613b6f57600080fd5b613b7b88828901613959565b92509250509295509295909350565b60008060408385031215613b9d57600080fd5b6000613bab85828601613905565b9250506020613bbc8582860161391a565b9150509250929050565b60008060408385031215613bd957600080fd5b6000613be785828601613905565b9250506020613bf885828601613a41565b9150509250929050565b60008060008060008060808789031215613c1b57600080fd5b6000613c2989828a01613905565b9650506020613c3a89828a01613a41565b955050604087013567ffffffffffffffff811115613c5757600080fd5b613c6389828a016139a3565b9450945050606087013567ffffffffffffffff811115613c8257600080fd5b613c8e89828a016139a3565b92509250509295509295509295565b600060208284031215613caf57600080fd5b6000613cbd8482850161392f565b91505092915050565b600060208284031215613cd857600080fd5b6000613ce684828501613944565b91505092915050565b60008060008060408587031215613d0557600080fd5b600085013567ffffffffffffffff811115613d1f57600080fd5b613d2b878288016139a3565b9450945050602085013567ffffffffffffffff811115613d4a57600080fd5b613d56878288016139a3565b925092505092959194509250565b600060208284031215613d7657600080fd5b600082013567ffffffffffffffff811115613d9057600080fd5b613d9c848285016139ed565b91505092915050565b600060208284031215613db757600080fd5b6000613dc584828501613a41565b91505092915050565b60008060408385031215613de157600080fd5b6000613def85828601613a41565b925050602083013567ffffffffffffffff811115613e0c57600080fd5b613e18858286016139ed565b9150509250929050565b613e2b816141d5565b82525050565b613e3a81614161565b82525050565b613e4981614173565b82525050565b6000613e5a8261411e565b613e64818561413f565b9350613e7481856020860161421a565b613e7d8161424d565b840191505092915050565b6000613e9382614134565b613e9d8185614150565b9350613ead81856020860161421a565b613eb68161424d565b840191505092915050565b6000613ecc82614129565b613ed68185614150565b9350613ee681856020860161421a565b613eef8161424d565b840191505092915050565b600081546001811660008114613f175760018114613f3d57613f81565b607f6002830416613f288187614150565b955060ff198316865260208601935050613f81565b60028204613f4b8187614150565b9550613f5685614109565b60005b82811015613f7857815481890152600182019150602081019050613f59565b80880195505050505b505092915050565b613f92816141cb565b82525050565b6000602082019050613fad6000830184613e31565b92915050565b6000608082019050613fc86000830187613e22565b613fd56020830186613e31565b613fe26040830185613f89565b8181036060830152613ff48184613e4f565b905095945050505050565b60006020820190506140146000830184613e40565b92915050565b600060208201905081810360008301526140348184613ec1565b905092915050565b600060208201905081810360008301526140568184613e88565b905092915050565b600060408201905081810360008301526140788185613efa565b9050818103602083015261408c8184613e88565b90509392505050565b60006020820190506140aa6000830184613f89565b92915050565b6000604051905081810181811067ffffffffffffffff821117156140d357600080fd5b8060405250919050565b600067ffffffffffffffff8211156140f457600080fd5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061416c826141ab565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006141e0826141e7565b9050919050565b60006141f2826141f9565b9050919050565b6000614204826141ab565b9050919050565b82818337600083830152505050565b60005b8381101561423857808201518184015260208101905061421d565b83811115614247576000848401525b50505050565b6000601f19601f8301169050919050565b61426781614161565b811461427257600080fd5b50565b61427e81614173565b811461428957600080fd5b50565b6142958161417f565b81146142a057600080fd5b50565b6142ac816141cb565b81146142b757600080fd5b5056fea26469706673582212203e598397dad3f217c54ee7af9a444519b31a292ab82839c894b782a0e4623eb164736f6c63430006020033
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.