Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
5,000 ACTUAL
Holders
64
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 ACTUALLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ActualGenesis
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-12 */ // ############################################################## // ############################################################## // ############################################################## // ######" ""### "" "################################### // #### ##### ------------------------- ## // #### ........ ###### ACTUAL GENESIS ## // ###########" ######## BY NEU × REGIME ## // ########" . ######### ## // ###### .### ######## https://actual.gallery ## // ##### #### "####### @actualgallery ## // #### ##### "###### ## // ### "" ##### https://neuregi.me ## // ### # "### @neuxregime ## // ###. .#####. .### ------------------------- ## // #####........#########......################################## // ############################################################## // ############################################################## // ## "NEVER BEFORE HAS THERE BEEN SO MUCH LIGHT" - M. ## // ############################################################## // ############################################################## // SPDX-License-Identifier: Unlicensed // Sources flattened with hardhat v2.8.0 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Address: insufficient balance'); (bool success, ) = recipient.call{value: amount}(''); require( success, 'Address: unable to send value, recipient may have reverted' ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, 'Address: low-level call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, 'Address: low-level call with value failed' ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, 'Address: insufficient balance for call' ); require(isContract(target), 'Address: call to non-contract'); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, 'Address: low-level static call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), 'Address: static call to non-contract'); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, 'Address: low-level delegate call failed' ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), 'Address: delegate call to non-contract'); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return '0'; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return '0x00'; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = '0'; buffer[1] = 'x'; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, 'Strings: hex length insufficient'); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @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 { _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, 'ERC721: approve to caller'); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @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 {} } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), 'Ownable: caller is not the owner'); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), 'Ownable: new owner is the zero address'); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert('ECDSA: invalid signature'); } else if (error == RecoverError.InvalidSignatureLength) { revert('ECDSA: invalid signature length'); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and( vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if ( uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 ) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked('\x19Ethereum Signed Message:\n32', hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256( abi.encodePacked( '\x19Ethereum Signed Message:\n', Strings.toString(s.length), s ) ); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked('\x19\x01', domainSeparator, structHash)); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( 'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)' ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator( typeHash, hashedName, hashedVersion ); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256( abi.encode( typeHash, nameHash, versionHash, block.chainid, address(this) ) ); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // File contracts/ActualGenesis.sol // ███████████████████████████████ // █████▀╝╙` ``╙▀▀███▓▀▀╝▀█████ // ███ ║████ // ███▓▄▄▄▄▄▄▄▄, ╓▓█████ // ██████████▀` ╓███████ // ███████▀^ ╓▓▄ ████████ // █████▌ ▄███▌ ║███████ // ████╨ ,▓████M ▀██████ // ███ █████╛ ▀█████ // ██M ╨▀▀' ╚████ // ██ ╓█▓ ▀██ // ██ ,▄█████, ██ // ██▓▄ ,▄▄█████████▓▄, ▄▓██ // ███████████████████████████████ // ██▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀██ // ██ █▀▀▀▀▀█ █ ▄▄▄▀▀█ █▀▀▀▀▀█ ██ // ██ █ ███ █ ██▄ █▄▄██ █ ███ █ ██ // ██ █ ▀▀▀ █ ▄██ ▀▄▀▀█ █ ▀▀▀ █ ██ // ██ ▀▀▀▀▀▀▀ ▀ █▄▀ ▀ ▀ ▀▀▀▀▀▀▀ ██ // ██ ▀█▄▄▀▀▀ ▄ ▀ ▀▄▄▄▄ ▀▄█▀█▀ ██ // ██ ▀█▄██ ▀█ █▀ ▄ █▀▀▀▄▀ ▀█▄ ██ // ██ █ ▄▀ ▄▀█▄ ▄▀▄▄ █ █▀▀▄▀▀█▀ ██ // ██ ▄▀█▄▀▄▄ ██▀▀ █▀▄ ██▀█▄ ██ // ██ ▀▀ ▀▀ ▀▀█ ▀ ▀█▀▀▀█▀▀ ██ // ██ █▀▀▀▀▀█ ▄▀ ▄ ▄ █ ▀ █▄▄▄▄ ██ // ██ █ ███ █ ▀▄▀▀▄▀█▄▀███▀▀███ ██ // ██ █ ▀▀▀ █ ▄█ █▀█▀█▀ ▀▄▄█▄█ ██ // ██ ▀▀▀▀▀▀▀ ▀ ▀▀ ▀ ▀▀ ▀▀▀ ██ // ██ ------------------------- ██ // ██ ACTUAL GENESIS ██ // ██ BY NEU × REGIME ██ // ██ ██ // ██ https://actual.gallery ██ // ██ @actualgallery ██ // ██ ██ // ██ https://neuregi.me ██ // ██ @neuxregime ██ // ██ ------------------------- ██ // ██▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄██ // ███████████████████████████████ // ██ "NEVER BEFORE, HAS THERE ██ // ██ BEEN SO MUCH LIGHT" ████████ // ██ -M. ████████████████████████ // ██████████ ENCODING REQUIRES ██ // ██ POWERLINE SUPPORTING FONT ██ // ███████████████████████████████ // ███████████████ JAN. 6, 2022 ██ // ███████████████████████████████ pragma solidity ^0.8.4; error TokenURILocked(); error ArweaveIDLocked(); error SaleIsLocked(); error AllArtworksSold(); error ArtworkAlreadyMinted(); error ArtworkDoesNotExist(); error NewMaxNumberLowerThanCurrentNumberOfMintedArtworks(); error NewMaxNumberGreaterThanTotalSupply(); error AmountMoreThanSetPrice(); error AmountLessThanSetPrice(); error MoreThanOneArtworkExistsAlready(); error SenderIsDifferentFromOwner(); error ArtworkWithProvidedTokenIdDoesNotExist(); error DirectMintDisallowedSignatureMismatch(); error WithdrawalFailed(); contract ActualGenesis is ERC721, EIP712, Ownable { string public tokenBaseURI; bool public tokenURILocked; string public arweaveID; bool public arweaveIDLocked; string public tokenURISuffix = ''; bool public saleLocked; uint256 public totalSupply; uint256 public maxNumberOfArtworks; uint256 public numberOfMintedArtworks; uint256 public pricePerArtwork; uint256 public artistProofs = 10; mapping(uint256 => bool) private tokenIdToIsArtworkPrivate; mapping(uint256 => address) private tokenIdToAddressArtworkIsLentTo; event Purchase(address indexed buyer, uint256 price, uint256 indexed tokenId); event Gift(address indexed receiver, uint256 indexed tokenId); event Lend( address indexed from, address indexed receiver, uint256 indexed tokenId ); event ArweaveIdUpdated(string newArweaveId); constructor( string memory _tokenBaseURI, bool _saleLocked, uint256 _totalSupply, uint256 _maxNumberOfArtworks, uint256 _pricePerArtwork ) ERC721('Actual Genesis', 'ACTUAL') EIP712('Actual Genesis', '1.0.0') { tokenBaseURI = _tokenBaseURI; saleLocked = _saleLocked; totalSupply = _totalSupply; maxNumberOfArtworks = _maxNumberOfArtworks; pricePerArtwork = _pricePerArtwork; } /** * @dev Checks whether th eprovided `tokenId` exists. * * @param tokenId artwork token id * * @return true if artwork exists (has been minted * already), false otherwise */ function exists(uint256 tokenId) public view returns (bool) { return _exists(tokenId); } /** * @dev Base URI for computing {tokenURI}. The resulting * tokenURI for each token will be the concatenation of * the `baseURI` and the `tokenId`. */ function _baseURI() internal view override returns (string memory) { return tokenBaseURI; } /** * @dev Changes `baseURI`, useful when freezing the * contract. * * @notice that value cannot be changed if `tokenURILocked` * is locked. * * @param newBaseURI new URI replacing the old one */ function setTokenBaseURI(string memory newBaseURI) public onlyOwner { if (tokenURILocked == true) revert TokenURILocked(); tokenBaseURI = newBaseURI; } /** * @dev Overriden `tokenURI` with the ability to add a * suffix to URI. This is particularly helpful if * if metadata is "baked" as static .json files. * * @notice calls ERC721 `tokenURI` first and concatenates * the returned value with `tokenURISuffix` * * @param tokenId id of token to retrive URI for */ function tokenURI(uint256 tokenId) public view override returns (string memory) { string memory tokenURIBasename = super.tokenURI(tokenId); return bytes(tokenURIBasename).length > 0 ? string(abi.encodePacked(tokenURIBasename, tokenURISuffix)) : ''; } /** * @dev Lock the `baseURI` preventing any changes to * be committed to it. Useful when freezing the contract. */ function lockTokenURI() public onlyOwner { tokenURILocked = true; } /** * @dev Changes `tokenURISuffix`, useful when freezing the * contract after all assets have been decentralized. * * @param newTokenURISuffix new suffix replacing the old one */ function setTokenURISuffix(string memory newTokenURISuffix) public onlyOwner { tokenURISuffix = newTokenURISuffix; } /** * @dev Changes `arweaveID`, useful when freezing the * contract after all assets have been decentralized. * * @notice that value cannot be changed if `arweaveIDLocked` * is locked. * * @param newArweaveID new ID replacing the old one */ function setArweaveID(string memory newArweaveID) public onlyOwner { if (arweaveIDLocked == true) revert ArweaveIDLocked(); arweaveID = newArweaveID; } /** * @dev Lock the `arweaveID` preventing any changes to be * committed to it. Useful when freezing the contract. */ function lockArweaveID() public onlyOwner { arweaveIDLocked = true; } /** * @dev Collects balance sum and transfers to sender. */ function collectSum() public onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}( '' ); if (success == false) revert WithdrawalFailed(); } /** * @dev Permits lending of an artwork to an arbitrary * address 'addressToLendTo'. This functionality is to be * used in conjuction with setArtworkPublic/Private * * Requirements: * - `tokenID` must be owned by msg.sender * - `tokenID` must be already minted * * @param tokenID id of token that will be lent * @param addressToLendTo address of the borrower * * Emits a {Lend} event. */ function lend(uint256 tokenID, address addressToLendTo) public { if (!_exists(tokenID)) revert ArtworkDoesNotExist(); if (ownerOf(tokenID) != msg.sender) revert SenderIsDifferentFromOwner(); emit Lend(ownerOf(tokenID), addressToLendTo, tokenID); tokenIdToAddressArtworkIsLentTo[tokenID] = addressToLendTo; } /** * @dev Checks the address to which `tokenID` is lent to. * * Requirements: * - `tokenID` must be already minted * * @param tokenID id of token that is lent * @return address of the borrower of `tokenID` */ function getLentToAddress(uint256 tokenID) public view returns (address) { if (!_exists(tokenID)) revert ArtworkDoesNotExist(); return tokenIdToAddressArtworkIsLentTo[tokenID]; } /** * @dev Makes an artwork with `tokenID` public * * Requirements: * - `tokenID` must be owned by msg.sender * - `tokenID` must be already minted * * @param tokenID id of token that will be made public */ function setArtworkPublic(uint256 tokenID) public { setArtworkPrivateState(tokenID, false); } /** * @dev Makes an artwork with `tokenID` private * * Requirements: * - `tokenID` must be owned by msg.sender * - `tokenID` must be already minted * * @param tokenID id of token that will be made private */ function setArtworkPrivate(uint256 tokenID) public { setArtworkPrivateState(tokenID, true); } /** * @dev Checks if an artwork with `tokenID` is public or * private. * * Requirements: * - `tokenID` must be already minted * * @param tokenID id of artwork to check * @return true if private, false if public */ function isArtworkPrivate(uint256 tokenID) public view returns (bool) { if (!_exists(tokenID)) revert ArtworkDoesNotExist(); return tokenIdToIsArtworkPrivate[tokenID]; } /** * @dev Helper function to modify the private/public state * of `tokenID`. * * Requirements: * - `tokenID` must be owned by msg.sender * - `tokenID` must be already minted * * @param tokenID id of token to be made private/public * @param flag true to make private, false to make public */ function setArtworkPrivateState(uint256 tokenID, bool flag) private { if (!_exists(tokenID)) revert ArtworkDoesNotExist(); if (ownerOf(tokenID) != msg.sender) revert SenderIsDifferentFromOwner(); tokenIdToIsArtworkPrivate[tokenID] = flag; } /** * @dev Checks the number of artworks available for minting. * * @return the number of artworks available for minting */ function artworksLeft() public view returns (uint256) { return maxNumberOfArtworks - numberOfMintedArtworks; } /** * @dev Changes the maximum number of artworks available for * minting. * * Requirements: * - new maximum must be < than total number of artworks * - new maximum must be > than artworks minted so far * * @param newMaxNumberOfArtworks new maximum */ function setMaxNumberOfArtworks(uint256 newMaxNumberOfArtworks) public onlyOwner { if (newMaxNumberOfArtworks < numberOfMintedArtworks) revert NewMaxNumberLowerThanCurrentNumberOfMintedArtworks(); if (newMaxNumberOfArtworks >= totalSupply) revert NewMaxNumberGreaterThanTotalSupply(); maxNumberOfArtworks = newMaxNumberOfArtworks; } /** * @dev Modifier ensuring that the minting tx is valid. * * Requirements: * - sale is not locked * - there are artworks left to be minted * - artwork is not already minted * - artwork `tokenId` is valid and <= total supply * - transaction value is exactly same as the base price * * @param newTokenId new token ID that will be minted */ modifier isSaleValid(uint256 newTokenId) { if (msg.sender != owner() && saleLocked == true) revert SaleIsLocked(); if (artworksLeft() == 0) revert AllArtworksSold(); if (_exists(newTokenId)) revert ArtworkAlreadyMinted(); if (newTokenId > totalSupply) revert ArtworkWithProvidedTokenIdDoesNotExist(); if (msg.value < pricePerArtwork && msg.sender != owner()) revert AmountLessThanSetPrice(); if (msg.value > pricePerArtwork && msg.sender != owner()) revert AmountMoreThanSetPrice(); _; } /** * @dev Mints `artistProofs` number of artworks with * `tokenID` starting at 1 (inclusive) and increasing * to `artistProofs` (inclusive). * * Requirements: * - No artworks have been sold/minted already */ function mintArtistProofs() public onlyOwner { if (numberOfMintedArtworks > 0) revert MoreThanOneArtworkExistsAlready(); for (uint256 i = 1; i <= artistProofs; i++) { mintArtistProof(i); } } /** * @dev Helper function to mint artist proofs */ function mintArtistProof(uint256 newTokenId) private isSaleValid(newTokenId) { emit Purchase(msg.sender, msg.value, newTokenId); _mintPiece(newTokenId, msg.sender); } /** * @dev Computes EIP 712 hash of typed structure of * `account` and `tokenID` * * @param account msg.sender of minting transaction * @param newTokenId artwork to be minted * * @return the hash of the fully encoded EIP712 message * for this domain. */ function _hash(address account, uint256 newTokenId) internal view returns (bytes32) { return _hashTypedDataV4( keccak256( abi.encode( keccak256('NFT(uint256 Artwork,address Buyer)'), newTokenId, account ) ) ); } /** * @dev Compares an EIP 712 signed message of * `account`and `newTokenId` with one provided by the `buy` * function (incoming from client/wallet app). * * @param account msg.sender of minting transaction * @param newTokenId artwork to be minted * @param signature provided by the client/wallet * * @return true if contract-computed signature matches the * client/wallet signature, otherwise false, meaning that * the msg.sender is different from the wallet account that * signed the message. */ function matchAddressSigner( address account, uint256 newTokenId, bytes memory signature ) private view returns (bool) { return account == ECDSA.recover(_hash(account, newTokenId), signature); // return _hash(account, newTokenId) == signature; } /** * @dev Mints an artwork with `newTokenId` * * Requirements: * - see isSaleValid(uint256 newTokenId) * - see matchAddressSigner(...) * * @param signature client-provided wallet-signed keccak256 * hash of msg.sender and `newTokenId` * @param newTokenId artwork to be minted * * Emits a {Transfer} and {Purchase} event. */ function buy(bytes memory signature, uint256 newTokenId) public payable isSaleValid(newTokenId) { if (matchAddressSigner(msg.sender, newTokenId, signature) == false) revert DirectMintDisallowedSignatureMismatch(); emit Purchase(msg.sender, msg.value, newTokenId); _mintPiece(newTokenId, msg.sender); } /** * @dev Gifting/airdrop functionality for owner * * Requirements: * - see isSaleValid(uint256 newTokenId) * - see onlyOwner(...) * * @param receiver address that will receive the artwork * @param newTokenId artwork to be minted * * Emits a {Transfer} and {Gift} event. */ function gift(uint256 newTokenId, address receiver) public payable onlyOwner isSaleValid(newTokenId) { emit Gift(receiver, newTokenId); _mintPiece(newTokenId, receiver); } /** * @dev Helper function to mint artworks. Used in gift, buy, *and mintArtistProof. * * By defaults sets: * - the artwork to be public * - lent to the address of the owner (msg.sender) * - increments `numberOfMintedArtworks`, the number of * artworks minted so far * * @param toAddress address that will own the artwork * @param newTokenId artwork to be minted * * Emits a {Transfer} event. */ function _mintPiece(uint256 newTokenId, address toAddress) private { tokenIdToIsArtworkPrivate[newTokenId] = false; tokenIdToAddressArtworkIsLentTo[newTokenId] = msg.sender; numberOfMintedArtworks += 1; _safeMint(toAddress, newTokenId); } /** * @dev Locks public sale * * Requirements: * - see onlyOwner(...) */ function lockSale() public onlyOwner { saleLocked = true; } /** * @dev Unlocks public sale * * Requirements: * - see onlyOwner(...) */ function unlockSale() public onlyOwner { saleLocked = false; } /** * @dev Getter function to determine if public sale is * locked or not. * * @return true if sale is locked, false otherwise */ function getSaleLocked() public view returns (bool) { return saleLocked; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"},{"internalType":"bool","name":"_saleLocked","type":"bool"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"uint256","name":"_maxNumberOfArtworks","type":"uint256"},{"internalType":"uint256","name":"_pricePerArtwork","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllArtworksSold","type":"error"},{"inputs":[],"name":"AmountLessThanSetPrice","type":"error"},{"inputs":[],"name":"AmountMoreThanSetPrice","type":"error"},{"inputs":[],"name":"ArtworkAlreadyMinted","type":"error"},{"inputs":[],"name":"ArtworkDoesNotExist","type":"error"},{"inputs":[],"name":"ArtworkWithProvidedTokenIdDoesNotExist","type":"error"},{"inputs":[],"name":"ArweaveIDLocked","type":"error"},{"inputs":[],"name":"DirectMintDisallowedSignatureMismatch","type":"error"},{"inputs":[],"name":"MoreThanOneArtworkExistsAlready","type":"error"},{"inputs":[],"name":"NewMaxNumberGreaterThanTotalSupply","type":"error"},{"inputs":[],"name":"NewMaxNumberLowerThanCurrentNumberOfMintedArtworks","type":"error"},{"inputs":[],"name":"SaleIsLocked","type":"error"},{"inputs":[],"name":"SenderIsDifferentFromOwner","type":"error"},{"inputs":[],"name":"TokenURILocked","type":"error"},{"inputs":[],"name":"WithdrawalFailed","type":"error"},{"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":false,"internalType":"string","name":"newArweaveId","type":"string"}],"name":"ArweaveIdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Gift","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Lend","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Purchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artistProofs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artworksLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"arweaveID","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"arweaveIDLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"newTokenId","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"collectSum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"getLentToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"gift","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"isArtworkPrivate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"address","name":"addressToLendTo","type":"address"}],"name":"lend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockArweaveID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxNumberOfArtworks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintArtistProofs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfMintedArtworks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerArtwork","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"setArtworkPrivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"setArtworkPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newArweaveID","type":"string"}],"name":"setArweaveID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxNumberOfArtworks","type":"uint256"}],"name":"setMaxNumberOfArtworks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setTokenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newTokenURISuffix","type":"string"}],"name":"setTokenURISuffix","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":[],"name":"tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURILocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURISuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockSale","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610160604081905260006101408190526200001d91600b9162000244565b50600a6011553480156200003057600080fd5b50604051620032cc380380620032cc833981016040819052620000539162000300565b6040518060400160405280600e81526020016d41637475616c2047656e6573697360901b815250604051806040016040528060058152602001640312e302e360dc1b8152506040518060400160405280600e81526020016d41637475616c2047656e6573697360901b815250604051806040016040528060068152602001651050d515505360d21b8152508160009080519060200190620000f692919062000244565b5080516200010c90600190602084019062000244565b5050825160208085019190912083518483012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c0019052805194019390932091935091906080523060601b60c0526101205250620001b79250620001b19150503390565b620001f2565b8451620001cc90600790602088019062000244565b50600c805460ff191694151594909417909355600d91909155600e556010555062000459565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620002529062000406565b90600052602060002090601f016020900481019282620002765760008555620002c1565b82601f106200029157805160ff1916838001178555620002c1565b82800160010185558215620002c1579182015b82811115620002c1578251825591602001919060010190620002a4565b50620002cf929150620002d3565b5090565b5b80821115620002cf5760008155600101620002d4565b80518015158114620002fb57600080fd5b919050565b600080600080600060a0868803121562000318578081fd5b85516001600160401b03808211156200032f578283fd5b818801915088601f83011262000343578283fd5b81518181111562000358576200035862000443565b604051601f8201601f19908116603f0116810190838211818310171562000383576200038362000443565b81604052828152602093508b848487010111156200039f578586fd5b8591505b82821015620003c25784820184015181830185015290830190620003a3565b82821115620003d357858484830101525b9850620003e5915050888201620002ea565b604089015160608a01516080909a0151989b919a5098979650945050505050565b600181811c908216806200041b57607f821691505b602082108114156200043d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160601c60e0516101005161012051612e20620004ac6000396000612406015260006124550152600061243001526000612389015260006123b3015260006123dd0152612e206000f3fe6080604052600436106102885760003560e01c806370a082311161015a578063b1884744116100c1578063dbbc853b1161007a578063dbbc853b14610715578063e136a84d1461072a578063e985e9c514610740578063eb23482714610789578063edbf3fde146107a9578063f2fde38b146107c957600080fd5b8063b188474414610675578063b7f4863114610695578063b88d4fde146106aa578063bdd6a7f3146106ca578063bf26069f146106df578063c87b56dd146106f557600080fd5b80638ef79e91116101135780638ef79e91146105d05780639452cd17146105f057806395d89b4114610606578063a22cb4651461061b578063a9852bfb1461063b578063ac998f451461065b57600080fd5b806370a082311461053b578063715018a61461055b5780637e90e28b1461057057806383a076be1461058a5780638da5cb5b1461059d5780638dea7225146105bb57600080fd5b806323b872dd116101fe5780634ab45d54116101b75780634ab45d54146104915780634e99b800146104b15780634f558e79146104c65780635e5a9e30146104e65780635fb338ae146104fb5780636352211e1461051b57600080fd5b806323b872dd146103ef57806324d788091461040f57806325867d421461042f57806342842e0e1461044457806342b588f514610464578063485ec9941461047c57600080fd5b8063095ea7b311610250578063095ea7b31461034857806312822a751461036857806312c40f9e1461038257806318160ddd146103a25780631d758668146103c65780631f62197c146103d957600080fd5b806301ffc9a71461028d57806305ea13fb146102c257806306fdde03146102d957806307c60dac146102fb578063081812fc14610310575b600080fd5b34801561029957600080fd5b506102ad6102a836600461298c565b6107e9565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d761083b565b005b3480156102e557600080fd5b506102ee6108b9565b6040516102b99190612bce565b34801561030757600080fd5b506102d761094b565b34801561031c57600080fd5b5061033061032b366004612a4d565b610984565b6040516001600160a01b0390911681526020016102b9565b34801561035457600080fd5b506102d7610363366004612963565b610a0c565b34801561037457600080fd5b50600c546102ad9060ff1681565b34801561038e57600080fd5b506102d761039d366004612a4d565b610b22565b3480156103ae57600080fd5b506103b8600d5481565b6040519081526020016102b9565b6102d76103d43660046129c4565b610b96565b3480156103e557600080fd5b506103b8600f5481565b3480156103fb57600080fd5b506102d761040a366004612888565b610d3b565b34801561041b57600080fd5b5061033061042a366004612a4d565b610d6c565b34801561043b57600080fd5b506102d7610db0565b34801561045057600080fd5b506102d761045f366004612888565b610de6565b34801561047057600080fd5b50600c5460ff166102ad565b34801561048857600080fd5b506102ee610e01565b34801561049d57600080fd5b506102d76104ac366004612a07565b610e8f565b3480156104bd57600080fd5b506102ee610ef9565b3480156104d257600080fd5b506102ad6104e1366004612a4d565b610f06565b3480156104f257600080fd5b506102d7610f11565b34801561050757600080fd5b506102d7610516366004612a4d565b610f4a565b34801561052757600080fd5b50610330610536366004612a4d565b610f55565b34801561054757600080fd5b506103b861055636600461283c565b610fcc565b34801561056757600080fd5b506102d7611053565b34801561057c57600080fd5b50600a546102ad9060ff1681565b6102d7610598366004612a65565b611089565b3480156105a957600080fd5b506006546001600160a01b0316610330565b3480156105c757600080fd5b506102d761122f565b3480156105dc57600080fd5b506102d76105eb366004612a07565b611268565b3480156105fc57600080fd5b506103b860105481565b34801561061257600080fd5b506102ee6112ce565b34801561062757600080fd5b506102d7610636366004612929565b6112dd565b34801561064757600080fd5b506102d7610656366004612a07565b6112e8565b34801561066757600080fd5b506008546102ad9060ff1681565b34801561068157600080fd5b506102d7610690366004612a65565b611325565b3480156106a157600080fd5b506103b86113f3565b3480156106b657600080fd5b506102d76106c53660046128c3565b61140a565b3480156106d657600080fd5b506102d7611442565b3480156106eb57600080fd5b506103b8600e5481565b34801561070157600080fd5b506102ee610710366004612a4d565b6114d6565b34801561072157600080fd5b506102ee61152e565b34801561073657600080fd5b506103b860115481565b34801561074c57600080fd5b506102ad61075b366004612856565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561079557600080fd5b506102ad6107a4366004612a4d565b61153b565b3480156107b557600080fd5b506102d76107c4366004612a4d565b611579565b3480156107d557600080fd5b506102d76107e436600461283c565b611584565b60006001600160e01b031982166380ac58cd60e01b148061081a57506001600160e01b03198216635b5e139f60e01b145b8061083557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b0316331461086e5760405162461bcd60e51b815260040161086590612c33565b60405180910390fd5b600f541561088f57604051636bface7960e01b815260040160405180910390fd5b60015b60115481116108b6576108a48161161c565b806108ae81612d63565b915050610892565b50565b6060600080546108c890612d28565b80601f01602080910402602001604051908101604052809291908181526020018280546108f490612d28565b80156109415780601f1061091657610100808354040283529160200191610941565b820191906000526020600020905b81548152906001019060200180831161092457829003601f168201915b5050505050905090565b6006546001600160a01b031633146109755760405162461bcd60e51b815260040161086590612c33565b600c805460ff19166001179055565b600061098f82611799565b6109f05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610865565b506000908152600460205260409020546001600160a01b031690565b6000610a1782610f55565b9050806001600160a01b0316836001600160a01b03161415610a855760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610865565b336001600160a01b0382161480610aa15750610aa1813361075b565b610b135760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610865565b610b1d83836117b6565b505050565b6006546001600160a01b03163314610b4c5760405162461bcd60e51b815260040161086590612c33565b600f54811015610b6f576040516360de586960e01b815260040160405180910390fd5b600d548110610b915760405163358ff9d360e01b815260040160405180910390fd5b600e55565b80610ba96006546001600160a01b031690565b6001600160a01b0316336001600160a01b031614158015610bd15750600c5460ff1615156001145b15610bef576040516307f140fd60e41b815260040160405180910390fd5b610bf76113f3565b610c145760405163338b50d560e11b815260040160405180910390fd5b610c1d81611799565b15610c3b5760405163d7b986a760e01b815260040160405180910390fd5b600d54811115610c5e57604051630a8b60d760e41b815260040160405180910390fd5b60105434108015610c7a57506006546001600160a01b03163314155b15610c98576040516307211edf60e51b815260040160405180910390fd5b60105434118015610cb457506006546001600160a01b03163314155b15610cd257604051638761ad8960e01b815260040160405180910390fd5b610cdd338385611824565b610cfa576040516370bebd4960e01b815260040160405180910390fd5b604051348152829033907f12cb4648cf3058b17ceeb33e579f8b0bc269fe0843f3900b8e24b6c54871703c9060200160405180910390a3610b1d8233611856565b610d4533826118a9565b610d615760405162461bcd60e51b815260040161086590612c68565b610b1d838383611993565b6000610d7782611799565b610d9457604051637e69f04160e11b815260040160405180910390fd5b506000908152601360205260409020546001600160a01b031690565b6006546001600160a01b03163314610dda5760405162461bcd60e51b815260040161086590612c33565b600c805460ff19169055565b610b1d8383836040518060200160405280600081525061140a565b60098054610e0e90612d28565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3a90612d28565b8015610e875780601f10610e5c57610100808354040283529160200191610e87565b820191906000526020600020905b815481529060010190602001808311610e6a57829003601f168201915b505050505081565b6006546001600160a01b03163314610eb95760405162461bcd60e51b815260040161086590612c33565b600a5460ff16151560011415610ee25760405163e42582d960e01b815260040160405180910390fd5b8051610ef59060099060208401906126f2565b5050565b60078054610e0e90612d28565b600061083582611799565b6006546001600160a01b03163314610f3b5760405162461bcd60e51b815260040161086590612c33565b6008805460ff19166001179055565b6108b6816001611b33565b6000818152600260205260408120546001600160a01b0316806108355760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610865565b60006001600160a01b0382166110375760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610865565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461107d5760405162461bcd60e51b815260040161086590612c33565b6110876000611baa565b565b6006546001600160a01b031633146110b35760405162461bcd60e51b815260040161086590612c33565b816110c66006546001600160a01b031690565b6001600160a01b0316336001600160a01b0316141580156110ee5750600c5460ff1615156001145b1561110c576040516307f140fd60e41b815260040160405180910390fd5b6111146113f3565b6111315760405163338b50d560e11b815260040160405180910390fd5b61113a81611799565b156111585760405163d7b986a760e01b815260040160405180910390fd5b600d5481111561117b57604051630a8b60d760e41b815260040160405180910390fd5b6010543410801561119757506006546001600160a01b03163314155b156111b5576040516307211edf60e51b815260040160405180910390fd5b601054341180156111d157506006546001600160a01b03163314155b156111ef57604051638761ad8960e01b815260040160405180910390fd5b60405183906001600160a01b038416907fef33e970549489dd2e75c841935709372f2926e3b90b56af4040186e9b83b3e490600090a3610b1d8383611856565b6006546001600160a01b031633146112595760405162461bcd60e51b815260040161086590612c33565b600a805460ff19166001179055565b6006546001600160a01b031633146112925760405162461bcd60e51b815260040161086590612c33565b60085460ff161515600114156112bb5760405163a16ef1d560e01b815260040160405180910390fd5b8051610ef59060079060208401906126f2565b6060600180546108c890612d28565b610ef5338383611bfc565b6006546001600160a01b031633146113125760405162461bcd60e51b815260040161086590612c33565b8051610ef590600b9060208401906126f2565b61132e82611799565b61134b57604051637e69f04160e11b815260040160405180910390fd5b3361135583610f55565b6001600160a01b03161461137c576040516313e8695b60e11b815260040160405180910390fd5b81816001600160a01b031661139084610f55565b6001600160a01b03167f11dd72a5d477527ee1cbe309212bb368745a98cf1dc3befcac7eef4988a957c260405160405180910390a460009182526013602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000600f54600e546114059190612ce5565b905090565b61141433836118a9565b6114305760405162461bcd60e51b815260040161086590612c68565b61143c84848484611ccb565b50505050565b6006546001600160a01b0316331461146c5760405162461bcd60e51b815260040161086590612c33565b604051600090339047908381818185875af1925050503d80600081146114ae576040519150601f19603f3d011682016040523d82523d6000602084013e6114b3565b606091505b5090915050806108b6576040516327fcd9d160e01b815260040160405180910390fd5b606060006114e383611cfe565b905060008151116115035760405180602001604052806000815250611527565b80600b604051602001611517929190612ae2565b6040516020818303038152906040525b9392505050565b600b8054610e0e90612d28565b600061154682611799565b61156357604051637e69f04160e11b815260040160405180910390fd5b5060009081526012602052604090205460ff1690565b6108b6816000611b33565b6006546001600160a01b031633146115ae5760405162461bcd60e51b815260040161086590612c33565b6001600160a01b0381166116135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610865565b6108b681611baa565b8061162f6006546001600160a01b031690565b6001600160a01b0316336001600160a01b0316141580156116575750600c5460ff1615156001145b15611675576040516307f140fd60e41b815260040160405180910390fd5b61167d6113f3565b61169a5760405163338b50d560e11b815260040160405180910390fd5b6116a381611799565b156116c15760405163d7b986a760e01b815260040160405180910390fd5b600d548111156116e457604051630a8b60d760e41b815260040160405180910390fd5b6010543410801561170057506006546001600160a01b03163314155b1561171e576040516307211edf60e51b815260040160405180910390fd5b6010543411801561173a57506006546001600160a01b03163314155b1561175857604051638761ad8960e01b815260040160405180910390fd5b604051348152829033907f12cb4648cf3058b17ceeb33e579f8b0bc269fe0843f3900b8e24b6c54871703c9060200160405180910390a3610ef58233611856565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117eb82610f55565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118396118338585611db2565b83611e16565b6001600160a01b0316846001600160a01b03161490509392505050565b6000828152601260209081526040808320805460ff191690556013909152812080546001600160a01b03191633179055600f805460019290611899908490612cb9565b90915550610ef590508183611e3a565b60006118b482611799565b6119155760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610865565b600061192083610f55565b9050806001600160a01b0316846001600160a01b0316148061195b5750836001600160a01b031661195084610984565b6001600160a01b0316145b8061198b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166119a682610f55565b6001600160a01b031614611a0e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610865565b6001600160a01b038216611a705760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610865565b611a7b6000826117b6565b6001600160a01b0383166000908152600360205260408120805460019290611aa4908490612ce5565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ad2908490612cb9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611b3c82611799565b611b5957604051637e69f04160e11b815260040160405180910390fd5b33611b6383610f55565b6001600160a01b031614611b8a576040516313e8695b60e11b815260040160405180910390fd5b600091825260126020526040909120805460ff1916911515919091179055565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611c5e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610865565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611cd6848484611993565b611ce284848484611e54565b61143c5760405162461bcd60e51b815260040161086590612be1565b6060611d0982611799565b611d6d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610865565b6000611d77611f61565b90506000815111611d975760405180602001604052806000815250611527565b80611da184611f70565b604051602001611517929190612ab3565b604080517f7b76ebe097c2232d1e5413981327cbbf542564a9f1fe9ad07a725272b00030bb60208201529081018290526001600160a01b0383166060820152600090611527906080016040516020818303038152906040528051906020012061208a565b6000806000611e2585856120d8565b91509150611e3281612148565b509392505050565b610ef5828260405180602001604052806000815250612349565b60006001600160a01b0384163b15611f5657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e98903390899088908890600401612b91565b602060405180830381600087803b158015611eb257600080fd5b505af1925050508015611ee2575060408051601f3d908101601f19168201909252611edf918101906129a8565b60015b611f3c573d808015611f10576040519150601f19603f3d011682016040523d82523d6000602084013e611f15565b606091505b508051611f345760405162461bcd60e51b815260040161086590612be1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061198b565b506001949350505050565b6060600780546108c890612d28565b606081611f945750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fbe5780611fa881612d63565b9150611fb79050600a83612cd1565b9150611f98565b60008167ffffffffffffffff811115611fe757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612011576020820181803683370190505b5090505b841561198b57612026600183612ce5565b9150612033600a86612d7e565b61203e906030612cb9565b60f81b81838151811061206157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612083600a86612cd1565b9450612015565b600061083561209761237c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008082516041141561210f5760208301516040840151606085015160001a612103878285856124a3565b94509450505050612141565b825160401415612139576020830151604084015161212e868383612590565b935093505050612141565b506000905060025b9250929050565b600081600481111561216a57634e487b7160e01b600052602160045260246000fd5b14156121735750565b600181600481111561219557634e487b7160e01b600052602160045260246000fd5b14156121e35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610865565b600281600481111561220557634e487b7160e01b600052602160045260246000fd5b14156122535760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610865565b600381600481111561227557634e487b7160e01b600052602160045260246000fd5b14156122ce5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610865565b60048160048111156122f057634e487b7160e01b600052602160045260246000fd5b14156108b65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610865565b61235383836125bf565b6123606000848484611e54565b610b1d5760405162461bcd60e51b815260040161086590612be1565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156123d557507f000000000000000000000000000000000000000000000000000000000000000046145b156123ff57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156124da5750600090506003612587565b8460ff16601b141580156124f257508460ff16601c14155b156125035750600090506004612587565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612557573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661258057600060019250925050612587565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016125b1878288856124a3565b935093505050935093915050565b6001600160a01b0382166126155760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610865565b61261e81611799565b1561266b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610865565b6001600160a01b0382166000908152600360205260408120805460019290612694908490612cb9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126fe90612d28565b90600052602060002090601f0160209004810192826127205760008555612766565b82601f1061273957805160ff1916838001178555612766565b82800160010185558215612766579182015b8281111561276657825182559160200191906001019061274b565b50612772929150612776565b5090565b5b808211156127725760008155600101612777565b600067ffffffffffffffff808411156127a6576127a6612dbe565b604051601f8501601f19908116603f011681019082821181831017156127ce576127ce612dbe565b816040528093508581528686860111156127e757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461281857600080fd5b919050565b600082601f83011261282d578081fd5b6115278383356020850161278b565b60006020828403121561284d578081fd5b61152782612801565b60008060408385031215612868578081fd5b61287183612801565b915061287f60208401612801565b90509250929050565b60008060006060848603121561289c578081fd5b6128a584612801565b92506128b360208501612801565b9150604084013590509250925092565b600080600080608085870312156128d8578081fd5b6128e185612801565b93506128ef60208601612801565b925060408501359150606085013567ffffffffffffffff811115612911578182fd5b61291d8782880161281d565b91505092959194509250565b6000806040838503121561293b578182fd5b61294483612801565b915060208301358015158114612958578182fd5b809150509250929050565b60008060408385031215612975578182fd5b61297e83612801565b946020939093013593505050565b60006020828403121561299d578081fd5b813561152781612dd4565b6000602082840312156129b9578081fd5b815161152781612dd4565b600080604083850312156129d6578182fd5b823567ffffffffffffffff8111156129ec578283fd5b6129f88582860161281d565b95602094909401359450505050565b600060208284031215612a18578081fd5b813567ffffffffffffffff811115612a2e578182fd5b8201601f81018413612a3e578182fd5b61198b8482356020840161278b565b600060208284031215612a5e578081fd5b5035919050565b60008060408385031215612a77578182fd5b8235915061287f60208401612801565b60008151808452612a9f816020860160208601612cfc565b601f01601f19169290920160200192915050565b60008351612ac5818460208801612cfc565b835190830190612ad9818360208801612cfc565b01949350505050565b600083516020612af58285838901612cfc565b8454918401918390600181811c9080831680612b1257607f831692505b858310811415612b3057634e487b7160e01b88526022600452602488fd5b808015612b445760018114612b5557612b81565b60ff19851688528388019550612b81565b60008b815260209020895b85811015612b795781548a820152908401908801612b60565b505083880195505b50939a9950505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bc490830184612a87565b9695505050505050565b6020815260006115276020830184612a87565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612ccc57612ccc612d92565b500190565b600082612ce057612ce0612da8565b500490565b600082821015612cf757612cf7612d92565b500390565b60005b83811015612d17578181015183820152602001612cff565b8381111561143c5750506000910152565b600181811c90821680612d3c57607f821691505b60208210811415612d5d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d7757612d77612d92565b5060010190565b600082612d8d57612d8d612da8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108b657600080fdfea2646970667358221220800119f736278e36e67325cdfc629e6a4d2071dea7eb8fc0466406af58b12d7564736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000000000000000002068747470733a2f2f646170702e61637475616c2e67616c6c6572792f6170692f
Deployed Bytecode
0x6080604052600436106102885760003560e01c806370a082311161015a578063b1884744116100c1578063dbbc853b1161007a578063dbbc853b14610715578063e136a84d1461072a578063e985e9c514610740578063eb23482714610789578063edbf3fde146107a9578063f2fde38b146107c957600080fd5b8063b188474414610675578063b7f4863114610695578063b88d4fde146106aa578063bdd6a7f3146106ca578063bf26069f146106df578063c87b56dd146106f557600080fd5b80638ef79e91116101135780638ef79e91146105d05780639452cd17146105f057806395d89b4114610606578063a22cb4651461061b578063a9852bfb1461063b578063ac998f451461065b57600080fd5b806370a082311461053b578063715018a61461055b5780637e90e28b1461057057806383a076be1461058a5780638da5cb5b1461059d5780638dea7225146105bb57600080fd5b806323b872dd116101fe5780634ab45d54116101b75780634ab45d54146104915780634e99b800146104b15780634f558e79146104c65780635e5a9e30146104e65780635fb338ae146104fb5780636352211e1461051b57600080fd5b806323b872dd146103ef57806324d788091461040f57806325867d421461042f57806342842e0e1461044457806342b588f514610464578063485ec9941461047c57600080fd5b8063095ea7b311610250578063095ea7b31461034857806312822a751461036857806312c40f9e1461038257806318160ddd146103a25780631d758668146103c65780631f62197c146103d957600080fd5b806301ffc9a71461028d57806305ea13fb146102c257806306fdde03146102d957806307c60dac146102fb578063081812fc14610310575b600080fd5b34801561029957600080fd5b506102ad6102a836600461298c565b6107e9565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d761083b565b005b3480156102e557600080fd5b506102ee6108b9565b6040516102b99190612bce565b34801561030757600080fd5b506102d761094b565b34801561031c57600080fd5b5061033061032b366004612a4d565b610984565b6040516001600160a01b0390911681526020016102b9565b34801561035457600080fd5b506102d7610363366004612963565b610a0c565b34801561037457600080fd5b50600c546102ad9060ff1681565b34801561038e57600080fd5b506102d761039d366004612a4d565b610b22565b3480156103ae57600080fd5b506103b8600d5481565b6040519081526020016102b9565b6102d76103d43660046129c4565b610b96565b3480156103e557600080fd5b506103b8600f5481565b3480156103fb57600080fd5b506102d761040a366004612888565b610d3b565b34801561041b57600080fd5b5061033061042a366004612a4d565b610d6c565b34801561043b57600080fd5b506102d7610db0565b34801561045057600080fd5b506102d761045f366004612888565b610de6565b34801561047057600080fd5b50600c5460ff166102ad565b34801561048857600080fd5b506102ee610e01565b34801561049d57600080fd5b506102d76104ac366004612a07565b610e8f565b3480156104bd57600080fd5b506102ee610ef9565b3480156104d257600080fd5b506102ad6104e1366004612a4d565b610f06565b3480156104f257600080fd5b506102d7610f11565b34801561050757600080fd5b506102d7610516366004612a4d565b610f4a565b34801561052757600080fd5b50610330610536366004612a4d565b610f55565b34801561054757600080fd5b506103b861055636600461283c565b610fcc565b34801561056757600080fd5b506102d7611053565b34801561057c57600080fd5b50600a546102ad9060ff1681565b6102d7610598366004612a65565b611089565b3480156105a957600080fd5b506006546001600160a01b0316610330565b3480156105c757600080fd5b506102d761122f565b3480156105dc57600080fd5b506102d76105eb366004612a07565b611268565b3480156105fc57600080fd5b506103b860105481565b34801561061257600080fd5b506102ee6112ce565b34801561062757600080fd5b506102d7610636366004612929565b6112dd565b34801561064757600080fd5b506102d7610656366004612a07565b6112e8565b34801561066757600080fd5b506008546102ad9060ff1681565b34801561068157600080fd5b506102d7610690366004612a65565b611325565b3480156106a157600080fd5b506103b86113f3565b3480156106b657600080fd5b506102d76106c53660046128c3565b61140a565b3480156106d657600080fd5b506102d7611442565b3480156106eb57600080fd5b506103b8600e5481565b34801561070157600080fd5b506102ee610710366004612a4d565b6114d6565b34801561072157600080fd5b506102ee61152e565b34801561073657600080fd5b506103b860115481565b34801561074c57600080fd5b506102ad61075b366004612856565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561079557600080fd5b506102ad6107a4366004612a4d565b61153b565b3480156107b557600080fd5b506102d76107c4366004612a4d565b611579565b3480156107d557600080fd5b506102d76107e436600461283c565b611584565b60006001600160e01b031982166380ac58cd60e01b148061081a57506001600160e01b03198216635b5e139f60e01b145b8061083557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b0316331461086e5760405162461bcd60e51b815260040161086590612c33565b60405180910390fd5b600f541561088f57604051636bface7960e01b815260040160405180910390fd5b60015b60115481116108b6576108a48161161c565b806108ae81612d63565b915050610892565b50565b6060600080546108c890612d28565b80601f01602080910402602001604051908101604052809291908181526020018280546108f490612d28565b80156109415780601f1061091657610100808354040283529160200191610941565b820191906000526020600020905b81548152906001019060200180831161092457829003601f168201915b5050505050905090565b6006546001600160a01b031633146109755760405162461bcd60e51b815260040161086590612c33565b600c805460ff19166001179055565b600061098f82611799565b6109f05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610865565b506000908152600460205260409020546001600160a01b031690565b6000610a1782610f55565b9050806001600160a01b0316836001600160a01b03161415610a855760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610865565b336001600160a01b0382161480610aa15750610aa1813361075b565b610b135760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610865565b610b1d83836117b6565b505050565b6006546001600160a01b03163314610b4c5760405162461bcd60e51b815260040161086590612c33565b600f54811015610b6f576040516360de586960e01b815260040160405180910390fd5b600d548110610b915760405163358ff9d360e01b815260040160405180910390fd5b600e55565b80610ba96006546001600160a01b031690565b6001600160a01b0316336001600160a01b031614158015610bd15750600c5460ff1615156001145b15610bef576040516307f140fd60e41b815260040160405180910390fd5b610bf76113f3565b610c145760405163338b50d560e11b815260040160405180910390fd5b610c1d81611799565b15610c3b5760405163d7b986a760e01b815260040160405180910390fd5b600d54811115610c5e57604051630a8b60d760e41b815260040160405180910390fd5b60105434108015610c7a57506006546001600160a01b03163314155b15610c98576040516307211edf60e51b815260040160405180910390fd5b60105434118015610cb457506006546001600160a01b03163314155b15610cd257604051638761ad8960e01b815260040160405180910390fd5b610cdd338385611824565b610cfa576040516370bebd4960e01b815260040160405180910390fd5b604051348152829033907f12cb4648cf3058b17ceeb33e579f8b0bc269fe0843f3900b8e24b6c54871703c9060200160405180910390a3610b1d8233611856565b610d4533826118a9565b610d615760405162461bcd60e51b815260040161086590612c68565b610b1d838383611993565b6000610d7782611799565b610d9457604051637e69f04160e11b815260040160405180910390fd5b506000908152601360205260409020546001600160a01b031690565b6006546001600160a01b03163314610dda5760405162461bcd60e51b815260040161086590612c33565b600c805460ff19169055565b610b1d8383836040518060200160405280600081525061140a565b60098054610e0e90612d28565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3a90612d28565b8015610e875780601f10610e5c57610100808354040283529160200191610e87565b820191906000526020600020905b815481529060010190602001808311610e6a57829003601f168201915b505050505081565b6006546001600160a01b03163314610eb95760405162461bcd60e51b815260040161086590612c33565b600a5460ff16151560011415610ee25760405163e42582d960e01b815260040160405180910390fd5b8051610ef59060099060208401906126f2565b5050565b60078054610e0e90612d28565b600061083582611799565b6006546001600160a01b03163314610f3b5760405162461bcd60e51b815260040161086590612c33565b6008805460ff19166001179055565b6108b6816001611b33565b6000818152600260205260408120546001600160a01b0316806108355760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610865565b60006001600160a01b0382166110375760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610865565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461107d5760405162461bcd60e51b815260040161086590612c33565b6110876000611baa565b565b6006546001600160a01b031633146110b35760405162461bcd60e51b815260040161086590612c33565b816110c66006546001600160a01b031690565b6001600160a01b0316336001600160a01b0316141580156110ee5750600c5460ff1615156001145b1561110c576040516307f140fd60e41b815260040160405180910390fd5b6111146113f3565b6111315760405163338b50d560e11b815260040160405180910390fd5b61113a81611799565b156111585760405163d7b986a760e01b815260040160405180910390fd5b600d5481111561117b57604051630a8b60d760e41b815260040160405180910390fd5b6010543410801561119757506006546001600160a01b03163314155b156111b5576040516307211edf60e51b815260040160405180910390fd5b601054341180156111d157506006546001600160a01b03163314155b156111ef57604051638761ad8960e01b815260040160405180910390fd5b60405183906001600160a01b038416907fef33e970549489dd2e75c841935709372f2926e3b90b56af4040186e9b83b3e490600090a3610b1d8383611856565b6006546001600160a01b031633146112595760405162461bcd60e51b815260040161086590612c33565b600a805460ff19166001179055565b6006546001600160a01b031633146112925760405162461bcd60e51b815260040161086590612c33565b60085460ff161515600114156112bb5760405163a16ef1d560e01b815260040160405180910390fd5b8051610ef59060079060208401906126f2565b6060600180546108c890612d28565b610ef5338383611bfc565b6006546001600160a01b031633146113125760405162461bcd60e51b815260040161086590612c33565b8051610ef590600b9060208401906126f2565b61132e82611799565b61134b57604051637e69f04160e11b815260040160405180910390fd5b3361135583610f55565b6001600160a01b03161461137c576040516313e8695b60e11b815260040160405180910390fd5b81816001600160a01b031661139084610f55565b6001600160a01b03167f11dd72a5d477527ee1cbe309212bb368745a98cf1dc3befcac7eef4988a957c260405160405180910390a460009182526013602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000600f54600e546114059190612ce5565b905090565b61141433836118a9565b6114305760405162461bcd60e51b815260040161086590612c68565b61143c84848484611ccb565b50505050565b6006546001600160a01b0316331461146c5760405162461bcd60e51b815260040161086590612c33565b604051600090339047908381818185875af1925050503d80600081146114ae576040519150601f19603f3d011682016040523d82523d6000602084013e6114b3565b606091505b5090915050806108b6576040516327fcd9d160e01b815260040160405180910390fd5b606060006114e383611cfe565b905060008151116115035760405180602001604052806000815250611527565b80600b604051602001611517929190612ae2565b6040516020818303038152906040525b9392505050565b600b8054610e0e90612d28565b600061154682611799565b61156357604051637e69f04160e11b815260040160405180910390fd5b5060009081526012602052604090205460ff1690565b6108b6816000611b33565b6006546001600160a01b031633146115ae5760405162461bcd60e51b815260040161086590612c33565b6001600160a01b0381166116135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610865565b6108b681611baa565b8061162f6006546001600160a01b031690565b6001600160a01b0316336001600160a01b0316141580156116575750600c5460ff1615156001145b15611675576040516307f140fd60e41b815260040160405180910390fd5b61167d6113f3565b61169a5760405163338b50d560e11b815260040160405180910390fd5b6116a381611799565b156116c15760405163d7b986a760e01b815260040160405180910390fd5b600d548111156116e457604051630a8b60d760e41b815260040160405180910390fd5b6010543410801561170057506006546001600160a01b03163314155b1561171e576040516307211edf60e51b815260040160405180910390fd5b6010543411801561173a57506006546001600160a01b03163314155b1561175857604051638761ad8960e01b815260040160405180910390fd5b604051348152829033907f12cb4648cf3058b17ceeb33e579f8b0bc269fe0843f3900b8e24b6c54871703c9060200160405180910390a3610ef58233611856565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117eb82610f55565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118396118338585611db2565b83611e16565b6001600160a01b0316846001600160a01b03161490509392505050565b6000828152601260209081526040808320805460ff191690556013909152812080546001600160a01b03191633179055600f805460019290611899908490612cb9565b90915550610ef590508183611e3a565b60006118b482611799565b6119155760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610865565b600061192083610f55565b9050806001600160a01b0316846001600160a01b0316148061195b5750836001600160a01b031661195084610984565b6001600160a01b0316145b8061198b57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166119a682610f55565b6001600160a01b031614611a0e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610865565b6001600160a01b038216611a705760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610865565b611a7b6000826117b6565b6001600160a01b0383166000908152600360205260408120805460019290611aa4908490612ce5565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ad2908490612cb9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611b3c82611799565b611b5957604051637e69f04160e11b815260040160405180910390fd5b33611b6383610f55565b6001600160a01b031614611b8a576040516313e8695b60e11b815260040160405180910390fd5b600091825260126020526040909120805460ff1916911515919091179055565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611c5e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610865565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611cd6848484611993565b611ce284848484611e54565b61143c5760405162461bcd60e51b815260040161086590612be1565b6060611d0982611799565b611d6d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610865565b6000611d77611f61565b90506000815111611d975760405180602001604052806000815250611527565b80611da184611f70565b604051602001611517929190612ab3565b604080517f7b76ebe097c2232d1e5413981327cbbf542564a9f1fe9ad07a725272b00030bb60208201529081018290526001600160a01b0383166060820152600090611527906080016040516020818303038152906040528051906020012061208a565b6000806000611e2585856120d8565b91509150611e3281612148565b509392505050565b610ef5828260405180602001604052806000815250612349565b60006001600160a01b0384163b15611f5657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e98903390899088908890600401612b91565b602060405180830381600087803b158015611eb257600080fd5b505af1925050508015611ee2575060408051601f3d908101601f19168201909252611edf918101906129a8565b60015b611f3c573d808015611f10576040519150601f19603f3d011682016040523d82523d6000602084013e611f15565b606091505b508051611f345760405162461bcd60e51b815260040161086590612be1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061198b565b506001949350505050565b6060600780546108c890612d28565b606081611f945750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fbe5780611fa881612d63565b9150611fb79050600a83612cd1565b9150611f98565b60008167ffffffffffffffff811115611fe757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612011576020820181803683370190505b5090505b841561198b57612026600183612ce5565b9150612033600a86612d7e565b61203e906030612cb9565b60f81b81838151811061206157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612083600a86612cd1565b9450612015565b600061083561209761237c565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008082516041141561210f5760208301516040840151606085015160001a612103878285856124a3565b94509450505050612141565b825160401415612139576020830151604084015161212e868383612590565b935093505050612141565b506000905060025b9250929050565b600081600481111561216a57634e487b7160e01b600052602160045260246000fd5b14156121735750565b600181600481111561219557634e487b7160e01b600052602160045260246000fd5b14156121e35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610865565b600281600481111561220557634e487b7160e01b600052602160045260246000fd5b14156122535760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610865565b600381600481111561227557634e487b7160e01b600052602160045260246000fd5b14156122ce5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610865565b60048160048111156122f057634e487b7160e01b600052602160045260246000fd5b14156108b65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610865565b61235383836125bf565b6123606000848484611e54565b610b1d5760405162461bcd60e51b815260040161086590612be1565b6000306001600160a01b037f00000000000000000000000034ff3cf6c2615a41de98be7c606f0389f034124f161480156123d557507f000000000000000000000000000000000000000000000000000000000000000146145b156123ff57507fc366cfc3a4a5190c9d25a29685ca93a0c0d66a267dbcef5d200da46315c8bf9990565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f705ecd3f3e0d5503a81837f9de3e55e604851ae564716d30d0d588f7cab99676828401527f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c60608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156124da5750600090506003612587565b8460ff16601b141580156124f257508460ff16601c14155b156125035750600090506004612587565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612557573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661258057600060019250925050612587565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016125b1878288856124a3565b935093505050935093915050565b6001600160a01b0382166126155760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610865565b61261e81611799565b1561266b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610865565b6001600160a01b0382166000908152600360205260408120805460019290612694908490612cb9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546126fe90612d28565b90600052602060002090601f0160209004810192826127205760008555612766565b82601f1061273957805160ff1916838001178555612766565b82800160010185558215612766579182015b8281111561276657825182559160200191906001019061274b565b50612772929150612776565b5090565b5b808211156127725760008155600101612777565b600067ffffffffffffffff808411156127a6576127a6612dbe565b604051601f8501601f19908116603f011681019082821181831017156127ce576127ce612dbe565b816040528093508581528686860111156127e757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461281857600080fd5b919050565b600082601f83011261282d578081fd5b6115278383356020850161278b565b60006020828403121561284d578081fd5b61152782612801565b60008060408385031215612868578081fd5b61287183612801565b915061287f60208401612801565b90509250929050565b60008060006060848603121561289c578081fd5b6128a584612801565b92506128b360208501612801565b9150604084013590509250925092565b600080600080608085870312156128d8578081fd5b6128e185612801565b93506128ef60208601612801565b925060408501359150606085013567ffffffffffffffff811115612911578182fd5b61291d8782880161281d565b91505092959194509250565b6000806040838503121561293b578182fd5b61294483612801565b915060208301358015158114612958578182fd5b809150509250929050565b60008060408385031215612975578182fd5b61297e83612801565b946020939093013593505050565b60006020828403121561299d578081fd5b813561152781612dd4565b6000602082840312156129b9578081fd5b815161152781612dd4565b600080604083850312156129d6578182fd5b823567ffffffffffffffff8111156129ec578283fd5b6129f88582860161281d565b95602094909401359450505050565b600060208284031215612a18578081fd5b813567ffffffffffffffff811115612a2e578182fd5b8201601f81018413612a3e578182fd5b61198b8482356020840161278b565b600060208284031215612a5e578081fd5b5035919050565b60008060408385031215612a77578182fd5b8235915061287f60208401612801565b60008151808452612a9f816020860160208601612cfc565b601f01601f19169290920160200192915050565b60008351612ac5818460208801612cfc565b835190830190612ad9818360208801612cfc565b01949350505050565b600083516020612af58285838901612cfc565b8454918401918390600181811c9080831680612b1257607f831692505b858310811415612b3057634e487b7160e01b88526022600452602488fd5b808015612b445760018114612b5557612b81565b60ff19851688528388019550612b81565b60008b815260209020895b85811015612b795781548a820152908401908801612b60565b505083880195505b50939a9950505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bc490830184612a87565b9695505050505050565b6020815260006115276020830184612a87565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612ccc57612ccc612d92565b500190565b600082612ce057612ce0612da8565b500490565b600082821015612cf757612cf7612d92565b500390565b60005b83811015612d17578181015183820152602001612cff565b8381111561143c5750506000910152565b600181811c90821680612d3c57607f821691505b60208210811415612d5d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d7757612d77612d92565b5060010190565b600082612d8d57612d8d612da8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108b657600080fdfea2646970667358221220800119f736278e36e67325cdfc629e6a4d2071dea7eb8fc0466406af58b12d7564736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000000000000000002068747470733a2f2f646170702e61637475616c2e67616c6c6572792f6170692f
-----Decoded View---------------
Arg [0] : _tokenBaseURI (string): https://dapp.actual.gallery/api/
Arg [1] : _saleLocked (bool): True
Arg [2] : _totalSupply (uint256): 5000
Arg [3] : _maxNumberOfArtworks (uint256): 2000
Arg [4] : _pricePerArtwork (uint256): 125000000000000000
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [3] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [4] : 00000000000000000000000000000000000000000000000001bc16d674ec8000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [6] : 68747470733a2f2f646170702e61637475616c2e67616c6c6572792f6170692f
Deployed Bytecode Sourcemap
53771:14051:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21835:309;;;;;;;;;;-1:-1:-1;21835:309:0;;;;;:::i;:::-;;:::i;:::-;;;8523:14:1;;8516:22;8498:41;;8486:2;8471:18;21835:309:0;;;;;;;;63320:215;;;;;;;;;;;;;:::i;:::-;;22792:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;67337:67::-;;;;;;;;;;;;;:::i;24315:239::-;;;;;;;;;;-1:-1:-1;24315:239:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7821:32:1;;;7803:51;;7791:2;7776:18;24315:239:0;7758:102:1;23880:377:0;;;;;;;;;;-1:-1:-1;23880:377:0;;;;;:::i;:::-;;:::i;53992:22::-;;;;;;;;;;-1:-1:-1;53992:22:0;;;;;;;;61744:379;;;;;;;;;;-1:-1:-1;61744:379:0;;;;;:::i;:::-;;:::i;54019:26::-;;;;;;;;;;;;;;;;;;;18068:25:1;;;18056:2;18041:18;54019:26:0;18023:76:1;65628:346:0;;;;;;:::i;:::-;;:::i;54089:37::-;;;;;;;;;;;;;;;;25093:332;;;;;;;;;;-1:-1:-1;25093:332:0;;;;;:::i;:::-;;:::i;59248:191::-;;;;;;;;;;-1:-1:-1;59248:191:0;;;;;:::i;:::-;;:::i;67508:70::-;;;;;;;;;;;;;:::i;25488:165::-;;;;;;;;;;-1:-1:-1;25488:165:0;;;;;:::i;:::-;;:::i;67737:82::-;;;;;;;;;;-1:-1:-1;67803:10:0;;;;67737:82;;53890:23;;;;;;;;;;;;;:::i;57561:164::-;;;;;;;;;;-1:-1:-1;57561:164:0;;;;;:::i;:::-;;:::i;53826:26::-;;;;;;;;;;;;;:::i;55292:96::-;;;;;;;;;;-1:-1:-1;55292:96:0;;;;;:::i;:::-;;:::i;56871:75::-;;;;;;;;;;;;;:::i;60036:101::-;;;;;;;;;;-1:-1:-1;60036:101:0;;;;;:::i;:::-;;:::i;22480:253::-;;;;;;;;;;-1:-1:-1;22480:253:0;;;;;:::i;:::-;;:::i;22200:226::-;;;;;;;;;;-1:-1:-1;22200:226:0;;;;;:::i;:::-;;:::i;35352:97::-;;;;;;;;;;;;;:::i;53918:27::-;;;;;;;;;;-1:-1:-1;53918:27:0;;;;;;;;66302:207;;;;;;:::i;:::-;;:::i;34741:81::-;;;;;;;;;;-1:-1:-1;34810:6:0;;-1:-1:-1;;;;;34810:6:0;34741:81;;57864:77;;;;;;;;;;;;;:::i;55902:164::-;;;;;;;;;;-1:-1:-1;55902:164:0;;;;;:::i;:::-;;:::i;54131:30::-;;;;;;;;;;;;;;;;22947:98;;;;;;;;;;;;;:::i;24618:167::-;;;;;;;;;;-1:-1:-1;24618:167:0;;;;;:::i;:::-;;:::i;57155:124::-;;;;;;;;;;-1:-1:-1;57155:124:0;;;;;:::i;:::-;;:::i;53857:26::-;;;;;;;;;;-1:-1:-1;53857:26:0;;;;;;;;58665:332;;;;;;;;;;-1:-1:-1;58665:332:0;;;;;:::i;:::-;;:::i;61328:118::-;;;;;;;;;;;;;:::i;25716:321::-;;;;;;;;;;-1:-1:-1;25716:321:0;;;;;:::i;:::-;;:::i;58018:197::-;;;;;;;;;;;;;:::i;54050:34::-;;;;;;;;;;;;;;;;56421:313;;;;;;;;;;-1:-1:-1;56421:313:0;;;;;:::i;:::-;;:::i;53952:33::-;;;;;;;;;;;;;:::i;54166:32::-;;;;;;;;;;;;;;;;24848:186;;;;;;;;;;-1:-1:-1;24848:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;24993:25:0;;;24970:4;24993:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24848:186;60396:182;;;;;;;;;;-1:-1:-1;60396:182:0;;;;;:::i;:::-;;:::i;59686:101::-;;;;;;;;;;-1:-1:-1;59686:101:0;;;;;:::i;:::-;;:::i;35594:191::-;;;;;;;;;;-1:-1:-1;35594:191:0;;;;;:::i;:::-;;:::i;21835:309::-;21962:4;-1:-1:-1;;;;;;21992:40:0;;-1:-1:-1;;;21992:40:0;;:99;;-1:-1:-1;;;;;;;22043:48:0;;-1:-1:-1;;;22043:48:0;21992:99;:146;;;-1:-1:-1;;;;;;;;;;20454:40:0;;;22102:36;21978:160;21835:309;-1:-1:-1;;21835:309:0:o;63320:215::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;;;;;;;;;63376:22:::1;::::0;:26;63372:72:::1;;63411:33;;-1:-1:-1::0;;;63411:33:0::1;;;;;;;;;;;63372:72;63468:1;63451:79;63476:12;;63471:1;:17;63451:79;;63504:18;63520:1;63504:15;:18::i;:::-;63490:3:::0;::::1;::::0;::::1;:::i;:::-;;;;63451:79;;;;63320:215::o:0;22792:94::-;22846:13;22875:5;22868:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22792:94;:::o;67337:67::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;67381:10:::1;:17:::0;;-1:-1:-1;;67381:17:0::1;67394:4;67381:17;::::0;;67337:67::o;24315:239::-;24416:7;24443:16;24451:7;24443;:16::i;:::-;24435:73;;;;-1:-1:-1;;;24435:73:0;;15704:2:1;24435:73:0;;;15686:21:1;15743:2;15723:18;;;15716:30;15782:34;15762:18;;;15755:62;-1:-1:-1;;;15833:18:1;;;15826:42;15885:19;;24435:73:0;15676:234:1;24435:73:0;-1:-1:-1;24524:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24524:24:0;;24315:239::o;23880:377::-;23957:13;23973:23;23988:7;23973:14;:23::i;:::-;23957:39;;24017:5;-1:-1:-1;;;;;24011:11:0;:2;-1:-1:-1;;;;;24011:11:0;;;24003:57;;;;-1:-1:-1;;;24003:57:0;;17304:2:1;24003:57:0;;;17286:21:1;17343:2;17323:18;;;17316:30;17382:34;17362:18;;;17355:62;-1:-1:-1;;;17433:18:1;;;17426:31;17474:19;;24003:57:0;17276:223:1;24003:57:0;17394:10;-1:-1:-1;;;;;24085:21:0;;;;:62;;-1:-1:-1;24110:37:0;24127:5;17394:10;24848:186;:::i;24110:37::-;24069:152;;;;-1:-1:-1;;;24069:152:0;;13694:2:1;24069:152:0;;;13676:21:1;13733:2;13713:18;;;13706:30;13772:34;13752:18;;;13745:62;13843:26;13823:18;;;13816:54;13887:19;;24069:152:0;13666:246:1;24069:152:0;24230:21;24239:2;24243:7;24230:8;:21::i;:::-;23880:377;;;:::o;61744:379::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;61874:22:::1;;61849;:47;61845:119;;;61912:52;;-1:-1:-1::0;;;61912:52:0::1;;;;;;;;;;;61845:119;62001:11;;61975:22;:37;61971:93;;62028:36;;-1:-1:-1::0;;;62028:36:0::1;;;;;;;;;;;61971:93;62073:19;:44:::0;61744:379::o;65628:346::-;65727:10;62582:7;34810:6;;-1:-1:-1;;;;;34810:6:0;;34741:81;62582:7;-1:-1:-1;;;;;62568:21:0;:10;-1:-1:-1;;;;;62568:21:0;;;:43;;;;-1:-1:-1;62593:10:0;;;;:18;;:10;:18;62568:43;62564:70;;;62620:14;;-1:-1:-1;;;62620:14:0;;;;;;;;;;;62564:70;62647:14;:12;:14::i;:::-;62643:49;;62675:17;;-1:-1:-1;;;62675:17:0;;;;;;;;;;;62643:49;62705:19;62713:10;62705:7;:19::i;:::-;62701:54;;;62733:22;;-1:-1:-1;;;62733:22:0;;;;;;;;;;;62701:54;62781:11;;62768:10;:24;62764:84;;;62808:40;;-1:-1:-1;;;62808:40:0;;;;;;;;;;;62764:84;62873:15;;62861:9;:27;:52;;;;-1:-1:-1;34810:6:0;;-1:-1:-1;;;;;34810:6:0;62892:10;:21;;62861:52;62857:96;;;62929:24;;-1:-1:-1;;;62929:24:0;;;;;;;;;;;62857:96;62978:15;;62966:9;:27;:52;;;;-1:-1:-1;34810:6:0;;-1:-1:-1;;;;;34810:6:0;62997:10;:21;;62966:52;62962:96;;;63034:24;;-1:-1:-1;;;63034:24:0;;;;;;;;;;;62962:96;65753:53:::1;65772:10;65784;65796:9;65753:18;:53::i;:::-;65749:121;;65831:39;;-1:-1:-1::0;;;65831:39:0::1;;;;;;;;;;;65749:121;65884:43;::::0;65905:9:::1;18068:25:1::0;;65916:10:0;;65893::::1;::::0;65884:43:::1;::::0;18056:2:1;18041:18;65884:43:0::1;;;;;;;65934:34;65945:10;65957;65934;:34::i;25093:332::-:0;25274:41;17394:10;25307:7;25274:18;:41::i;:::-;25258:124;;;;-1:-1:-1;;;25258:124:0;;;;;;;:::i;:::-;25391:28;25401:4;25407:2;25411:7;25391:9;:28::i;59248:191::-;59312:7;59333:16;59341:7;59333;:16::i;:::-;59328:51;;59358:21;;-1:-1:-1;;;59358:21:0;;;;;;;;;;;59328:51;-1:-1:-1;59393:40:0;;;;:31;:40;;;;;;-1:-1:-1;;;;;59393:40:0;;59248:191::o;67508:70::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;67554:10:::1;:18:::0;;-1:-1:-1;;67554:18:0::1;::::0;;67508:70::o;25488:165::-;25608:39;25625:4;25631:2;25635:7;25608:39;;;;;;;;;;;;:16;:39::i;53890:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57561:164::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;57639:15:::1;::::0;::::1;;:23;;:15:::0;:23:::1;57635:53;;;57671:17;;-1:-1:-1::0;;;57671:17:0::1;;;;;;;;;;;57635:53;57695:24:::0;;::::1;::::0;:9:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;:::-;;57561:164:::0;:::o;53826:26::-;;;;;;;:::i;55292:96::-;55346:4;55366:16;55374:7;55366;:16::i;56871:75::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;56919:14:::1;:21:::0;;-1:-1:-1;;56919:21:0::1;56936:4;56919:21;::::0;;56871:75::o;60036:101::-;60094:37;60117:7;60126:4;60094:22;:37::i;22480:253::-;22577:7;22612:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22612:16:0;22643:19;22635:73;;;;-1:-1:-1;;;22635:73:0;;14530:2:1;22635:73:0;;;14512:21:1;14569:2;14549:18;;;14542:30;14608:34;14588:18;;;14581:62;-1:-1:-1;;;14659:18:1;;;14652:39;14708:19;;22635:73:0;14502:231:1;22200:226:0;22297:7;-1:-1:-1;;;;;22324:19:0;;22316:74;;;;-1:-1:-1;;;22316:74:0;;14119:2:1;22316:74:0;;;14101:21:1;14158:2;14138:18;;;14131:30;14197:34;14177:18;;;14170:62;-1:-1:-1;;;14248:18:1;;;14241:40;14298:19;;22316:74:0;14091:232:1;22316:74:0;-1:-1:-1;;;;;;22404:16:0;;;;;:9;:16;;;;;;;22200:226::o;35352:97::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;35413:30:::1;35440:1;35413:18;:30::i;:::-;35352:97::o:0;66302:207::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;66411:10:::1;62582:7;34810:6:::0;;-1:-1:-1;;;;;34810:6:0;;34741:81;62582:7:::1;-1:-1:-1::0;;;;;62568:21:0::1;:10;-1:-1:-1::0;;;;;62568:21:0::1;;;:43;;;;-1:-1:-1::0;62593:10:0::1;::::0;::::1;;:18;;:10:::0;:18:::1;62568:43;62564:70;;;62620:14;;-1:-1:-1::0;;;62620:14:0::1;;;;;;;;;;;62564:70;62647:14;:12;:14::i;:::-;62643:49;;62675:17;;-1:-1:-1::0;;;62675:17:0::1;;;;;;;;;;;62643:49;62705:19;62713:10;62705:7;:19::i;:::-;62701:54;;;62733:22;;-1:-1:-1::0;;;62733:22:0::1;;;;;;;;;;;62701:54;62781:11;;62768:10;:24;62764:84;;;62808:40;;-1:-1:-1::0;;;62808:40:0::1;;;;;;;;;;;62764:84;62873:15;;62861:9;:27;:52;;;;-1:-1:-1::0;34810:6:0;;-1:-1:-1;;;;;34810:6:0;62892:10:::1;:21;;62861:52;62857:96;;;62929:24;;-1:-1:-1::0;;;62929:24:0::1;;;;;;;;;;;62857:96;62978:15;;62966:9;:27;:52;;;;-1:-1:-1::0;34810:6:0;;-1:-1:-1;;;;;34810:6:0;62997:10:::1;:21;;62966:52;62962:96;;;63034:24;;-1:-1:-1::0;;;63034:24:0::1;;;;;;;;;;;62962:96;66438:26:::2;::::0;66453:10;;-1:-1:-1;;;;;66438:26:0;::::2;::::0;::::2;::::0;;;::::2;66471:32;66482:10;66494:8;66471:10;:32::i;57864:77::-:0;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;57913:15:::1;:22:::0;;-1:-1:-1;;57913:22:0::1;57931:4;57913:22;::::0;;57864:77::o;55902:164::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;55981:14:::1;::::0;::::1;;:22;;:14:::0;:22:::1;55977:51;;;56012:16;;-1:-1:-1::0;;;56012:16:0::1;;;;;;;;;;;55977:51;56035:25:::0;;::::1;::::0;:12:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;22947:98::-:0;23003:13;23032:7;23025:14;;;;;:::i;24618:167::-;24727:52;17394:10;24760:8;24770;24727:18;:52::i;57155:124::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;57239:34;;::::1;::::0;:14:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;58665:332::-:0;58740:16;58748:7;58740;:16::i;:::-;58735:51;;58765:21;;-1:-1:-1;;;58765:21:0;;;;;;;;;;;58735:51;58817:10;58797:16;58805:7;58797;:16::i;:::-;-1:-1:-1;;;;;58797:30:0;;58793:71;;58836:28;;-1:-1:-1;;;58836:28:0;;;;;;;;;;;58793:71;58918:7;58901:15;-1:-1:-1;;;;;58878:48:0;58883:16;58891:7;58883;:16::i;:::-;-1:-1:-1;;;;;58878:48:0;;;;;;;;;;;58933:40;;;;:31;:40;;;;;;:58;;-1:-1:-1;;;;;;58933:58:0;-1:-1:-1;;;;;58933:58:0;;;;;;;;;58665:332::o;61328:118::-;61373:7;61418:22;;61396:19;;:44;;;;:::i;:::-;61389:51;;61328:118;:::o;25716:321::-;25877:41;17394:10;25910:7;25877:18;:41::i;:::-;25861:124;;;;-1:-1:-1;;;25861:124:0;;;;;;;:::i;:::-;25992:39;26006:4;26012:2;26016:7;26025:5;25992:13;:39::i;:::-;25716:321;;;;:::o;58018:197::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;58083:72:::1;::::0;58065:12:::1;::::0;58091:10:::1;::::0;58115:21:::1;::::0;58065:12;58083:72;58065:12;58083:72;58115:21;58091:10;58083:72:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;58064:91:0;;-1:-1:-1;;58166:16:0;58162:47:::1;;58191:18;;-1:-1:-1::0;;;58191:18:0::1;;;;;;;;;;;56421:313:::0;56506:13;56531:30;56564:23;56579:7;56564:14;:23::i;:::-;56531:56;;56643:1;56616:16;56610:30;:34;:118;;;;;;;;;;;;;;;;;56680:16;56698:14;56663:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56610:118;56596:132;56421:313;-1:-1:-1;;;56421:313:0:o;53952:33::-;;;;;;;:::i;60396:182::-;60460:4;60478:16;60486:7;60478;:16::i;:::-;60473:51;;60503:21;;-1:-1:-1;;;60503:21:0;;;;;;;;;;;60473:51;-1:-1:-1;60538:34:0;;;;:25;:34;;;;;;;;;60396:182::o;59686:101::-;59743:38;59766:7;59775:5;59743:22;:38::i;35594:191::-;34810:6;;-1:-1:-1;;;;;34810:6:0;17394:10;34943:23;34935:68;;;;-1:-1:-1;;;34935:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35679:22:0;::::1;35671:73;;;::::0;-1:-1:-1;;;35671:73:0;;11355:2:1;35671:73:0::1;::::0;::::1;11337:21:1::0;11394:2;11374:18;;;11367:30;11433:34;11413:18;;;11406:62;-1:-1:-1;;;11484:18:1;;;11477:36;11530:19;;35671:73:0::1;11327:228:1::0;35671:73:0::1;35751:28;35770:8;35751:18;:28::i;63604:179::-:0;63669:10;62582:7;34810:6;;-1:-1:-1;;;;;34810:6:0;;34741:81;62582:7;-1:-1:-1;;;;;62568:21:0;:10;-1:-1:-1;;;;;62568:21:0;;;:43;;;;-1:-1:-1;62593:10:0;;;;:18;;:10;:18;62568:43;62564:70;;;62620:14;;-1:-1:-1;;;62620:14:0;;;;;;;;;;;62564:70;62647:14;:12;:14::i;:::-;62643:49;;62675:17;;-1:-1:-1;;;62675:17:0;;;;;;;;;;;62643:49;62705:19;62713:10;62705:7;:19::i;:::-;62701:54;;;62733:22;;-1:-1:-1;;;62733:22:0;;;;;;;;;;;62701:54;62781:11;;62768:10;:24;62764:84;;;62808:40;;-1:-1:-1;;;62808:40:0;;;;;;;;;;;62764:84;62873:15;;62861:9;:27;:52;;;;-1:-1:-1;34810:6:0;;-1:-1:-1;;;;;34810:6:0;62892:10;:21;;62861:52;62857:96;;;62929:24;;-1:-1:-1;;;62929:24:0;;;;;;;;;;;62857:96;62978:15;;62966:9;:27;:52;;;;-1:-1:-1;34810:6:0;;-1:-1:-1;;;;;34810:6:0;62997:10;:21;;62966:52;62962:96;;;63034:24;;-1:-1:-1;;;63034:24:0;;;;;;;;;;;62962:96;63693:43:::1;::::0;63714:9:::1;18068:25:1::0;;63725:10:0;;63702::::1;::::0;63693:43:::1;::::0;18056:2:1;18041:18;63693:43:0::1;;;;;;;63743:34;63754:10;63766;63743;:34::i;27484:121::-:0;27549:4;27569:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27569:16:0;:30;;;27484:121::o;31218:164::-;31289:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31289:29:0;-1:-1:-1;;;;;31289:29:0;;;;;;;;:24;;31339:23;31289:24;31339:14;:23::i;:::-;-1:-1:-1;;;;;31330:46:0;;;;;;;;;;;31218:164;;:::o;64971:276::-;65102:4;65133:52;65147:26;65153:7;65162:10;65147:5;:26::i;:::-;65175:9;65133:13;:52::i;:::-;-1:-1:-1;;;;;65122:63:0;:7;-1:-1:-1;;;;;65122:63:0;;65115:70;;64971:276;;;;;:::o;66972:263::-;67086:5;67046:37;;;:25;:37;;;;;;;;:45;;-1:-1:-1;;67046:45:0;;;67098:31;:43;;;;;:56;;-1:-1:-1;;;;;;67098:56:0;67144:10;67098:56;;;67161:22;:27;;67046:45;;67086:5;67161:27;;67046:45;;67161:27;:::i;:::-;;;;-1:-1:-1;67197:32:0;;-1:-1:-1;67207:9:0;67218:10;67197:9;:32::i;27756:371::-;27869:4;27893:16;27901:7;27893;:16::i;:::-;27885:73;;;;-1:-1:-1;;;27885:73:0;;13281:2:1;27885:73:0;;;13263:21:1;13320:2;13300:18;;;13293:30;13359:34;13339:18;;;13332:62;-1:-1:-1;;;13410:18:1;;;13403:42;13462:19;;27885:73:0;13253:234:1;27885:73:0;27965:13;27981:23;27996:7;27981:14;:23::i;:::-;27965:39;;28030:5;-1:-1:-1;;;;;28019:16:0;:7;-1:-1:-1;;;;;28019:16:0;;:58;;;;28070:7;-1:-1:-1;;;;;28046:31:0;:20;28058:7;28046:11;:20::i;:::-;-1:-1:-1;;;;;28046:31:0;;28019:58;:101;;;-1:-1:-1;;;;;;24993:25:0;;;24970:4;24993:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28088:32;28011:110;27756:371;-1:-1:-1;;;;27756:371:0:o;30565:547::-;30714:4;-1:-1:-1;;;;;30687:31:0;:23;30702:7;30687:14;:23::i;:::-;-1:-1:-1;;;;;30687:31:0;;30671:106;;;;-1:-1:-1;;;30671:106:0;;16478:2:1;30671:106:0;;;16460:21:1;16517:2;16497:18;;;16490:30;16556:34;16536:18;;;16529:62;-1:-1:-1;;;16607:18:1;;;16600:39;16656:19;;30671:106:0;16450:231:1;30671:106:0;-1:-1:-1;;;;;30792:16:0;;30784:65;;;;-1:-1:-1;;;30784:65:0;;12119:2:1;30784:65:0;;;12101:21:1;12158:2;12138:18;;;12131:30;12197:34;12177:18;;;12170:62;-1:-1:-1;;;12248:18:1;;;12241:34;12292:19;;30784:65:0;12091:226:1;30784:65:0;30954:29;30971:1;30975:7;30954:8;:29::i;:::-;-1:-1:-1;;;;;30992:15:0;;;;;;:9;:15;;;;;:20;;31011:1;;30992:15;:20;;31011:1;;30992:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31019:13:0;;;;;;:9;:13;;;;;:18;;31036:1;;31019:13;:18;;31036:1;;31019:18;:::i;:::-;;;;-1:-1:-1;;31044:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31044:21:0;-1:-1:-1;;;;;31044:21:0;;;;;;;;;31079:27;;31044:16;;31079:27;;;;;;;30565:547;;;:::o;60919:260::-;60999:16;61007:7;60999;:16::i;:::-;60994:51;;61024:21;;-1:-1:-1;;;61024:21:0;;;;;;;;;;;60994:51;61076:10;61056:16;61064:7;61056;:16::i;:::-;-1:-1:-1;;;;;61056:30:0;;61052:71;;61095:28;;-1:-1:-1;;;61095:28:0;;;;;;;;;;;61052:71;61132:34;;;;:25;:34;;;;;;:41;;-1:-1:-1;;61132:41:0;;;;;;;;;;60919:260::o;35935:177::-;36024:6;;;-1:-1:-1;;;;;36037:17:0;;;-1:-1:-1;;;;;;36037:17:0;;;;;;;36066:40;;36024:6;;;36037:17;36024:6;;36066:40;;36005:16;;36066:40;35935:177;;:::o;31512:287::-;31649:8;-1:-1:-1;;;;;31640:17:0;:5;-1:-1:-1;;;;;31640:17:0;;;31632:55;;;;-1:-1:-1;;;31632:55:0;;12524:2:1;31632:55:0;;;12506:21:1;12563:2;12543:18;;;12536:30;12602:27;12582:18;;;12575:55;12647:18;;31632:55:0;12496:175:1;31632:55:0;-1:-1:-1;;;;;31694:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31694:46:0;;;;;;;;;;31752:41;;8498::1;;;31752::0;;8471:18:1;31752:41:0;;;;;;;31512:287;;;:::o;26881:308::-;27016:28;27026:4;27032:2;27036:7;27016:9;:28::i;:::-;27067:48;27090:4;27096:2;27100:7;27109:5;27067:22;:48::i;:::-;27051:132;;;;-1:-1:-1;;;27051:132:0;;;;;;;:::i;23108:394::-;23206:13;23247:16;23255:7;23247;:16::i;:::-;23231:97;;;;-1:-1:-1;;;23231:97:0;;16888:2:1;23231:97:0;;;16870:21:1;16927:2;16907:18;;;16900:30;16966:34;16946:18;;;16939:62;-1:-1:-1;;;17017:18:1;;;17010:45;17072:19;;23231:97:0;16860:237:1;23231:97:0;23337:21;23361:10;:8;:10::i;:::-;23337:34;;23416:1;23398:7;23392:21;:25;:104;;;;;;;;;;;;;;;;;23453:7;23462:18;:7;:16;:18::i;:::-;23436:45;;;;;;;;;:::i;64082:330::-;64254:132;;;64279:47;64254:132;;;9246:25:1;9287:18;;;9280:34;;;-1:-1:-1;;;;;9350:32:1;;9330:18;;;9323:60;64172:7:0;;64205:201;;9219:18:1;;64254:132:0;;;;;;;;;;;;64232:165;;;;;;64205:16;:201::i;40221:235::-;40314:7;40334:17;40353:18;40375:27;40386:4;40392:9;40375:10;:27::i;:::-;40333:69;;;;40409:18;40421:5;40409:11;:18::i;:::-;-1:-1:-1;40441:9:0;40221:235;-1:-1:-1;;;40221:235:0:o;28447:104::-;28519:26;28529:2;28533:7;28519:26;;;;;;;;;;;;:9;:26::i;32342:685::-;32479:4;-1:-1:-1;;;;;32496:13:0;;9919:20;9959:8;32492:530;;32535:72;;-1:-1:-1;;;32535:72:0;;-1:-1:-1;;;;;32535:36:0;;;;;:72;;17394:10;;32586:4;;32592:7;;32601:5;;32535:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32535:72:0;;;;;;;;-1:-1:-1;;32535:72:0;;;;;;;;;;;;:::i;:::-;;;32522:459;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32762:13:0;;32758:214;;32795:60;;-1:-1:-1;;;32795:60:0;;;;;;;:::i;32758:214::-;32940:6;32934:13;32925:6;32921:2;32917:15;32910:38;32522:459;-1:-1:-1;;;;;;32657:51:0;-1:-1:-1;;;32657:51:0;;-1:-1:-1;32650:58:0;;32492:530;-1:-1:-1;33010:4:0;32342:685;;;;;;:::o;55566:99::-;55618:13;55647:12;55640:19;;;;;:::i;17877:637::-;17933:13;18142:10;18138:43;;-1:-1:-1;;18163:10:0;;;;;;;;;;;;-1:-1:-1;;;18163:10:0;;;;;17877:637::o;18138:43::-;18202:5;18187:12;18235:62;18242:9;;18235:62;;18262:8;;;;:::i;:::-;;-1:-1:-1;18279:10:0;;-1:-1:-1;18287:2:0;18279:10;;:::i;:::-;;;18235:62;;;18303:19;18335:6;18325:17;;;;;;-1:-1:-1;;;18325:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18325:17:0;;18303:39;;18349:132;18356:10;;18349:132;;18377:11;18387:1;18377:11;;:::i;:::-;;-1:-1:-1;18440:10:0;18448:2;18440:5;:10;:::i;:::-;18427:24;;:2;:24;:::i;:::-;18414:39;;18397:6;18404;18397:14;;;;;;-1:-1:-1;;;18397:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;18397:56:0;;;;;;;;-1:-1:-1;18462:11:0;18471:2;18462:11;;:::i;:::-;;;18349:132;;49611:184;49708:7;49734:55;49756:20;:18;:20::i;:::-;49778:10;45144:57;;-1:-1:-1;;;45144:57:0;;;7308:27:1;7351:11;;;7344:27;;;7387:12;;;7380:28;;;45108:7:0;;7424:12:1;;45144:57:0;;;;;;;;;;;;45134:68;;;;;;45127:75;;45000:208;;;;;38289:1160;38385:7;38394:12;38606:9;:16;38626:2;38606:22;38602:842;;;38858:4;38843:20;;38837:27;38900:4;38885:20;;38879:27;38950:4;38935:20;;38929:27;38639:9;38921:36;38981:25;38992:4;38921:36;38837:27;38879;38981:10;:25::i;:::-;38974:32;;;;;;;;;38602:842;39024:9;:16;39044:2;39024:22;39020:424;;;39261:4;39246:20;;39240:27;39304:4;39289:20;;39283:27;39334:23;39345:4;39240:27;39283;39334:10;:23::i;:::-;39327:30;;;;;;;;39020:424;-1:-1:-1;39396:1:0;;-1:-1:-1;39400:35:0;39020:424;38289:1160;;;;;:::o;36658:587::-;36732:20;36723:5;:29;;;;;;-1:-1:-1;;;36723:29:0;;;;;;;;;;36719:521;;;36658:587;:::o;36719:521::-;36820:29;36811:5;:38;;;;;;-1:-1:-1;;;36811:38:0;;;;;;;;;;36807:433;;;36860:34;;-1:-1:-1;;;36860:34:0;;10223:2:1;36860:34:0;;;10205:21:1;10262:2;10242:18;;;10235:30;10301:26;10281:18;;;10274:54;10345:18;;36860:34:0;10195:174:1;36807:433:0;36921:35;36912:5;:44;;;;;;-1:-1:-1;;;36912:44:0;;;;;;;;;;36908:332;;;36967:41;;-1:-1:-1;;;36967:41:0;;10576:2:1;36967:41:0;;;10558:21:1;10615:2;10595:18;;;10588:30;10654:33;10634:18;;;10627:61;10705:18;;36967:41:0;10548:181:1;36908:332:0;37035:30;37026:5;:39;;;;;;-1:-1:-1;;;37026:39:0;;;;;;;;;;37022:218;;;37076:44;;-1:-1:-1;;;37076:44:0;;12878:2:1;37076:44:0;;;12860:21:1;12917:2;12897:18;;;12890:30;12956:34;12936:18;;;12929:62;-1:-1:-1;;;13007:18:1;;;13000:32;13049:19;;37076:44:0;12850:224:1;37022:218:0;37147:30;37138:5;:39;;;;;;-1:-1:-1;;;37138:39:0;;;;;;;;;;37134:106;;;37188:44;;-1:-1:-1;;;37188:44:0;;14940:2:1;37188:44:0;;;14922:21:1;14979:2;14959:18;;;14952:30;15018:34;14998:18;;;14991:62;-1:-1:-1;;;15069:18:1;;;15062:32;15111:19;;37188:44:0;14912:224:1;28768:281:0;28880:18;28886:2;28890:7;28880:5;:18::i;:::-;28921:54;28952:1;28956:2;28960:7;28969:5;28921:22;:54::i;:::-;28905:138;;;;-1:-1:-1;;;28905:138:0;;;;;;;:::i;48373:288::-;48426:7;48454:4;-1:-1:-1;;;;;48463:12:0;48446:29;;:66;;;;;48496:16;48479:13;:33;48446:66;48442:214;;;-1:-1:-1;48530:24:0;;48373:288::o;48442:214::-;-1:-1:-1;48847:139:0;;;48606:10;48847:139;;;;8809:25:1;;;;48618:12:0;8850:18:1;;;8843:34;48632:15:0;8893:18:1;;;8886:34;48936:13:0;8936:18:1;;;8929:34;48970:4:0;8979:19:1;;;;8972:61;;;;48847:139:0;;;;;;;;;;8781:19:1;;;;48847:139:0;;;48827:168;;;;;;61328:118::o;41633:1543::-;41746:7;;42655:66;42635:86;;42623:174;;;-1:-1:-1;42754:1:0;;-1:-1:-1;42758:30:0;42738:51;;42623:174;42807:1;:7;;42812:2;42807:7;;:18;;;;;42818:1;:7;;42823:2;42818:7;;42807:18;42803:92;;;-1:-1:-1;42852:1:0;;-1:-1:-1;42856:30:0;42836:51;;42803:92;43001:24;;;42984:14;43001:24;;;;;;;;;9621:25:1;;;9694:4;9682:17;;9662:18;;;9655:45;;;;9716:18;;;9709:34;;;9759:18;;;9752:34;;;43001:24:0;;9593:19:1;;43001:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43001:24:0;;-1:-1:-1;;43001:24:0;;;-1:-1:-1;;;;;;;43036:20:0;;43032:93;;43083:1;43087:29;43067:50;;;;;;;43032:93;43141:6;-1:-1:-1;43149:20:0;;-1:-1:-1;41633:1543:0;;;;;;;;:::o;40703:370::-;40803:7;;-1:-1:-1;;;;;40886:102:0;;41009:3;41005:12;;;41019:2;41001:21;41042:25;41053:4;41001:21;41062:1;40886:102;41042:10;:25::i;:::-;41035:32;;;;;;40703:370;;;;;;:::o;29359:356::-;-1:-1:-1;;;;;29435:16:0;;29427:61;;;;-1:-1:-1;;;29427:61:0;;15343:2:1;29427:61:0;;;15325:21:1;;;15362:18;;;15355:30;15421:34;15401:18;;;15394:62;15473:18;;29427:61:0;15315:182:1;29427:61:0;29504:16;29512:7;29504;:16::i;:::-;29503:17;29495:58;;;;-1:-1:-1;;;29495:58:0;;11762:2:1;29495:58:0;;;11744:21:1;11801:2;11781:18;;;11774:30;11840;11820:18;;;11813:58;11888:18;;29495:58:0;11734:178:1;29495:58:0;-1:-1:-1;;;;;29616:13:0;;;;;;:9;:13;;;;;:18;;29633:1;;29616:13;:18;;29633:1;;29616:18;:::i;:::-;;;;-1:-1:-1;;29641:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29641:21:0;-1:-1:-1;;;;;29641:21:0;;;;;;;;29676:33;;29641:16;;;29676:33;;29641:16;;29676:33;29359:356;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:228::-;870:5;923:3;916:4;908:6;904:17;900:27;890:2;;945:5;938;931:20;890:2;971:79;1046:3;1037:6;1024:20;1017:4;1009:6;1005:17;971:79;:::i;1061:196::-;1120:6;1173:2;1161:9;1152:7;1148:23;1144:32;1141:2;;;1194:6;1186;1179:22;1141:2;1222:29;1241:9;1222:29;:::i;1262:270::-;1330:6;1338;1391:2;1379:9;1370:7;1366:23;1362:32;1359:2;;;1412:6;1404;1397:22;1359:2;1440:29;1459:9;1440:29;:::i;:::-;1430:39;;1488:38;1522:2;1511:9;1507:18;1488:38;:::i;:::-;1478:48;;1349:183;;;;;:::o;1537:338::-;1614:6;1622;1630;1683:2;1671:9;1662:7;1658:23;1654:32;1651:2;;;1704:6;1696;1689:22;1651:2;1732:29;1751:9;1732:29;:::i;:::-;1722:39;;1780:38;1814:2;1803:9;1799:18;1780:38;:::i;:::-;1770:48;;1865:2;1854:9;1850:18;1837:32;1827:42;;1641:234;;;;;:::o;1880:557::-;1975:6;1983;1991;1999;2052:3;2040:9;2031:7;2027:23;2023:33;2020:2;;;2074:6;2066;2059:22;2020:2;2102:29;2121:9;2102:29;:::i;:::-;2092:39;;2150:38;2184:2;2173:9;2169:18;2150:38;:::i;:::-;2140:48;;2235:2;2224:9;2220:18;2207:32;2197:42;;2290:2;2279:9;2275:18;2262:32;2317:18;2309:6;2306:30;2303:2;;;2354:6;2346;2339:22;2303:2;2382:49;2423:7;2414:6;2403:9;2399:22;2382:49;:::i;:::-;2372:59;;;2010:427;;;;;;;:::o;2442:367::-;2507:6;2515;2568:2;2556:9;2547:7;2543:23;2539:32;2536:2;;;2589:6;2581;2574:22;2536:2;2617:29;2636:9;2617:29;:::i;:::-;2607:39;;2696:2;2685:9;2681:18;2668:32;2743:5;2736:13;2729:21;2722:5;2719:32;2709:2;;2770:6;2762;2755:22;2709:2;2798:5;2788:15;;;2526:283;;;;;:::o;2814:264::-;2882:6;2890;2943:2;2931:9;2922:7;2918:23;2914:32;2911:2;;;2964:6;2956;2949:22;2911:2;2992:29;3011:9;2992:29;:::i;:::-;2982:39;3068:2;3053:18;;;;3040:32;;-1:-1:-1;;;2901:177:1:o;3083:255::-;3141:6;3194:2;3182:9;3173:7;3169:23;3165:32;3162:2;;;3215:6;3207;3200:22;3162:2;3259:9;3246:23;3278:30;3302:5;3278:30;:::i;3343:259::-;3412:6;3465:2;3453:9;3444:7;3440:23;3436:32;3433:2;;;3486:6;3478;3471:22;3433:2;3523:9;3517:16;3542:30;3566:5;3542:30;:::i;3607:408::-;3684:6;3692;3745:2;3733:9;3724:7;3720:23;3716:32;3713:2;;;3766:6;3758;3751:22;3713:2;3811:9;3798:23;3844:18;3836:6;3833:30;3830:2;;;3881:6;3873;3866:22;3830:2;3909:49;3950:7;3941:6;3930:9;3926:22;3909:49;:::i;:::-;3899:59;4005:2;3990:18;;;;3977:32;;-1:-1:-1;;;;3703:312:1:o;4020:480::-;4089:6;4142:2;4130:9;4121:7;4117:23;4113:32;4110:2;;;4163:6;4155;4148:22;4110:2;4208:9;4195:23;4241:18;4233:6;4230:30;4227:2;;;4278:6;4270;4263:22;4227:2;4306:22;;4359:4;4351:13;;4347:27;-1:-1:-1;4337:2:1;;4393:6;4385;4378:22;4337:2;4421:73;4486:7;4481:2;4468:16;4463:2;4459;4455:11;4421:73;:::i;4505:190::-;4564:6;4617:2;4605:9;4596:7;4592:23;4588:32;4585:2;;;4638:6;4630;4623:22;4585:2;-1:-1:-1;4666:23:1;;4575:120;-1:-1:-1;4575:120:1:o;4700:264::-;4768:6;4776;4829:2;4817:9;4808:7;4804:23;4800:32;4797:2;;;4850:6;4842;4835:22;4797:2;4891:9;4878:23;4868:33;;4920:38;4954:2;4943:9;4939:18;4920:38;:::i;4969:257::-;5010:3;5048:5;5042:12;5075:6;5070:3;5063:19;5091:63;5147:6;5140:4;5135:3;5131:14;5124:4;5117:5;5113:16;5091:63;:::i;:::-;5208:2;5187:15;-1:-1:-1;;5183:29:1;5174:39;;;;5215:4;5170:50;;5018:208;-1:-1:-1;;5018:208:1:o;5231:470::-;5410:3;5448:6;5442:13;5464:53;5510:6;5505:3;5498:4;5490:6;5486:17;5464:53;:::i;:::-;5580:13;;5539:16;;;;5602:57;5580:13;5539:16;5636:4;5624:17;;5602:57;:::i;:::-;5675:20;;5418:283;-1:-1:-1;;;;5418:283:1:o;5706:1339::-;5882:3;5920:6;5914:13;5946:4;5959:51;6003:6;5998:3;5993:2;5985:6;5981:15;5959:51;:::i;:::-;6097:13;;6032:16;;;;6068:3;;6157:1;6179:18;;;;6232;;;;6259:2;;6337:4;6327:8;6323:19;6311:31;;6259:2;6400;6390:8;6387:16;6367:18;6364:40;6361:2;;;-1:-1:-1;;;6427:33:1;;6483:4;6480:1;6473:15;6513:4;6434:3;6501:17;6361:2;6544:18;6571:110;;;;6695:1;6690:330;;;;6537:483;;6571:110;-1:-1:-1;;6606:24:1;;6592:39;;6651:20;;;;-1:-1:-1;6571:110:1;;6690:330;18151:4;18170:17;;;18220:4;18204:21;;6785:3;6801:169;6815:8;6812:1;6809:15;6801:169;;;6897:14;;6882:13;;;6875:37;6940:16;;;;6832:10;;6801:169;;;6805:3;;7001:8;6994:5;6990:20;6983:27;;6537:483;-1:-1:-1;7036:3:1;;5890:1155;-1:-1:-1;;;;;;;;;;5890:1155:1:o;7865:488::-;-1:-1:-1;;;;;8134:15:1;;;8116:34;;8186:15;;8181:2;8166:18;;8159:43;8233:2;8218:18;;8211:34;;;8281:3;8276:2;8261:18;;8254:31;;;8059:4;;8302:45;;8327:19;;8319:6;8302:45;:::i;:::-;8294:53;8068:285;-1:-1:-1;;;;;;8068:285:1:o;9797:219::-;9946:2;9935:9;9928:21;9909:4;9966:44;10006:2;9995:9;9991:18;9983:6;9966:44;:::i;10734:414::-;10936:2;10918:21;;;10975:2;10955:18;;;10948:30;11014:34;11009:2;10994:18;;10987:62;-1:-1:-1;;;11080:2:1;11065:18;;11058:48;11138:3;11123:19;;10908:240::o;15915:356::-;16117:2;16099:21;;;16136:18;;;16129:30;16195:34;16190:2;16175:18;;16168:62;16262:2;16247:18;;16089:182::o;17504:413::-;17706:2;17688:21;;;17745:2;17725:18;;;17718:30;17784:34;17779:2;17764:18;;17757:62;-1:-1:-1;;;17850:2:1;17835:18;;17828:47;17907:3;17892:19;;17678:239::o;18236:128::-;18276:3;18307:1;18303:6;18300:1;18297:13;18294:2;;;18313:18;;:::i;:::-;-1:-1:-1;18349:9:1;;18284:80::o;18369:120::-;18409:1;18435;18425:2;;18440:18;;:::i;:::-;-1:-1:-1;18474:9:1;;18415:74::o;18494:125::-;18534:4;18562:1;18559;18556:8;18553:2;;;18567:18;;:::i;:::-;-1:-1:-1;18604:9:1;;18543:76::o;18624:258::-;18696:1;18706:113;18720:6;18717:1;18714:13;18706:113;;;18796:11;;;18790:18;18777:11;;;18770:39;18742:2;18735:10;18706:113;;;18837:6;18834:1;18831:13;18828:2;;;-1:-1:-1;;18872:1:1;18854:16;;18847:27;18677:205::o;18887:380::-;18966:1;18962:12;;;;19009;;;19030:2;;19084:4;19076:6;19072:17;19062:27;;19030:2;19137;19129:6;19126:14;19106:18;19103:38;19100:2;;;19183:10;19178:3;19174:20;19171:1;19164:31;19218:4;19215:1;19208:15;19246:4;19243:1;19236:15;19100:2;;18942:325;;;:::o;19272:135::-;19311:3;-1:-1:-1;;19332:17:1;;19329:2;;;19352:18;;:::i;:::-;-1:-1:-1;19399:1:1;19388:13;;19319:88::o;19412:112::-;19444:1;19470;19460:2;;19475:18;;:::i;:::-;-1:-1:-1;19509:9:1;;19450:74::o;19529:127::-;19590:10;19585:3;19581:20;19578:1;19571:31;19621:4;19618:1;19611:15;19645:4;19642:1;19635:15;19661:127;19722:10;19717:3;19713:20;19710:1;19703:31;19753:4;19750:1;19743:15;19777:4;19774:1;19767:15;19793:127;19854:10;19849:3;19845:20;19842:1;19835:31;19885:4;19882:1;19875:15;19909:4;19906:1;19899:15;19925:131;-1:-1:-1;;;;;;19999:32:1;;19989:43;;19979:2;;20046:1;20043;20036:12
Swarm Source
ipfs://800119f736278e36e67325cdfc629e6a4d2071dea7eb8fc0466406af58b12d75
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.