Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 50 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 15826791 | 818 days ago | IN | 0 ETH | 0.00172293 | ||||
Set Approval For... | 15748123 | 829 days ago | IN | 0 ETH | 0.00078268 | ||||
Set Approval For... | 15215096 | 910 days ago | IN | 0 ETH | 0.00171811 | ||||
Set Approval For... | 14968403 | 951 days ago | IN | 0 ETH | 0.0025623 | ||||
Transfer From | 14858715 | 969 days ago | IN | 0 ETH | 0.00128011 | ||||
Transfer From | 14858711 | 969 days ago | IN | 0 ETH | 0.00099761 | ||||
Set Approval For... | 14784991 | 981 days ago | IN | 0 ETH | 0.00043564 | ||||
Set Approval For... | 14750043 | 986 days ago | IN | 0 ETH | 0.00266517 | ||||
Transfer From | 14169559 | 1077 days ago | IN | 0 ETH | 0.00591919 | ||||
Set Approval For... | 13641747 | 1159 days ago | IN | 0 ETH | 0.00670193 | ||||
Mint | 13641138 | 1159 days ago | IN | 0 ETH | 0.02599647 | ||||
Set Approval For... | 13630085 | 1161 days ago | IN | 0 ETH | 0.00599705 | ||||
Set Approval For... | 13627383 | 1162 days ago | IN | 0 ETH | 0.00463421 | ||||
Mint | 13627353 | 1162 days ago | IN | 0 ETH | 0.03104035 | ||||
Set Approval For... | 13621814 | 1162 days ago | IN | 0 ETH | 0.00625786 | ||||
Mint | 13621740 | 1162 days ago | IN | 0 ETH | 0.03802924 | ||||
Set Approval For... | 13619780 | 1163 days ago | IN | 0 ETH | 0.00510518 | ||||
Mint | 13619742 | 1163 days ago | IN | 0 ETH | 0.02005992 | ||||
Mint | 13618759 | 1163 days ago | IN | 0 ETH | 0.02850898 | ||||
Set Approval For... | 13609421 | 1164 days ago | IN | 0 ETH | 0.00571818 | ||||
Mint | 13609400 | 1164 days ago | IN | 0 ETH | 0.02313844 | ||||
Set Approval For... | 13588964 | 1168 days ago | IN | 0 ETH | 0.0052653 | ||||
Mint | 13588943 | 1168 days ago | IN | 0 ETH | 0.0432276 | ||||
Set Approval For... | 13585448 | 1168 days ago | IN | 0 ETH | 0.0044276 | ||||
Set Approval For... | 13585444 | 1168 days ago | IN | 0 ETH | 0.00694178 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Verisart
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "../royalties/Royalties.sol"; import "../Signable.sol"; // Version: Verisart-1.0 contract Verisart is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Burnable, Ownable, Royalties, Signable { string private _baseURIextended; // OpenSea metadata freeze event PermanentURI(string _value, uint256 indexed _id); constructor(string memory baseURI) ERC721("Verisart", "VER") { _baseURIextended = baseURI; } function _baseURI() internal view override returns (string memory) { return _baseURIextended; } function mint( address to, uint256 tokenId, string memory _tokenURI, address payable receiver, uint256 basisPoints, uint8 v, bytes32 r, bytes32 s ) public validRoyalties(basisPoints) { require( owner() == recoverAddress(tokenId, _tokenURI, v, r, s), "Valid signature required" ); _mintSingle(to, tokenId, _tokenURI, receiver, basisPoints); } function mintBulk( address to, uint256 tokenId, string[] memory _tokenURIs, address payable receiver, uint256 basisPoints, uint8 v, bytes32 r, bytes32 s ) public validRoyalties(basisPoints) { require( owner() == recoverAddressBulk(tokenId, _tokenURIs, v, r, s), "Valid signature required" ); _mintBulk(to, tokenId, _tokenURIs, receiver, basisPoints); } /** * @dev Verisart mints on behalf of users who have given permission */ function mintVerisart( address _to, uint256 tokenId, string memory _tokenURI, address payable receiver, uint256 basisPoints, uint8 v, bytes32 r, bytes32 s ) public onlyOwner validRoyalties(basisPoints) { address to = recoverPersonalAddress(tokenId, _tokenURI, v, r, s); require(to == _to, "Signature wrong for expected `to`"); _mintSingle(to, tokenId, _tokenURI, receiver, basisPoints); } /** * @dev Verisart bulk mints on behalf of users who have given permission */ function mintBulkVerisart( address _to, uint256 tokenId, string[] memory _tokenURIs, address payable receiver, uint256 basisPoints, uint8 v, bytes32 r, bytes32 s ) public onlyOwner validRoyalties(basisPoints) { address to = recoverPersonalAddressBulk( tokenId, _tokenURIs, v, r, s ); require(to == _to, "Signature wrong for expected `to`"); _mintBulk(to, tokenId, _tokenURIs, receiver, basisPoints); } /** * @dev Royalties are set naively on minting so this check * is performed once before minting to avoid extra unnecessary gas */ modifier validRoyalties(uint256 basisPoints) { require(basisPoints < 10000, "Total royalties exceeds 100%"); _; } function _mintBulk( address to, uint256 baseTokenId, string[] memory _tokenURIs, address payable receiver, uint256 basisPoints ) internal { for (uint256 i = 0; i < _tokenURIs.length; i++) { _mintSingle(to, baseTokenId + i, _tokenURIs[i], receiver, basisPoints); } } function _mintSingle( address to, uint256 tokenId, string memory _tokenURI, address payable receiver, uint256 basisPoints ) internal { _safeMint(to, tokenId); _setTokenURI(tokenId, _tokenURI); if (basisPoints > 0) { _setRoyalties(tokenId, receiver, basisPoints); } emit PermanentURI(tokenURI(tokenId), tokenId); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function _existsRoyalties(uint256 tokenId) internal view virtual override(Royalties) returns (bool) { return super._exists(tokenId); } function _getRoyaltyFallback() internal view override returns (address payable) { return payable(owner()); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId) || _supportsRoyaltyInterfaces(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; abstract contract Royalties { mapping(uint256 => address payable) internal _tokenRoyaltyReceiver; mapping(uint256 => uint256) internal _tokenRoyaltyBPS; function _existsRoyalties(uint256 tokenId) internal view virtual returns (bool); /** * @dev Rarible: RoyaltiesV1 * * bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb * bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f * * => 0xb9c4d9fb ^ 0x0ebd4c7f = 0xb7799584 */ bytes4 private constant _INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584; /** * @dev Foundation * * bytes4(keccak256('getFees(uint256)')) == 0xd5a06d4c * * => 0xd5a06d4c = 0xd5a06d4c */ bytes4 private constant _INTERFACE_ID_ROYALTIES_FOUNDATION = 0xd5a06d4c; /** * @dev EIP-2981 * * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a * * => 0x2a55205a = 0x2a55205a */ bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a; function _setRoyalties( uint256 tokenId, address payable receiver, uint256 basisPoints ) internal { require(basisPoints > 0); _tokenRoyaltyReceiver[tokenId] = receiver; _tokenRoyaltyBPS[tokenId] = basisPoints; } /** * @dev 3rd party Marketplace Royalty Support */ /** * @dev IFoundation */ function getFees(uint256 tokenId) external view virtual returns (address payable[] memory, uint256[] memory) { require(_existsRoyalties(tokenId), "Nonexistent token"); address payable[] memory receivers = new address payable[](1); uint256[] memory bps = new uint256[](1); receivers[0] = _getReceiver(tokenId); bps[0] = _getBps(tokenId); return (receivers, bps); } /** * @dev IRaribleV1 */ function getFeeRecipients(uint256 tokenId) external view virtual returns (address payable[] memory) { require(_existsRoyalties(tokenId), "Nonexistent token"); address payable[] memory receivers = new address payable[](1); receivers[0] = _getReceiver(tokenId); return receivers; } function getFeeBps(uint256 tokenId) external view virtual returns (uint256[] memory) { require(_existsRoyalties(tokenId), "Nonexistent token"); uint256[] memory bps = new uint256[](1); bps[0] = _getBps(tokenId); return bps; } /** * @dev EIP-2981 * Returns primary receiver i.e. receivers[0] */ function royaltyInfo(uint256 tokenId, uint256 value) external view virtual returns (address, uint256) { require(_existsRoyalties(tokenId), "Nonexistent token"); return _getRoyaltyInfo(tokenId, value); } function _getRoyaltyInfo(uint256 tokenId, uint256 value) internal view returns (address receiver, uint256 amount) { address _receiver = _getReceiver(tokenId); return (_receiver, (_tokenRoyaltyBPS[tokenId] * value) / 10000); } function _getBps(uint256 tokenId) internal view returns (uint256) { return _tokenRoyaltyBPS[tokenId]; } function _getReceiver(uint256 tokenId) internal view returns (address payable) { uint256 bps = _getBps(tokenId); address payable receiver = _tokenRoyaltyReceiver[tokenId]; if (bps == 0 || receiver == address(0)) { /** * @dev: If bps is 0 the receiver was never set * Fall back to this contract so badly behaved * marketplaces have somewhere to send money to */ return (_getRoyaltyFallback()); } return receiver; } function _getRoyaltyFallback() internal view virtual returns (address payable); function _supportsRoyaltyInterfaces(bytes4 interfaceId) public pure returns (bool) { return interfaceId == _INTERFACE_ID_ROYALTIES_RARIBLE || interfaceId == _INTERFACE_ID_ROYALTIES_FOUNDATION || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; contract Signable is Ownable { function recoverAddressBulk( uint256 tokenId, string[] memory _tokenURIs, uint8 v, bytes32 r, bytes32 s ) internal view returns (address) { bytes32 h = keccak256( abi.encode(this, tokenId, _tokenURIs) ); address _address = ecrecover(h, v, r, s); return _address; } function recoverAddress( uint256 tokenId, string memory _tokenURI, uint8 v, bytes32 r, bytes32 s ) internal view returns (address) { bytes32 h = keccak256(abi.encode(this, tokenId, _tokenURI)); address _address = ecrecover(h, v, r, s); return _address; } /** * @dev Personal: recovers the address from a personal sign from the user */ function recoverPersonalAddressBulk( uint256 tokenId, string[] memory _tokenURIs, uint8 v, bytes32 r, bytes32 s ) internal view returns (address) { bytes memory prefix = "\x19Ethereum Signed Message:\n32"; bytes32 h = keccak256( abi.encode(this, tokenId, _tokenURIs) ); bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, h)); address _address = ecrecover(prefixedHash, v, r, s); return _address; } function recoverPersonalAddress( uint256 tokenId, string memory _tokenURI, uint8 v, bytes32 r, bytes32 s ) internal view returns (address) { bytes memory prefix = "\x19Ethereum Signed Message:\n32"; bytes32 h = keccak256(abi.encode(this, tokenId, _tokenURI)); bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, h)); address _address = ecrecover(prefixedHash, v, r, s); return _address; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC721.sol"; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC721.sol"; import "../../../utils/Context.sol"; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"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":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"PermanentURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"_supportsRoyaltyInterfaces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFees","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"},{"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":"_tokenURI","type":"string"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint256","name":"basisPoints","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string[]","name":"_tokenURIs","type":"string[]"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint256","name":"basisPoints","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string[]","name":"_tokenURIs","type":"string[]"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint256","name":"basisPoints","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintBulkVerisart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint256","name":"basisPoints","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintVerisart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002fcc38038062002fcc8339810160408190526200003491620001e1565b604080518082018252600881526715995c9a5cd85c9d60c21b6020808301918252835180850190945260038452622b22a960e91b9084015281519192916200007f9160009162000125565b5080516200009590600190602084019062000125565b505050620000b2620000ac620000cf60201b60201c565b620000d3565b8051620000c790600e90602084019062000125565b5050620002fa565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013390620002bd565b90600052602060002090601f016020900481019282620001575760008555620001a2565b82601f106200017257805160ff1916838001178555620001a2565b82800160010185558215620001a2579182015b82811115620001a257825182559160200191906001019062000185565b50620001b0929150620001b4565b5090565b5b80821115620001b05760008155600101620001b5565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215620001f557600080fd5b82516001600160401b03808211156200020d57600080fd5b818501915085601f8301126200022257600080fd5b815181811115620002375762000237620001cb565b604051601f8201601f19908116603f01168101908382118183101715620002625762000262620001cb565b8160405282815288868487010111156200027b57600080fd5b600093505b828410156200029f578484018601518185018701529285019262000280565b82841115620002b15760008684830101525b98975050505050505050565b600181811c90821680620002d257607f821691505b60208210811415620002f457634e487b7160e01b600052602260045260246000fd5b50919050565b612cc2806200030a6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80634f6ccce71161010457806395d89b41116100a2578063c87b56dd11610071578063c87b56dd14610400578063d5a06d4c14610413578063e985e9c514610434578063f2fde38b1461047057600080fd5b806395d89b41146103b2578063a22cb465146103ba578063b88d4fde146103cd578063b9c4d9fb146103e057600080fd5b8063715018a6116100de578063715018a614610373578063729afc1f1461037b5780638c05a2331461038e5780638da5cb5b146103a157600080fd5b80634f6ccce71461033a5780636352211e1461034d57806370a082311461036057600080fd5b806323b872dd11610171578063307b52a61161014b578063307b52a6146102ee578063331584631461030157806342842e0e1461031457806342966c681461032757600080fd5b806323b872dd146102965780632a55205a146102a95780632f745c59146102db57600080fd5b8063095ea7b3116101ad578063095ea7b31461023c5780630ebd4c7f14610251578063152fcb2e1461027157806318160ddd1461028457600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e2366004612314565b610483565b60405190151581526020015b60405180910390f35b6102046104a3565b6040516101f39190612389565b61022461021f36600461239c565b610535565b6040516001600160a01b0390911681526020016101f3565b61024f61024a3660046123ca565b6105c2565b005b61026461025f36600461239c565b6106d8565b6040516101f39190612431565b6101e761027f366004612314565b610755565b6008545b6040519081526020016101f3565b61024f6102a4366004612444565b6107a6565b6102bc6102b7366004612485565b6107d8565b604080516001600160a01b0390931683526020830191909152016101f3565b6102886102e93660046123ca565b610815565b61024f6102fc366004612587565b6108ab565b61024f61030f3660046126b7565b61095e565b61024f610322366004612444565b610a05565b61024f61033536600461239c565b610a20565b61028861034836600461239c565b610a9a565b61022461035b36600461239c565b610b2d565b61028861036e36600461271f565b610ba4565b61024f610c2b565b61024f610389366004612587565b610c61565b61024f61039c3660046126b7565b610cfc565b600b546001600160a01b0316610224565b610204610da4565b61024f6103c836600461273c565b610db3565b61024f6103db36600461277a565b610e78565b6103f36103ee36600461239c565b610eb0565b6040516101f39190612833565b61020461040e36600461239c565b610f33565b61042661042136600461239c565b610f3e565b6040516101f3929190612846565b6101e7610442366004612874565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61024f61047e36600461271f565b611015565b600061048e826110ad565b8061049d575061049d82610755565b92915050565b6060600080546104b2906128a2565b80601f01602080910402602001604051908101604052809291908181526020018280546104de906128a2565b801561052b5780601f106105005761010080835404028352916020019161052b565b820191906000526020600020905b81548152906001019060200180831161050e57829003601f168201915b5050505050905090565b6000610540826110d2565b6105a65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105cd82610b2d565b9050806001600160a01b0316836001600160a01b0316141561063b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161059d565b336001600160a01b038216148061065757506106578133610442565b6106c95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161059d565b6106d383836110ef565b505050565b60606106e38261115d565b6106ff5760405162461bcd60e51b815260040161059d906128dd565b60408051600180825281830190925260009160208083019080368337019050506000848152600d60205260409020549091508160008151811061074457610744612908565b602090810291909101015292915050565b60006001600160e01b03198216632dde656160e21b148061078657506001600160e01b031982166335681b5360e21b145b8061049d57506001600160e01b0319821663152a902d60e11b1492915050565b6107b1335b82611168565b6107cd5760405162461bcd60e51b815260040161059d9061291e565b6106d3838383611252565b6000806107e48461115d565b6108005760405162461bcd60e51b815260040161059d906128dd565b61080a84846113fd565b915091509250929050565b600061082083610ba4565b82106108825760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161059d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b8361271081106108cd5760405162461bcd60e51b815260040161059d9061296f565b6108da8888868686611444565b6001600160a01b03166108f5600b546001600160a01b031690565b6001600160a01b0316146109465760405162461bcd60e51b815260206004820152601860248201527715985b1a59081cda59db985d1d5c99481c995c5d5a5c995960421b604482015260640161059d565b61095389898989896114de565b505050505050505050565b600b546001600160a01b031633146109885760405162461bcd60e51b815260040161059d906129a6565b8361271081106109aa5760405162461bcd60e51b815260040161059d9061296f565b60006109b98989878787611533565b9050896001600160a01b0316816001600160a01b0316146109ec5760405162461bcd60e51b815260040161059d906129db565b6109f9818a8a8a8a611636565b50505050505050505050565b6106d383838360405180602001604052806000815250610e78565b610a29336107ab565b610a8e5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b606482015260840161059d565b610a97816116a2565b50565b6000610aa560085490565b8210610b085760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161059d565b60088281548110610b1b57610b1b612908565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061049d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161059d565b60006001600160a01b038216610c0f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161059d565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610c555760405162461bcd60e51b815260040161059d906129a6565b610c5f60006116ab565b565b600b546001600160a01b03163314610c8b5760405162461bcd60e51b815260040161059d906129a6565b836127108110610cad5760405162461bcd60e51b815260040161059d9061296f565b6000610cbc89898787876116fd565b9050896001600160a01b0316816001600160a01b031614610cef5760405162461bcd60e51b815260040161059d906129db565b6109f9818a8a8a8a6114de565b836127108110610d1e5760405162461bcd60e51b815260040161059d9061296f565b610d2b888886868661174f565b6001600160a01b0316610d46600b546001600160a01b031690565b6001600160a01b031614610d975760405162461bcd60e51b815260206004820152601860248201527715985b1a59081cda59db985d1d5c99481c995c5d5a5c995960421b604482015260640161059d565b6109538989898989611636565b6060600180546104b2906128a2565b6001600160a01b038216331415610e0c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161059d565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610e823383611168565b610e9e5760405162461bcd60e51b815260040161059d9061291e565b610eaa84848484611767565b50505050565b6060610ebb8261115d565b610ed75760405162461bcd60e51b815260040161059d906128dd565b60408051600180825281830190925260009160208083019080368337019050509050610f028361179a565b81600081518110610f1557610f15612908565b6001600160a01b039092166020928302919091019091015292915050565b606061049d826117e5565b606080610f4a8361115d565b610f665760405162461bcd60e51b815260040161059d906128dd565b604080516001808252818301909252600091602080830190803683375050604080516001808252818301909252929350600092915060208083019080368337019050509050610fb48561179a565b82600081518110610fc757610fc7612908565b6001600160a01b039092166020928302919091018201526000868152600d90915260409020548160008151811061100057611000612908565b60209081029190910101529094909350915050565b600b546001600160a01b0316331461103f5760405162461bcd60e51b815260040161059d906129a6565b6001600160a01b0381166110a45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161059d565b610a97816116ab565b60006001600160e01b0319821663780e9d6360e01b148061049d575061049d82611947565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061112482610b2d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061049d826110d2565b6000611173826110d2565b6111d45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161059d565b60006111df83610b2d565b9050806001600160a01b0316846001600160a01b0316148061121a5750836001600160a01b031661120f84610535565b6001600160a01b0316145b8061124a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661126582610b2d565b6001600160a01b0316146112cd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161059d565b6001600160a01b03821661132f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161059d565b61133a838383611997565b6113456000826110ef565b6001600160a01b038316600090815260036020526040812080546001929061136e908490612a32565b90915550506001600160a01b038216600090815260036020526040812080546001929061139c908490612a49565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080600061140b8561179a565b6000868152600d602052604090205490915081906127109061142e908790612a61565b6114389190612a96565b92509250509250929050565b60008030878760405160200161145c93929190612aaa565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156114c7573d6000803e3d6000fd5b5050604051601f1901519998505050505050505050565b60005b835181101561152b57611519866114f88388612a49565b86848151811061150a5761150a612908565b60200260200101518686611636565b8061152381612b23565b9150506114e1565b505050505050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600030888860405160200161158593929190612b3e565b604051602081830303815290604052805190602001209050600082826040516020016115b2929190612b65565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8b169284019290925260608301899052608083018890529092509060019060a0016020604051602081039080840390855afa15801561161d573d6000803e3d6000fd5b5050604051601f1901519b9a5050505050505050505050565b61164085856119a2565b61164a84846119c0565b801561165b5761165b848383611a4b565b837fa109ba539900bf1b633f956d63c96fc89b814c7287f7aa50a9216d0b5565720761168686610f33565b6040516116939190612389565b60405180910390a25050505050565b610a9781611a91565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600030888860405160200161158593929190612aaa565b60008030878760405160200161145c93929190612b3e565b611772848484611252565b61177e84848484611ad1565b610eaa5760405162461bcd60e51b815260040161059d90612b87565b6000818152600d6020908152604080832054600c9092528220546001600160a01b03168115806117d157506001600160a01b038116155b156117de5761124a611bde565b9392505050565b60606117f0826110d2565b6118565760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b606482015260840161059d565b6000828152600a60205260408120805461186f906128a2565b80601f016020809104026020016040519081016040528092919081815260200182805461189b906128a2565b80156118e85780601f106118bd576101008083540402835291602001916118e8565b820191906000526020600020905b8154815290600101906020018083116118cb57829003601f168201915b5050505050905060006118f9611bf7565b905080516000141561190c575092915050565b81511561193e578082604051602001611926929190612bd9565b60405160208183030381529060405292505050919050565b61124a84611c06565b60006001600160e01b031982166380ac58cd60e01b148061197857506001600160e01b03198216635b5e139f60e01b145b8061049d57506301ffc9a760e01b6001600160e01b031983161461049d565b6106d3838383611cd0565b6119bc828260405180602001604052806000815250611d88565b5050565b6119c9826110d2565b611a2c5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b606482015260840161059d565b6000828152600a6020908152604090912082516106d39284019061222f565b60008111611a5857600080fd5b6000928352600c6020908152604080852080546001600160a01b0319166001600160a01b039590951694909417909355600d9052912055565b611a9a81611dbb565b6000818152600a602052604090208054611ab3906128a2565b159050610a97576000818152600a60205260408120610a97916122b3565b60006001600160a01b0384163b15611bd357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b15903390899088908890600401612c08565b602060405180830381600087803b158015611b2f57600080fd5b505af1925050508015611b5f575060408051601f3d908101601f19168201909252611b5c91810190612c45565b60015b611bb9573d808015611b8d576040519150601f19603f3d011682016040523d82523d6000602084013e611b92565b606091505b508051611bb15760405162461bcd60e51b815260040161059d90612b87565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061124a565b506001949350505050565b6000611bf2600b546001600160a01b031690565b905090565b6060600e80546104b2906128a2565b6060611c11826110d2565b611c755760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161059d565b6000611c7f611bf7565b90506000815111611c9f57604051806020016040528060008152506117de565b80611ca984611e62565b604051602001611cba929190612bd9565b6040516020818303038152906040529392505050565b6001600160a01b038316611d2b57611d2681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611d4e565b816001600160a01b0316836001600160a01b031614611d4e57611d4e8382611f60565b6001600160a01b038216611d65576106d381611ffd565b826001600160a01b0316826001600160a01b0316146106d3576106d382826120ac565b611d9283836120f0565b611d9f6000848484611ad1565b6106d35760405162461bcd60e51b815260040161059d90612b87565b6000611dc682610b2d565b9050611dd481600084611997565b611ddf6000836110ef565b6001600160a01b0381166000908152600360205260408120805460019290611e08908490612a32565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b606081611e865750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611eb05780611e9a81612b23565b9150611ea99050600a83612a96565b9150611e8a565b60008167ffffffffffffffff811115611ecb57611ecb6124a7565b6040519080825280601f01601f191660200182016040528015611ef5576020820181803683370190505b5090505b841561124a57611f0a600183612a32565b9150611f17600a86612c62565b611f22906030612a49565b60f81b818381518110611f3757611f37612908565b60200101906001600160f81b031916908160001a905350611f59600a86612a96565b9450611ef9565b60006001611f6d84610ba4565b611f779190612a32565b600083815260076020526040902054909150808214611fca576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061200f90600190612a32565b6000838152600960205260408120546008805493945090928490811061203757612037612908565b90600052602060002001549050806008838154811061205857612058612908565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061209057612090612c76565b6001900381819060005260206000200160009055905550505050565b60006120b783610ba4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166121465760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161059d565b61214f816110d2565b1561219c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161059d565b6121a860008383611997565b6001600160a01b03821660009081526003602052604081208054600192906121d1908490612a49565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461223b906128a2565b90600052602060002090601f01602090048101928261225d57600085556122a3565b82601f1061227657805160ff19168380011785556122a3565b828001600101855582156122a3579182015b828111156122a3578251825591602001919060010190612288565b506122af9291506122e9565b5090565b5080546122bf906128a2565b6000825580601f106122cf575050565b601f016020900490600052602060002090810190610a9791905b5b808211156122af57600081556001016122ea565b6001600160e01b031981168114610a9757600080fd5b60006020828403121561232657600080fd5b81356117de816122fe565b60005b8381101561234c578181015183820152602001612334565b83811115610eaa5750506000910152565b60008151808452612375816020860160208601612331565b601f01601f19169290920160200192915050565b6020815260006117de602083018461235d565b6000602082840312156123ae57600080fd5b5035919050565b6001600160a01b0381168114610a9757600080fd5b600080604083850312156123dd57600080fd5b82356123e8816123b5565b946020939093013593505050565b600081518084526020808501945080840160005b838110156124265781518752958201959082019060010161240a565b509495945050505050565b6020815260006117de60208301846123f6565b60008060006060848603121561245957600080fd5b8335612464816123b5565b92506020840135612474816123b5565b929592945050506040919091013590565b6000806040838503121561249857600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156124e6576124e66124a7565b604052919050565b600067ffffffffffffffff831115612508576125086124a7565b61251b601f8401601f19166020016124bd565b905082815283838301111561252f57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261255757600080fd5b6117de838335602085016124ee565b8035612571816123b5565b919050565b803560ff8116811461257157600080fd5b600080600080600080600080610100898b0312156125a457600080fd5b6125ae89356123b5565b883597506020890135965067ffffffffffffffff60408a013511156125d257600080fd5b604089013589018a601f8201126125e857600080fd5b67ffffffffffffffff81351115612601576126016124a7565b6126116020823560051b016124bd565b81358082526020808301929160051b8401018d81111561263057600080fd5b602084015b818110156126715767ffffffffffffffff8135111561265357600080fd5b6126638f60208335880101612546565b845260209384019301612635565b505080985050505061268560608a01612566565b94506080890135935061269a60a08a01612576565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600080610100898b0312156126d457600080fd5b88356126df816123b5565b975060208901359650604089013567ffffffffffffffff81111561270257600080fd5b61270e8b828c01612546565b9650506060890135612685816123b5565b60006020828403121561273157600080fd5b81356117de816123b5565b6000806040838503121561274f57600080fd5b823561275a816123b5565b91506020830135801515811461276f57600080fd5b809150509250929050565b6000806000806080858703121561279057600080fd5b843561279b816123b5565b935060208501356127ab816123b5565b925060408501359150606085013567ffffffffffffffff8111156127ce57600080fd5b8501601f810187136127df57600080fd5b6127ee878235602084016124ee565b91505092959194509250565b600081518084526020808501945080840160005b838110156124265781516001600160a01b03168752958201959082019060010161280e565b6020815260006117de60208301846127fa565b60408152600061285960408301856127fa565b828103602084015261286b81856123f6565b95945050505050565b6000806040838503121561288757600080fd5b8235612892816123b5565b9150602083013561276f816123b5565b600181811c908216806128b657607f821691505b602082108114156128d757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601190820152702737b732bc34b9ba32b73a103a37b5b2b760791b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601c908201527f546f74616c20726f79616c746965732065786365656473203130302500000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f5369676e61747572652077726f6e6720666f722065787065637465642060746f6040820152600360fd1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015612a4457612a44612a1c565b500390565b60008219821115612a5c57612a5c612a1c565b500190565b6000816000190483118215151615612a7b57612a7b612a1c565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612aa557612aa5612a80565b500490565b60006060820160018060a01b0386168352602085818501526060604085015281855180845260808601915060808160051b870101935082870160005b82811015612b1457607f19888703018452612b0286835161235d565b95509284019290840190600101612ae6565b50939998505050505050505050565b6000600019821415612b3757612b37612a1c565b5060010190565b60018060a01b038416815282602082015260606040820152600061286b606083018461235d565b60008351612b77818460208801612331565b9190910191825250602001919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008351612beb818460208801612331565b835190830190612bff818360208801612331565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c3b9083018461235d565b9695505050505050565b600060208284031215612c5757600080fd5b81516117de816122fe565b600082612c7157612c71612a80565b500690565b634e487b7160e01b600052603160045260246000fdfea264697066735822122069a23ee713a7b78b934e06c5f49ad5c3d2ef8f50ab5b575357187a52c7827ec664736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80634f6ccce71161010457806395d89b41116100a2578063c87b56dd11610071578063c87b56dd14610400578063d5a06d4c14610413578063e985e9c514610434578063f2fde38b1461047057600080fd5b806395d89b41146103b2578063a22cb465146103ba578063b88d4fde146103cd578063b9c4d9fb146103e057600080fd5b8063715018a6116100de578063715018a614610373578063729afc1f1461037b5780638c05a2331461038e5780638da5cb5b146103a157600080fd5b80634f6ccce71461033a5780636352211e1461034d57806370a082311461036057600080fd5b806323b872dd11610171578063307b52a61161014b578063307b52a6146102ee578063331584631461030157806342842e0e1461031457806342966c681461032757600080fd5b806323b872dd146102965780632a55205a146102a95780632f745c59146102db57600080fd5b8063095ea7b3116101ad578063095ea7b31461023c5780630ebd4c7f14610251578063152fcb2e1461027157806318160ddd1461028457600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e2366004612314565b610483565b60405190151581526020015b60405180910390f35b6102046104a3565b6040516101f39190612389565b61022461021f36600461239c565b610535565b6040516001600160a01b0390911681526020016101f3565b61024f61024a3660046123ca565b6105c2565b005b61026461025f36600461239c565b6106d8565b6040516101f39190612431565b6101e761027f366004612314565b610755565b6008545b6040519081526020016101f3565b61024f6102a4366004612444565b6107a6565b6102bc6102b7366004612485565b6107d8565b604080516001600160a01b0390931683526020830191909152016101f3565b6102886102e93660046123ca565b610815565b61024f6102fc366004612587565b6108ab565b61024f61030f3660046126b7565b61095e565b61024f610322366004612444565b610a05565b61024f61033536600461239c565b610a20565b61028861034836600461239c565b610a9a565b61022461035b36600461239c565b610b2d565b61028861036e36600461271f565b610ba4565b61024f610c2b565b61024f610389366004612587565b610c61565b61024f61039c3660046126b7565b610cfc565b600b546001600160a01b0316610224565b610204610da4565b61024f6103c836600461273c565b610db3565b61024f6103db36600461277a565b610e78565b6103f36103ee36600461239c565b610eb0565b6040516101f39190612833565b61020461040e36600461239c565b610f33565b61042661042136600461239c565b610f3e565b6040516101f3929190612846565b6101e7610442366004612874565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61024f61047e36600461271f565b611015565b600061048e826110ad565b8061049d575061049d82610755565b92915050565b6060600080546104b2906128a2565b80601f01602080910402602001604051908101604052809291908181526020018280546104de906128a2565b801561052b5780601f106105005761010080835404028352916020019161052b565b820191906000526020600020905b81548152906001019060200180831161050e57829003601f168201915b5050505050905090565b6000610540826110d2565b6105a65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105cd82610b2d565b9050806001600160a01b0316836001600160a01b0316141561063b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161059d565b336001600160a01b038216148061065757506106578133610442565b6106c95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161059d565b6106d383836110ef565b505050565b60606106e38261115d565b6106ff5760405162461bcd60e51b815260040161059d906128dd565b60408051600180825281830190925260009160208083019080368337019050506000848152600d60205260409020549091508160008151811061074457610744612908565b602090810291909101015292915050565b60006001600160e01b03198216632dde656160e21b148061078657506001600160e01b031982166335681b5360e21b145b8061049d57506001600160e01b0319821663152a902d60e11b1492915050565b6107b1335b82611168565b6107cd5760405162461bcd60e51b815260040161059d9061291e565b6106d3838383611252565b6000806107e48461115d565b6108005760405162461bcd60e51b815260040161059d906128dd565b61080a84846113fd565b915091509250929050565b600061082083610ba4565b82106108825760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161059d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b8361271081106108cd5760405162461bcd60e51b815260040161059d9061296f565b6108da8888868686611444565b6001600160a01b03166108f5600b546001600160a01b031690565b6001600160a01b0316146109465760405162461bcd60e51b815260206004820152601860248201527715985b1a59081cda59db985d1d5c99481c995c5d5a5c995960421b604482015260640161059d565b61095389898989896114de565b505050505050505050565b600b546001600160a01b031633146109885760405162461bcd60e51b815260040161059d906129a6565b8361271081106109aa5760405162461bcd60e51b815260040161059d9061296f565b60006109b98989878787611533565b9050896001600160a01b0316816001600160a01b0316146109ec5760405162461bcd60e51b815260040161059d906129db565b6109f9818a8a8a8a611636565b50505050505050505050565b6106d383838360405180602001604052806000815250610e78565b610a29336107ab565b610a8e5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b606482015260840161059d565b610a97816116a2565b50565b6000610aa560085490565b8210610b085760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161059d565b60088281548110610b1b57610b1b612908565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061049d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161059d565b60006001600160a01b038216610c0f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161059d565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610c555760405162461bcd60e51b815260040161059d906129a6565b610c5f60006116ab565b565b600b546001600160a01b03163314610c8b5760405162461bcd60e51b815260040161059d906129a6565b836127108110610cad5760405162461bcd60e51b815260040161059d9061296f565b6000610cbc89898787876116fd565b9050896001600160a01b0316816001600160a01b031614610cef5760405162461bcd60e51b815260040161059d906129db565b6109f9818a8a8a8a6114de565b836127108110610d1e5760405162461bcd60e51b815260040161059d9061296f565b610d2b888886868661174f565b6001600160a01b0316610d46600b546001600160a01b031690565b6001600160a01b031614610d975760405162461bcd60e51b815260206004820152601860248201527715985b1a59081cda59db985d1d5c99481c995c5d5a5c995960421b604482015260640161059d565b6109538989898989611636565b6060600180546104b2906128a2565b6001600160a01b038216331415610e0c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161059d565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610e823383611168565b610e9e5760405162461bcd60e51b815260040161059d9061291e565b610eaa84848484611767565b50505050565b6060610ebb8261115d565b610ed75760405162461bcd60e51b815260040161059d906128dd565b60408051600180825281830190925260009160208083019080368337019050509050610f028361179a565b81600081518110610f1557610f15612908565b6001600160a01b039092166020928302919091019091015292915050565b606061049d826117e5565b606080610f4a8361115d565b610f665760405162461bcd60e51b815260040161059d906128dd565b604080516001808252818301909252600091602080830190803683375050604080516001808252818301909252929350600092915060208083019080368337019050509050610fb48561179a565b82600081518110610fc757610fc7612908565b6001600160a01b039092166020928302919091018201526000868152600d90915260409020548160008151811061100057611000612908565b60209081029190910101529094909350915050565b600b546001600160a01b0316331461103f5760405162461bcd60e51b815260040161059d906129a6565b6001600160a01b0381166110a45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161059d565b610a97816116ab565b60006001600160e01b0319821663780e9d6360e01b148061049d575061049d82611947565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061112482610b2d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061049d826110d2565b6000611173826110d2565b6111d45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161059d565b60006111df83610b2d565b9050806001600160a01b0316846001600160a01b0316148061121a5750836001600160a01b031661120f84610535565b6001600160a01b0316145b8061124a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661126582610b2d565b6001600160a01b0316146112cd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161059d565b6001600160a01b03821661132f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161059d565b61133a838383611997565b6113456000826110ef565b6001600160a01b038316600090815260036020526040812080546001929061136e908490612a32565b90915550506001600160a01b038216600090815260036020526040812080546001929061139c908490612a49565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080600061140b8561179a565b6000868152600d602052604090205490915081906127109061142e908790612a61565b6114389190612a96565b92509250509250929050565b60008030878760405160200161145c93929190612aaa565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156114c7573d6000803e3d6000fd5b5050604051601f1901519998505050505050505050565b60005b835181101561152b57611519866114f88388612a49565b86848151811061150a5761150a612908565b60200260200101518686611636565b8061152381612b23565b9150506114e1565b505050505050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600030888860405160200161158593929190612b3e565b604051602081830303815290604052805190602001209050600082826040516020016115b2929190612b65565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8b169284019290925260608301899052608083018890529092509060019060a0016020604051602081039080840390855afa15801561161d573d6000803e3d6000fd5b5050604051601f1901519b9a5050505050505050505050565b61164085856119a2565b61164a84846119c0565b801561165b5761165b848383611a4b565b837fa109ba539900bf1b633f956d63c96fc89b814c7287f7aa50a9216d0b5565720761168686610f33565b6040516116939190612389565b60405180910390a25050505050565b610a9781611a91565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600030888860405160200161158593929190612aaa565b60008030878760405160200161145c93929190612b3e565b611772848484611252565b61177e84848484611ad1565b610eaa5760405162461bcd60e51b815260040161059d90612b87565b6000818152600d6020908152604080832054600c9092528220546001600160a01b03168115806117d157506001600160a01b038116155b156117de5761124a611bde565b9392505050565b60606117f0826110d2565b6118565760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b606482015260840161059d565b6000828152600a60205260408120805461186f906128a2565b80601f016020809104026020016040519081016040528092919081815260200182805461189b906128a2565b80156118e85780601f106118bd576101008083540402835291602001916118e8565b820191906000526020600020905b8154815290600101906020018083116118cb57829003601f168201915b5050505050905060006118f9611bf7565b905080516000141561190c575092915050565b81511561193e578082604051602001611926929190612bd9565b60405160208183030381529060405292505050919050565b61124a84611c06565b60006001600160e01b031982166380ac58cd60e01b148061197857506001600160e01b03198216635b5e139f60e01b145b8061049d57506301ffc9a760e01b6001600160e01b031983161461049d565b6106d3838383611cd0565b6119bc828260405180602001604052806000815250611d88565b5050565b6119c9826110d2565b611a2c5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b606482015260840161059d565b6000828152600a6020908152604090912082516106d39284019061222f565b60008111611a5857600080fd5b6000928352600c6020908152604080852080546001600160a01b0319166001600160a01b039590951694909417909355600d9052912055565b611a9a81611dbb565b6000818152600a602052604090208054611ab3906128a2565b159050610a97576000818152600a60205260408120610a97916122b3565b60006001600160a01b0384163b15611bd357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611b15903390899088908890600401612c08565b602060405180830381600087803b158015611b2f57600080fd5b505af1925050508015611b5f575060408051601f3d908101601f19168201909252611b5c91810190612c45565b60015b611bb9573d808015611b8d576040519150601f19603f3d011682016040523d82523d6000602084013e611b92565b606091505b508051611bb15760405162461bcd60e51b815260040161059d90612b87565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061124a565b506001949350505050565b6000611bf2600b546001600160a01b031690565b905090565b6060600e80546104b2906128a2565b6060611c11826110d2565b611c755760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161059d565b6000611c7f611bf7565b90506000815111611c9f57604051806020016040528060008152506117de565b80611ca984611e62565b604051602001611cba929190612bd9565b6040516020818303038152906040529392505050565b6001600160a01b038316611d2b57611d2681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611d4e565b816001600160a01b0316836001600160a01b031614611d4e57611d4e8382611f60565b6001600160a01b038216611d65576106d381611ffd565b826001600160a01b0316826001600160a01b0316146106d3576106d382826120ac565b611d9283836120f0565b611d9f6000848484611ad1565b6106d35760405162461bcd60e51b815260040161059d90612b87565b6000611dc682610b2d565b9050611dd481600084611997565b611ddf6000836110ef565b6001600160a01b0381166000908152600360205260408120805460019290611e08908490612a32565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b606081611e865750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611eb05780611e9a81612b23565b9150611ea99050600a83612a96565b9150611e8a565b60008167ffffffffffffffff811115611ecb57611ecb6124a7565b6040519080825280601f01601f191660200182016040528015611ef5576020820181803683370190505b5090505b841561124a57611f0a600183612a32565b9150611f17600a86612c62565b611f22906030612a49565b60f81b818381518110611f3757611f37612908565b60200101906001600160f81b031916908160001a905350611f59600a86612a96565b9450611ef9565b60006001611f6d84610ba4565b611f779190612a32565b600083815260076020526040902054909150808214611fca576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061200f90600190612a32565b6000838152600960205260408120546008805493945090928490811061203757612037612908565b90600052602060002001549050806008838154811061205857612058612908565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061209057612090612c76565b6001900381819060005260206000200160009055905550505050565b60006120b783610ba4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166121465760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161059d565b61214f816110d2565b1561219c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161059d565b6121a860008383611997565b6001600160a01b03821660009081526003602052604081208054600192906121d1908490612a49565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461223b906128a2565b90600052602060002090601f01602090048101928261225d57600085556122a3565b82601f1061227657805160ff19168380011785556122a3565b828001600101855582156122a3579182015b828111156122a3578251825591602001919060010190612288565b506122af9291506122e9565b5090565b5080546122bf906128a2565b6000825580601f106122cf575050565b601f016020900490600052602060002090810190610a9791905b5b808211156122af57600081556001016122ea565b6001600160e01b031981168114610a9757600080fd5b60006020828403121561232657600080fd5b81356117de816122fe565b60005b8381101561234c578181015183820152602001612334565b83811115610eaa5750506000910152565b60008151808452612375816020860160208601612331565b601f01601f19169290920160200192915050565b6020815260006117de602083018461235d565b6000602082840312156123ae57600080fd5b5035919050565b6001600160a01b0381168114610a9757600080fd5b600080604083850312156123dd57600080fd5b82356123e8816123b5565b946020939093013593505050565b600081518084526020808501945080840160005b838110156124265781518752958201959082019060010161240a565b509495945050505050565b6020815260006117de60208301846123f6565b60008060006060848603121561245957600080fd5b8335612464816123b5565b92506020840135612474816123b5565b929592945050506040919091013590565b6000806040838503121561249857600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156124e6576124e66124a7565b604052919050565b600067ffffffffffffffff831115612508576125086124a7565b61251b601f8401601f19166020016124bd565b905082815283838301111561252f57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261255757600080fd5b6117de838335602085016124ee565b8035612571816123b5565b919050565b803560ff8116811461257157600080fd5b600080600080600080600080610100898b0312156125a457600080fd5b6125ae89356123b5565b883597506020890135965067ffffffffffffffff60408a013511156125d257600080fd5b604089013589018a601f8201126125e857600080fd5b67ffffffffffffffff81351115612601576126016124a7565b6126116020823560051b016124bd565b81358082526020808301929160051b8401018d81111561263057600080fd5b602084015b818110156126715767ffffffffffffffff8135111561265357600080fd5b6126638f60208335880101612546565b845260209384019301612635565b505080985050505061268560608a01612566565b94506080890135935061269a60a08a01612576565b925060c0890135915060e089013590509295985092959890939650565b600080600080600080600080610100898b0312156126d457600080fd5b88356126df816123b5565b975060208901359650604089013567ffffffffffffffff81111561270257600080fd5b61270e8b828c01612546565b9650506060890135612685816123b5565b60006020828403121561273157600080fd5b81356117de816123b5565b6000806040838503121561274f57600080fd5b823561275a816123b5565b91506020830135801515811461276f57600080fd5b809150509250929050565b6000806000806080858703121561279057600080fd5b843561279b816123b5565b935060208501356127ab816123b5565b925060408501359150606085013567ffffffffffffffff8111156127ce57600080fd5b8501601f810187136127df57600080fd5b6127ee878235602084016124ee565b91505092959194509250565b600081518084526020808501945080840160005b838110156124265781516001600160a01b03168752958201959082019060010161280e565b6020815260006117de60208301846127fa565b60408152600061285960408301856127fa565b828103602084015261286b81856123f6565b95945050505050565b6000806040838503121561288757600080fd5b8235612892816123b5565b9150602083013561276f816123b5565b600181811c908216806128b657607f821691505b602082108114156128d757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601190820152702737b732bc34b9ba32b73a103a37b5b2b760791b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601c908201527f546f74616c20726f79616c746965732065786365656473203130302500000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f5369676e61747572652077726f6e6720666f722065787065637465642060746f6040820152600360fd1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015612a4457612a44612a1c565b500390565b60008219821115612a5c57612a5c612a1c565b500190565b6000816000190483118215151615612a7b57612a7b612a1c565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612aa557612aa5612a80565b500490565b60006060820160018060a01b0386168352602085818501526060604085015281855180845260808601915060808160051b870101935082870160005b82811015612b1457607f19888703018452612b0286835161235d565b95509284019290840190600101612ae6565b50939998505050505050505050565b6000600019821415612b3757612b37612a1c565b5060010190565b60018060a01b038416815282602082015260606040820152600061286b606083018461235d565b60008351612b77818460208801612331565b9190910191825250602001919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008351612beb818460208801612331565b835190830190612bff818360208801612331565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c3b9083018461235d565b9695505050505050565b600060208284031215612c5757600080fd5b81516117de816122fe565b600082612c7157612c71612a80565b500690565b634e487b7160e01b600052603160045260246000fdfea264697066735822122069a23ee713a7b78b934e06c5f49ad5c3d2ef8f50ab5b575357187a52c7827ec664736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [2] : 697066733a2f2f00000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
492:5009:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5227:272;;;;;;:::i;:::-;;:::i;:::-;;;565:14:17;;558:22;540:41;;528:2;513:18;5227:272:1;;;;;;;;2414:98:4;;;:::i;:::-;;;;;;;:::i;3925:217::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:17;;;1674:51;;1662:2;1647:18;3925:217:4;1528:203:17;3463:401:4;;;;;;:::i;:::-;;:::i;:::-;;2477:298:2;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4217:320::-;;;;;;:::i;:::-;;:::i;1535:111:8:-;1622:10;:17;1535:111;;;3044:25:17;;;3032:2;3017:18;1535:111:8;2898:177:17;4789:330:4;;;;;;:::i;:::-;;:::i;2868:258:2:-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3986:32:17;;;3968:51;;4050:2;4035:18;;4028:34;;;;3941:18;2868:258:2;3794:274:17;1211:253:8;;;;;;:::i;:::-;;:::i;1457:489:1:-;;;;;;:::i;:::-;;:::i;2040:486::-;;;;;;:::i;:::-;;:::i;5185:179:4:-;;;;;;:::i;:::-;;:::i;451:241:7:-;;;;;;:::i;:::-;;:::i;1718:230:8:-;;;;;;:::i;:::-;;:::i;2117:235:4:-;;;;;;:::i;:::-;;:::i;1855:205::-;;;;;;:::i;:::-;;:::i;1605:92:3:-;;;:::i;2625:567:1:-;;;;;;:::i;:::-;;:::i;989:462::-;;;;;;:::i;:::-;;:::i;973:85:3:-;1045:6;;-1:-1:-1;;;;;1045:6:3;973:85;;2576:102:4;;;:::i;4209:290::-;;;;;;:::i;:::-;;:::i;5430:320::-;;;;;;:::i;:::-;;:::i;2119:352:2:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4674:189:1:-;;;;;;:::i;:::-;;:::i;1622:452:2:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;4565:162:4:-;;;;;;:::i;:::-;-1:-1:-1;;;;;4685:25:4;;;4662:4;4685:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4565:162;1846:189:3;;;;;;:::i;:::-;;:::i;5227:272:1:-;5362:4;5401:36;5425:11;5401:23;:36::i;:::-;:91;;;;5453:39;5480:11;5453:26;:39::i;:::-;5382:110;5227:272;-1:-1:-1;;5227:272:1:o;2414:98:4:-;2468:13;2500:5;2493:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:98;:::o;3925:217::-;4001:7;4028:16;4036:7;4028;:16::i;:::-;4020:73;;;;-1:-1:-1;;;4020:73:4;;11724:2:17;4020:73:4;;;11706:21:17;11763:2;11743:18;;;11736:30;11802:34;11782:18;;;11775:62;-1:-1:-1;;;11853:18:17;;;11846:42;11905:19;;4020:73:4;;;;;;;;;-1:-1:-1;4111:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4111:24:4;;3925:217::o;3463:401::-;3543:13;3559:23;3574:7;3559:14;:23::i;:::-;3543:39;;3606:5;-1:-1:-1;;;;;3600:11:4;:2;-1:-1:-1;;;;;3600:11:4;;;3592:57;;;;-1:-1:-1;;;3592:57:4;;12137:2:17;3592:57:4;;;12119:21:17;12176:2;12156:18;;;12149:30;12215:34;12195:18;;;12188:62;-1:-1:-1;;;12266:18:17;;;12259:31;12307:19;;3592:57:4;11935:397:17;3592:57:4;666:10:13;-1:-1:-1;;;;;3681:21:4;;;;:62;;-1:-1:-1;3706:37:4;3723:5;666:10:13;4565:162:4;:::i;3706:37::-;3660:165;;;;-1:-1:-1;;;3660:165:4;;12539:2:17;3660:165:4;;;12521:21:17;12578:2;12558:18;;;12551:30;12617:34;12597:18;;;12590:62;12688:26;12668:18;;;12661:54;12732:19;;3660:165:4;12337:420:17;3660:165:4;3836:21;3845:2;3849:7;3836:8;:21::i;:::-;3533:331;3463:401;;:::o;2477:298:2:-;2576:16;2616:25;2633:7;2616:16;:25::i;:::-;2608:55;;;;-1:-1:-1;;;2608:55:2;;;;;;;:::i;:::-;2697:16;;;2711:1;2697:16;;;;;;;;;2674:20;;2697:16;;;;;;;;;;;-1:-1:-1;;3468:7:2;3494:25;;;:16;:25;;;;;;2674:39;;-1:-1:-1;2723:3:2;2727:1;2723:6;;;;;;;;:::i;:::-;;;;;;;;;;:25;2765:3;2477:298;-1:-1:-1;;2477:298:2:o;4217:320::-;4318:4;-1:-1:-1;;;;;;4357:46:2;;-1:-1:-1;;;4357:46:2;;:111;;-1:-1:-1;;;;;;;4419:49:2;;-1:-1:-1;;;4419:49:2;4357:111;:173;;;-1:-1:-1;;;;;;;4484:46:2;;-1:-1:-1;;;4484:46:2;4338:192;4217:320;-1:-1:-1;;4217:320:2:o;4789:330:4:-;4978:41;666:10:13;4997:12:4;5011:7;4978:18;:41::i;:::-;4970:103;;;;-1:-1:-1;;;4970:103:4;;;;;;;:::i;:::-;5084:28;5094:4;5100:2;5104:7;5084:9;:28::i;2868:258:2:-;2984:7;2993;3024:25;3041:7;3024:16;:25::i;:::-;3016:55;;;;-1:-1:-1;;;3016:55:2;;;;;;;:::i;:::-;3088:31;3104:7;3113:5;3088:15;:31::i;:::-;3081:38;;;;2868:258;;;;;:::o;1211:253:8:-;1308:7;1343:23;1360:5;1343:16;:23::i;:::-;1335:5;:31;1327:87;;;;-1:-1:-1;;;1327:87:8;;13860:2:17;1327:87:8;;;13842:21:17;13899:2;13879:18;;;13872:30;13938:34;13918:18;;;13911:62;-1:-1:-1;;;13989:18:17;;;13982:41;14040:19;;1327:87:8;13658:407:17;1327:87:8;-1:-1:-1;;;;;;1431:19:8;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1211:253::o;1457:489:1:-;1702:11;3425:5;3411:11;:19;3403:60;;;;-1:-1:-1;;;3403:60:1;;;;;;;:::i;:::-;1773:48:::1;1792:7;1801:10;1813:1;1816;1819;1773:18;:48::i;:::-;-1:-1:-1::0;;;;;1746:75:1::1;:7;1045:6:3::0;;-1:-1:-1;;;;;1045:6:3;;973:85;1746:7:1::1;-1:-1:-1::0;;;;;1746:75:1::1;;1725:146;;;::::0;-1:-1:-1;;;1725:146:1;;14629:2:17;1725:146:1::1;::::0;::::1;14611:21:17::0;14668:2;14648:18;;;14641:30;-1:-1:-1;;;14687:18:17;;;14680:54;14751:18;;1725:146:1::1;14427:348:17::0;1725:146:1::1;1882:57;1892:2;1896:7;1905:10;1917:8;1927:11;1882:9;:57::i;:::-;1457:489:::0;;;;;;;;;:::o;2040:486::-;1045:6:3;;-1:-1:-1;;;;;1045:6:3;666:10:13;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;2297:11:1::1;3425:5;3411:11;:19;3403:60;;;;-1:-1:-1::0;;;3403:60:1::1;;;;;;;:::i;:::-;2320:10:::2;2333:51;2356:7;2365:9;2376:1;2379;2382;2333:22;:51::i;:::-;2320:64;;2409:3;-1:-1:-1::0;;;;;2403:9:1::2;:2;-1:-1:-1::0;;;;;2403:9:1::2;;2395:55;;;;-1:-1:-1::0;;;2395:55:1::2;;;;;;;:::i;:::-;2461:58;2473:2;2477:7;2486:9;2497:8;2507:11;2461;:58::i;:::-;2310:216;1255:1:3::1;2040:486:1::0;;;;;;;;:::o;5185:179:4:-;5318:39;5335:4;5341:2;5345:7;5318:39;;;;;;;;;;;;:16;:39::i;451:241:7:-;567:41;666:10:13;586:12:7;587:96:13;567:41:7;559:102;;;;-1:-1:-1;;;559:102:7;;15745:2:17;559:102:7;;;15727:21:17;15784:2;15764:18;;;15757:30;15823:34;15803:18;;;15796:62;-1:-1:-1;;;15874:18:17;;;15867:46;15930:19;;559:102:7;15543:412:17;559:102:7;671:14;677:7;671:5;:14::i;:::-;451:241;:::o;1718:230:8:-;1793:7;1828:30;1622:10;:17;;1535:111;1828:30;1820:5;:38;1812:95;;;;-1:-1:-1;;;1812:95:8;;16162:2:17;1812:95:8;;;16144:21:17;16201:2;16181:18;;;16174:30;16240:34;16220:18;;;16213:62;-1:-1:-1;;;16291:18:17;;;16284:42;16343:19;;1812:95:8;15960:408:17;1812:95:8;1924:10;1935:5;1924:17;;;;;;;;:::i;:::-;;;;;;;;;1917:24;;1718:230;;;:::o;2117:235:4:-;2189:7;2224:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2224:16:4;2258:19;2250:73;;;;-1:-1:-1;;;2250:73:4;;16575:2:17;2250:73:4;;;16557:21:17;16614:2;16594:18;;;16587:30;16653:34;16633:18;;;16626:62;-1:-1:-1;;;16704:18:17;;;16697:39;16753:19;;2250:73:4;16373:405:17;1855:205:4;1927:7;-1:-1:-1;;;;;1954:19:4;;1946:74;;;;-1:-1:-1;;;1946:74:4;;16985:2:17;1946:74:4;;;16967:21:17;17024:2;17004:18;;;16997:30;17063:34;17043:18;;;17036:62;-1:-1:-1;;;17114:18:17;;;17107:40;17164:19;;1946:74:4;16783:406:17;1946:74:4;-1:-1:-1;;;;;;2037:16:4;;;;;:9;:16;;;;;;;1855:205::o;1605:92:3:-;1045:6;;-1:-1:-1;;;;;1045:6:3;666:10:13;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;1669:21:::1;1687:1;1669:9;:21::i;:::-;1605:92::o:0;2625:567:1:-;1045:6:3;;-1:-1:-1;;;;;1045:6:3;666:10:13;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;2889:11:1::1;3425:5;3411:11;:19;3403:60;;;;-1:-1:-1::0;;;3403:60:1::1;;;;;;;:::i;:::-;2912:10:::2;2925:126;2965:7;2986:10;3010:1;3025;3040;2925:26;:126::i;:::-;2912:139;;3076:3;-1:-1:-1::0;;;;;3070:9:1::2;:2;-1:-1:-1::0;;;;;3070:9:1::2;;3062:55;;;;-1:-1:-1::0;;;3062:55:1::2;;;;;;;:::i;:::-;3128:57;3138:2;3142:7;3151:10;3163:8;3173:11;3128:9;:57::i;989:462::-:0;1227:11;3425:5;3411:11;:19;3403:60;;;;-1:-1:-1;;;3403:60:1;;;;;;;:::i;:::-;1282:43:::1;1297:7;1306:9;1317:1;1320;1323;1282:14;:43::i;:::-;-1:-1:-1::0;;;;;1271:54:1::1;:7;1045:6:3::0;;-1:-1:-1;;;;;1045:6:3;;973:85;1271:7:1::1;-1:-1:-1::0;;;;;1271:54:1::1;;1250:125;;;::::0;-1:-1:-1;;;1250:125:1;;14629:2:17;1250:125:1::1;::::0;::::1;14611:21:17::0;14668:2;14648:18;;;14641:30;-1:-1:-1;;;14687:18:17;;;14680:54;14751:18;;1250:125:1::1;14427:348:17::0;1250:125:1::1;1386:58;1398:2;1402:7;1411:9;1422:8;1432:11;1386;:58::i;2576:102:4:-:0;2632:13;2664:7;2657:14;;;;;:::i;4209:290::-;-1:-1:-1;;;;;4311:24:4;;666:10:13;4311:24:4;;4303:62;;;;-1:-1:-1;;;4303:62:4;;17396:2:17;4303:62:4;;;17378:21:17;17435:2;17415:18;;;17408:30;17474:27;17454:18;;;17447:55;17519:18;;4303:62:4;17194:349:17;4303:62:4;666:10:13;4376:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;4376:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;4376:53:4;;;;;;;;;;4444:48;;540:41:17;;;4376:42:4;;666:10:13;4444:48:4;;513:18:17;4444:48:4;;;;;;;4209:290;;:::o;5430:320::-;5599:41;666:10:13;5632:7:4;5599:18;:41::i;:::-;5591:103;;;;-1:-1:-1;;;5591:103:4;;;;;;;:::i;:::-;5704:39;5718:4;5724:2;5728:7;5737:5;5704:13;:39::i;:::-;5430:320;;;;:::o;2119:352:2:-;2225:24;2273:25;2290:7;2273:16;:25::i;:::-;2265:55;;;;-1:-1:-1;;;2265:55:2;;;;;;;:::i;:::-;2368:24;;;2390:1;2368:24;;;;;;;;;2331:34;;2368:24;;;;;;;;;;;-1:-1:-1;2368:24:2;2331:61;;2417:21;2430:7;2417:12;:21::i;:::-;2402:9;2412:1;2402:12;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2402:36:2;;;:12;;;;;;;;;;;:36;2455:9;2119:352;-1:-1:-1;;2119:352:2:o;4674:189:1:-;4797:13;4833:23;4848:7;4833:14;:23::i;1622:452:2:-;1719:24;1745:16;1785:25;1802:7;1785:16;:25::i;:::-;1777:55;;;;-1:-1:-1;;;1777:55:2;;;;;;;:::i;:::-;1880:24;;;1902:1;1880:24;;;;;;;;;1843:34;;1880:24;;;;;;;;;-1:-1:-1;;1937:16:2;;;1951:1;1937:16;;;;;;;;;1843:61;;-1:-1:-1;1914:20:2;;1937:16;-1:-1:-1;1937:16:2;;;;;;;;;;;-1:-1:-1;1937:16:2;1914:39;;1978:21;1991:7;1978:12;:21::i;:::-;1963:9;1973:1;1963:12;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1963:36:2;;;:12;;;;;;;;;;:36;3468:7;3494:25;;;:16;:25;;;;;;;2009:3;2013:1;2009:6;;;;;;;;:::i;:::-;;;;;;;;;;:25;2052:9;;2063:3;;-1:-1:-1;1622:452:2;-1:-1:-1;;1622:452:2:o;1846:189:3:-;1045:6;;-1:-1:-1;;;;;1045:6:3;666:10:13;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;1934:22:3;::::1;1926:73;;;::::0;-1:-1:-1;;;1926:73:3;;17750:2:17;1926:73:3::1;::::0;::::1;17732:21:17::0;17789:2;17769:18;;;17762:30;17828:34;17808:18;;;17801:62;-1:-1:-1;;;17879:18:17;;;17872:36;17925:19;;1926:73:3::1;17548:402:17::0;1926:73:3::1;2009:19;2019:8;2009:9;:19::i;910:222:8:-:0;1012:4;-1:-1:-1;;;;;;1035:50:8;;-1:-1:-1;;;1035:50:8;;:90;;;1089:36;1113:11;1089:23;:36::i;7222:125:4:-;7287:4;7310:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7310:16:4;:30;;;7222:125::o;11073:171::-;11147:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11147:29:4;-1:-1:-1;;;;;11147:29:4;;;;;;;;:24;;11200:23;11147:24;11200:14;:23::i;:::-;-1:-1:-1;;;;;11191:46:4;;;;;;;;;;;11073:171;;:::o;4869:190:1:-;5003:4;5030:22;5044:7;5030:13;:22::i;7505:344:4:-;7598:4;7622:16;7630:7;7622;:16::i;:::-;7614:73;;;;-1:-1:-1;;;7614:73:4;;18157:2:17;7614:73:4;;;18139:21:17;18196:2;18176:18;;;18169:30;18235:34;18215:18;;;18208:62;-1:-1:-1;;;18286:18:17;;;18279:42;18338:19;;7614:73:4;17955:408:17;7614:73:4;7697:13;7713:23;7728:7;7713:14;:23::i;:::-;7697:39;;7765:5;-1:-1:-1;;;;;7754:16:4;:7;-1:-1:-1;;;;;7754:16:4;;:51;;;;7798:7;-1:-1:-1;;;;;7774:31:4;:20;7786:7;7774:11;:20::i;:::-;-1:-1:-1;;;;;7774:31:4;;7754:51;:87;;;-1:-1:-1;;;;;;4685:25:4;;;4662:4;4685:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7809:32;7746:96;7505:344;-1:-1:-1;;;;7505:344:4:o;10402:560::-;10556:4;-1:-1:-1;;;;;10529:31:4;:23;10544:7;10529:14;:23::i;:::-;-1:-1:-1;;;;;10529:31:4;;10521:85;;;;-1:-1:-1;;;10521:85:4;;18570:2:17;10521:85:4;;;18552:21:17;18609:2;18589:18;;;18582:30;18648:34;18628:18;;;18621:62;-1:-1:-1;;;18699:18:17;;;18692:39;18748:19;;10521:85:4;18368:405:17;10521:85:4;-1:-1:-1;;;;;10624:16:4;;10616:65;;;;-1:-1:-1;;;10616:65:4;;18980:2:17;10616:65:4;;;18962:21:17;19019:2;18999:18;;;18992:30;19058:34;19038:18;;;19031:62;-1:-1:-1;;;19109:18:17;;;19102:34;19153:19;;10616:65:4;18778:400:17;10616:65:4;10692:39;10713:4;10719:2;10723:7;10692:20;:39::i;:::-;10793:29;10810:1;10814:7;10793:8;:29::i;:::-;-1:-1:-1;;;;;10833:15:4;;;;;;:9;:15;;;;;:20;;10852:1;;10833:15;:20;;10852:1;;10833:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10863:13:4;;;;;;:9;:13;;;;;:18;;10880:1;;10863:13;:18;;10880:1;;10863:18;:::i;:::-;;;;-1:-1:-1;;10891:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10891:21:4;-1:-1:-1;;;;;10891:21:4;;;;;;;;;10928:27;;10891:16;;10928:27;;;;;;;10402:560;;;:::o;3132:273:2:-;3236:16;3254:14;3284:17;3304:21;3317:7;3304:12;:21::i;:::-;3355:25;;;;:16;:25;;;;;;3284:41;;-1:-1:-1;3284:41:2;;3392:5;;3355:33;;3383:5;;3355:33;:::i;:::-;3354:43;;;;:::i;:::-;3335:63;;;;;3132:273;;;;;:::o;149:357:0:-;322:7;341:9;387:4;393:7;402:10;376:37;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;376:37:0;;;;;;;;;353:70;;376:37;353:70;;;;433:16;452:21;;;;;;;;;21230:25:17;;;21303:4;21291:17;;21271:18;;;21264:45;;;;21325:18;;;21318:34;;;21368:18;;;21361:34;;;353:70:0;;-1:-1:-1;433:16:0;452:21;;21202:19:17;;452:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;452:21:0;;-1:-1:-1;;452:21:0;;;149:357;-1:-1:-1;;;;;;;;;149:357:0:o;3487:341:1:-;3684:9;3679:143;3703:10;:17;3699:1;:21;3679:143;;;3741:70;3753:2;3757:15;3771:1;3757:11;:15;:::i;:::-;3774:10;3785:1;3774:13;;;;;;;;:::i;:::-;;;;;;;3789:8;3799:11;3741;:70::i;:::-;3722:3;;;;:::i;:::-;;;;3679:143;;;;3487:341;;;;;:::o;1458:483:0:-;1632:7;1651:19;:56;;;;;;;;;;;;;;;;;;;1717:9;1750:4;1756:7;1765:9;1739:36;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1729:47;;;;;;1717:59;;1786:20;1836:6;1844:1;1819:27;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1819:27:0;;;;;;;;;1809:38;;1819:27;1809:38;;;;1857:16;1876:32;;;;;;;;;21230:25:17;;;21303:4;21291:17;;21271:18;;;21264:45;;;;21325:18;;;21318:34;;;21368:18;;;21361:34;;;1809:38:0;;-1:-1:-1;1857:16:0;1876:32;;21202:19:17;;1876:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1876:32:0;;-1:-1:-1;;1876:32:0;;;1458:483;-1:-1:-1;;;;;;;;;;;1458:483:0:o;3834:413:1:-;4021:22;4031:2;4035:7;4021:9;:22::i;:::-;4053:32;4066:7;4075:9;4053:12;:32::i;:::-;4099:15;;4095:91;;4130:45;4144:7;4153:8;4163:11;4130:13;:45::i;:::-;4232:7;4200:40;4213:17;4222:7;4213:8;:17::i;:::-;4200:40;;;;;;:::i;:::-;;;;;;;;3834:413;;;;;:::o;4535:133::-;4641:20;4653:7;4641:11;:20::i;2041:169:3:-;2115:6;;;-1:-1:-1;;;;;2131:17:3;;;-1:-1:-1;;;;;;2131:17:3;;;;;;;2163:40;;2115:6;;;2131:17;2115:6;;2163:40;;2096:16;;2163:40;2086:124;2041:169;:::o;939:513:0:-;1120:7;1139:19;:56;;;;;;;;;;;;;;;;;;;1205:9;1251:4;1257:7;1266:10;1240:37;;;;;;;;;;:::i;512:327::-;678:7;697:9;730:4;736:7;745:9;719:36;;;;;;;;;;:::i;6612:307:4:-;6763:28;6773:4;6779:2;6783:7;6763:9;:28::i;:::-;6809:48;6832:4;6838:2;6842:7;6851:5;6809:22;:48::i;:::-;6801:111;;;;-1:-1:-1;;;6801:111:4;;;;;;;:::i;3532:562:2:-;3618:15;3494:25;;;:16;:25;;;;;;;;;3716:21;:30;;;;;;-1:-1:-1;;;;;3716:30:2;3760:8;;;:34;;-1:-1:-1;;;;;;3772:22:2;;;3760:34;3756:306;;;4029:21;:19;:21::i;3756:306::-;4079:8;3532:562;-1:-1:-1;;;3532:562:2:o;387:663:9:-;460:13;493:16;501:7;493;:16::i;:::-;485:78;;;;-1:-1:-1;;;485:78:9;;22951:2:17;485:78:9;;;22933:21:17;22990:2;22970:18;;;22963:30;23029:34;23009:18;;;23002:62;-1:-1:-1;;;23080:18:17;;;23073:47;23137:19;;485:78:9;22749:413:17;485:78:9;574:23;600:19;;;:10;:19;;;;;574:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;629:18;650:10;:8;:10::i;:::-;629:31;;739:4;733:18;755:1;733:23;729:70;;;-1:-1:-1;779:9:9;387:663;-1:-1:-1;;387:663:9:o;729:70::-;901:23;;:27;897:106;;975:4;981:9;958:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;944:48;;;;387:663;;;:::o;897:106::-;1020:23;1035:7;1020:14;:23::i;1496:300:4:-;1598:4;-1:-1:-1;;;;;;1633:40:4;;-1:-1:-1;;;1633:40:4;;:104;;-1:-1:-1;;;;;;;1689:48:4;;-1:-1:-1;;;1689:48:4;1633:104;:156;;;-1:-1:-1;;;;;;;;;;871:40:15;;;1753:36:4;763:155:15;4320:209:1;4477:45;4504:4;4510:2;4514:7;4477:26;:45::i;8179:108:4:-;8254:26;8264:2;8268:7;8254:26;;;;;;;;;;;;:9;:26::i;:::-;8179:108;;:::o;1197:214:9:-;1296:16;1304:7;1296;:16::i;:::-;1288:75;;;;-1:-1:-1;;;1288:75:9;;23844:2:17;1288:75:9;;;23826:21:17;23883:2;23863:18;;;23856:30;23922:34;23902:18;;;23895:62;-1:-1:-1;;;23973:18:17;;;23966:44;24027:19;;1288:75:9;23642:410:17;1288:75:9;1373:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;1242:267:2:-;1400:1;1386:11;:15;1378:24;;;;;;1412:30;;;;:21;:30;;;;;;;;:41;;-1:-1:-1;;;;;;1412:41:2;-1:-1:-1;;;;;1412:41:2;;;;;;;;;;;1463:16;:25;;;;:39;1242:267::o;1628:200:9:-;1696:20;1708:7;1696:11;:20::i;:::-;1737:19;;;;:10;:19;;;;;1731:33;;;;;:::i;:::-;:38;;-1:-1:-1;1727:95:9;;1792:19;;;;:10;:19;;;;;1785:26;;;:::i;11797:778:4:-;11947:4;-1:-1:-1;;;;;11967:13:4;;1034:20:12;1080:8;11963:606:4;;12002:72;;-1:-1:-1;;;12002:72:4;;-1:-1:-1;;;;;12002:36:4;;;;;:72;;666:10:13;;12053:4:4;;12059:7;;12068:5;;12002:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12002:72:4;;;;;;;;-1:-1:-1;;12002:72:4;;;;;;;;;;;;:::i;:::-;;;11998:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12241:13:4;;12237:266;;12283:60;;-1:-1:-1;;;12283:60:4;;;;;;;:::i;12237:266::-;12455:6;12449:13;12440:6;12436:2;12432:15;12425:38;11998:519;-1:-1:-1;;;;;;12124:51:4;-1:-1:-1;;;12124:51:4;;-1:-1:-1;12117:58:4;;11963:606;-1:-1:-1;12554:4:4;11797:778;;;;;;:::o;5065:156:1:-;5160:15;5206:7;1045:6:3;;-1:-1:-1;;;;;1045:6:3;;973:85;5206:7:1;5191:23;;5065:156;:::o;876:107::-;928:13;960:16;953:23;;;;;:::i;2744:329:4:-;2817:13;2850:16;2858:7;2850;:16::i;:::-;2842:76;;;;-1:-1:-1;;;2842:76:4;;25007:2:17;2842:76:4;;;24989:21:17;25046:2;25026:18;;;25019:30;25085:34;25065:18;;;25058:62;-1:-1:-1;;;25136:18:17;;;25129:45;25191:19;;2842:76:4;24805:411:17;2842:76:4;2929:21;2953:10;:8;:10::i;:::-;2929:34;;3004:1;2986:7;2980:21;:25;:86;;;;;;;;;;;;;;;;;3032:7;3041:18;:7;:16;:18::i;:::-;3015:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2973:93;2744:329;-1:-1:-1;;;2744:329:4:o;2544:572:8:-;-1:-1:-1;;;;;2743:18:8;;2739:183;;2777:40;2809:7;3925:10;:17;;3898:24;;;;:15;:24;;;;;:44;;;3952:24;;;;;;;;;;;;3822:161;2777:40;2739:183;;;2846:2;-1:-1:-1;;;;;2838:10:8;:4;-1:-1:-1;;;;;2838:10:8;;2834:88;;2864:47;2897:4;2903:7;2864:32;:47::i;:::-;-1:-1:-1;;;;;2935:16:8;;2931:179;;2967:45;3004:7;2967:36;:45::i;2931:179::-;3039:4;-1:-1:-1;;;;;3033:10:8;:2;-1:-1:-1;;;;;3033:10:8;;3029:81;;3059:40;3087:2;3091:7;3059:27;:40::i;8508:311:4:-;8633:18;8639:2;8643:7;8633:5;:18::i;:::-;8682:54;8713:1;8717:2;8721:7;8730:5;8682:22;:54::i;:::-;8661:151;;;;-1:-1:-1;;;8661:151:4;;;;;;;:::i;9730:348::-;9789:13;9805:23;9820:7;9805:14;:23::i;:::-;9789:39;;9839:48;9860:5;9875:1;9879:7;9839:20;:48::i;:::-;9925:29;9942:1;9946:7;9925:8;:29::i;:::-;-1:-1:-1;;;;;9965:16:4;;;;;;:9;:16;;;;;:21;;9985:1;;9965:16;:21;;9985:1;;9965:21;:::i;:::-;;;;-1:-1:-1;;10003:16:4;;;;:7;:16;;;;;;9996:23;;-1:-1:-1;;;;;;9996:23:4;;;10035:36;10011:7;;10003:16;-1:-1:-1;;;;;10035:36:4;;;;;10003:16;;10035:36;9779:299;9730:348;:::o;275:703:14:-;331:13;548:10;544:51;;-1:-1:-1;;574:10:14;;;;;;;;;;;;-1:-1:-1;;;574:10:14;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:14;;-1:-1:-1;720:2:14;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:14;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:14;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;849:56:14;;;;;;;;-1:-1:-1;919:11:14;928:2;919:11;;:::i;:::-;;;791:150;;4600:970:8;4862:22;4912:1;4887:22;4904:4;4887:16;:22::i;:::-;:26;;;;:::i;:::-;4923:18;4944:26;;;:17;:26;;;;;;4862:51;;-1:-1:-1;5074:28:8;;;5070:323;;-1:-1:-1;;;;;5140:18:8;;5118:19;5140:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5189:30;;;;;;:44;;;5305:30;;:17;:30;;;;;:43;;;5070:323;-1:-1:-1;5486:26:8;;;;:17;:26;;;;;;;;5479:33;;;-1:-1:-1;;;;;5529:18:8;;;;;:12;:18;;;;;:34;;;;;;;5522:41;4600:970::o;5858:1061::-;6132:10;:17;6107:22;;6132:21;;6152:1;;6132:21;:::i;:::-;6163:18;6184:24;;;:15;:24;;;;;;6552:10;:26;;6107:46;;-1:-1:-1;6184:24:8;;6107:46;;6552:26;;;;;;:::i;:::-;;;;;;;;;6530:48;;6614:11;6589:10;6600;6589:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6693:28;;;:15;:28;;;;;;;:41;;;6862:24;;;;;6855:31;6896:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5929:990;;;5858:1061;:::o;3410:217::-;3494:14;3511:20;3528:2;3511:16;:20::i;:::-;-1:-1:-1;;;;;3541:16:8;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3585:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3410:217:8:o;9141:372:4:-;-1:-1:-1;;;;;9220:16:4;;9212:61;;;;-1:-1:-1;;;9212:61:4;;25672:2:17;9212:61:4;;;25654:21:17;;;25691:18;;;25684:30;25750:34;25730:18;;;25723:62;25802:18;;9212:61:4;25470:356:17;9212:61:4;9292:16;9300:7;9292;:16::i;:::-;9291:17;9283:58;;;;-1:-1:-1;;;9283:58:4;;26033:2:17;9283:58:4;;;26015:21:17;26072:2;26052:18;;;26045:30;26111;26091:18;;;26084:58;26159:18;;9283:58:4;25831:352:17;9283:58:4;9352:45;9381:1;9385:2;9389:7;9352:20;:45::i;:::-;-1:-1:-1;;;;;9408:13:4;;;;;;:9;:13;;;;;:18;;9425:1;;9408:13;:18;;9425:1;;9408:18;:::i;:::-;;;;-1:-1:-1;;9436:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9436:21:4;-1:-1:-1;;;;;9436:21:4;;;;;;;;9473:33;;9436:16;;;9473:33;;9436:16;;9473:33;9141:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:17;-1:-1:-1;;;;;;88:32:17;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:17;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:17;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:17:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:17;;1343:180;-1:-1:-1;1343:180:17:o;1736:131::-;-1:-1:-1;;;;;1811:31:17;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:17:o;2192:435::-;2245:3;2283:5;2277:12;2310:6;2305:3;2298:19;2336:4;2365:2;2360:3;2356:12;2349:19;;2402:2;2395:5;2391:14;2423:1;2433:169;2447:6;2444:1;2441:13;2433:169;;;2508:13;;2496:26;;2542:12;;;;2577:15;;;;2469:1;2462:9;2433:169;;;-1:-1:-1;2618:3:17;;2192:435;-1:-1:-1;;;;;2192:435:17:o;2632:261::-;2811:2;2800:9;2793:21;2774:4;2831:56;2883:2;2872:9;2868:18;2860:6;2831:56;:::i;3080:456::-;3157:6;3165;3173;3226:2;3214:9;3205:7;3201:23;3197:32;3194:52;;;3242:1;3239;3232:12;3194:52;3281:9;3268:23;3300:31;3325:5;3300:31;:::i;:::-;3350:5;-1:-1:-1;3407:2:17;3392:18;;3379:32;3420:33;3379:32;3420:33;:::i;:::-;3080:456;;3472:7;;-1:-1:-1;;;3526:2:17;3511:18;;;;3498:32;;3080:456::o;3541:248::-;3609:6;3617;3670:2;3658:9;3649:7;3645:23;3641:32;3638:52;;;3686:1;3683;3676:12;3638:52;-1:-1:-1;;3709:23:17;;;3779:2;3764:18;;;3751:32;;-1:-1:-1;3541:248:17:o;4073:127::-;4134:10;4129:3;4125:20;4122:1;4115:31;4165:4;4162:1;4155:15;4189:4;4186:1;4179:15;4205:275;4276:2;4270:9;4341:2;4322:13;;-1:-1:-1;;4318:27:17;4306:40;;4376:18;4361:34;;4397:22;;;4358:62;4355:88;;;4423:18;;:::i;:::-;4459:2;4452:22;4205:275;;-1:-1:-1;4205:275:17:o;4485:407::-;4550:5;4584:18;4576:6;4573:30;4570:56;;;4606:18;;:::i;:::-;4644:57;4689:2;4668:15;;-1:-1:-1;;4664:29:17;4695:4;4660:40;4644:57;:::i;:::-;4635:66;;4724:6;4717:5;4710:21;4764:3;4755:6;4750:3;4746:16;4743:25;4740:45;;;4781:1;4778;4771:12;4740:45;4830:6;4825:3;4818:4;4811:5;4807:16;4794:43;4884:1;4877:4;4868:6;4861:5;4857:18;4853:29;4846:40;4485:407;;;;;:::o;4897:222::-;4940:5;4993:3;4986:4;4978:6;4974:17;4970:27;4960:55;;5011:1;5008;5001:12;4960:55;5033:80;5109:3;5100:6;5087:20;5080:4;5072:6;5068:17;5033:80;:::i;5124:142::-;5200:20;;5229:31;5200:20;5229:31;:::i;:::-;5124:142;;;:::o;5271:156::-;5337:20;;5397:4;5386:16;;5376:27;;5366:55;;5417:1;5414;5407:12;5432:1618;5595:6;5603;5611;5619;5627;5635;5643;5651;5704:3;5692:9;5683:7;5679:23;5675:33;5672:53;;;5721:1;5718;5711:12;5672:53;5734:49;5772:9;5759:23;5734:49;:::i;:::-;5815:9;5802:23;5792:33;;5872:2;5861:9;5857:18;5844:32;5834:42;;5925:18;5919:2;5908:9;5904:18;5891:32;5888:56;5885:76;;;5957:1;5954;5947:12;5885:76;6023:2;6012:9;6008:18;5995:32;5984:9;5980:48;6066:7;6059:4;6055:2;6051:13;6047:27;6037:55;;6088:1;6085;6078:12;6037:55;6125:18;6120:2;6107:16;6104:40;6101:66;;;6147:18;;:::i;:::-;6187:50;6233:2;6227;6214:16;6211:1;6207:24;6203:33;6187:50;:::i;:::-;6283:16;;6271:29;;;6325:2;6316:12;;;;6259:3;6367:1;6363:24;6355:33;;6351:42;6405:19;;;6402:39;;;6437:1;6434;6427:12;6402:39;6469:2;6465;6461:11;6481:262;6497:6;6492:3;6489:15;6481:262;;;6576:18;6570:3;6557:17;6554:41;6551:61;;;6608:1;6605;6598:12;6551:61;6637:63;6692:7;6687:2;6680:3;6667:17;6663:2;6659:26;6655:35;6637:63;:::i;:::-;6625:76;;6730:2;6721:12;;;;6514;6481:262;;;6485:3;;6762:5;6752:15;;;;;6786:46;6828:2;6817:9;6813:18;6786:46;:::i;:::-;6776:56;;6879:3;6868:9;6864:19;6851:33;6841:43;;6903:37;6935:3;6924:9;6920:19;6903:37;:::i;:::-;6893:47;;6987:3;6976:9;6972:19;6959:33;6949:43;;7039:3;7028:9;7024:19;7011:33;7001:43;;5432:1618;;;;;;;;;;;:::o;7055:953::-;7193:6;7201;7209;7217;7225;7233;7241;7249;7302:3;7290:9;7281:7;7277:23;7273:33;7270:53;;;7319:1;7316;7309:12;7270:53;7358:9;7345:23;7377:31;7402:5;7377:31;:::i;:::-;7427:5;-1:-1:-1;7479:2:17;7464:18;;7451:32;;-1:-1:-1;7534:2:17;7519:18;;7506:32;7561:18;7550:30;;7547:50;;;7593:1;7590;7583:12;7547:50;7616;7658:7;7649:6;7638:9;7634:22;7616:50;:::i;:::-;7606:60;;;7718:2;7707:9;7703:18;7690:32;7731:33;7756:7;7731:33;:::i;8013:247::-;8072:6;8125:2;8113:9;8104:7;8100:23;8096:32;8093:52;;;8141:1;8138;8131:12;8093:52;8180:9;8167:23;8199:31;8224:5;8199:31;:::i;8265:416::-;8330:6;8338;8391:2;8379:9;8370:7;8366:23;8362:32;8359:52;;;8407:1;8404;8397:12;8359:52;8446:9;8433:23;8465:31;8490:5;8465:31;:::i;:::-;8515:5;-1:-1:-1;8572:2:17;8557:18;;8544:32;8614:15;;8607:23;8595:36;;8585:64;;8645:1;8642;8635:12;8585:64;8668:7;8658:17;;;8265:416;;;;;:::o;8686:795::-;8781:6;8789;8797;8805;8858:3;8846:9;8837:7;8833:23;8829:33;8826:53;;;8875:1;8872;8865:12;8826:53;8914:9;8901:23;8933:31;8958:5;8933:31;:::i;:::-;8983:5;-1:-1:-1;9040:2:17;9025:18;;9012:32;9053:33;9012:32;9053:33;:::i;:::-;9105:7;-1:-1:-1;9159:2:17;9144:18;;9131:32;;-1:-1:-1;9214:2:17;9199:18;;9186:32;9241:18;9230:30;;9227:50;;;9273:1;9270;9263:12;9227:50;9296:22;;9349:4;9341:13;;9337:27;-1:-1:-1;9327:55:17;;9378:1;9375;9368:12;9327:55;9401:74;9467:7;9462:2;9449:16;9444:2;9440;9436:11;9401:74;:::i;:::-;9391:84;;;8686:795;;;;;;;:::o;9486:469::-;9547:3;9585:5;9579:12;9612:6;9607:3;9600:19;9638:4;9667:2;9662:3;9658:12;9651:19;;9704:2;9697:5;9693:14;9725:1;9735:195;9749:6;9746:1;9743:13;9735:195;;;9814:13;;-1:-1:-1;;;;;9810:39:17;9798:52;;9870:12;;;;9905:15;;;;9846:1;9764:9;9735:195;;9960:285;10155:2;10144:9;10137:21;10118:4;10175:64;10235:2;10224:9;10220:18;10212:6;10175:64;:::i;10250:489::-;10523:2;10512:9;10505:21;10486:4;10549:64;10609:2;10598:9;10594:18;10586:6;10549:64;:::i;:::-;10661:9;10653:6;10649:22;10644:2;10633:9;10629:18;10622:50;10689:44;10726:6;10718;10689:44;:::i;:::-;10681:52;10250:489;-1:-1:-1;;;;;10250:489:17:o;10744:388::-;10812:6;10820;10873:2;10861:9;10852:7;10848:23;10844:32;10841:52;;;10889:1;10886;10879:12;10841:52;10928:9;10915:23;10947:31;10972:5;10947:31;:::i;:::-;10997:5;-1:-1:-1;11054:2:17;11039:18;;11026:32;11067:33;11026:32;11067:33;:::i;11137:380::-;11216:1;11212:12;;;;11259;;;11280:61;;11334:4;11326:6;11322:17;11312:27;;11280:61;11387:2;11379:6;11376:14;11356:18;11353:38;11350:161;;;11433:10;11428:3;11424:20;11421:1;11414:31;11468:4;11465:1;11458:15;11496:4;11493:1;11486:15;11350:161;;11137:380;;;:::o;12762:341::-;12964:2;12946:21;;;13003:2;12983:18;;;12976:30;-1:-1:-1;;;13037:2:17;13022:18;;13015:47;13094:2;13079:18;;12762:341::o;13108:127::-;13169:10;13164:3;13160:20;13157:1;13150:31;13200:4;13197:1;13190:15;13224:4;13221:1;13214:15;13240:413;13442:2;13424:21;;;13481:2;13461:18;;;13454:30;13520:34;13515:2;13500:18;;13493:62;-1:-1:-1;;;13586:2:17;13571:18;;13564:47;13643:3;13628:19;;13240:413::o;14070:352::-;14272:2;14254:21;;;14311:2;14291:18;;;14284:30;14350;14345:2;14330:18;;14323:58;14413:2;14398:18;;14070:352::o;14780:356::-;14982:2;14964:21;;;15001:18;;;14994:30;15060:34;15055:2;15040:18;;15033:62;15127:2;15112:18;;14780:356::o;15141:397::-;15343:2;15325:21;;;15382:2;15362:18;;;15355:30;15421:34;15416:2;15401:18;;15394:62;-1:-1:-1;;;15487:2:17;15472:18;;15465:31;15528:3;15513:19;;15141:397::o;19183:127::-;19244:10;19239:3;19235:20;19232:1;19225:31;19275:4;19272:1;19265:15;19299:4;19296:1;19289:15;19315:125;19355:4;19383:1;19380;19377:8;19374:34;;;19388:18;;:::i;:::-;-1:-1:-1;19425:9:17;;19315:125::o;19445:128::-;19485:3;19516:1;19512:6;19509:1;19506:13;19503:39;;;19522:18;;:::i;:::-;-1:-1:-1;19558:9:17;;19445:128::o;19578:168::-;19618:7;19684:1;19680;19676:6;19672:14;19669:1;19666:21;19661:1;19654:9;19647:17;19643:45;19640:71;;;19691:18;;:::i;:::-;-1:-1:-1;19731:9:17;;19578:168::o;19751:127::-;19812:10;19807:3;19803:20;19800:1;19793:31;19843:4;19840:1;19833:15;19867:4;19864:1;19857:15;19883:120;19923:1;19949;19939:35;;19954:18;;:::i;:::-;-1:-1:-1;19988:9:17;;19883:120::o;20008:990::-;20242:4;20290:2;20279:9;20275:18;20349:1;20345;20340:3;20336:11;20332:19;20324:6;20320:32;20309:9;20302:51;20372:2;20410:6;20405:2;20394:9;20390:18;20383:34;20453:2;20448;20437:9;20433:18;20426:30;20476:6;20511;20505:13;20542:6;20534;20527:22;20580:3;20569:9;20565:19;20558:26;;20643:3;20633:6;20630:1;20626:14;20615:9;20611:30;20607:40;20593:54;;20682:2;20674:6;20670:15;20703:1;20713:256;20727:6;20724:1;20721:13;20713:256;;;20820:3;20816:8;20804:9;20796:6;20792:22;20788:37;20783:3;20776:50;20849:40;20882:6;20873;20867:13;20849:40;:::i;:::-;20839:50;-1:-1:-1;20947:12:17;;;;20912:15;;;;20749:1;20742:9;20713:256;;;-1:-1:-1;20986:6:17;;20008:990;-1:-1:-1;;;;;;;;;20008:990:17:o;21406:135::-;21445:3;-1:-1:-1;;21466:17:17;;21463:43;;;21486:18;;:::i;:::-;-1:-1:-1;21533:1:17;21522:13;;21406:135::o;21546:404::-;21796:1;21792;21787:3;21783:11;21779:19;21771:6;21767:32;21756:9;21749:51;21836:6;21831:2;21820:9;21816:18;21809:34;21879:2;21874;21863:9;21859:18;21852:30;21730:4;21899:45;21940:2;21929:9;21925:18;21917:6;21899:45;:::i;21955:370::-;22112:3;22150:6;22144:13;22166:53;22212:6;22207:3;22200:4;22192:6;22188:17;22166:53;:::i;:::-;22241:16;;;;22266:21;;;-1:-1:-1;22314:4:17;22303:16;;21955:370;-1:-1:-1;21955:370:17:o;22330:414::-;22532:2;22514:21;;;22571:2;22551:18;;;22544:30;22610:34;22605:2;22590:18;;22583:62;-1:-1:-1;;;22676:2:17;22661:18;;22654:48;22734:3;22719:19;;22330:414::o;23167:470::-;23346:3;23384:6;23378:13;23400:53;23446:6;23441:3;23434:4;23426:6;23422:17;23400:53;:::i;:::-;23516:13;;23475:16;;;;23538:57;23516:13;23475:16;23572:4;23560:17;;23538:57;:::i;:::-;23611:20;;23167:470;-1:-1:-1;;;;23167:470:17:o;24057:489::-;-1:-1:-1;;;;;24326:15:17;;;24308:34;;24378:15;;24373:2;24358:18;;24351:43;24425:2;24410:18;;24403:34;;;24473:3;24468:2;24453:18;;24446:31;;;24251:4;;24494:46;;24520:19;;24512:6;24494:46;:::i;:::-;24486:54;24057:489;-1:-1:-1;;;;;;24057:489:17:o;24551:249::-;24620:6;24673:2;24661:9;24652:7;24648:23;24644:32;24641:52;;;24689:1;24686;24679:12;24641:52;24721:9;24715:16;24740:30;24764:5;24740:30;:::i;25221:112::-;25253:1;25279;25269:35;;25284:18;;:::i;:::-;-1:-1:-1;25318:9:17;;25221:112::o;25338:127::-;25399:10;25394:3;25390:20;25387:1;25380:31;25430:4;25427:1;25420:15;25454:4;25451:1;25444:15
Swarm Source
ipfs://69a23ee713a7b78b934e06c5f49ad5c3d2ef8f50ab5b575357187a52c7827ec6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.