Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 EW10
Holders
105
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 EW10Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EtheriaWrapper1pt0
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-29 */ // File: @openzeppelin/contracts/utils/Strings.sol // 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/Context.sol // 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/access/Ownable.sol // 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/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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/token/ERC721/IERC721Receiver.sol // 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/utils/introspection/IERC165.sol // 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/utils/introspection/ERC165.sol // 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/IERC721.sol // 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/extensions/IERC721Metadata.sol // 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/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: contracts/EtheriaWrapper_v1pt0.sol // Solidity 0.8.7-e28d00a7 optimization 200 (default) pragma solidity ^0.8.6; interface Etheria { function getOwner(uint8 col, uint8 row) external view returns(address); function getOfferers(uint8 col, uint8 row) external view returns (address[] memory); function getOffers(uint8 col, uint8 row) external view returns (uint[] memory); function setName(uint8 col, uint8 row, string memory _n) external; function setStatus(uint8 col, uint8 row, string memory _s) external payable; function makeOffer(uint8 col, uint8 row) external payable; function acceptOffer(uint8 col, uint8 row, uint8 index, uint amt) external; function deleteOffer(uint8 col, uint8 row, uint8 index, uint amt) external; } contract EtheriaWrapper1pt0 is Ownable, ERC721 { address public _etheriaAddress; Etheria public _etheria; mapping (uint256 => address) public wrapInitializers; constructor() payable ERC721("Etheria Wrapper v1pt0 2015-10-22", "EW10") { _etheriaAddress = 0xe414716F017b5c1457bF98e985BCcB135DFf81F2; _etheria = Etheria(_etheriaAddress); _baseTokenURI = "https://etheria.world/metadata/v1pt0/"; _baseTokenExtension = ".json"; } receive() external payable { // Only accept from Etheria contract require(_msgSender() == _etheriaAddress, "EW10: ETH sender isn't Etheria contract"); } event WrapStarted(address indexed addr, uint256 indexed _locationID); event WrapFinished(address indexed addr, uint256 indexed _locationID); event Unwrapped(address indexed addr, uint256 indexed _locationID); event NameSet(address indexed addr, uint256 indexed _locationID, string name); event StatusSet(address indexed addr, uint256 indexed _locationID, string status); event OfferRejected(address indexed addr, uint256 indexed _locationID, uint offer, address offerer); event OfferRetracted(address indexed addr, uint256 indexed _locationID); // offerer is always address(this) and amount always 0.01 ETH function _getIndex(uint8 col, uint8 row) internal pure returns (uint256) { require(col <= uint8(32) && row <= uint8(32), "EW10: Invalid col and/or row. Valid range is 0-32"); // uint8 prevents sub-0 automatically return (uint256(col) * uint256(33)) + uint256(row); } // ***** Why are v0.9 and v1.0 wrappable while v1.1 and v1.2 are not? (as of March 2022) ***** // // Etheria was developed long before any NFT exchanges existed. As such, in versions v0.9 and // v1.0, I added internal exchange logic (hereinafter the "offer system") to facilitate trading before abandoning // it in favor of a simple "setOwner" function in v1.1 and v1.2. // // While this "offer system" was really poorly designed and clunky (the result of a manic episode of moving fast // and "testing in production"), it does actually work and work reliably if the proper precautions are taken. // // What's more, this "offer system" used msg.sender (v0.9 and v1.0) instead of tx.origin (v1.1 and v1.2) which // which means v0.9 and v1.0 tiles are ownable by smart contracts... i.e. they are WRAPPABLE // // Wrappability means that this terrible "offer system" will be entirely bypassed after wrapping is complete // because it's the WRAPPER that is traded, not the base token. The base token is owned by the wrapper smart contract // until unwrap time when the base token is transferred to the new owner. // ***** How the "offer system" works in v0.9 and v1.0 ***** (don't use this except to wrap/unwrap) // // Each v0.9 and v1.0 tile has two arrays: offers[] and offerers[] which can be up to 10 items long. // When a new offer comes in, the ETH is stored in the contract and the offers[] and offerers[] arrays are expanded // by 1 item to store the bid. // // The tile owner can then rejectOffer(col, row, offerIndex) or acceptOffer(col, row, offerIndex) to transfer // the tile to the successful bidder. // ***** How to wrap ***** // // 0. Start with the tile owned by your normal Ethereum account (not a smart contract) and make sure there are no // unwanted offers in the offer system. Call rejectOffer(col, row) until the arrays are completely empty. // 1. Call the wrapper contract's "makeOfferViaWrapper(col,row)" along with 0.01 ETH to force the wrapper to make // an offer on the base token. Only the tile owner can do this. The wrapper will save the owner's address. // 1b. Check the base token's offerer and offerers arrays. They should be 1 item long each, containing 0.01 and the // address of the *wrapper*. Also check wrapInitializer with getWrapInitializer(col,row) // 2. Now call acceptOffer(col,row) for your tile on the base contract. Ownership is transferred to the wrapper // which already has a record of your ownership. // 3. Call finishWrap() from previous owner to complete the process. // ***** How to unwrap ***** (Note: you probably shouldn't) // // 0. Start with the tile owned by the wrapper. Call rejectOfferViaWrapper(col, row) to clear out offer arrays. // 1. Call makeOffer(col,row) with 0.01 ETH from the destination account. Check the base token's offerer and offerers arrays. // They should be 1 item long each, containing 0.01 and the address of the destination account. // 2. Now call acceptOfferViaWrapper(col,row) for your tile to unwrap the tile to the desired destination. // ----------------------------------------------------------------------------------------------------------------- // External convenience function to let the user check who, if anyone, is the wrapInitializer for this col,row // function getWrapInitializer(uint8 col, uint8 row) external view returns (address) { uint256 _locationID = _getIndex(col, row); return wrapInitializers[_locationID]; } // WRAP STEP(S) 0: // Reject all standing offers on the base tile you directly own. // WRAP STEP 1: // Start the wrapping process by placing an offer on the target tile from the wrapper contract // Pre-requisites: // msg.sender must own the base tile (automatically excludes water, guarantees 721 does not exist) // offer/ers arrays must be empty (all standing offers rejected) // incoming value must be exactly 0.01 ETH // function makeOfferViaWrapper(uint8 col, uint8 row) external payable { uint256 _locationID = _getIndex(col, row); require(_etheria.getOwner(col,row) == msg.sender, "EW10: You must be the tile owner to start the wrapping process."); require(_etheria.getOffers(col,row).length == 0, "EW10: The offer/ers arrays for this tile must be empty. Reject all offers."); require(msg.value == 10000000000000000, "EW10: You must supply exactly 0.01 ETH to this function."); _etheria.makeOffer{value: msg.value}(col,row); // these two are redundant, but w/e require(_etheria.getOfferers(col,row)[0] == address(this), "EW10: The offerer in position 0 should be this wrapper address."); require(_etheria.getOffers(col,row)[0] == 10000000000000000, "EW10: The offer in position 0 should be 0.01 ETH."); wrapInitializers[_locationID] = msg.sender; // doesn't matter if a value already exists in this array emit WrapStarted(msg.sender, _locationID); } // post state: // Wrapper has placed a 0.01 ETH offer in position 0 of the specified tile that msg.sender owns, // Wrapper has recorded msg.sender as the wrapInitializer for the specified tile // WrapStarted event fired // WRAP STEP 2: // Call etheria.acceptOffer on the offer this wrapper made on the base tile to give the wrapper ownership (in position 0 only!) // post state: // Wrapper now owns the tile, the previous owner (paid 0.01 ETH) is still recorded as the wrapInitializer for it. 721 not yet issued. // 0.009 and 0.001 ETH have been sent to the base tile owner and Etheria contract creator, respectively, after the "sale" // base tile offer/ers arrays cleared out and refunded, if necessary // Note: There is no event for the offer acceptance on the base tile // Note: You *must* complete the wrapping process in step 3, even if you have changed your mind or want to unwrap. // The wrapper now technically owns the tile and you can't do anything with it until you finishWrap() first. // WRAP STEP 3: // Finishes the wrapping process by minting the 721 token // Pre-requisites: // caller must be the wrapInitializer for this tile // tile must be owned by the wrapper // function finishWrap(uint8 col, uint8 row) external { uint256 _locationID = _getIndex(col, row); require(wrapInitializers[_locationID] == msg.sender, "EW10: You are not the wrapInitializer for this tile. Call makeOfferViaWrapper first."); require(_etheria.getOwner(col,row) == address(this), "EW10: Tile is not yet owned by this wrapper. Call etheria.acceptOffer to give the wrapper ownership, then finishWrap to complete."); _mint(msg.sender, _locationID); // automatically checks to see if token doesn't yet exist require(_exists(_locationID), "EW10: 721 was not created as it should have been. Reverting."); delete wrapInitializers[_locationID]; // done minting, remove from wrapInitializers array require(wrapInitializers[_locationID] == address(0), "EW10: wrapInitializer was not reset to 0. Reverting."); emit WrapFinished(msg.sender, _locationID); } //post state: // 721 token created and owned by caller // wrapInitializer for this tile reset to 0 // WrapFinished event fired // UNWRAP STEP(S) 0 (if necessary): // rejectOfferViaWrapper enables the 721-ownerOf (you) to clear out standing offers on the base tile via the wrapper // (since the wrapper technically owns the base tile). W/o this, the tile's 10 offer slots could be DoS-ed with bogus offers // Note: This always rejects the 0 index offer to enforce the condition that our legit unwrapping offer sit // in position 0, the only position where we can guarantee no frontrunning/switcharoo issues // Pre-requisites: // The 721 exists for the col,row // There is 1+ offer(s) on the base tile // You own the 721 // The wrapper owns the base tile // function rejectOfferViaWrapper(uint8 col, uint8 row) external { uint256 _locationID = _getIndex(col, row); require(_exists(_locationID), "EW10: That 721 does not exist."); uint8 offersLength = uint8(_etheria.getOffers(col,row).length); // can't be more than 10 require(offersLength > 0, "EW10: The offer/ers arrays for this tile must not be empty."); address owner = ERC721.ownerOf(_locationID); require(owner == msg.sender, "EW10: You must be the 721-ownerOf the tile."); require(_etheria.getOwner(col,row) == address(this), "EW10: The wrapper must be the owner of the base tile."); address offerer = _etheria.getOfferers(col,row)[0]; // record offerer and offer for event below uint offer = _etheria.getOffers(col,row)[0]; _etheria.deleteOffer(col,row,0,offer); // always rejecting offer at index 0, we don't care about the others require(_etheria.getOffers(col,row).length == (offersLength-1), "EW10: Offers array must be 1 less than before. It is not. Reverting."); emit OfferRejected(msg.sender, _locationID, offer, offerer); // 721 owner rejected an offer on tile x of amount offer by offerer } //post state: // One less offer in the base tile's offers array // OfferRejected event fired // UNWRAP STEP 1: // call etheria.makeOffer with 0.01 ETH from the same account that owns the 721 // then make sure it's the offer sitting in position 0. If it isn't, rejectOfferViaWrapper until it is. // UNWRAP STEP 2: // Accepts the offer in position 0, the only position we can guarantee won't be switcharooed // Pre-requisites: // 721 must exist // You must own the 721 // offer on base tile in position 0 must be 0.01 ETH from the 721-owner // function acceptOfferViaWrapper(uint8 col, uint8 row) external { uint256 _locationID = _getIndex(col, row); require(_exists(_locationID), "EW10: That 721 does not exist."); address owner = ERC721.ownerOf(_locationID); require(owner == msg.sender, "EW10: You must be the 721-ownerOf the tile."); require(_etheria.getOfferers(col,row)[0] == msg.sender, "EW10: You are not the offerer in position 0."); require(_etheria.getOffers(col,row)[0] == 10000000000000000, "EW10: The offer in position 0 is not 0.01 ETH as expected."); _etheria.acceptOffer(col, row, 0, 10000000000000000); // 0.001 will be sent to Etheria creator and 0.009 will be sent to this contract require(_etheria.getOwner(col,row) == msg.sender, "EW10: You were not made the base tile owner as expected. Reverting."); _burn(_locationID); require(!_exists(_locationID), "EW10: The 721 was not burned as expected. Reverting."); emit Unwrapped(msg.sender, _locationID); // 721 owner unwrapped _locationID } // post state: // 721 burned, base tile now owned by msg.sender // 0.001 sent to Etheria contract creator, 0.009 sent to this wrapper for the "sale" // Note: This 0.009 ETH is not withdrawable to you due to complexity and gas. Consider it an unwrap fee. :) // Base tile offer/ers arrays cleared out and refunded, if necessary // NOTE: retractOfferViaWrapper is absent due to being unnecessary and overly complex. The tile owner can // always remove any unwanted offers, including any made from this wrapper. function setNameViaWrapper(uint8 col, uint8 row, string memory _n) external { uint256 _locationID = _getIndex(col, row); require(_exists(_locationID), "EW10: That 721 does not exist."); address owner = ERC721.ownerOf(_locationID); require(owner == msg.sender, "EW10: You must be the 721-ownerOf the tile."); _etheria.setName(col,row,_n); emit NameSet(msg.sender, _locationID, _n); // tile's 721-ownerOf set _locationID's name } function setStatusViaWrapper(uint8 col, uint8 row, string memory _n) external payable { uint256 _locationID = _getIndex(col, row); require(_exists(_locationID), "EW10: That 721 does not exist."); address owner = ERC721.ownerOf(_locationID); require(owner == msg.sender, "EW10: You must be the 721-ownerOf the tile."); require(msg.value == 1000000000000000000, "EW10: It costs 1 ETH to change status."); // 1 ETH _etheria.setStatus{value: msg.value}(col,row,_n); emit StatusSet(msg.sender, _locationID, _n); // tile's 721-ownerOf set _locationID's status } // In the extremely unlikely event somebody is being stupid and filling all the slots on the tiles AND maliciously // keeping a bot running to continually insert more bogus 0.01 ETH bids into the slots even as the tile owner // rejects them (i.e. a DoS attack meant to prevent un/wrapping), the tile owner can still get their wrapper bid onto // the tile via flashbots or similar (avoiding the mempool): Simply etheria.rejectOffer and wrapper.makeOfferViaWrapper // in back-to-back transactions, then reject offers until the wrapper offer is in slot 0, ready to wrap. (It doesn't // matter if the bot creates 9 more in the remaining slots.) Hence, there is nothing an attacker can do to DoS a tile. /** * @dev sets base token URI and the token extension... */ string public _baseTokenURI; string public _baseTokenExtension; function setBaseTokenURI(string memory __baseTokenURI) public onlyOwner { _baseTokenURI = __baseTokenURI; } function setTokenExtension(string memory __baseTokenExtension) public onlyOwner { _baseTokenExtension = __baseTokenExtension; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { // complete URI = base + token + token extension return string(abi.encodePacked(_baseTokenURI, Strings.toString(_tokenId), _baseTokenExtension)); } function empty() external onlyOwner { // Unwrapping leaves 0.009 ETH on this wrapper each time. Allow creator to retrieve, if it ever becomes // worth the effort. No other money should ever rest on this wrapper, only the base Etheria contract. payable(msg.sender).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"offer","type":"uint256"},{"indexed":false,"internalType":"address","name":"offerer","type":"address"}],"name":"OfferRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"}],"name":"OfferRetracted","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":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"},{"indexed":false,"internalType":"string","name":"status","type":"string"}],"name":"StatusSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"}],"name":"Unwrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"}],"name":"WrapFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"_locationID","type":"uint256"}],"name":"WrapStarted","type":"event"},{"inputs":[],"name":"_baseTokenExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_etheria","outputs":[{"internalType":"contract Etheria","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_etheriaAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"}],"name":"acceptOfferViaWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"empty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"}],"name":"finishWrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"}],"name":"getWrapInitializer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"}],"name":"makeOfferViaWrapper","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"}],"name":"rejectOfferViaWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"},{"internalType":"string","name":"_n","type":"string"}],"name":"setNameViaWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"col","type":"uint8"},{"internalType":"uint8","name":"row","type":"uint8"},{"internalType":"string","name":"_n","type":"string"}],"name":"setStatusViaWrapper","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseTokenExtension","type":"string"}],"name":"setTokenExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wrapInitializers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
602060809081527f45746865726961205772617070657220763170743020323031352d31302d323260a052610100604052600460c0908152630455731360e41b60e0526200004d3362000116565b81516200006290600190602085019062000166565b5080516200007890600290602084019062000166565b50506007805473e414716f017b5c1457bf98e985bccb135dff81f26001600160a01b031991821681179092556008805490911690911790555060408051606081019091526025808252620037cb60208301398051620000e091600a9160209091019062000166565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200010f91600b9162000166565b5062000249565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000174906200020c565b90600052602060002090601f016020900481019282620001985760008555620001e3565b82601f10620001b357805160ff1916838001178555620001e3565b82800160010185558215620001e3579182015b82811115620001e3578251825591602001919060010190620001c6565b50620001f1929150620001f5565b5090565b5b80821115620001f15760008155600101620001f6565b600181811c908216806200022157607f821691505b602082108114156200024357634e487b7160e01b600052602260045260246000fd5b50919050565b61357280620002596000396000f3fe6080604052600436106101dc5760003560e01c8063695d783211610102578063a22cb46511610095578063e985e9c511610064578063e985e9c5146105d6578063ec3408261461061f578063f2a75fe414610634578063f2fde38b1461064957600080fd5b8063a22cb46514610561578063b88d4fde14610581578063c87b56dd146105a1578063cfc86f7b146105c157600080fd5b80637b0cf1ef116100d15780637b0cf1ef146104d85780638da5cb5b146104f857806395d89b411461051657806398caef281461052b57600080fd5b8063695d78321461046257806370a0823114610475578063715018a6146104a357806373292671146104b857600080fd5b80632155abf51161017a5780634abc2fec116101495780634abc2fec146103ef5780635502e1481461040f5780635e0b0092146104225780636352211e1461044257600080fd5b80632155abf51461036f57806323b872dd1461038f57806330176e13146103af57806342842e0e146103cf57600080fd5b8063095ea7b3116101b6578063095ea7b3146102ef5780630cd5188f1461030f578063147c07181461032f5780632067c8e51461034f57600080fd5b806301ffc9a71461026057806306fdde0314610295578063081812fc146102b757600080fd5b3661025b576007546001600160a01b0316336001600160a01b0316146102595760405162461bcd60e51b815260206004820152602760248201527f455731303a204554482073656e6465722069736e2774204574686572696120636044820152661bdb9d1c9858dd60ca1b60648201526084015b60405180910390fd5b005b600080fd5b34801561026c57600080fd5b5061028061027b366004612f5f565b610669565b60405190151581526020015b60405180910390f35b3480156102a157600080fd5b506102aa6106bb565b60405161028c91906131ae565b3480156102c357600080fd5b506102d76102d2366004612fce565b61074d565b6040516001600160a01b03909116815260200161028c565b3480156102fb57600080fd5b5061025961030a366004612e01565b6107d5565b34801561031b57600080fd5b5061025961032a366004612fe7565b6108eb565b34801561033b57600080fd5b5061025961034a366004612f99565b610dbc565b34801561035b57600080fd5b5061025961036a366004612fe7565b610dfd565b34801561037b57600080fd5b506008546102d7906001600160a01b031681565b34801561039b57600080fd5b506102596103aa366004612d0d565b61139f565b3480156103bb57600080fd5b506102596103ca366004612f99565b6113d0565b3480156103db57600080fd5b506102596103ea366004612d0d565b61140d565b3480156103fb57600080fd5b506102d761040a366004612fe7565b611428565b61025961041d36600461301a565b611455565b34801561042e57600080fd5b506007546102d7906001600160a01b031681565b34801561044e57600080fd5b506102d761045d366004612fce565b6115d4565b610259610470366004612fe7565b61164b565b34801561048157600080fd5b50610495610490366004612c9a565b611bd8565b60405190815260200161028c565b3480156104af57600080fd5b50610259611c5f565b3480156104c457600080fd5b506102596104d3366004612fe7565b611c95565b3480156104e457600080fd5b506102596104f336600461301a565b611f75565b34801561050457600080fd5b506000546001600160a01b03166102d7565b34801561052257600080fd5b506102aa61207d565b34801561053757600080fd5b506102d7610546366004612fce565b6009602052600090815260409020546001600160a01b031681565b34801561056d57600080fd5b5061025961057c366004612dce565b61208c565b34801561058d57600080fd5b5061025961059c366004612d4e565b612097565b3480156105ad57600080fd5b506102aa6105bc366004612fce565b6120cf565b3480156105cd57600080fd5b506102aa612106565b3480156105e257600080fd5b506102806105f1366004612cd4565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561062b57600080fd5b506102aa612194565b34801561064057600080fd5b506102596121a1565b34801561065557600080fd5b50610259610664366004612c9a565b6121fa565b60006001600160e01b031982166380ac58cd60e01b148061069a57506001600160e01b03198216635b5e139f60e01b145b806106b557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546106ca9061344f565b80601f01602080910402602001604051908101604052809291908181526020018280546106f69061344f565b80156107435780601f1061071857610100808354040283529160200191610743565b820191906000526020600020905b81548152906001019060200180831161072657829003601f168201915b5050505050905090565b600061075882612292565b6107b95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610250565b506000908152600560205260409020546001600160a01b031690565b60006107e0826115d4565b9050806001600160a01b0316836001600160a01b0316141561084e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610250565b336001600160a01b038216148061086a575061086a81336105f1565b6108dc5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610250565b6108e683836122af565b505050565b60006108f7838361231d565b905061090281612292565b61091e5760405162461bcd60e51b8152600401610250906132e4565b6000610929826115d4565b90506001600160a01b03811633146109535760405162461bcd60e51b815260040161025090613213565b600854604051636a86455960e01b815260ff80871660048301528516602482015233916001600160a01b031690636a8645599060440160006040518083038186803b1580156109a157600080fd5b505afa1580156109b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109dd9190810190612e2d565b6000815181106109ef576109ef6134e5565b60200260200101516001600160a01b031614610a625760405162461bcd60e51b815260206004820152602c60248201527f455731303a20596f7520617265206e6f7420746865206f66666572657220696e60448201526b103837b9b4ba34b7b710181760a11b6064820152608401610250565b6008546040516318fb5f8f60e31b815260ff8087166004830152851660248201526001600160a01b039091169063c7dafc789060440160006040518083038186803b158015610ab057600080fd5b505afa158015610ac4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aec9190810190612ed3565b600081518110610afe57610afe6134e5565b6020026020010151662386f26fc1000014610b815760405162461bcd60e51b815260206004820152603a60248201527f455731303a20546865206f6666657220696e20706f736974696f6e203020697360448201527f206e6f7420302e3031204554482061732065787065637465642e0000000000006064820152608401610250565b60085460405163148e83e960e31b815260ff80871660048301528516602482015260006044820152662386f26fc1000060648201526001600160a01b039091169063a4741f4890608401600060405180830381600087803b158015610be557600080fd5b505af1158015610bf9573d6000803e3d6000fd5b505060085460405163e039e4a160e01b815260ff8089166004830152871660248201523393506001600160a01b03909116915063e039e4a19060440160206040518083038186803b158015610c4d57600080fd5b505afa158015610c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c859190612cb7565b6001600160a01b031614610d0d5760405162461bcd60e51b815260206004820152604360248201527f455731303a20596f752077657265206e6f74206d61646520746865206261736560448201527f2074696c65206f776e65722061732065787065637465642e205265766572746960648201526237339760e91b608482015260a401610250565b610d16826123c2565b610d1f82612292565b15610d895760405162461bcd60e51b815260206004820152603460248201527f455731303a205468652037323120776173206e6f74206275726e65642061732060448201527332bc3832b1ba32b217102932bb32b93a34b7339760611b6064820152608401610250565b604051829033907f95ae649bfaaef9def56a52f4fb2d9e8fa5496bb7082930e442c74cc76b03dcb390600090a350505050565b6000546001600160a01b03163314610de65760405162461bcd60e51b81526004016102509061325e565b8051610df990600b906020840190612b73565b5050565b6000610e09838361231d565b9050610e1481612292565b610e305760405162461bcd60e51b8152600401610250906132e4565b6008546040516318fb5f8f60e31b815260ff8086166004830152841660248201526000916001600160a01b03169063c7dafc789060440160006040518083038186803b158015610e7f57600080fd5b505afa158015610e93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ebb9190810190612ed3565b51905060008160ff1611610f375760405162461bcd60e51b815260206004820152603b60248201527f455731303a20546865206f666665722f6572732061727261797320666f72207460448201527f6869732074696c65206d757374206e6f7420626520656d7074792e00000000006064820152608401610250565b6000610f42836115d4565b90506001600160a01b0381163314610f6c5760405162461bcd60e51b815260040161025090613213565b60085460405163e039e4a160e01b815260ff80881660048301528616602482015230916001600160a01b03169063e039e4a19060440160206040518083038186803b158015610fba57600080fd5b505afa158015610fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff29190612cb7565b6001600160a01b0316146110665760405162461bcd60e51b815260206004820152603560248201527f455731303a205468652077726170706572206d75737420626520746865206f776044820152743732b91037b3103a3432903130b9b2903a34b6329760591b6064820152608401610250565b600854604051636a86455960e01b815260ff8088166004830152861660248201526000916001600160a01b031690636a8645599060440160006040518083038186803b1580156110b557600080fd5b505afa1580156110c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110f19190810190612e2d565b600081518110611103576111036134e5565b60209081029190910101516008546040516318fb5f8f60e31b815260ff808a166004830152881660248201529192506000916001600160a01b039091169063c7dafc789060440160006040518083038186803b15801561116257600080fd5b505afa158015611176573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261119e9190810190612ed3565b6000815181106111b0576111b06134e5565b6020908102919091010151600854604051633fa022c560e11b815260ff808b1660048301528916602482015260006044820152606481018390529192506001600160a01b031690637f40458a90608401600060405180830381600087803b15801561121a57600080fd5b505af115801561122e573d6000803e3d6000fd5b5050505060018461123f9190613400565b6008546040516318fb5f8f60e31b815260ff8a81166004830152898116602483015292909216916001600160a01b039091169063c7dafc789060440160006040518083038186803b15801561129357600080fd5b505afa1580156112a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112cf9190810190612ed3565b51146113515760405162461bcd60e51b8152602060048201526044602482018190527f455731303a204f6666657273206172726179206d7573742062652031206c6573908201527f73207468616e206265666f72652e204974206973206e6f742e2052657665727460648201526334b7339760e11b608482015260a401610250565b604080518281526001600160a01b0384166020820152869133917fbd9a5db408777ca146c18dbdaa3fdead0f84637f56abe4f3ba590c2c4d786c2e910160405180910390a350505050505050565b6113a9338261245d565b6113c55760405162461bcd60e51b815260040161025090613293565b6108e6838383612547565b6000546001600160a01b031633146113fa5760405162461bcd60e51b81526004016102509061325e565b8051610df990600a906020840190612b73565b6108e683838360405180602001604052806000815250612097565b600080611435848461231d565b6000908152600960205260409020546001600160a01b0316949350505050565b6000611461848461231d565b905061146c81612292565b6114885760405162461bcd60e51b8152600401610250906132e4565b6000611493826115d4565b90506001600160a01b03811633146114bd5760405162461bcd60e51b815260040161025090613213565b34670de0b6b3a7640000146115235760405162461bcd60e51b815260206004820152602660248201527f455731303a20497420636f73747320312045544820746f206368616e676520736044820152653a30ba3ab99760d11b6064820152608401610250565b600854604051632a1c2a9360e11b81526001600160a01b039091169063543855269034906115599089908990899060040161331b565b6000604051808303818588803b15801561157257600080fd5b505af1158015611586573d6000803e3d6000fd5b505050505081336001600160a01b03167f7ae797a5c5147dcb50947fce8be08662a4e9f5716bcab599a5e2d9894709930b856040516115c591906131ae565b60405180910390a35050505050565b6000818152600360205260408120546001600160a01b0316806106b55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610250565b6000611657838361231d565b60085460405163e039e4a160e01b815260ff80871660048301528516602482015291925033916001600160a01b039091169063e039e4a19060440160206040518083038186803b1580156116aa57600080fd5b505afa1580156116be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e29190612cb7565b6001600160a01b03161461175e5760405162461bcd60e51b815260206004820152603f60248201527f455731303a20596f75206d757374206265207468652074696c65206f776e657260448201527f20746f20737461727420746865207772617070696e672070726f636573732e006064820152608401610250565b6008546040516318fb5f8f60e31b815260ff8086166004830152841660248201526001600160a01b039091169063c7dafc789060440160006040518083038186803b1580156117ac57600080fd5b505afa1580156117c0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117e89190810190612ed3565b511561186f5760405162461bcd60e51b815260206004820152604a60248201527f455731303a20546865206f666665722f6572732061727261797320666f72207460448201527f6869732074696c65206d75737420626520656d7074792e2052656a656374206160648201526936361037b33332b9399760b11b608482015260a401610250565b34662386f26fc10000146118eb5760405162461bcd60e51b815260206004820152603860248201527f455731303a20596f75206d75737420737570706c792065786163746c7920302e60448201527f30312045544820746f20746869732066756e6374696f6e2e00000000000000006064820152608401610250565b600854604051631899ad4560e21b815260ff8086166004830152841660248201526001600160a01b0390911690636266b5149034906044016000604051808303818588803b15801561193c57600080fd5b505af1158015611950573d6000803e3d6000fd5b5050600854604051636a86455960e01b815260ff8089166004830152871660248201523094506001600160a01b039091169250636a864559915060440160006040518083038186803b1580156119a557600080fd5b505afa1580156119b9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119e19190810190612e2d565b6000815181106119f3576119f36134e5565b60200260200101516001600160a01b031614611a775760405162461bcd60e51b815260206004820152603f60248201527f455731303a20546865206f66666572657220696e20706f736974696f6e20302060448201527f73686f756c642062652074686973207772617070657220616464726573732e006064820152608401610250565b6008546040516318fb5f8f60e31b815260ff8086166004830152841660248201526001600160a01b039091169063c7dafc789060440160006040518083038186803b158015611ac557600080fd5b505afa158015611ad9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b019190810190612ed3565b600081518110611b1357611b136134e5565b6020026020010151662386f26fc1000014611b8a5760405162461bcd60e51b815260206004820152603160248201527f455731303a20546865206f6666657220696e20706f736974696f6e203020736860448201527037bab63210313290181718189022aa241760791b6064820152608401610250565b60008181526009602052604080822080546001600160a01b03191633908117909155905183927fbbbe6b1e878619266ad669ec014b7df730791e7918756261d6d697eadb258ab391a3505050565b60006001600160a01b038216611c435760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610250565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611c895760405162461bcd60e51b81526004016102509061325e565b611c9360006126e3565b565b6000611ca1838361231d565b6000818152600960205260409020549091506001600160a01b03163314611d4d5760405162461bcd60e51b815260206004820152605460248201527f455731303a20596f7520617265206e6f74207468652077726170496e6974696160448201527f6c697a657220666f7220746869732074696c652e2043616c6c206d616b654f666064820152733332b92b34b0abb930b83832b9103334b939ba1760611b608482015260a401610250565b60085460405163e039e4a160e01b815260ff80861660048301528416602482015230916001600160a01b03169063e039e4a19060440160206040518083038186803b158015611d9b57600080fd5b505afa158015611daf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd39190612cb7565b6001600160a01b031614611ea55760405162461bcd60e51b815260206004820152608160248201527f455731303a2054696c65206973206e6f7420796574206f776e6564206279207460448201527f68697320777261707065722e2043616c6c20657468657269612e61636365707460648201527f4f6666657220746f2067697665207468652077726170706572206f776e65727360848201527f6869702c207468656e2066696e6973685772617020746f20636f6d706c65746560a4820152601760f91b60c482015260e401610250565b611eaf3382612733565b611eb881612292565b611f2a5760405162461bcd60e51b815260206004820152603c60248201527f455731303a2037323120776173206e6f7420637265617465642061732069742060448201527f73686f756c642068617665206265656e2e20526576657274696e672e000000006064820152608401610250565b60008181526009602052604080822080546001600160a01b031916905551829133917f3cf906ed50bffa98a7d8755ae34ab2349dfd013d68b710b5b30f77ec6c8f7dea9190a3505050565b6000611f81848461231d565b9050611f8c81612292565b611fa85760405162461bcd60e51b8152600401610250906132e4565b6000611fb3826115d4565b90506001600160a01b0381163314611fdd5760405162461bcd60e51b815260040161025090613213565b6008546040516393eec1fb60e01b81526001600160a01b03909116906393eec1fb906120119088908890889060040161331b565b600060405180830381600087803b15801561202b57600080fd5b505af115801561203f573d6000803e3d6000fd5b5050505081336001600160a01b03167ff5d76516762cab8f8daa08297b6fcc80c203c570bc87f74ec3e77952d625d94b856040516115c591906131ae565b6060600280546106ca9061344f565b610df9338383612866565b6120a1338361245d565b6120bd5760405162461bcd60e51b815260040161025090613293565b6120c984848484612935565b50505050565b6060600a6120dc83612968565b600b6040516020016120f09392919061313e565b6040516020818303038152906040529050919050565b600a80546121139061344f565b80601f016020809104026020016040519081016040528092919081815260200182805461213f9061344f565b801561218c5780601f106121615761010080835404028352916020019161218c565b820191906000526020600020905b81548152906001019060200180831161216f57829003601f168201915b505050505081565b600b80546121139061344f565b6000546001600160a01b031633146121cb5760405162461bcd60e51b81526004016102509061325e565b60405133904780156108fc02916000818181858888f193505050501580156121f7573d6000803e3d6000fd5b50565b6000546001600160a01b031633146122245760405162461bcd60e51b81526004016102509061325e565b6001600160a01b0381166122895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610250565b6121f7816126e3565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906122e4826115d4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000602060ff8416118015906123375750602060ff831611155b61239d5760405162461bcd60e51b815260206004820152603160248201527f455731303a20496e76616c696420636f6c20616e642f6f7220726f772e2056616044820152703634b2103930b733b29034b9901816999960791b6064820152608401610250565b8160ff1660218460ff166123b191906133ca565b6123bb919061339e565b9392505050565b60006123cd826115d4565b90506123da6000836122af565b6001600160a01b03811660009081526004602052604081208054600192906124039084906133e9565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600061246882612292565b6124c95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610250565b60006124d4836115d4565b9050806001600160a01b0316846001600160a01b0316148061250f5750836001600160a01b03166125048461074d565b6001600160a01b0316145b8061253f57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661255a826115d4565b6001600160a01b0316146125be5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610250565b6001600160a01b0382166126205760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610250565b61262b6000826122af565b6001600160a01b03831660009081526004602052604081208054600192906126549084906133e9565b90915550506001600160a01b038216600090815260046020526040812080546001929061268290849061339e565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166127895760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610250565b61279281612292565b156127df5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610250565b6001600160a01b038216600090815260046020526040812080546001929061280890849061339e565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b031614156128c85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610250565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612940848484612547565b61294c84848484612a66565b6120c95760405162461bcd60e51b8152600401610250906131c1565b60608161298c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129b657806129a08161348a565b91506129af9050600a836133b6565b9150612990565b60008167ffffffffffffffff8111156129d1576129d16134fb565b6040519080825280601f01601f1916602001820160405280156129fb576020820181803683370190505b5090505b841561253f57612a106001836133e9565b9150612a1d600a866134a5565b612a2890603061339e565b60f81b818381518110612a3d57612a3d6134e5565b60200101906001600160f81b031916908160001a905350612a5f600a866133b6565b94506129ff565b60006001600160a01b0384163b15612b6857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612aaa903390899088908890600401613171565b602060405180830381600087803b158015612ac457600080fd5b505af1925050508015612af4575060408051601f3d908101601f19168201909252612af191810190612f7c565b60015b612b4e573d808015612b22576040519150601f19603f3d011682016040523d82523d6000602084013e612b27565b606091505b508051612b465760405162461bcd60e51b8152600401610250906131c1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061253f565b506001949350505050565b828054612b7f9061344f565b90600052602060002090601f016020900481019282612ba15760008555612be7565b82601f10612bba57805160ff1916838001178555612be7565b82800160010185558215612be7579182015b82811115612be7578251825591602001919060010190612bcc565b50612bf3929150612bf7565b5090565b5b80821115612bf35760008155600101612bf8565b600067ffffffffffffffff831115612c2657612c266134fb565b612c39601f8401601f1916602001613349565b9050828152838383011115612c4d57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612c7557600080fd5b6123bb83833560208501612c0c565b803560ff81168114612c9557600080fd5b919050565b600060208284031215612cac57600080fd5b81356123bb81613511565b600060208284031215612cc957600080fd5b81516123bb81613511565b60008060408385031215612ce757600080fd5b8235612cf281613511565b91506020830135612d0281613511565b809150509250929050565b600080600060608486031215612d2257600080fd5b8335612d2d81613511565b92506020840135612d3d81613511565b929592945050506040919091013590565b60008060008060808587031215612d6457600080fd5b8435612d6f81613511565b93506020850135612d7f81613511565b925060408501359150606085013567ffffffffffffffff811115612da257600080fd5b8501601f81018713612db357600080fd5b612dc287823560208401612c0c565b91505092959194509250565b60008060408385031215612de157600080fd5b8235612dec81613511565b915060208301358015158114612d0257600080fd5b60008060408385031215612e1457600080fd5b8235612e1f81613511565b946020939093013593505050565b60006020808385031215612e4057600080fd5b825167ffffffffffffffff811115612e5757600080fd5b8301601f81018513612e6857600080fd5b8051612e7b612e768261337a565b613349565b80828252848201915084840188868560051b8701011115612e9b57600080fd5b600094505b83851015612ec7578051612eb381613511565b835260019490940193918501918501612ea0565b50979650505050505050565b60006020808385031215612ee657600080fd5b825167ffffffffffffffff811115612efd57600080fd5b8301601f81018513612f0e57600080fd5b8051612f1c612e768261337a565b80828252848201915084840188868560051b8701011115612f3c57600080fd5b600094505b83851015612ec7578051835260019490940193918501918501612f41565b600060208284031215612f7157600080fd5b81356123bb81613526565b600060208284031215612f8e57600080fd5b81516123bb81613526565b600060208284031215612fab57600080fd5b813567ffffffffffffffff811115612fc257600080fd5b61253f84828501612c64565b600060208284031215612fe057600080fd5b5035919050565b60008060408385031215612ffa57600080fd5b61300383612c84565b915061301160208401612c84565b90509250929050565b60008060006060848603121561302f57600080fd5b61303884612c84565b925061304660208501612c84565b9150604084013567ffffffffffffffff81111561306257600080fd5b61306e86828701612c64565b9150509250925092565b60008151808452613090816020860160208601613423565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806130be57607f831692505b60208084108214156130e057634e487b7160e01b600052602260045260246000fd5b8180156130f4576001811461310557613132565b60ff19861689528489019650613132565b60008881526020902060005b8681101561312a5781548b820152908501908301613111565b505084890196505b50505050505092915050565b600061314a82866130a4565b845161315a818360208901613423565b613166818301866130a4565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131a490830184613078565b9695505050505050565b6020815260006123bb6020830184613078565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f455731303a20596f75206d75737420626520746865203732312d6f776e65724f60408201526a33103a3432903a34b6329760a91b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601e908201527f455731303a20546861742037323120646f6573206e6f742065786973742e0000604082015260600190565b60ff8416815260ff831660208201526060604082015260006133406060830184613078565b95945050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715613372576133726134fb565b604052919050565b600067ffffffffffffffff821115613394576133946134fb565b5060051b60200190565b600082198211156133b1576133b16134b9565b500190565b6000826133c5576133c56134cf565b500490565b60008160001904831182151516156133e4576133e46134b9565b500290565b6000828210156133fb576133fb6134b9565b500390565b600060ff821660ff84168082101561341a5761341a6134b9565b90039392505050565b60005b8381101561343e578181015183820152602001613426565b838111156120c95750506000910152565b600181811c9082168061346357607f821691505b6020821081141561348457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561349e5761349e6134b9565b5060010190565b6000826134b4576134b46134cf565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146121f757600080fd5b6001600160e01b0319811681146121f757600080fdfea2646970667358221220f3039146c25c6abc4203b8b9d3c6047cc64554852e68a50894a724d49b06675c64736f6c6343000807003368747470733a2f2f657468657269612e776f726c642f6d657461646174612f76317074302f
Deployed Bytecode
0x6080604052600436106101dc5760003560e01c8063695d783211610102578063a22cb46511610095578063e985e9c511610064578063e985e9c5146105d6578063ec3408261461061f578063f2a75fe414610634578063f2fde38b1461064957600080fd5b8063a22cb46514610561578063b88d4fde14610581578063c87b56dd146105a1578063cfc86f7b146105c157600080fd5b80637b0cf1ef116100d15780637b0cf1ef146104d85780638da5cb5b146104f857806395d89b411461051657806398caef281461052b57600080fd5b8063695d78321461046257806370a0823114610475578063715018a6146104a357806373292671146104b857600080fd5b80632155abf51161017a5780634abc2fec116101495780634abc2fec146103ef5780635502e1481461040f5780635e0b0092146104225780636352211e1461044257600080fd5b80632155abf51461036f57806323b872dd1461038f57806330176e13146103af57806342842e0e146103cf57600080fd5b8063095ea7b3116101b6578063095ea7b3146102ef5780630cd5188f1461030f578063147c07181461032f5780632067c8e51461034f57600080fd5b806301ffc9a71461026057806306fdde0314610295578063081812fc146102b757600080fd5b3661025b576007546001600160a01b0316336001600160a01b0316146102595760405162461bcd60e51b815260206004820152602760248201527f455731303a204554482073656e6465722069736e2774204574686572696120636044820152661bdb9d1c9858dd60ca1b60648201526084015b60405180910390fd5b005b600080fd5b34801561026c57600080fd5b5061028061027b366004612f5f565b610669565b60405190151581526020015b60405180910390f35b3480156102a157600080fd5b506102aa6106bb565b60405161028c91906131ae565b3480156102c357600080fd5b506102d76102d2366004612fce565b61074d565b6040516001600160a01b03909116815260200161028c565b3480156102fb57600080fd5b5061025961030a366004612e01565b6107d5565b34801561031b57600080fd5b5061025961032a366004612fe7565b6108eb565b34801561033b57600080fd5b5061025961034a366004612f99565b610dbc565b34801561035b57600080fd5b5061025961036a366004612fe7565b610dfd565b34801561037b57600080fd5b506008546102d7906001600160a01b031681565b34801561039b57600080fd5b506102596103aa366004612d0d565b61139f565b3480156103bb57600080fd5b506102596103ca366004612f99565b6113d0565b3480156103db57600080fd5b506102596103ea366004612d0d565b61140d565b3480156103fb57600080fd5b506102d761040a366004612fe7565b611428565b61025961041d36600461301a565b611455565b34801561042e57600080fd5b506007546102d7906001600160a01b031681565b34801561044e57600080fd5b506102d761045d366004612fce565b6115d4565b610259610470366004612fe7565b61164b565b34801561048157600080fd5b50610495610490366004612c9a565b611bd8565b60405190815260200161028c565b3480156104af57600080fd5b50610259611c5f565b3480156104c457600080fd5b506102596104d3366004612fe7565b611c95565b3480156104e457600080fd5b506102596104f336600461301a565b611f75565b34801561050457600080fd5b506000546001600160a01b03166102d7565b34801561052257600080fd5b506102aa61207d565b34801561053757600080fd5b506102d7610546366004612fce565b6009602052600090815260409020546001600160a01b031681565b34801561056d57600080fd5b5061025961057c366004612dce565b61208c565b34801561058d57600080fd5b5061025961059c366004612d4e565b612097565b3480156105ad57600080fd5b506102aa6105bc366004612fce565b6120cf565b3480156105cd57600080fd5b506102aa612106565b3480156105e257600080fd5b506102806105f1366004612cd4565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561062b57600080fd5b506102aa612194565b34801561064057600080fd5b506102596121a1565b34801561065557600080fd5b50610259610664366004612c9a565b6121fa565b60006001600160e01b031982166380ac58cd60e01b148061069a57506001600160e01b03198216635b5e139f60e01b145b806106b557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546106ca9061344f565b80601f01602080910402602001604051908101604052809291908181526020018280546106f69061344f565b80156107435780601f1061071857610100808354040283529160200191610743565b820191906000526020600020905b81548152906001019060200180831161072657829003601f168201915b5050505050905090565b600061075882612292565b6107b95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610250565b506000908152600560205260409020546001600160a01b031690565b60006107e0826115d4565b9050806001600160a01b0316836001600160a01b0316141561084e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610250565b336001600160a01b038216148061086a575061086a81336105f1565b6108dc5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610250565b6108e683836122af565b505050565b60006108f7838361231d565b905061090281612292565b61091e5760405162461bcd60e51b8152600401610250906132e4565b6000610929826115d4565b90506001600160a01b03811633146109535760405162461bcd60e51b815260040161025090613213565b600854604051636a86455960e01b815260ff80871660048301528516602482015233916001600160a01b031690636a8645599060440160006040518083038186803b1580156109a157600080fd5b505afa1580156109b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109dd9190810190612e2d565b6000815181106109ef576109ef6134e5565b60200260200101516001600160a01b031614610a625760405162461bcd60e51b815260206004820152602c60248201527f455731303a20596f7520617265206e6f7420746865206f66666572657220696e60448201526b103837b9b4ba34b7b710181760a11b6064820152608401610250565b6008546040516318fb5f8f60e31b815260ff8087166004830152851660248201526001600160a01b039091169063c7dafc789060440160006040518083038186803b158015610ab057600080fd5b505afa158015610ac4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610aec9190810190612ed3565b600081518110610afe57610afe6134e5565b6020026020010151662386f26fc1000014610b815760405162461bcd60e51b815260206004820152603a60248201527f455731303a20546865206f6666657220696e20706f736974696f6e203020697360448201527f206e6f7420302e3031204554482061732065787065637465642e0000000000006064820152608401610250565b60085460405163148e83e960e31b815260ff80871660048301528516602482015260006044820152662386f26fc1000060648201526001600160a01b039091169063a4741f4890608401600060405180830381600087803b158015610be557600080fd5b505af1158015610bf9573d6000803e3d6000fd5b505060085460405163e039e4a160e01b815260ff8089166004830152871660248201523393506001600160a01b03909116915063e039e4a19060440160206040518083038186803b158015610c4d57600080fd5b505afa158015610c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c859190612cb7565b6001600160a01b031614610d0d5760405162461bcd60e51b815260206004820152604360248201527f455731303a20596f752077657265206e6f74206d61646520746865206261736560448201527f2074696c65206f776e65722061732065787065637465642e205265766572746960648201526237339760e91b608482015260a401610250565b610d16826123c2565b610d1f82612292565b15610d895760405162461bcd60e51b815260206004820152603460248201527f455731303a205468652037323120776173206e6f74206275726e65642061732060448201527332bc3832b1ba32b217102932bb32b93a34b7339760611b6064820152608401610250565b604051829033907f95ae649bfaaef9def56a52f4fb2d9e8fa5496bb7082930e442c74cc76b03dcb390600090a350505050565b6000546001600160a01b03163314610de65760405162461bcd60e51b81526004016102509061325e565b8051610df990600b906020840190612b73565b5050565b6000610e09838361231d565b9050610e1481612292565b610e305760405162461bcd60e51b8152600401610250906132e4565b6008546040516318fb5f8f60e31b815260ff8086166004830152841660248201526000916001600160a01b03169063c7dafc789060440160006040518083038186803b158015610e7f57600080fd5b505afa158015610e93573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ebb9190810190612ed3565b51905060008160ff1611610f375760405162461bcd60e51b815260206004820152603b60248201527f455731303a20546865206f666665722f6572732061727261797320666f72207460448201527f6869732074696c65206d757374206e6f7420626520656d7074792e00000000006064820152608401610250565b6000610f42836115d4565b90506001600160a01b0381163314610f6c5760405162461bcd60e51b815260040161025090613213565b60085460405163e039e4a160e01b815260ff80881660048301528616602482015230916001600160a01b03169063e039e4a19060440160206040518083038186803b158015610fba57600080fd5b505afa158015610fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff29190612cb7565b6001600160a01b0316146110665760405162461bcd60e51b815260206004820152603560248201527f455731303a205468652077726170706572206d75737420626520746865206f776044820152743732b91037b3103a3432903130b9b2903a34b6329760591b6064820152608401610250565b600854604051636a86455960e01b815260ff8088166004830152861660248201526000916001600160a01b031690636a8645599060440160006040518083038186803b1580156110b557600080fd5b505afa1580156110c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110f19190810190612e2d565b600081518110611103576111036134e5565b60209081029190910101516008546040516318fb5f8f60e31b815260ff808a166004830152881660248201529192506000916001600160a01b039091169063c7dafc789060440160006040518083038186803b15801561116257600080fd5b505afa158015611176573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261119e9190810190612ed3565b6000815181106111b0576111b06134e5565b6020908102919091010151600854604051633fa022c560e11b815260ff808b1660048301528916602482015260006044820152606481018390529192506001600160a01b031690637f40458a90608401600060405180830381600087803b15801561121a57600080fd5b505af115801561122e573d6000803e3d6000fd5b5050505060018461123f9190613400565b6008546040516318fb5f8f60e31b815260ff8a81166004830152898116602483015292909216916001600160a01b039091169063c7dafc789060440160006040518083038186803b15801561129357600080fd5b505afa1580156112a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112cf9190810190612ed3565b51146113515760405162461bcd60e51b8152602060048201526044602482018190527f455731303a204f6666657273206172726179206d7573742062652031206c6573908201527f73207468616e206265666f72652e204974206973206e6f742e2052657665727460648201526334b7339760e11b608482015260a401610250565b604080518281526001600160a01b0384166020820152869133917fbd9a5db408777ca146c18dbdaa3fdead0f84637f56abe4f3ba590c2c4d786c2e910160405180910390a350505050505050565b6113a9338261245d565b6113c55760405162461bcd60e51b815260040161025090613293565b6108e6838383612547565b6000546001600160a01b031633146113fa5760405162461bcd60e51b81526004016102509061325e565b8051610df990600a906020840190612b73565b6108e683838360405180602001604052806000815250612097565b600080611435848461231d565b6000908152600960205260409020546001600160a01b0316949350505050565b6000611461848461231d565b905061146c81612292565b6114885760405162461bcd60e51b8152600401610250906132e4565b6000611493826115d4565b90506001600160a01b03811633146114bd5760405162461bcd60e51b815260040161025090613213565b34670de0b6b3a7640000146115235760405162461bcd60e51b815260206004820152602660248201527f455731303a20497420636f73747320312045544820746f206368616e676520736044820152653a30ba3ab99760d11b6064820152608401610250565b600854604051632a1c2a9360e11b81526001600160a01b039091169063543855269034906115599089908990899060040161331b565b6000604051808303818588803b15801561157257600080fd5b505af1158015611586573d6000803e3d6000fd5b505050505081336001600160a01b03167f7ae797a5c5147dcb50947fce8be08662a4e9f5716bcab599a5e2d9894709930b856040516115c591906131ae565b60405180910390a35050505050565b6000818152600360205260408120546001600160a01b0316806106b55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610250565b6000611657838361231d565b60085460405163e039e4a160e01b815260ff80871660048301528516602482015291925033916001600160a01b039091169063e039e4a19060440160206040518083038186803b1580156116aa57600080fd5b505afa1580156116be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e29190612cb7565b6001600160a01b03161461175e5760405162461bcd60e51b815260206004820152603f60248201527f455731303a20596f75206d757374206265207468652074696c65206f776e657260448201527f20746f20737461727420746865207772617070696e672070726f636573732e006064820152608401610250565b6008546040516318fb5f8f60e31b815260ff8086166004830152841660248201526001600160a01b039091169063c7dafc789060440160006040518083038186803b1580156117ac57600080fd5b505afa1580156117c0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117e89190810190612ed3565b511561186f5760405162461bcd60e51b815260206004820152604a60248201527f455731303a20546865206f666665722f6572732061727261797320666f72207460448201527f6869732074696c65206d75737420626520656d7074792e2052656a656374206160648201526936361037b33332b9399760b11b608482015260a401610250565b34662386f26fc10000146118eb5760405162461bcd60e51b815260206004820152603860248201527f455731303a20596f75206d75737420737570706c792065786163746c7920302e60448201527f30312045544820746f20746869732066756e6374696f6e2e00000000000000006064820152608401610250565b600854604051631899ad4560e21b815260ff8086166004830152841660248201526001600160a01b0390911690636266b5149034906044016000604051808303818588803b15801561193c57600080fd5b505af1158015611950573d6000803e3d6000fd5b5050600854604051636a86455960e01b815260ff8089166004830152871660248201523094506001600160a01b039091169250636a864559915060440160006040518083038186803b1580156119a557600080fd5b505afa1580156119b9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119e19190810190612e2d565b6000815181106119f3576119f36134e5565b60200260200101516001600160a01b031614611a775760405162461bcd60e51b815260206004820152603f60248201527f455731303a20546865206f66666572657220696e20706f736974696f6e20302060448201527f73686f756c642062652074686973207772617070657220616464726573732e006064820152608401610250565b6008546040516318fb5f8f60e31b815260ff8086166004830152841660248201526001600160a01b039091169063c7dafc789060440160006040518083038186803b158015611ac557600080fd5b505afa158015611ad9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b019190810190612ed3565b600081518110611b1357611b136134e5565b6020026020010151662386f26fc1000014611b8a5760405162461bcd60e51b815260206004820152603160248201527f455731303a20546865206f6666657220696e20706f736974696f6e203020736860448201527037bab63210313290181718189022aa241760791b6064820152608401610250565b60008181526009602052604080822080546001600160a01b03191633908117909155905183927fbbbe6b1e878619266ad669ec014b7df730791e7918756261d6d697eadb258ab391a3505050565b60006001600160a01b038216611c435760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610250565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611c895760405162461bcd60e51b81526004016102509061325e565b611c9360006126e3565b565b6000611ca1838361231d565b6000818152600960205260409020549091506001600160a01b03163314611d4d5760405162461bcd60e51b815260206004820152605460248201527f455731303a20596f7520617265206e6f74207468652077726170496e6974696160448201527f6c697a657220666f7220746869732074696c652e2043616c6c206d616b654f666064820152733332b92b34b0abb930b83832b9103334b939ba1760611b608482015260a401610250565b60085460405163e039e4a160e01b815260ff80861660048301528416602482015230916001600160a01b03169063e039e4a19060440160206040518083038186803b158015611d9b57600080fd5b505afa158015611daf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd39190612cb7565b6001600160a01b031614611ea55760405162461bcd60e51b815260206004820152608160248201527f455731303a2054696c65206973206e6f7420796574206f776e6564206279207460448201527f68697320777261707065722e2043616c6c20657468657269612e61636365707460648201527f4f6666657220746f2067697665207468652077726170706572206f776e65727360848201527f6869702c207468656e2066696e6973685772617020746f20636f6d706c65746560a4820152601760f91b60c482015260e401610250565b611eaf3382612733565b611eb881612292565b611f2a5760405162461bcd60e51b815260206004820152603c60248201527f455731303a2037323120776173206e6f7420637265617465642061732069742060448201527f73686f756c642068617665206265656e2e20526576657274696e672e000000006064820152608401610250565b60008181526009602052604080822080546001600160a01b031916905551829133917f3cf906ed50bffa98a7d8755ae34ab2349dfd013d68b710b5b30f77ec6c8f7dea9190a3505050565b6000611f81848461231d565b9050611f8c81612292565b611fa85760405162461bcd60e51b8152600401610250906132e4565b6000611fb3826115d4565b90506001600160a01b0381163314611fdd5760405162461bcd60e51b815260040161025090613213565b6008546040516393eec1fb60e01b81526001600160a01b03909116906393eec1fb906120119088908890889060040161331b565b600060405180830381600087803b15801561202b57600080fd5b505af115801561203f573d6000803e3d6000fd5b5050505081336001600160a01b03167ff5d76516762cab8f8daa08297b6fcc80c203c570bc87f74ec3e77952d625d94b856040516115c591906131ae565b6060600280546106ca9061344f565b610df9338383612866565b6120a1338361245d565b6120bd5760405162461bcd60e51b815260040161025090613293565b6120c984848484612935565b50505050565b6060600a6120dc83612968565b600b6040516020016120f09392919061313e565b6040516020818303038152906040529050919050565b600a80546121139061344f565b80601f016020809104026020016040519081016040528092919081815260200182805461213f9061344f565b801561218c5780601f106121615761010080835404028352916020019161218c565b820191906000526020600020905b81548152906001019060200180831161216f57829003601f168201915b505050505081565b600b80546121139061344f565b6000546001600160a01b031633146121cb5760405162461bcd60e51b81526004016102509061325e565b60405133904780156108fc02916000818181858888f193505050501580156121f7573d6000803e3d6000fd5b50565b6000546001600160a01b031633146122245760405162461bcd60e51b81526004016102509061325e565b6001600160a01b0381166122895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610250565b6121f7816126e3565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906122e4826115d4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000602060ff8416118015906123375750602060ff831611155b61239d5760405162461bcd60e51b815260206004820152603160248201527f455731303a20496e76616c696420636f6c20616e642f6f7220726f772e2056616044820152703634b2103930b733b29034b9901816999960791b6064820152608401610250565b8160ff1660218460ff166123b191906133ca565b6123bb919061339e565b9392505050565b60006123cd826115d4565b90506123da6000836122af565b6001600160a01b03811660009081526004602052604081208054600192906124039084906133e9565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600061246882612292565b6124c95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610250565b60006124d4836115d4565b9050806001600160a01b0316846001600160a01b0316148061250f5750836001600160a01b03166125048461074d565b6001600160a01b0316145b8061253f57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661255a826115d4565b6001600160a01b0316146125be5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610250565b6001600160a01b0382166126205760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610250565b61262b6000826122af565b6001600160a01b03831660009081526004602052604081208054600192906126549084906133e9565b90915550506001600160a01b038216600090815260046020526040812080546001929061268290849061339e565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166127895760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610250565b61279281612292565b156127df5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610250565b6001600160a01b038216600090815260046020526040812080546001929061280890849061339e565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b031614156128c85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610250565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612940848484612547565b61294c84848484612a66565b6120c95760405162461bcd60e51b8152600401610250906131c1565b60608161298c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129b657806129a08161348a565b91506129af9050600a836133b6565b9150612990565b60008167ffffffffffffffff8111156129d1576129d16134fb565b6040519080825280601f01601f1916602001820160405280156129fb576020820181803683370190505b5090505b841561253f57612a106001836133e9565b9150612a1d600a866134a5565b612a2890603061339e565b60f81b818381518110612a3d57612a3d6134e5565b60200101906001600160f81b031916908160001a905350612a5f600a866133b6565b94506129ff565b60006001600160a01b0384163b15612b6857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612aaa903390899088908890600401613171565b602060405180830381600087803b158015612ac457600080fd5b505af1925050508015612af4575060408051601f3d908101601f19168201909252612af191810190612f7c565b60015b612b4e573d808015612b22576040519150601f19603f3d011682016040523d82523d6000602084013e612b27565b606091505b508051612b465760405162461bcd60e51b8152600401610250906131c1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061253f565b506001949350505050565b828054612b7f9061344f565b90600052602060002090601f016020900481019282612ba15760008555612be7565b82601f10612bba57805160ff1916838001178555612be7565b82800160010185558215612be7579182015b82811115612be7578251825591602001919060010190612bcc565b50612bf3929150612bf7565b5090565b5b80821115612bf35760008155600101612bf8565b600067ffffffffffffffff831115612c2657612c266134fb565b612c39601f8401601f1916602001613349565b9050828152838383011115612c4d57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612c7557600080fd5b6123bb83833560208501612c0c565b803560ff81168114612c9557600080fd5b919050565b600060208284031215612cac57600080fd5b81356123bb81613511565b600060208284031215612cc957600080fd5b81516123bb81613511565b60008060408385031215612ce757600080fd5b8235612cf281613511565b91506020830135612d0281613511565b809150509250929050565b600080600060608486031215612d2257600080fd5b8335612d2d81613511565b92506020840135612d3d81613511565b929592945050506040919091013590565b60008060008060808587031215612d6457600080fd5b8435612d6f81613511565b93506020850135612d7f81613511565b925060408501359150606085013567ffffffffffffffff811115612da257600080fd5b8501601f81018713612db357600080fd5b612dc287823560208401612c0c565b91505092959194509250565b60008060408385031215612de157600080fd5b8235612dec81613511565b915060208301358015158114612d0257600080fd5b60008060408385031215612e1457600080fd5b8235612e1f81613511565b946020939093013593505050565b60006020808385031215612e4057600080fd5b825167ffffffffffffffff811115612e5757600080fd5b8301601f81018513612e6857600080fd5b8051612e7b612e768261337a565b613349565b80828252848201915084840188868560051b8701011115612e9b57600080fd5b600094505b83851015612ec7578051612eb381613511565b835260019490940193918501918501612ea0565b50979650505050505050565b60006020808385031215612ee657600080fd5b825167ffffffffffffffff811115612efd57600080fd5b8301601f81018513612f0e57600080fd5b8051612f1c612e768261337a565b80828252848201915084840188868560051b8701011115612f3c57600080fd5b600094505b83851015612ec7578051835260019490940193918501918501612f41565b600060208284031215612f7157600080fd5b81356123bb81613526565b600060208284031215612f8e57600080fd5b81516123bb81613526565b600060208284031215612fab57600080fd5b813567ffffffffffffffff811115612fc257600080fd5b61253f84828501612c64565b600060208284031215612fe057600080fd5b5035919050565b60008060408385031215612ffa57600080fd5b61300383612c84565b915061301160208401612c84565b90509250929050565b60008060006060848603121561302f57600080fd5b61303884612c84565b925061304660208501612c84565b9150604084013567ffffffffffffffff81111561306257600080fd5b61306e86828701612c64565b9150509250925092565b60008151808452613090816020860160208601613423565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806130be57607f831692505b60208084108214156130e057634e487b7160e01b600052602260045260246000fd5b8180156130f4576001811461310557613132565b60ff19861689528489019650613132565b60008881526020902060005b8681101561312a5781548b820152908501908301613111565b505084890196505b50505050505092915050565b600061314a82866130a4565b845161315a818360208901613423565b613166818301866130a4565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131a490830184613078565b9695505050505050565b6020815260006123bb6020830184613078565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f455731303a20596f75206d75737420626520746865203732312d6f776e65724f60408201526a33103a3432903a34b6329760a91b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601e908201527f455731303a20546861742037323120646f6573206e6f742065786973742e0000604082015260600190565b60ff8416815260ff831660208201526060604082015260006133406060830184613078565b95945050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715613372576133726134fb565b604052919050565b600067ffffffffffffffff821115613394576133946134fb565b5060051b60200190565b600082198211156133b1576133b16134b9565b500190565b6000826133c5576133c56134cf565b500490565b60008160001904831182151516156133e4576133e46134b9565b500290565b6000828210156133fb576133fb6134b9565b500390565b600060ff821660ff84168082101561341a5761341a6134b9565b90039392505050565b60005b8381101561343e578181015183820152602001613426565b838111156120c95750506000910152565b600181811c9082168061346357607f821691505b6020821081141561348457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561349e5761349e6134b9565b5060010190565b6000826134b4576134b46134cf565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146121f757600080fd5b6001600160e01b0319811681146121f757600080fdfea2646970667358221220f3039146c25c6abc4203b8b9d3c6047cc64554852e68a50894a724d49b06675c64736f6c63430008070033
Deployed Bytecode Sourcemap
39106:16458:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39706:15;;-1:-1:-1;;;;;39706:15:0;2883:10;-1:-1:-1;;;;;39690:31:0;;39682:83;;;;-1:-1:-1;;;39682:83:0;;15904:2:1;39682:83:0;;;15886:21:1;15943:2;15923:18;;;15916:30;15982:34;15962:18;;;15955:62;-1:-1:-1;;;16033:18:1;;;16026:37;16080:19;;39682:83:0;;;;;;;;;39106:16458;;;;;24109:305;;;;;;;;;;-1:-1:-1;24109:305:0;;;;;:::i;:::-;;:::i;:::-;;;9890:14:1;;9883:22;9865:41;;9853:2;9838:18;24109:305:0;;;;;;;;25054:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26613:221::-;;;;;;;;;;-1:-1:-1;26613:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9188:32:1;;;9170:51;;9158:2;9143:18;26613:221:0;9024:203:1;26136:411:0;;;;;;;;;;-1:-1:-1;26136:411:0;;;;;:::i;:::-;;:::i;51003:1069::-;;;;;;;;;;-1:-1:-1;51003:1069:0;;;;;:::i;:::-;;:::i;54815:141::-;;;;;;;;;;-1:-1:-1;54815:141:0;;;;;:::i;:::-;;:::i;49143:1214::-;;;;;;;;;;-1:-1:-1;49143:1214:0;;;;;:::i;:::-;;:::i;39199:23::-;;;;;;;;;;-1:-1:-1;39199:23:0;;;;-1:-1:-1;;;;;39199:23:0;;;27363:339;;;;;;;;;;-1:-1:-1;27363:339:0;;;;;:::i;:::-;;:::i;54686:121::-;;;;;;;;;;-1:-1:-1;54686:121:0;;;;;:::i;:::-;;:::i;27773:185::-;;;;;;;;;;-1:-1:-1;27773:185:0;;;;;:::i;:::-;;:::i;44236:189::-;;;;;;;;;;-1:-1:-1;44236:189:0;;;;;:::i;:::-;;:::i;53158:624::-;;;;;;:::i;:::-;;:::i;39162:30::-;;;;;;;;;;-1:-1:-1;39162:30:0;;;;-1:-1:-1;;;;;39162:30:0;;;24748:239;;;;;;;;;;-1:-1:-1;24748:239:0;;;;;:::i;:::-;;:::i;44935:1034::-;;;;;;:::i;:::-;;:::i;24478:208::-;;;;;;;;;;-1:-1:-1;24478:208:0;;;;;:::i;:::-;;:::i;:::-;;;25693:25:1;;;25681:2;25666:18;24478:208:0;25547:177:1;4730:103:0;;;;;;;;;;;;;:::i;47322:932::-;;;;;;;;;;-1:-1:-1;47322:932:0;;;;;:::i;:::-;;:::i;52664:486::-;;;;;;;;;;-1:-1:-1;52664:486:0;;;;;:::i;:::-;;:::i;4079:87::-;;;;;;;;;;-1:-1:-1;4125:7:0;4152:6;-1:-1:-1;;;;;4152:6:0;4079:87;;25223:104;;;;;;;;;;;;;:::i;39231:52::-;;;;;;;;;;-1:-1:-1;39231:52:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;39231:52:0;;;26906:155;;;;;;;;;;-1:-1:-1;26906:155:0;;;;;:::i;:::-;;:::i;28029:328::-;;;;;;;;;;-1:-1:-1;28029:328:0;;;;;:::i;:::-;;:::i;54973:246::-;;;;;;;;;;-1:-1:-1;54973:246:0;;;;;:::i;:::-;;:::i;54609:27::-;;;;;;;;;;;;;:::i;27132:164::-;;;;;;;;;;-1:-1:-1;27132:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27253:25:0;;;27229:4;27253:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27132:164;54643:33;;;;;;;;;;;;;:::i;55227:334::-;;;;;;;;;;;;;:::i;4988:201::-;;;;;;;;;;-1:-1:-1;4988:201:0;;;;;:::i;:::-;;:::i;24109:305::-;24211:4;-1:-1:-1;;;;;;24248:40:0;;-1:-1:-1;;;24248:40:0;;:105;;-1:-1:-1;;;;;;;24305:48:0;;-1:-1:-1;;;24305:48:0;24248:105;:158;;;-1:-1:-1;;;;;;;;;;16972:40:0;;;24370:36;24228:178;24109:305;-1:-1:-1;;24109:305:0:o;25054:100::-;25108:13;25141:5;25134:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25054:100;:::o;26613:221::-;26689:7;26717:16;26725:7;26717;:16::i;:::-;26709:73;;;;-1:-1:-1;;;26709:73:0;;18823:2:1;26709:73:0;;;18805:21:1;18862:2;18842:18;;;18835:30;18901:34;18881:18;;;18874:62;-1:-1:-1;;;18952:18:1;;;18945:42;19004:19;;26709:73:0;18621:408:1;26709:73:0;-1:-1:-1;26802:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26802:24:0;;26613:221::o;26136:411::-;26217:13;26233:23;26248:7;26233:14;:23::i;:::-;26217:39;;26281:5;-1:-1:-1;;;;;26275:11:0;:2;-1:-1:-1;;;;;26275:11:0;;;26267:57;;;;-1:-1:-1;;;26267:57:0;;20486:2:1;26267:57:0;;;20468:21:1;20525:2;20505:18;;;20498:30;20564:34;20544:18;;;20537:62;-1:-1:-1;;;20615:18:1;;;20608:31;20656:19;;26267:57:0;20284:397:1;26267:57:0;2883:10;-1:-1:-1;;;;;26359:21:0;;;;:62;;-1:-1:-1;26384:37:0;26401:5;2883:10;27132:164;:::i;26384:37::-;26337:168;;;;-1:-1:-1;;;26337:168:0;;15479:2:1;26337:168:0;;;15461:21:1;15518:2;15498:18;;;15491:30;15557:34;15537:18;;;15530:62;15628:26;15608:18;;;15601:54;15672:19;;26337:168:0;15277:420:1;26337:168:0;26518:21;26527:2;26531:7;26518:8;:21::i;:::-;26206:341;26136:411;;:::o;51003:1069::-;51076:19;51098;51108:3;51113;51098:9;:19::i;:::-;51076:41;;51136:20;51144:11;51136:7;:20::i;:::-;51128:63;;;;-1:-1:-1;;;51128:63:0;;;;;;;:::i;:::-;51202:13;51218:27;51233:11;51218:14;:27::i;:::-;51202:43;-1:-1:-1;;;;;;51264:19:0;;51273:10;51264:19;51256:75;;;;-1:-1:-1;;;51256:75:0;;;;;;;:::i;:::-;51350:8;;:29;;-1:-1:-1;;;51350:29:0;;26204:4:1;26192:17;;;51350:29:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;51386:10:0;;-1:-1:-1;;;;;51350:8:0;;:20;;26147:18:1;;51350:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51350:29:0;;;;;;;;;;;;:::i;:::-;51380:1;51350:32;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;51350:46:0;;51342:103;;;;-1:-1:-1;;;51342:103:0;;19597:2:1;51342:103:0;;;19579:21:1;19636:2;19616:18;;;19609:30;19675:34;19655:18;;;19648:62;-1:-1:-1;;;19726:18:1;;;19719:42;19778:19;;51342:103:0;19395:408:1;51342:103:0;51464:8;;:27;;-1:-1:-1;;;51464:27:0;;26204:4:1;26192:17;;;51464:27:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;-1:-1:-1;;;;;51464:8:0;;;;:18;;26147::1;;51464:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51464:27:0;;;;;;;;;;;;:::i;:::-;51492:1;51464:30;;;;;;;;:::i;:::-;;;;;;;51498:17;51464:51;51456:122;;;;-1:-1:-1;;;51456:122:0;;15052:2:1;51456:122:0;;;15034:21:1;15091:2;15071:18;;;15064:30;15130:34;15110:18;;;15103:62;15201:28;15181:18;;;15174:56;15247:19;;51456:122:0;14850:422:1;51456:122:0;51589:8;;:52;;-1:-1:-1;;;51589:52:0;;26558:4:1;26546:17;;;51589:52:0;;;26528:36:1;26600:17;;26580:18;;;26573:45;51589:8:0;26634:18:1;;;26627:45;51623:17:0;26688:18:1;;;26681:34;-1:-1:-1;;;;;51589:8:0;;;;:20;;26500:19:1;;51589:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51741:8:0;;:26;;-1:-1:-1;;;51741:26:0;;26204:4:1;26192:17;;;51741:26:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;51771:10:0;;-1:-1:-1;;;;;;51741:8:0;;;;-1:-1:-1;51741:17:0;;26147:18:1;;51741:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51741:40:0;;51733:120;;;;-1:-1:-1;;;51733:120:0;;20010:2:1;51733:120:0;;;19992:21:1;20049:2;20029:18;;;20022:30;20088:34;20068:18;;;20061:62;20159:34;20139:18;;;20132:62;-1:-1:-1;;;20210:19:1;;;20203:34;20254:19;;51733:120:0;19808:471:1;51733:120:0;51864:18;51870:11;51864:5;:18::i;:::-;51902:20;51910:11;51902:7;:20::i;:::-;51901:21;51893:86;;;;-1:-1:-1;;;51893:86:0;;17616:2:1;51893:86:0;;;17598:21:1;17655:2;17635:18;;;17628:30;17694:34;17674:18;;;17667:62;-1:-1:-1;;;17745:18:1;;;17738:50;17805:19;;51893:86:0;17414:416:1;51893:86:0;51995:34;;52017:11;;52005:10;;51995:34;;;;;51065:1007;;51003:1069;;:::o;54815:141::-;4125:7;4152:6;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;54906:42;;::::1;::::0;:19:::1;::::0;:42:::1;::::0;::::1;::::0;::::1;:::i;:::-;;54815:141:::0;:::o;49143:1214::-;49217:19;49239;49249:3;49254;49239:9;:19::i;:::-;49217:41;;49277:20;49285:11;49277:7;:20::i;:::-;49269:63;;;;-1:-1:-1;;;49269:63:0;;;;;;;:::i;:::-;49370:8;;:27;;-1:-1:-1;;;49370:27:0;;26204:4:1;26192:17;;;49370:27:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;49343:18:0;;-1:-1:-1;;;;;49370:8:0;;:18;;26147::1;;49370:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49370:27:0;;;;;;;;;;;;:::i;:::-;:34;49343:62;;49464:1;49449:12;:16;;;49441:88;;;;-1:-1:-1;;;49441:88:0;;10567:2:1;49441:88:0;;;10549:21:1;10606:2;10586:18;;;10579:30;10645:34;10625:18;;;10618:62;10716:29;10696:18;;;10689:57;10763:19;;49441:88:0;10365:423:1;49441:88:0;49540:13;49556:27;49571:11;49556:14;:27::i;:::-;49540:43;-1:-1:-1;;;;;;49602:19:0;;49611:10;49602:19;49594:75;;;;-1:-1:-1;;;49594:75:0;;;;;;;:::i;:::-;49688:8;;:26;;-1:-1:-1;;;49688:26:0;;26204:4:1;26192:17;;;49688:26:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;49726:4:0;;-1:-1:-1;;;;;49688:8:0;;:17;;26147:18:1;;49688:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49688:43:0;;49680:109;;;;-1:-1:-1;;;49680:109:0;;22649:2:1;49680:109:0;;;22631:21:1;22688:2;22668:18;;;22661:30;22727:34;22707:18;;;22700:62;-1:-1:-1;;;22778:18:1;;;22771:51;22839:19;;49680:109:0;22447:417:1;49680:109:0;49818:8;;:29;;-1:-1:-1;;;49818:29:0;;26204:4:1;26192:17;;;49818:29:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;49800:15:0;;-1:-1:-1;;;;;49818:8:0;;:20;;26147:18:1;;49818:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49818:29:0;;;;;;;;;;;;:::i;:::-;49848:1;49818:32;;;;;;;;:::i;:::-;;;;;;;;;;;49918:8;;:27;;-1:-1:-1;;;49918:27:0;;26204:4:1;26192:17;;;49918:27:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;49818:32:0;;-1:-1:-1;49905:10:0;;-1:-1:-1;;;;;49918:8:0;;;;:18;;26147::1;;49918:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49918:27:0;;;;;;;;;;;;:::i;:::-;49946:1;49918:30;;;;;;;;:::i;:::-;;;;;;;;;;;49959:8;;:37;;-1:-1:-1;;;49959:37:0;;26558:4:1;26546:17;;;49959:37:0;;;26528:36:1;26600:17;;26580:18;;;26573:45;49959:8:0;26634:18:1;;;26627:45;26688:18;;;26681:34;;;49918:30:0;;-1:-1:-1;;;;;;49959:8:0;;:20;;26500:19:1;;49959:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50136:1;50123:12;:14;;;;:::i;:::-;50084:8;;:27;;-1:-1:-1;;;50084:27:0;;:54;26192:17:1;;;50084:27:0;;;26174:36:1;26246:17;;;26226:18;;;26219:45;50084:54:0;;;;;-1:-1:-1;;;;;50084:8:0;;;;:18;;26147::1;;50084:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50084:27:0;;;;;;;;;;;;:::i;:::-;:34;:54;50076:135;;;;-1:-1:-1;;;50076:135:0;;13750:2:1;50076:135:0;;;13732:21:1;13789:2;13769:18;;;13762:30;;;13828:34;13808:18;;;13801:62;13899:34;13879:18;;;13872:62;-1:-1:-1;;;13950:19:1;;;13943:35;13995:19;;50076:135:0;13548:472:1;50076:135:0;50227:54;;;25903:25:1;;;-1:-1:-1;;;;;25964:32:1;;25959:2;25944:18;;25937:60;50253:11:0;;50241:10;;50227:54;;25876:18:1;50227:54:0;;;;;;;49205:1152;;;;;49143:1214;;:::o;27363:339::-;27558:41;2883:10;27591:7;27558:18;:41::i;:::-;27550:103;;;;-1:-1:-1;;;27550:103:0;;;;;;;:::i;:::-;27666:28;27676:4;27682:2;27686:7;27666:9;:28::i;54686:121::-;4125:7;4152:6;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;54769:30;;::::1;::::0;:13:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;27773:185::-:0;27911:39;27928:4;27934:2;27938:7;27911:39;;;;;;;;;;;;:16;:39::i;44236:189::-;44309:7;44329:19;44351;44361:3;44366;44351:9;:19::i;:::-;44388:29;;;;:16;:29;;;;;;-1:-1:-1;;;;;44388:29:0;;44236:189;-1:-1:-1;;;;44236:189:0:o;53158:624::-;53255:19;53277;53287:3;53292;53277:9;:19::i;:::-;53255:41;;53315:20;53323:11;53315:7;:20::i;:::-;53307:63;;;;-1:-1:-1;;;53307:63:0;;;;;;;:::i;:::-;53381:13;53397:27;53412:11;53397:14;:27::i;:::-;53381:43;-1:-1:-1;;;;;;53443:19:0;;53452:10;53443:19;53435:75;;;;-1:-1:-1;;;53435:75:0;;;;;;;:::i;:::-;53529:9;53542:19;53529:32;53521:83;;;;-1:-1:-1;;;53521:83:0;;11821:2:1;53521:83:0;;;11803:21:1;11860:2;11840:18;;;11833:30;11899:34;11879:18;;;11872:62;-1:-1:-1;;;11950:18:1;;;11943:36;11996:19;;53521:83:0;11619:402:1;53521:83:0;53624:8;;:48;;-1:-1:-1;;;53624:48:0;;-1:-1:-1;;;;;53624:8:0;;;;:18;;53650:9;;53624:48;;53661:3;;53665;;53669:2;;53624:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53710:11;53698:10;-1:-1:-1;;;;;53688:38:0;;53723:2;53688:38;;;;;;:::i;:::-;;;;;;;;53244:538;;53158:624;;;:::o;24748:239::-;24820:7;24856:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24856:16:0;24891:19;24883:73;;;;-1:-1:-1;;;24883:73:0;;17206:2:1;24883:73:0;;;17188:21:1;17245:2;17225:18;;;17218:30;17284:34;17264:18;;;17257:62;-1:-1:-1;;;17335:18:1;;;17328:39;17384:19;;24883:73:0;17004:405:1;44935:1034:0;45014:19;45036;45046:3;45051;45036:9;:19::i;:::-;45074:8;;:26;;-1:-1:-1;;;45074:26:0;;26204:4:1;26192:17;;;45074:26:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;45014:41:0;;-1:-1:-1;45104:10:0;;-1:-1:-1;;;;;45074:8:0;;;;:17;;26147:18:1;;45074:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45074:40:0;;45066:116;;;;-1:-1:-1;;;45066:116:0;;23071:2:1;45066:116:0;;;23053:21:1;23110:2;23090:18;;;23083:30;23149:34;23129:18;;;23122:62;23220:33;23200:18;;;23193:61;23271:19;;45066:116:0;22869:427:1;45066:116:0;45201:8;;:27;;-1:-1:-1;;;45201:27:0;;26204:4:1;26192:17;;;45201:27:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;-1:-1:-1;;;;;45201:8:0;;;;:18;;26147::1;;45201:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45201:27:0;;;;;;;;;;;;:::i;:::-;:34;:39;45193:126;;;;-1:-1:-1;;;45193:126:0;;16312:2:1;45193:126:0;;;16294:21:1;16351:2;16331:18;;;16324:30;16390:34;16370:18;;;16363:62;16461:34;16441:18;;;16434:62;-1:-1:-1;;;16512:19:1;;;16505:41;16563:19;;45193:126:0;16110:478:1;45193:126:0;45338:9;45351:17;45338:30;45330:99;;;;-1:-1:-1;;;45330:99:0;;18398:2:1;45330:99:0;;;18380:21:1;18437:2;18417:18;;;18410:30;18476:34;18456:18;;;18449:62;18547:26;18527:18;;;18520:54;18591:19;;45330:99:0;18196:420:1;45330:99:0;45448:8;;:45;;-1:-1:-1;;;45448:45:0;;26204:4:1;26192:17;;;45448:45:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;-1:-1:-1;;;;;45448:8:0;;;;:18;;45474:9;;26147:18:1;;45448:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45557:8:0;;:29;;-1:-1:-1;;;45557:29:0;;26204:4:1;26192:17;;;45557:29:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;45601:4:0;;-1:-1:-1;;;;;;45557:8:0;;;;-1:-1:-1;45557:20:0;;-1:-1:-1;26147:18:1;;45557:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45557:29:0;;;;;;;;;;;;:::i;:::-;45587:1;45557:32;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;45557:49:0;;45549:125;;;;-1:-1:-1;;;45549:125:0;;23921:2:1;45549:125:0;;;23903:21:1;23960:2;23940:18;;;23933:30;23999:34;23979:18;;;23972:62;24070:33;24050:18;;;24043:61;24121:19;;45549:125:0;23719:427:1;45549:125:0;45693:8;;:27;;-1:-1:-1;;;45693:27:0;;26204:4:1;26192:17;;;45693:27:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;-1:-1:-1;;;;;45693:8:0;;;;:18;;26147::1;;45693:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45693:27:0;;;;;;;;;;;;:::i;:::-;45721:1;45693:30;;;;;;;;:::i;:::-;;;;;;;45727:17;45693:51;45685:113;;;;-1:-1:-1;;;45685:113:0;;25331:2:1;45685:113:0;;;25313:21:1;25370:2;25350:18;;;25343:30;25409:34;25389:18;;;25382:62;-1:-1:-1;;;25460:18:1;;;25453:47;25517:19;;45685:113:0;25129:413:1;45685:113:0;45809:29;;;;:16;:29;;;;;;:42;;-1:-1:-1;;;;;;45809:42:0;45841:10;45809:42;;;;;;45925:36;;45826:11;;45925:36;;;45003:966;44935:1034;;:::o;24478:208::-;24550:7;-1:-1:-1;;;;;24578:19:0;;24570:74;;;;-1:-1:-1;;;24570:74:0;;16795:2:1;24570:74:0;;;16777:21:1;16834:2;16814:18;;;16807:30;16873:34;16853:18;;;16846:62;-1:-1:-1;;;16924:18:1;;;16917:40;16974:19;;24570:74:0;16593:406:1;24570:74:0;-1:-1:-1;;;;;;24662:16:0;;;;;:9;:16;;;;;;;24478:208::o;4730:103::-;4125:7;4152:6;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;47322:932::-;47384:19;47406;47416:3;47421;47406:9;:19::i;:::-;47444:29;;;;:16;:29;;;;;;47384:41;;-1:-1:-1;;;;;;47444:29:0;47477:10;47444:43;47436:140;;;;-1:-1:-1;;;47436:140:0;;22156:2:1;47436:140:0;;;22138:21:1;22195:2;22175:18;;;22168:30;22234:34;22214:18;;;22207:62;22305:34;22285:18;;;22278:62;-1:-1:-1;;;22356:19:1;;;22349:51;22417:19;;47436:140:0;21954:488:1;47436:140:0;47595:8;;:26;;-1:-1:-1;;;47595:26:0;;26204:4:1;26192:17;;;47595:26:0;;;26174:36:1;26246:17;;26226:18;;;26219:45;47633:4:0;;-1:-1:-1;;;;;47595:8:0;;:17;;26147:18:1;;47595:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47595:43:0;;47587:185;;;;-1:-1:-1;;;47587:185:0;;24353:2:1;47587:185:0;;;24335:21:1;24392:3;24372:18;;;24365:31;24432:34;24412:18;;;24405:62;24503:34;24483:18;;;24476:62;24575:34;24554:19;;;24547:63;24647:34;24626:19;;;24619:63;-1:-1:-1;;;24698:19:1;;;24691:32;24740:19;;47587:185:0;24151:614:1;47587:185:0;47783:30;47789:10;47801:11;47783:5;:30::i;:::-;47890:20;47898:11;47890:7;:20::i;:::-;47882:93;;;;-1:-1:-1;;;47882:93:0;;21309:2:1;47882:93:0;;;21291:21:1;21348:2;21328:18;;;21321:30;21387:34;21367:18;;;21360:62;21458:30;21438:18;;;21431:58;21506:19;;47882:93:0;21107:424:1;47882:93:0;47993:29;;;;:16;:29;;;;;;47986:36;;-1:-1:-1;;;;;;47986:36:0;;;48209:37;47993:29;;48222:10;;48209:37;;47993:29;48209:37;47373:881;47322:932;;:::o;52664:486::-;52751:19;52773;52783:3;52788;52773:9;:19::i;:::-;52751:41;;52811:20;52819:11;52811:7;:20::i;:::-;52803:63;;;;-1:-1:-1;;;52803:63:0;;;;;;;:::i;:::-;52877:13;52893:27;52908:11;52893:14;:27::i;:::-;52877:43;-1:-1:-1;;;;;;52939:19:0;;52948:10;52939:19;52931:75;;;;-1:-1:-1;;;52931:75:0;;;;;;;:::i;:::-;53017:8;;:28;;-1:-1:-1;;;53017:28:0;;-1:-1:-1;;;;;53017:8:0;;;;:16;;:28;;53034:3;;53038;;53042:2;;53017:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53081:11;53069:10;-1:-1:-1;;;;;53061:36:0;;53094:2;53061:36;;;;;;:::i;25223:104::-;25279:13;25312:7;25305:14;;;;;:::i;26906:155::-;27001:52;2883:10;27034:8;27044;27001:18;:52::i;28029:328::-;28204:41;2883:10;28237:7;28204:18;:41::i;:::-;28196:103;;;;-1:-1:-1;;;28196:103:0;;;;;;;:::i;:::-;28310:39;28324:4;28330:2;28334:7;28343:5;28310:13;:39::i;:::-;28029:328;;;;:::o;54973:246::-;55039:13;55147;55162:26;55179:8;55162:16;:26::i;:::-;55190:19;55130:80;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55116:95;;54973:246;;;:::o;54609:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54643:33::-;;;;;;;:::i;55227:334::-;4125:7;4152:6;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;55501:51:::1;::::0;55509:10:::1;::::0;55530:21:::1;55501:51:::0;::::1;;;::::0;::::1;::::0;;;55530:21;55509:10;55501:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;55227:334::o:0;4988:201::-;4125:7;4152:6;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5077:22:0;::::1;5069:73;;;::::0;-1:-1:-1;;;5069:73:0;;11414:2:1;5069:73:0::1;::::0;::::1;11396:21:1::0;11453:2;11433:18;;;11426:30;11492:34;11472:18;;;11465:62;-1:-1:-1;;;11543:18:1;;;11536:36;11589:19;;5069:73:0::1;11212:402:1::0;5069:73:0::1;5153:28;5172:8;5153:18;:28::i;29867:127::-:0;29932:4;29956:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29956:16:0;:30;;;29867:127::o;34013:174::-;34088:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34088:29:0;-1:-1:-1;;;;;34088:29:0;;;;;;;;:24;;34142:23;34088:24;34142:14;:23::i;:::-;-1:-1:-1;;;;;34133:46:0;;;;;;;;;;;34013:174;;:::o;40425:289::-;40489:7;40530:2;40517:16;;;;;;;:36;;-1:-1:-1;40550:2:0;40537:16;;;;;40517:36;40509:98;;;;-1:-1:-1;;;40509:98:0;;23503:2:1;40509:98:0;;;23485:21:1;23542:2;23522:18;;;23515:30;23581:34;23561:18;;;23554:62;-1:-1:-1;;;23632:18:1;;;23625:47;23689:19;;40509:98:0;23301:413:1;40509:98:0;40702:3;40694:12;;40687:2;40672:3;40664:12;;:26;;;;:::i;:::-;40663:43;;;;:::i;:::-;40656:50;40425:289;-1:-1:-1;;;40425:289:0:o;32513:420::-;32573:13;32589:23;32604:7;32589:14;:23::i;:::-;32573:39;;32714:29;32731:1;32735:7;32714:8;:29::i;:::-;-1:-1:-1;;;;;32756:16:0;;;;;;:9;:16;;;;;:21;;32776:1;;32756:16;:21;;32776:1;;32756:21;:::i;:::-;;;;-1:-1:-1;;32795:16:0;;;;:7;:16;;;;;;32788:23;;-1:-1:-1;;;;;;32788:23:0;;;32829:36;32803:7;;32795:16;-1:-1:-1;;;;;32829:36:0;;;;;32795:16;;32829:36;54906:42:::1;54815:141:::0;:::o;30161:348::-;30254:4;30279:16;30287:7;30279;:16::i;:::-;30271:73;;;;-1:-1:-1;;;30271:73:0;;14227:2:1;30271:73:0;;;14209:21:1;14266:2;14246:18;;;14239:30;14305:34;14285:18;;;14278:62;-1:-1:-1;;;14356:18:1;;;14349:42;14408:19;;30271:73:0;14025:408:1;30271:73:0;30355:13;30371:23;30386:7;30371:14;:23::i;:::-;30355:39;;30424:5;-1:-1:-1;;;;;30413:16:0;:7;-1:-1:-1;;;;;30413:16:0;;:51;;;;30457:7;-1:-1:-1;;;;;30433:31:0;:20;30445:7;30433:11;:20::i;:::-;-1:-1:-1;;;;;30433:31:0;;30413:51;:87;;;-1:-1:-1;;;;;;27253:25:0;;;27229:4;27253:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30468:32;30405:96;30161:348;-1:-1:-1;;;;30161:348:0:o;33270:625::-;33429:4;-1:-1:-1;;;;;33402:31:0;:23;33417:7;33402:14;:23::i;:::-;-1:-1:-1;;;;;33402:31:0;;33394:81;;;;-1:-1:-1;;;33394:81:0;;12228:2:1;33394:81:0;;;12210:21:1;12267:2;12247:18;;;12240:30;12306:34;12286:18;;;12279:62;-1:-1:-1;;;12357:18:1;;;12350:35;12402:19;;33394:81:0;12026:401:1;33394:81:0;-1:-1:-1;;;;;33494:16:0;;33486:65;;;;-1:-1:-1;;;33486:65:0;;12991:2:1;33486:65:0;;;12973:21:1;13030:2;13010:18;;;13003:30;13069:34;13049:18;;;13042:62;-1:-1:-1;;;13120:18:1;;;13113:34;13164:19;;33486:65:0;12789:400:1;33486:65:0;33668:29;33685:1;33689:7;33668:8;:29::i;:::-;-1:-1:-1;;;;;33710:15:0;;;;;;:9;:15;;;;;:20;;33729:1;;33710:15;:20;;33729:1;;33710:20;:::i;:::-;;;;-1:-1:-1;;;;;;;33741:13:0;;;;;;:9;:13;;;;;:18;;33758:1;;33741:13;:18;;33758:1;;33741:18;:::i;:::-;;;;-1:-1:-1;;33770:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33770:21:0;-1:-1:-1;;;;;33770:21:0;;;;;;;;;33809:27;;33770:16;;33809:27;;;;;;;26206:341;26136:411;;:::o;5349:191::-;5423:16;5442:6;;-1:-1:-1;;;;;5459:17:0;;;-1:-1:-1;;;;;;5459:17:0;;;;;;5492:40;;5442:6;;;;;;;5492:40;;5423:16;5492:40;5412:128;5349:191;:::o;31845:439::-;-1:-1:-1;;;;;31925:16:0;;31917:61;;;;-1:-1:-1;;;31917:61:0;;18037:2:1;31917:61:0;;;18019:21:1;;;18056:18;;;18049:30;18115:34;18095:18;;;18088:62;18167:18;;31917:61:0;17835:356:1;31917:61:0;31998:16;32006:7;31998;:16::i;:::-;31997:17;31989:58;;;;-1:-1:-1;;;31989:58:0;;12634:2:1;31989:58:0;;;12616:21:1;12673:2;12653:18;;;12646:30;12712;12692:18;;;12685:58;12760:18;;31989:58:0;12432:352:1;31989:58:0;-1:-1:-1;;;;;32118:13:0;;;;;;:9;:13;;;;;:18;;32135:1;;32118:13;:18;;32135:1;;32118:18;:::i;:::-;;;;-1:-1:-1;;32147:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32147:21:0;-1:-1:-1;;;;;32147:21:0;;;;;;;;32186:33;;32147:16;;;32186:33;;32147:16;;32186:33;54906:42:::1;54815:141:::0;:::o;34329:315::-;34484:8;-1:-1:-1;;;;;34475:17:0;:5;-1:-1:-1;;;;;34475:17:0;;;34467:55;;;;-1:-1:-1;;;34467:55:0;;13396:2:1;34467:55:0;;;13378:21:1;13435:2;13415:18;;;13408:30;13474:27;13454:18;;;13447:55;13519:18;;34467:55:0;13194:349:1;34467:55:0;-1:-1:-1;;;;;34533:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;34533:46:0;;;;;;;;;;34595:41;;9865::1;;;34595::0;;9838:18:1;34595:41:0;;;;;;;34329:315;;;:::o;29239:::-;29396:28;29406:4;29412:2;29416:7;29396:9;:28::i;:::-;29443:48;29466:4;29472:2;29476:7;29485:5;29443:22;:48::i;:::-;29435:111;;;;-1:-1:-1;;;29435:111:0;;;;;;;:::i;365:723::-;421:13;642:10;638:53;;-1:-1:-1;;669:10:0;;;;;;;;;;;;-1:-1:-1;;;669:10:0;;;;;365:723::o;638:53::-;716:5;701:12;757:78;764:9;;757:78;;790:8;;;;:::i;:::-;;-1:-1:-1;813:10:0;;-1:-1:-1;821:2:0;813:10;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;867:17:0;;845:39;;895:154;902:10;;895:154;;929:11;939:1;929:11;;:::i;:::-;;-1:-1:-1;998:10:0;1006:2;998:5;:10;:::i;:::-;985:24;;:2;:24;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;955:56:0;;;;;;;;-1:-1:-1;1026:11:0;1035:2;1026:11;;:::i;:::-;;;895:154;;35209:799;35364:4;-1:-1:-1;;;;;35385:13:0;;7075:19;:23;35381:620;;35421:72;;-1:-1:-1;;;35421:72:0;;-1:-1:-1;;;;;35421:36:0;;;;;:72;;2883:10;;35472:4;;35478:7;;35487:5;;35421:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35421:72:0;;;;;;;;-1:-1:-1;;35421:72:0;;;;;;;;;;;;:::i;:::-;;;35417:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35663:13:0;;35659:272;;35706:60;;-1:-1:-1;;;35706:60:0;;;;;;;:::i;35659:272::-;35881:6;35875:13;35866:6;35862:2;35858:15;35851:38;35417:529;-1:-1:-1;;;;;;35544:51:0;-1:-1:-1;;;35544:51:0;;-1:-1:-1;35537:58:0;;35381:620;-1:-1:-1;35985:4:0;35209:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:221::-;468:5;521:3;514:4;506:6;502:17;498:27;488:55;;539:1;536;529:12;488:55;561:79;636:3;627:6;614:20;607:4;599:6;595:17;561:79;:::i;651:156::-;717:20;;777:4;766:16;;756:27;;746:55;;797:1;794;787:12;746:55;651:156;;;:::o;812:247::-;871:6;924:2;912:9;903:7;899:23;895:32;892:52;;;940:1;937;930:12;892:52;979:9;966:23;998:31;1023:5;998:31;:::i;1064:251::-;1134:6;1187:2;1175:9;1166:7;1162:23;1158:32;1155:52;;;1203:1;1200;1193:12;1155:52;1235:9;1229:16;1254:31;1279:5;1254:31;:::i;1320:388::-;1388:6;1396;1449:2;1437:9;1428:7;1424:23;1420:32;1417:52;;;1465:1;1462;1455:12;1417:52;1504:9;1491:23;1523:31;1548:5;1523:31;:::i;:::-;1573:5;-1:-1:-1;1630:2:1;1615:18;;1602:32;1643:33;1602:32;1643:33;:::i;:::-;1695:7;1685:17;;;1320:388;;;;;:::o;1713:456::-;1790:6;1798;1806;1859:2;1847:9;1838:7;1834:23;1830:32;1827:52;;;1875:1;1872;1865:12;1827:52;1914:9;1901:23;1933:31;1958:5;1933:31;:::i;:::-;1983:5;-1:-1:-1;2040:2:1;2025:18;;2012:32;2053:33;2012:32;2053:33;:::i;:::-;1713:456;;2105:7;;-1:-1:-1;;;2159:2:1;2144:18;;;;2131:32;;1713:456::o;2174:794::-;2269:6;2277;2285;2293;2346:3;2334:9;2325:7;2321:23;2317:33;2314:53;;;2363:1;2360;2353:12;2314:53;2402:9;2389:23;2421:31;2446:5;2421:31;:::i;:::-;2471:5;-1:-1:-1;2528:2:1;2513:18;;2500:32;2541:33;2500:32;2541:33;:::i;:::-;2593:7;-1:-1:-1;2647:2:1;2632:18;;2619:32;;-1:-1:-1;2702:2:1;2687:18;;2674:32;2729:18;2718:30;;2715:50;;;2761:1;2758;2751:12;2715:50;2784:22;;2837:4;2829:13;;2825:27;-1:-1:-1;2815:55:1;;2866:1;2863;2856:12;2815:55;2889:73;2954:7;2949:2;2936:16;2931:2;2927;2923:11;2889:73;:::i;:::-;2879:83;;;2174:794;;;;;;;:::o;2973:416::-;3038:6;3046;3099:2;3087:9;3078:7;3074:23;3070:32;3067:52;;;3115:1;3112;3105:12;3067:52;3154:9;3141:23;3173:31;3198:5;3173:31;:::i;:::-;3223:5;-1:-1:-1;3280:2:1;3265:18;;3252:32;3322:15;;3315:23;3303:36;;3293:64;;3353:1;3350;3343:12;3394:315;3462:6;3470;3523:2;3511:9;3502:7;3498:23;3494:32;3491:52;;;3539:1;3536;3529:12;3491:52;3578:9;3565:23;3597:31;3622:5;3597:31;:::i;:::-;3647:5;3699:2;3684:18;;;;3671:32;;-1:-1:-1;;;3394:315:1:o;3714:967::-;3809:6;3840:2;3883;3871:9;3862:7;3858:23;3854:32;3851:52;;;3899:1;3896;3889:12;3851:52;3932:9;3926:16;3965:18;3957:6;3954:30;3951:50;;;3997:1;3994;3987:12;3951:50;4020:22;;4073:4;4065:13;;4061:27;-1:-1:-1;4051:55:1;;4102:1;4099;4092:12;4051:55;4131:2;4125:9;4154:60;4170:43;4210:2;4170:43;:::i;:::-;4154:60;:::i;:::-;4236:3;4260:2;4255:3;4248:15;4288:2;4283:3;4279:12;4272:19;;4319:2;4315;4311:11;4367:7;4362:2;4356;4353:1;4349:10;4345:2;4341:19;4337:28;4334:41;4331:61;;;4388:1;4385;4378:12;4331:61;4410:1;4401:10;;4420:231;4434:2;4431:1;4428:9;4420:231;;;4498:3;4492:10;4515:31;4540:5;4515:31;:::i;:::-;4559:18;;4452:1;4445:9;;;;;4597:12;;;;4629;;4420:231;;;-1:-1:-1;4670:5:1;3714:967;-1:-1:-1;;;;;;;3714:967:1:o;4686:892::-;4781:6;4812:2;4855;4843:9;4834:7;4830:23;4826:32;4823:52;;;4871:1;4868;4861:12;4823:52;4904:9;4898:16;4937:18;4929:6;4926:30;4923:50;;;4969:1;4966;4959:12;4923:50;4992:22;;5045:4;5037:13;;5033:27;-1:-1:-1;5023:55:1;;5074:1;5071;5064:12;5023:55;5103:2;5097:9;5126:60;5142:43;5182:2;5142:43;:::i;5126:60::-;5208:3;5232:2;5227:3;5220:15;5260:2;5255:3;5251:12;5244:19;;5291:2;5287;5283:11;5339:7;5334:2;5328;5325:1;5321:10;5317:2;5313:19;5309:28;5306:41;5303:61;;;5360:1;5357;5350:12;5303:61;5382:1;5373:10;;5392:156;5406:2;5403:1;5400:9;5392:156;;;5463:10;;5451:23;;5424:1;5417:9;;;;;5494:12;;;;5526;;5392:156;;5583:245;5641:6;5694:2;5682:9;5673:7;5669:23;5665:32;5662:52;;;5710:1;5707;5700:12;5662:52;5749:9;5736:23;5768:30;5792:5;5768:30;:::i;5833:249::-;5902:6;5955:2;5943:9;5934:7;5930:23;5926:32;5923:52;;;5971:1;5968;5961:12;5923:52;6003:9;5997:16;6022:30;6046:5;6022:30;:::i;6087:322::-;6156:6;6209:2;6197:9;6188:7;6184:23;6180:32;6177:52;;;6225:1;6222;6215:12;6177:52;6265:9;6252:23;6298:18;6290:6;6287:30;6284:50;;;6330:1;6327;6320:12;6284:50;6353;6395:7;6386:6;6375:9;6371:22;6353:50;:::i;6414:180::-;6473:6;6526:2;6514:9;6505:7;6501:23;6497:32;6494:52;;;6542:1;6539;6532:12;6494:52;-1:-1:-1;6565:23:1;;6414:180;-1:-1:-1;6414:180:1:o;6599:252::-;6663:6;6671;6724:2;6712:9;6703:7;6699:23;6695:32;6692:52;;;6740:1;6737;6730:12;6692:52;6763:27;6780:9;6763:27;:::i;:::-;6753:37;;6809:36;6841:2;6830:9;6826:18;6809:36;:::i;:::-;6799:46;;6599:252;;;;;:::o;6856:462::-;6939:6;6947;6955;7008:2;6996:9;6987:7;6983:23;6979:32;6976:52;;;7024:1;7021;7014:12;6976:52;7047:27;7064:9;7047:27;:::i;:::-;7037:37;;7093:36;7125:2;7114:9;7110:18;7093:36;:::i;:::-;7083:46;;7180:2;7169:9;7165:18;7152:32;7207:18;7199:6;7196:30;7193:50;;;7239:1;7236;7229:12;7193:50;7262;7304:7;7295:6;7284:9;7280:22;7262:50;:::i;:::-;7252:60;;;6856:462;;;;;:::o;7323:257::-;7364:3;7402:5;7396:12;7429:6;7424:3;7417:19;7445:63;7501:6;7494:4;7489:3;7485:14;7478:4;7471:5;7467:16;7445:63;:::i;:::-;7562:2;7541:15;-1:-1:-1;;7537:29:1;7528:39;;;;7569:4;7524:50;;7323:257;-1:-1:-1;;7323:257:1:o;7585:973::-;7670:12;;7635:3;;7725:1;7745:18;;;;7798;;;;7825:61;;7879:4;7871:6;7867:17;7857:27;;7825:61;7905:2;7953;7945:6;7942:14;7922:18;7919:38;7916:161;;;7999:10;7994:3;7990:20;7987:1;7980:31;8034:4;8031:1;8024:15;8062:4;8059:1;8052:15;7916:161;8093:18;8120:104;;;;8238:1;8233:319;;;;8086:466;;8120:104;-1:-1:-1;;8153:24:1;;8141:37;;8198:16;;;;-1:-1:-1;8120:104:1;;8233:319;28074:1;28067:14;;;28111:4;28098:18;;8327:1;8341:165;8355:6;8352:1;8349:13;8341:165;;;8433:14;;8420:11;;;8413:35;8476:16;;;;8370:10;;8341:165;;;8345:3;;8535:6;8530:3;8526:16;8519:23;;8086:466;;;;;;;7585:973;;;;:::o;8563:456::-;8784:3;8812:38;8846:3;8838:6;8812:38;:::i;:::-;8879:6;8873:13;8895:52;8940:6;8936:2;8929:4;8921:6;8917:17;8895:52;:::i;:::-;8963:50;9005:6;9001:2;8997:15;8989:6;8963:50;:::i;:::-;8956:57;8563:456;-1:-1:-1;;;;;;;8563:456:1:o;9232:488::-;-1:-1:-1;;;;;9501:15:1;;;9483:34;;9553:15;;9548:2;9533:18;;9526:43;9600:2;9585:18;;9578:34;;;9648:3;9643:2;9628:18;;9621:31;;;9426:4;;9669:45;;9694:19;;9686:6;9669:45;:::i;:::-;9661:53;9232:488;-1:-1:-1;;;;;;9232:488:1:o;10141:219::-;10290:2;10279:9;10272:21;10253:4;10310:44;10350:2;10339:9;10335:18;10327:6;10310:44;:::i;10793:414::-;10995:2;10977:21;;;11034:2;11014:18;;;11007:30;11073:34;11068:2;11053:18;;11046:62;-1:-1:-1;;;11139:2:1;11124:18;;11117:48;11197:3;11182:19;;10793:414::o;14438:407::-;14640:2;14622:21;;;14679:2;14659:18;;;14652:30;14718:34;14713:2;14698:18;;14691:62;-1:-1:-1;;;14784:2:1;14769:18;;14762:41;14835:3;14820:19;;14438:407::o;19034:356::-;19236:2;19218:21;;;19255:18;;;19248:30;19314:34;19309:2;19294:18;;19287:62;19381:2;19366:18;;19034:356::o;21536:413::-;21738:2;21720:21;;;21777:2;21757:18;;;21750:30;21816:34;21811:2;21796:18;;21789:62;-1:-1:-1;;;21882:2:1;21867:18;;21860:47;21939:3;21924:19;;21536:413::o;24770:354::-;24972:2;24954:21;;;25011:2;24991:18;;;24984:30;25050:32;25045:2;25030:18;;25023:60;25115:2;25100:18;;24770:354::o;27153:375::-;27362:4;27354:6;27350:17;27339:9;27332:36;27416:4;27408:6;27404:17;27399:2;27388:9;27384:18;27377:45;27458:2;27453;27442:9;27438:18;27431:30;27313:4;27478:44;27518:2;27507:9;27503:18;27495:6;27478:44;:::i;:::-;27470:52;27153:375;-1:-1:-1;;;;;27153:375:1:o;27533:275::-;27604:2;27598:9;27669:2;27650:13;;-1:-1:-1;;27646:27:1;27634:40;;27704:18;27689:34;;27725:22;;;27686:62;27683:88;;;27751:18;;:::i;:::-;27787:2;27780:22;27533:275;;-1:-1:-1;27533:275:1:o;27813:183::-;27873:4;27906:18;27898:6;27895:30;27892:56;;;27928:18;;:::i;:::-;-1:-1:-1;27973:1:1;27969:14;27985:4;27965:25;;27813:183::o;28127:128::-;28167:3;28198:1;28194:6;28191:1;28188:13;28185:39;;;28204:18;;:::i;:::-;-1:-1:-1;28240:9:1;;28127:128::o;28260:120::-;28300:1;28326;28316:35;;28331:18;;:::i;:::-;-1:-1:-1;28365:9:1;;28260:120::o;28385:168::-;28425:7;28491:1;28487;28483:6;28479:14;28476:1;28473:21;28468:1;28461:9;28454:17;28450:45;28447:71;;;28498:18;;:::i;:::-;-1:-1:-1;28538:9:1;;28385:168::o;28558:125::-;28598:4;28626:1;28623;28620:8;28617:34;;;28631:18;;:::i;:::-;-1:-1:-1;28668:9:1;;28558:125::o;28688:195::-;28726:4;28763;28760:1;28756:12;28795:4;28792:1;28788:12;28820:3;28815;28812:12;28809:38;;;28827:18;;:::i;:::-;28864:13;;;28688:195;-1:-1:-1;;;28688:195:1:o;28888:258::-;28960:1;28970:113;28984:6;28981:1;28978:13;28970:113;;;29060:11;;;29054:18;29041:11;;;29034:39;29006:2;28999:10;28970:113;;;29101:6;29098:1;29095:13;29092:48;;;-1:-1:-1;;29136:1:1;29118:16;;29111:27;28888:258::o;29151:380::-;29230:1;29226:12;;;;29273;;;29294:61;;29348:4;29340:6;29336:17;29326:27;;29294:61;29401:2;29393:6;29390:14;29370:18;29367:38;29364:161;;;29447:10;29442:3;29438:20;29435:1;29428:31;29482:4;29479:1;29472:15;29510:4;29507:1;29500:15;29364:161;;29151:380;;;:::o;29536:135::-;29575:3;-1:-1:-1;;29596:17:1;;29593:43;;;29616:18;;:::i;:::-;-1:-1:-1;29663:1:1;29652:13;;29536:135::o;29676:112::-;29708:1;29734;29724:35;;29739:18;;:::i;:::-;-1:-1:-1;29773:9:1;;29676:112::o;29793:127::-;29854:10;29849:3;29845:20;29842:1;29835:31;29885:4;29882:1;29875:15;29909:4;29906:1;29899:15;29925:127;29986:10;29981:3;29977:20;29974:1;29967:31;30017:4;30014:1;30007:15;30041:4;30038:1;30031:15;30057:127;30118:10;30113:3;30109:20;30106:1;30099:31;30149:4;30146:1;30139:15;30173:4;30170:1;30163:15;30189:127;30250:10;30245:3;30241:20;30238:1;30231:31;30281:4;30278:1;30271:15;30305:4;30302:1;30295:15;30321:131;-1:-1:-1;;;;;30396:31:1;;30386:42;;30376:70;;30442:1;30439;30432:12;30457:131;-1:-1:-1;;;;;;30531:32:1;;30521:43;;30511:71;;30578:1;30575;30568:12
Swarm Source
ipfs://f3039146c25c6abc4203b8b9d3c6047cc64554852e68a50894a724d49b06675c
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.