Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 288 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint Frm | 13756481 | 1067 days ago | IN | 0 ETH | 0.00886349 | ||||
Mint Frm | 13745753 | 1068 days ago | IN | 0 ETH | 0.00905862 | ||||
Mint Frm | 13745716 | 1068 days ago | IN | 0 ETH | 0.00891348 | ||||
Set Frm Nft | 13056099 | 1176 days ago | IN | 0 ETH | 0.00276005 | ||||
Set Frm Nft | 13056075 | 1176 days ago | IN | 0 ETH | 0.00278755 | ||||
Set Frm Nft | 13056074 | 1176 days ago | IN | 0 ETH | 0.00304396 | ||||
Set Frm Nft | 13036021 | 1179 days ago | IN | 0 ETH | 0.00387788 | ||||
Set Frm Nft | 13036018 | 1179 days ago | IN | 0 ETH | 0.00385279 | ||||
Set Frm Nft | 13036016 | 1179 days ago | IN | 0 ETH | 0.00342556 | ||||
Set Frm Nft | 13030475 | 1180 days ago | IN | 0 ETH | 0.00235935 | ||||
Set Frm Nft | 13030455 | 1180 days ago | IN | 0 ETH | 0.00260342 | ||||
Set Frm Nft | 13030443 | 1180 days ago | IN | 0 ETH | 0.00260342 | ||||
Set Frm Nft | 13030407 | 1180 days ago | IN | 0 ETH | 0.00244071 | ||||
Mint Frm | 13030114 | 1180 days ago | IN | 0 ETH | 0.00528685 | ||||
Mint Frm | 13030073 | 1180 days ago | IN | 0 ETH | 0.00499313 | ||||
Mint Frm | 13030030 | 1180 days ago | IN | 0 ETH | 0.00425885 | ||||
Mint Frm | 13030019 | 1180 days ago | IN | 0 ETH | 0.00396513 | ||||
Set Frm Nft Uri | 13029992 | 1180 days ago | IN | 0 ETH | 0.00374712 | ||||
Set Frm Nft Uri | 13029982 | 1180 days ago | IN | 0 ETH | 0.00374712 | ||||
Set Frm Nft Uri | 13029963 | 1180 days ago | IN | 0 ETH | 0.00437164 | ||||
Set Frm Nft | 13024104 | 1181 days ago | IN | 0 ETH | 0.00300932 | ||||
Set Frm Nft | 13024073 | 1181 days ago | IN | 0 ETH | 0.00277726 | ||||
Set Frm Nft | 13024054 | 1181 days ago | IN | 0 ETH | 0.00309065 | ||||
Set Frm Nft | 13024040 | 1181 days ago | IN | 0 ETH | 0.00309065 | ||||
Set Frm Nft Uri | 13023871 | 1181 days ago | IN | 0 ETH | 0.00534546 |
Loading...
Loading
Contract Name:
Vizmesh
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-21 */ /** *Submitted for verification at Etherscan.io on 2021-04-25 */ /** *Submitted for verification at Etherscan.io on 2021-04-18 */ // Sources flattened with hardhat v2.2.0 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] 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/extensions/[email protected] 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 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] 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}. 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 || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly 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` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } } // File @openzeppelin/contracts/access/[email protected] 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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/utils/math/[email protected] pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File vizmesh.sol pragma solidity =0.8.0; contract Vizmesh is ERC721, Ownable { using SafeMath for uint; using Counters for Counters.Counter; Counters.Counter private _tokenIds; //STORAGE AND CONSTANTS uint16 public constant tokenSupplyLimit = 35144; uint16 private constant frmsPerEra = 5000; uint256 private _lastMintBlockTimestamp = 0; mapping (uint256 => frm) public frms; mapping (uint256 => era) public eras; //EVENTS event logSetFrmPosition(uint256 _tokenId, int16 _x, int16 _y); event logSetFrmNft(uint256 _tokenId, address _displayedNftContractAddress, uint256 _displayedNftTokenId); event logSetFrmNftUri(uint256 _tokenId, string _tokenUri); event logMintFrm(uint256 _tokenId); //STRUCT DEFINITIONS struct frm { int16 x; int16 y; uint256 positionSetBlockTimestamp; uint256 nftSetBlockTimestamp; address nftContractAddress; uint256 nftTokenId; string nftUri; string frmUri; bool useNftUri; bool isPaused; } struct era { string name; uint16 tokens100000xPerMinuteRate; uint16 addMinutesToLastMintTimestamp; } //CONSTRUCTOR constructor() ERC721("Vizmesh Frames", "FRM") { eras[0] = era("Impressionist", 486, 206); eras[1] = era("Fauvist", 340, 295); eras[2] = era("Expressionist", 238, 421); eras[3] = era("Cubist", 166, 603); eras[4] = era("Futurist", 116, 863); eras[5] = era("Constructivist", 81, 1235); eras[6] = era("Surrealist", 57, 1755); } //FRM OWNER FUNCTIONS function setFrmPosition(uint256 _tokenId, int16 _x, int16 _y) external { require(_exists(_tokenId), "Token must exists."); require(msg.sender == ownerOf(_tokenId) || msg.sender == owner(), "Must be token or contract owner."); require(msg.sender == owner() || frms[_tokenId].isPaused == false, "FRM must not be paused."); frms[_tokenId].positionSetBlockTimestamp = _getBlockTimestamp(); //Set this before position frms[_tokenId].x = _x; frms[_tokenId].y = _y; emit logSetFrmPosition(_tokenId, _x, _y); } function setFrmNft(uint256 _tokenId, address _nftContractAddress, uint256 _nftTokenId) external { require(_exists(_tokenId), "Token must exists."); require(msg.sender == ownerOf(_tokenId) || msg.sender == owner(), "Must be token or contract owner."); require(msg.sender == owner() || frms[_tokenId].isPaused == false, "FRM must not be paused."); frms[_tokenId].nftSetBlockTimestamp = _getBlockTimestamp(); frms[_tokenId].nftContractAddress = _nftContractAddress; frms[_tokenId].nftTokenId = _nftTokenId; frms[_tokenId].useNftUri = false; emit logSetFrmNft(_tokenId, _nftContractAddress, _nftTokenId); } function setFrmNftUri(uint256 _tokenId, string calldata _nftUri) external { require(_exists(_tokenId), "Token must exists."); require(msg.sender == ownerOf(_tokenId) || msg.sender == owner(), "Must be token or contract owner."); require(msg.sender == owner() || frms[_tokenId].isPaused == false, "FRM must not be paused."); frms[_tokenId].nftSetBlockTimestamp = _getBlockTimestamp(); frms[_tokenId].nftUri = _nftUri; frms[_tokenId].useNftUri = true; emit logSetFrmNftUri(_tokenId, _nftUri); } //VIZMESH SMART CONTRACT OWNER FUNCTIONS function pauseFrm(uint256 _tokenId) external onlyOwner { require(_exists(_tokenId), "Token must exists."); frms[_tokenId].isPaused = true; } function resumeFrm(uint256 _tokenId) external onlyOwner { require(_exists(_tokenId), "Token must exists."); frms[_tokenId].isPaused = false; } function setFrmUri(uint256 _tokenId, string calldata _frmUri) external onlyOwner { require(_exists(_tokenId), "Token must exists."); frms[_tokenId].frmUri = _frmUri; } function mintFrm(address _tokenOwner, int16 _x, int16 _y) external onlyOwner { uint256 tokenCount = _tokenIds.current(); require(tokenCount < tokenSupplyLimit, "Can't exceed the tokenSupplyLimit."); uint256 eraIndex = _getEraIndex(tokenCount); uint256 blockTimestamp = _getBlockTimestamp(); uint256 secondsPerMinute = 60; require(_lastMintBlockTimestamp < blockTimestamp, "Block timestamp must come after the _lastMintBlockTimestamp value."); if(tokenCount >= 144){ //Get minutes since last mint uint256 secondsSinceLastMint = blockTimestamp.sub(_lastMintBlockTimestamp); uint256 minutesSinceLastMint = secondsSinceLastMint.div(secondsPerMinute); //Get tokens to mint 100000x uint256 tokens100000xPerMinuteRate = eras[eraIndex].tokens100000xPerMinuteRate; uint256 tokens100000x = minutesSinceLastMint.mul(tokens100000xPerMinuteRate); //Require that at least one token can be created require(tokens100000x >= 100000, "It's too early to mint a new FRM."); } //Mint _tokenIds.increment(); uint256 newTokenId = _tokenIds.current(); frms[newTokenId] = frm(_x, _y, blockTimestamp, blockTimestamp, address(0), 0, '', '', false, false); _mint(_tokenOwner, newTokenId); //This token goes to the CONTRACT owner and NOT the caller of this function. //Update timestamp if(tokenCount >= 144) { uint256 addMinutesToLastMintTimestamp = eras[eraIndex].addMinutesToLastMintTimestamp; _lastMintBlockTimestamp += addMinutesToLastMintTimestamp * secondsPerMinute; } else { _lastMintBlockTimestamp = blockTimestamp; } emit logMintFrm(newTokenId); } //READ FUNCTIONS function tokenURI(uint256 _tokenId) public view override returns(string memory) { require(_exists(_tokenId), "Token must exists."); return frms[_tokenId].frmUri; } function _getEraIndex(uint256 tokenCount) internal pure returns(uint256) { if(tokenCount <= 144){ return 0; } uint256 eraIndex = (tokenCount.sub(144)).div(frmsPerEra); return eraIndex; } function getTokenIdsCurrent() external view returns(uint256) { return _tokenIds.current(); } function _getBlockTimestamp() //have this function return the block.timestamp internal view returns(uint256) { return block.timestamp; } function renounceOwnership() public override onlyOwner { //Do nothing } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"logMintFrm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_displayedNftContractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_displayedNftTokenId","type":"uint256"}],"name":"logSetFrmNft","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_tokenUri","type":"string"}],"name":"logSetFrmNftUri","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"int16","name":"_x","type":"int16"},{"indexed":false,"internalType":"int16","name":"_y","type":"int16"}],"name":"logSetFrmPosition","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"eras","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"tokens100000xPerMinuteRate","type":"uint16"},{"internalType":"uint16","name":"addMinutesToLastMintTimestamp","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"frms","outputs":[{"internalType":"int16","name":"x","type":"int16"},{"internalType":"int16","name":"y","type":"int16"},{"internalType":"uint256","name":"positionSetBlockTimestamp","type":"uint256"},{"internalType":"uint256","name":"nftSetBlockTimestamp","type":"uint256"},{"internalType":"address","name":"nftContractAddress","type":"address"},{"internalType":"uint256","name":"nftTokenId","type":"uint256"},{"internalType":"string","name":"nftUri","type":"string"},{"internalType":"string","name":"frmUri","type":"string"},{"internalType":"bool","name":"useNftUri","type":"bool"},{"internalType":"bool","name":"isPaused","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenIdsCurrent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOwner","type":"address"},{"internalType":"int16","name":"_x","type":"int16"},{"internalType":"int16","name":"_y","type":"int16"}],"name":"mintFrm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"pauseFrm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"resumeFrm","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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_nftContractAddress","type":"address"},{"internalType":"uint256","name":"_nftTokenId","type":"uint256"}],"name":"setFrmNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_nftUri","type":"string"}],"name":"setFrmNftUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"int16","name":"_x","type":"int16"},{"internalType":"int16","name":"_y","type":"int16"}],"name":"setFrmPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_frmUri","type":"string"}],"name":"setFrmUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSupplyLimit","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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"}]
Contract Creation Code
608060405260006008553480156200001657600080fd5b506040518060400160405280600e81526020017f56697a6d657368204672616d65730000000000000000000000000000000000008152506040518060400160405280600381526020017f46524d000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009b92919062000757565b508060019080519060200190620000b492919062000757565b5050506000620000c96200074f60201b60201c565b905080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060405180606001604052806040518060400160405280600d81526020017f496d7072657373696f6e6973740000000000000000000000000000000000000081525081526020016101e661ffff16815260200160ce61ffff16815250600a60008081526020019081526020016000206000820151816000019080519060200190620001f492919062000757565b5060208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548161ffff021916908361ffff16021790555090505060405180606001604052806040518060400160405280600781526020017f4661757669737400000000000000000000000000000000000000000000000000815250815260200161015461ffff16815260200161012761ffff16815250600a6000600181526020019081526020016000206000820151816000019080519060200190620002cc92919062000757565b5060208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548161ffff021916908361ffff16021790555090505060405180606001604052806040518060400160405280600d81526020017f45787072657373696f6e69737400000000000000000000000000000000000000815250815260200160ee61ffff1681526020016101a561ffff16815250600a6000600281526020019081526020016000206000820151816000019080519060200190620003a392919062000757565b5060208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548161ffff021916908361ffff16021790555090505060405180606001604052806040518060400160405280600681526020017f4375626973740000000000000000000000000000000000000000000000000000815250815260200160a661ffff16815260200161025b61ffff16815250600a60006003815260200190815260200160002060008201518160000190805190602001906200047a92919062000757565b5060208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548161ffff021916908361ffff16021790555090505060405180606001604052806040518060400160405280600881526020017f46757475726973740000000000000000000000000000000000000000000000008152508152602001607461ffff16815260200161035f61ffff16815250600a60006004815260200190815260200160002060008201518160000190805190602001906200055192919062000757565b5060208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548161ffff021916908361ffff16021790555090505060405180606001604052806040518060400160405280600e81526020017f436f6e73747275637469766973740000000000000000000000000000000000008152508152602001605161ffff1681526020016104d361ffff16815250600a60006005815260200190815260200160002060008201518160000190805190602001906200062892919062000757565b5060208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548161ffff021916908361ffff16021790555090505060405180606001604052806040518060400160405280600a81526020017f5375727265616c697374000000000000000000000000000000000000000000008152508152602001603961ffff1681526020016106db61ffff16815250600a6000600681526020019081526020016000206000820151816000019080519060200190620006ff92919062000757565b5060208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548161ffff021916908361ffff1602179055509050506200086c565b600033905090565b828054620007659062000807565b90600052602060002090601f016020900481019282620007895760008555620007d5565b82601f10620007a457805160ff1916838001178555620007d5565b82800160010185558215620007d5579182015b82811115620007d4578251825591602001919060010190620007b7565b5b509050620007e49190620007e8565b5090565b5b8082111562000803576000816000905550600101620007e9565b5090565b600060028204905060018216806200082057607f821691505b602082108114156200083757620008366200083d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6142b0806200087c6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063ae8bb64e11610097578063c87b56dd11610071578063c87b56dd146104ad578063d128080f146104dd578063e985e9c5146104f9578063f2fde38b14610529576101a9565b8063ae8bb64e14610459578063b88d4fde14610475578063c243fe0314610491576101a9565b80638da5cb5b116100d35780638da5cb5b146103e557806395d89b4114610403578063a22cb46514610421578063a2daef141461043d576101a9565b806370a0823114610379578063715018a6146103a9578063720a70bd146103b3576101a9565b806320f10fdd1161016657806342842e0e1161014057806342842e0e146102f5578063625e827c146103115780636352211e1461032d5780636c50dbae1461035d576101a9565b806320f10fdd146102825780632374c7da146102a057806323b872dd146102d9576101a9565b806301ffc9a7146101ae578063047c6286146101de57806306fdde03146101fc578063081812fc1461021a578063095ea7b31461024a57806311d116aa14610266575b600080fd5b6101c860048036038101906101c39190612fb2565b610545565b6040516101d591906139ee565b60405180910390f35b6101e6610627565b6040516101f39190613dce565b60405180910390f35b610204610638565b6040516102119190613ab3565b60405180910390f35b610234600480360381019061022f9190613004565b6106ca565b6040516102419190613987565b60405180910390f35b610264600480360381019061025f9190612f76565b61074f565b005b610280600480360381019061027b9190612f27565b610867565b005b61028a610cf8565b6040516102979190613db3565b60405180910390f35b6102ba60048036038101906102b59190613004565b610cfe565b6040516102d09a99989796959493929190613a09565b60405180910390f35b6102f360048036038101906102ee9190612e21565b610eb6565b005b61030f600480360381019061030a9190612e21565b610f16565b005b61032b60048036038101906103269190613004565b610f36565b005b61034760048036038101906103429190613004565b61102c565b6040516103549190613987565b60405180910390f35b610377600480360381019061037291906130cb565b6110de565b005b610393600480360381019061038e9190612dbc565b6111cd565b6040516103a09190613dce565b60405180910390f35b6103b1611285565b005b6103cd60048036038101906103c89190613004565b611303565b6040516103dc93929190613ad5565b60405180910390f35b6103ed6113d1565b6040516103fa9190613987565b60405180910390f35b61040b6113fb565b6040516104189190613ab3565b60405180910390f35b61043b60048036038101906104369190612eeb565b61148d565b005b6104576004803603810190610452919061307c565b61160e565b005b610473600480360381019061046e919061302d565b61187a565b005b61048f600480360381019061048a9190612e70565b611b1d565b005b6104ab60048036038101906104a69190613004565b611b7f565b005b6104c760048036038101906104c29190613004565b611c75565b6040516104d49190613ab3565b60405180910390f35b6104f760048036038101906104f291906130cb565b611d65565b005b610513600480360381019061050e9190612de5565b611fbe565b60405161052091906139ee565b60405180910390f35b610543600480360381019061053e9190612dbc565b612052565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061061057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610620575061061f826121fe565b5b9050919050565b60006106336007612268565b905090565b60606000805461064790614108565b80601f016020809104026020016040519081016040528092919081815260200182805461067390614108565b80156106c05780601f10610695576101008083540402835291602001916106c0565b820191906000526020600020905b8154815290600101906020018083116106a357829003601f168201915b5050505050905090565b60006106d582612276565b610714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070b90613cf3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061075a8261102c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c290613d53565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ea6122e2565b73ffffffffffffffffffffffffffffffffffffffff1614806108195750610818816108136122e2565b611fbe565b5b610858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084f90613c53565b60405180910390fd5b61086283836122ea565b505050565b61086f6122e2565b73ffffffffffffffffffffffffffffffffffffffff1661088d6113d1565b73ffffffffffffffffffffffffffffffffffffffff16146108e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108da90613d13565b60405180910390fd5b60006108ef6007612268565b905061894861ffff168110610939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093090613d93565b60405180910390fd5b6000610944826123a3565b905060006109506123f0565b90506000603c9050816008541061099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390613cb3565b60405180910390fd5b60908410610a635760006109bb600854846123f890919063ffffffff16565b905060006109d2838361240e90919063ffffffff16565b90506000600a600087815260200190815260200160002060010160009054906101000a900461ffff1661ffff1690506000610a16828461242490919063ffffffff16565b9050620186a0811015610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5590613b53565b60405180910390fd5b505050505b610a6d600761243a565b6000610a796007612268565b90506040518061014001604052808860010b81526020018760010b8152602001848152602001848152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001604051806020016040528060008152508152602001604051806020016040528060008152508152602001600015158152602001600015158152506009600083815260200190815260200160002060008201518160000160006101000a81548161ffff021916908360010b61ffff16021790555060208201518160000160026101000a81548161ffff021916908360010b61ffff160217905550604082015181600101556060820151816002015560808201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816004015560c0820151816005019080519060200190610be3929190612b63565b5060e0820151816006019080519060200190610c00929190612b63565b506101008201518160070160006101000a81548160ff0219169083151502179055506101208201518160070160016101000a81548160ff021916908315150217905550905050610c508882612450565b60908510610caf576000600a600086815260200190815260200160002060010160029054906101000a900461ffff1661ffff1690508281610c919190613fa9565b60086000828254610ca29190613f22565b9250508190555050610cb7565b826008819055505b7fce5b3642a7305d5af1c30986479281fe412d24d7a518b86fd3d7f55f2791133d81604051610ce69190613dce565b60405180910390a15050505050505050565b61894881565b60096020528060005260406000206000915090508060000160009054906101000a900460010b908060000160029054906101000a900460010b908060010154908060020154908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806004015490806005018054610d7f90614108565b80601f0160208091040260200160405190810160405280929190818152602001828054610dab90614108565b8015610df85780601f10610dcd57610100808354040283529160200191610df8565b820191906000526020600020905b815481529060010190602001808311610ddb57829003601f168201915b505050505090806006018054610e0d90614108565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3990614108565b8015610e865780601f10610e5b57610100808354040283529160200191610e86565b820191906000526020600020905b815481529060010190602001808311610e6957829003601f168201915b5050505050908060070160009054906101000a900460ff16908060070160019054906101000a900460ff1690508a565b610ec7610ec16122e2565b8261261e565b610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd90613d73565b60405180910390fd5b610f118383836126fc565b505050565b610f3183838360405180602001604052806000815250611b1d565b505050565b610f3e6122e2565b73ffffffffffffffffffffffffffffffffffffffff16610f5c6113d1565b73ffffffffffffffffffffffffffffffffffffffff1614610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990613d13565b60405180910390fd5b610fbb81612276565b610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff190613b13565b60405180910390fd5b60016009600083815260200190815260200160002060070160016101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cc90613c93565b60405180910390fd5b80915050919050565b6110e66122e2565b73ffffffffffffffffffffffffffffffffffffffff166111046113d1565b73ffffffffffffffffffffffffffffffffffffffff161461115a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115190613d13565b60405180910390fd5b61116383612276565b6111a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119990613b13565b60405180910390fd5b81816009600086815260200190815260200160002060060191906111c7929190612be9565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123590613c73565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61128d6122e2565b73ffffffffffffffffffffffffffffffffffffffff166112ab6113d1565b73ffffffffffffffffffffffffffffffffffffffff1614611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f890613d13565b60405180910390fd5b565b600a60205280600052604060002060009150905080600001805461132690614108565b80601f016020809104026020016040519081016040528092919081815260200182805461135290614108565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b5050505050908060010160009054906101000a900461ffff16908060010160029054906101000a900461ffff16905083565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461140a90614108565b80601f016020809104026020016040519081016040528092919081815260200182805461143690614108565b80156114835780601f1061145857610100808354040283529160200191611483565b820191906000526020600020905b81548152906001019060200180831161146657829003601f168201915b5050505050905090565b6114956122e2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa90613c13565b60405180910390fd5b80600560006115106122e2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115bd6122e2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161160291906139ee565b60405180910390a35050565b61161783612276565b611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d90613b13565b60405180910390fd5b61165f8361102c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116ca575061169b6113d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090613bd3565b60405180910390fd5b6117116113d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117715750600015156009600085815260200190815260200160002060070160019054906101000a900460ff161515145b6117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a790613b33565b60405180910390fd5b6117b86123f0565b6009600085815260200190815260200160002060010181905550816009600085815260200190815260200160002060000160006101000a81548161ffff021916908360010b61ffff160217905550806009600085815260200190815260200160002060000160026101000a81548161ffff021916908360010b61ffff1602179055507f9f346c8d9c230d921a91ddef8efe587d0a78674ef188fb73cc4db159a2b4579e83838360405161186d93929190613e20565b60405180910390a1505050565b61188383612276565b6118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b990613b13565b60405180910390fd5b6118cb8361102c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061193657506119076113d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c90613bd3565b60405180910390fd5b61197d6113d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806119dd5750600015156009600085815260200190815260200160002060070160019054906101000a900460ff161515145b611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1390613b33565b60405180910390fd5b611a246123f0565b6009600085815260200190815260200160002060020181905550816009600085815260200190815260200160002060030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960008581526020019081526020016000206004018190555060006009600085815260200190815260200160002060070160006101000a81548160ff0219169083151502179055507fe540a12baaacfb50136b8ff6f53301eb84fe28b59e52c56fa7b2128a3355d0af838383604051611b1093929190613de9565b60405180910390a1505050565b611b2e611b286122e2565b8361261e565b611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490613d73565b60405180910390fd5b611b7984848484612958565b50505050565b611b876122e2565b73ffffffffffffffffffffffffffffffffffffffff16611ba56113d1565b73ffffffffffffffffffffffffffffffffffffffff1614611bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf290613d13565b60405180910390fd5b611c0481612276565b611c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a90613b13565b60405180910390fd5b60006009600083815260200190815260200160002060070160016101000a81548160ff02191690831515021790555050565b6060611c8082612276565b611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb690613b13565b60405180910390fd5b600960008381526020019081526020016000206006018054611ce090614108565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0c90614108565b8015611d595780601f10611d2e57610100808354040283529160200191611d59565b820191906000526020600020905b815481529060010190602001808311611d3c57829003601f168201915b50505050509050919050565b611d6e83612276565b611dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da490613b13565b60405180910390fd5b611db68361102c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e215750611df26113d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5790613bd3565b60405180910390fd5b611e686113d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ec85750600015156009600085815260200190815260200160002060070160019054906101000a900460ff161515145b611f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efe90613b33565b60405180910390fd5b611f0f6123f0565b60096000858152602001908152602001600020600201819055508181600960008681526020019081526020016000206005019190611f4e929190612be9565b5060016009600085815260200190815260200160002060070160006101000a81548160ff0219169083151502179055507f9296d0a8133bb5745f8689e66892f769d092830c6bc1c8b0953178a37d902f01838383604051611fb193929190613e57565b60405180910390a1505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61205a6122e2565b73ffffffffffffffffffffffffffffffffffffffff166120786113d1565b73ffffffffffffffffffffffffffffffffffffffff16146120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c590613d13565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561213e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213590613b93565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081600001549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661235d8361102c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000609082116123b657600090506123eb565b60006123e461138861ffff166123d66090866123f890919063ffffffff16565b61240e90919063ffffffff16565b9050809150505b919050565b600042905090565b600081836124069190614003565b905092915050565b6000818361241c9190613f78565b905092915050565b600081836124329190613fa9565b905092915050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b790613cd3565b60405180910390fd5b6124c981612276565b15612509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250090613bb3565b60405180910390fd5b612515600083836129b4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125659190613f22565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061262982612276565b612668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265f90613c33565b60405180910390fd5b60006126738361102c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126e257508373ffffffffffffffffffffffffffffffffffffffff166126ca846106ca565b73ffffffffffffffffffffffffffffffffffffffff16145b806126f357506126f28185611fbe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661271c8261102c565b73ffffffffffffffffffffffffffffffffffffffff1614612772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276990613d33565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d990613bf3565b60405180910390fd5b6127ed8383836129b4565b6127f86000826122ea565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128489190614003565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461289f9190613f22565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6129638484846126fc565b61296f848484846129b9565b6129ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a590613b73565b60405180910390fd5b50505050565b505050565b60006129da8473ffffffffffffffffffffffffffffffffffffffff16612b50565b15612b43578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a036122e2565b8786866040518563ffffffff1660e01b8152600401612a2594939291906139a2565b602060405180830381600087803b158015612a3f57600080fd5b505af1925050508015612a7057506040513d601f19601f82011682018060405250810190612a6d9190612fdb565b60015b612af3573d8060008114612aa0576040519150601f19603f3d011682016040523d82523d6000602084013e612aa5565b606091505b50600081511415612aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae290613b73565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b48565b600190505b949350505050565b600080823b905060008111915050919050565b828054612b6f90614108565b90600052602060002090601f016020900481019282612b915760008555612bd8565b82601f10612baa57805160ff1916838001178555612bd8565b82800160010185558215612bd8579182015b82811115612bd7578251825591602001919060010190612bbc565b5b509050612be59190612c6f565b5090565b828054612bf590614108565b90600052602060002090601f016020900481019282612c175760008555612c5e565b82601f10612c3057803560ff1916838001178555612c5e565b82800160010185558215612c5e579182015b82811115612c5d578235825591602001919060010190612c42565b5b509050612c6b9190612c6f565b5090565b5b80821115612c88576000816000905550600101612c70565b5090565b6000612c9f612c9a84613eba565b613e89565b905082815260208101848484011115612cb757600080fd5b612cc28482856140c6565b509392505050565b600081359050612cd981614207565b92915050565b600081359050612cee8161421e565b92915050565b600081359050612d0381614235565b92915050565b600081519050612d1881614235565b92915050565b600082601f830112612d2f57600080fd5b8135612d3f848260208601612c8c565b91505092915050565b600081359050612d578161424c565b92915050565b60008083601f840112612d6f57600080fd5b8235905067ffffffffffffffff811115612d8857600080fd5b602083019150836001820283011115612da057600080fd5b9250929050565b600081359050612db681614263565b92915050565b600060208284031215612dce57600080fd5b6000612ddc84828501612cca565b91505092915050565b60008060408385031215612df857600080fd5b6000612e0685828601612cca565b9250506020612e1785828601612cca565b9150509250929050565b600080600060608486031215612e3657600080fd5b6000612e4486828701612cca565b9350506020612e5586828701612cca565b9250506040612e6686828701612da7565b9150509250925092565b60008060008060808587031215612e8657600080fd5b6000612e9487828801612cca565b9450506020612ea587828801612cca565b9350506040612eb687828801612da7565b925050606085013567ffffffffffffffff811115612ed357600080fd5b612edf87828801612d1e565b91505092959194509250565b60008060408385031215612efe57600080fd5b6000612f0c85828601612cca565b9250506020612f1d85828601612cdf565b9150509250929050565b600080600060608486031215612f3c57600080fd5b6000612f4a86828701612cca565b9350506020612f5b86828701612d48565b9250506040612f6c86828701612d48565b9150509250925092565b60008060408385031215612f8957600080fd5b6000612f9785828601612cca565b9250506020612fa885828601612da7565b9150509250929050565b600060208284031215612fc457600080fd5b6000612fd284828501612cf4565b91505092915050565b600060208284031215612fed57600080fd5b6000612ffb84828501612d09565b91505092915050565b60006020828403121561301657600080fd5b600061302484828501612da7565b91505092915050565b60008060006060848603121561304257600080fd5b600061305086828701612da7565b935050602061306186828701612cca565b925050604061307286828701612da7565b9150509250925092565b60008060006060848603121561309157600080fd5b600061309f86828701612da7565b93505060206130b086828701612d48565b92505060406130c186828701612d48565b9150509250925092565b6000806000604084860312156130e057600080fd5b60006130ee86828701612da7565b935050602084013567ffffffffffffffff81111561310b57600080fd5b61311786828701612d5d565b92509250509250925092565b61312c81614037565b82525050565b61313b81614049565b82525050565b600061314c82613eea565b6131568185613f00565b93506131668185602086016140d5565b61316f816141f6565b840191505092915050565b61318381614081565b82525050565b60006131958385613f11565b93506131a28385846140c6565b6131ab836141f6565b840190509392505050565b60006131c182613ef5565b6131cb8185613f11565b93506131db8185602086016140d5565b6131e4816141f6565b840191505092915050565b60006131fc601283613f11565b91507f546f6b656e206d757374206578697374732e00000000000000000000000000006000830152602082019050919050565b600061323c601783613f11565b91507f46524d206d757374206e6f74206265207061757365642e0000000000000000006000830152602082019050919050565b600061327c602183613f11565b91507f4974277320746f6f206561726c7920746f206d696e742061206e65772046524d60008301527f2e000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132e2603283613f11565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613348602683613f11565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133ae601c83613f11565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006133ee602083613f11565b91507f4d75737420626520746f6b656e206f7220636f6e7472616374206f776e65722e6000830152602082019050919050565b600061342e602483613f11565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613494601983613f11565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006134d4602c83613f11565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061353a603883613f11565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006135a0602a83613f11565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613606602983613f11565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061366c604283613f11565b91507f426c6f636b2074696d657374616d70206d75737420636f6d652061667465722060008301527f746865205f6c6173744d696e74426c6f636b54696d657374616d702076616c7560208301527f652e0000000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b60006136f8602083613f11565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613738602c83613f11565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061379e602083613f11565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006137de602983613f11565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613844602183613f11565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138aa603183613f11565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613910602283613f11565b91507f43616e2774206578636565642074686520746f6b656e537570706c794c696d6960008301527f742e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6139728161408e565b82525050565b613981816140bc565b82525050565b600060208201905061399c6000830184613123565b92915050565b60006080820190506139b76000830187613123565b6139c46020830186613123565b6139d16040830185613978565b81810360608301526139e38184613141565b905095945050505050565b6000602082019050613a036000830184613132565b92915050565b600061014082019050613a1f600083018d61317a565b613a2c602083018c61317a565b613a39604083018b613978565b613a46606083018a613978565b613a536080830189613123565b613a6060a0830188613978565b81810360c0830152613a7281876131b6565b905081810360e0830152613a8681866131b6565b9050613a96610100830185613132565b613aa4610120830184613132565b9b9a5050505050505050505050565b60006020820190508181036000830152613acd81846131b6565b905092915050565b60006060820190508181036000830152613aef81866131b6565b9050613afe6020830185613969565b613b0b6040830184613969565b949350505050565b60006020820190508181036000830152613b2c816131ef565b9050919050565b60006020820190508181036000830152613b4c8161322f565b9050919050565b60006020820190508181036000830152613b6c8161326f565b9050919050565b60006020820190508181036000830152613b8c816132d5565b9050919050565b60006020820190508181036000830152613bac8161333b565b9050919050565b60006020820190508181036000830152613bcc816133a1565b9050919050565b60006020820190508181036000830152613bec816133e1565b9050919050565b60006020820190508181036000830152613c0c81613421565b9050919050565b60006020820190508181036000830152613c2c81613487565b9050919050565b60006020820190508181036000830152613c4c816134c7565b9050919050565b60006020820190508181036000830152613c6c8161352d565b9050919050565b60006020820190508181036000830152613c8c81613593565b9050919050565b60006020820190508181036000830152613cac816135f9565b9050919050565b60006020820190508181036000830152613ccc8161365f565b9050919050565b60006020820190508181036000830152613cec816136eb565b9050919050565b60006020820190508181036000830152613d0c8161372b565b9050919050565b60006020820190508181036000830152613d2c81613791565b9050919050565b60006020820190508181036000830152613d4c816137d1565b9050919050565b60006020820190508181036000830152613d6c81613837565b9050919050565b60006020820190508181036000830152613d8c8161389d565b9050919050565b60006020820190508181036000830152613dac81613903565b9050919050565b6000602082019050613dc86000830184613969565b92915050565b6000602082019050613de36000830184613978565b92915050565b6000606082019050613dfe6000830186613978565b613e0b6020830185613123565b613e186040830184613978565b949350505050565b6000606082019050613e356000830186613978565b613e42602083018561317a565b613e4f604083018461317a565b949350505050565b6000604082019050613e6c6000830186613978565b8181036020830152613e7f818486613189565b9050949350505050565b6000604051905081810181811067ffffffffffffffff82111715613eb057613eaf6141c7565b5b8060405250919050565b600067ffffffffffffffff821115613ed557613ed46141c7565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613f2d826140bc565b9150613f38836140bc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f6d57613f6c61413a565b5b828201905092915050565b6000613f83826140bc565b9150613f8e836140bc565b925082613f9e57613f9d614169565b5b828204905092915050565b6000613fb4826140bc565b9150613fbf836140bc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ff857613ff761413a565b5b828202905092915050565b600061400e826140bc565b9150614019836140bc565b92508282101561402c5761402b61413a565b5b828203905092915050565b60006140428261409c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008160010b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140f35780820151818401526020810190506140d8565b83811115614102576000848401525b50505050565b6000600282049050600182168061412057607f821691505b6020821081141561413457614133614198565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61421081614037565b811461421b57600080fd5b50565b61422781614049565b811461423257600080fd5b50565b61423e81614055565b811461424957600080fd5b50565b61425581614081565b811461426057600080fd5b50565b61426c816140bc565b811461427757600080fd5b5056fea2646970667358221220bdc2fcd62ca6400a605d1e4894d502681b038bd9d599efaf3d4e44429c11e24a64736f6c63430008000033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063ae8bb64e11610097578063c87b56dd11610071578063c87b56dd146104ad578063d128080f146104dd578063e985e9c5146104f9578063f2fde38b14610529576101a9565b8063ae8bb64e14610459578063b88d4fde14610475578063c243fe0314610491576101a9565b80638da5cb5b116100d35780638da5cb5b146103e557806395d89b4114610403578063a22cb46514610421578063a2daef141461043d576101a9565b806370a0823114610379578063715018a6146103a9578063720a70bd146103b3576101a9565b806320f10fdd1161016657806342842e0e1161014057806342842e0e146102f5578063625e827c146103115780636352211e1461032d5780636c50dbae1461035d576101a9565b806320f10fdd146102825780632374c7da146102a057806323b872dd146102d9576101a9565b806301ffc9a7146101ae578063047c6286146101de57806306fdde03146101fc578063081812fc1461021a578063095ea7b31461024a57806311d116aa14610266575b600080fd5b6101c860048036038101906101c39190612fb2565b610545565b6040516101d591906139ee565b60405180910390f35b6101e6610627565b6040516101f39190613dce565b60405180910390f35b610204610638565b6040516102119190613ab3565b60405180910390f35b610234600480360381019061022f9190613004565b6106ca565b6040516102419190613987565b60405180910390f35b610264600480360381019061025f9190612f76565b61074f565b005b610280600480360381019061027b9190612f27565b610867565b005b61028a610cf8565b6040516102979190613db3565b60405180910390f35b6102ba60048036038101906102b59190613004565b610cfe565b6040516102d09a99989796959493929190613a09565b60405180910390f35b6102f360048036038101906102ee9190612e21565b610eb6565b005b61030f600480360381019061030a9190612e21565b610f16565b005b61032b60048036038101906103269190613004565b610f36565b005b61034760048036038101906103429190613004565b61102c565b6040516103549190613987565b60405180910390f35b610377600480360381019061037291906130cb565b6110de565b005b610393600480360381019061038e9190612dbc565b6111cd565b6040516103a09190613dce565b60405180910390f35b6103b1611285565b005b6103cd60048036038101906103c89190613004565b611303565b6040516103dc93929190613ad5565b60405180910390f35b6103ed6113d1565b6040516103fa9190613987565b60405180910390f35b61040b6113fb565b6040516104189190613ab3565b60405180910390f35b61043b60048036038101906104369190612eeb565b61148d565b005b6104576004803603810190610452919061307c565b61160e565b005b610473600480360381019061046e919061302d565b61187a565b005b61048f600480360381019061048a9190612e70565b611b1d565b005b6104ab60048036038101906104a69190613004565b611b7f565b005b6104c760048036038101906104c29190613004565b611c75565b6040516104d49190613ab3565b60405180910390f35b6104f760048036038101906104f291906130cb565b611d65565b005b610513600480360381019061050e9190612de5565b611fbe565b60405161052091906139ee565b60405180910390f35b610543600480360381019061053e9190612dbc565b612052565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061061057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610620575061061f826121fe565b5b9050919050565b60006106336007612268565b905090565b60606000805461064790614108565b80601f016020809104026020016040519081016040528092919081815260200182805461067390614108565b80156106c05780601f10610695576101008083540402835291602001916106c0565b820191906000526020600020905b8154815290600101906020018083116106a357829003601f168201915b5050505050905090565b60006106d582612276565b610714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070b90613cf3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061075a8261102c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c290613d53565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ea6122e2565b73ffffffffffffffffffffffffffffffffffffffff1614806108195750610818816108136122e2565b611fbe565b5b610858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084f90613c53565b60405180910390fd5b61086283836122ea565b505050565b61086f6122e2565b73ffffffffffffffffffffffffffffffffffffffff1661088d6113d1565b73ffffffffffffffffffffffffffffffffffffffff16146108e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108da90613d13565b60405180910390fd5b60006108ef6007612268565b905061894861ffff168110610939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093090613d93565b60405180910390fd5b6000610944826123a3565b905060006109506123f0565b90506000603c9050816008541061099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390613cb3565b60405180910390fd5b60908410610a635760006109bb600854846123f890919063ffffffff16565b905060006109d2838361240e90919063ffffffff16565b90506000600a600087815260200190815260200160002060010160009054906101000a900461ffff1661ffff1690506000610a16828461242490919063ffffffff16565b9050620186a0811015610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5590613b53565b60405180910390fd5b505050505b610a6d600761243a565b6000610a796007612268565b90506040518061014001604052808860010b81526020018760010b8152602001848152602001848152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001604051806020016040528060008152508152602001604051806020016040528060008152508152602001600015158152602001600015158152506009600083815260200190815260200160002060008201518160000160006101000a81548161ffff021916908360010b61ffff16021790555060208201518160000160026101000a81548161ffff021916908360010b61ffff160217905550604082015181600101556060820151816002015560808201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816004015560c0820151816005019080519060200190610be3929190612b63565b5060e0820151816006019080519060200190610c00929190612b63565b506101008201518160070160006101000a81548160ff0219169083151502179055506101208201518160070160016101000a81548160ff021916908315150217905550905050610c508882612450565b60908510610caf576000600a600086815260200190815260200160002060010160029054906101000a900461ffff1661ffff1690508281610c919190613fa9565b60086000828254610ca29190613f22565b9250508190555050610cb7565b826008819055505b7fce5b3642a7305d5af1c30986479281fe412d24d7a518b86fd3d7f55f2791133d81604051610ce69190613dce565b60405180910390a15050505050505050565b61894881565b60096020528060005260406000206000915090508060000160009054906101000a900460010b908060000160029054906101000a900460010b908060010154908060020154908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806004015490806005018054610d7f90614108565b80601f0160208091040260200160405190810160405280929190818152602001828054610dab90614108565b8015610df85780601f10610dcd57610100808354040283529160200191610df8565b820191906000526020600020905b815481529060010190602001808311610ddb57829003601f168201915b505050505090806006018054610e0d90614108565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3990614108565b8015610e865780601f10610e5b57610100808354040283529160200191610e86565b820191906000526020600020905b815481529060010190602001808311610e6957829003601f168201915b5050505050908060070160009054906101000a900460ff16908060070160019054906101000a900460ff1690508a565b610ec7610ec16122e2565b8261261e565b610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd90613d73565b60405180910390fd5b610f118383836126fc565b505050565b610f3183838360405180602001604052806000815250611b1d565b505050565b610f3e6122e2565b73ffffffffffffffffffffffffffffffffffffffff16610f5c6113d1565b73ffffffffffffffffffffffffffffffffffffffff1614610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990613d13565b60405180910390fd5b610fbb81612276565b610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff190613b13565b60405180910390fd5b60016009600083815260200190815260200160002060070160016101000a81548160ff02191690831515021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cc90613c93565b60405180910390fd5b80915050919050565b6110e66122e2565b73ffffffffffffffffffffffffffffffffffffffff166111046113d1565b73ffffffffffffffffffffffffffffffffffffffff161461115a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115190613d13565b60405180910390fd5b61116383612276565b6111a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119990613b13565b60405180910390fd5b81816009600086815260200190815260200160002060060191906111c7929190612be9565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123590613c73565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61128d6122e2565b73ffffffffffffffffffffffffffffffffffffffff166112ab6113d1565b73ffffffffffffffffffffffffffffffffffffffff1614611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f890613d13565b60405180910390fd5b565b600a60205280600052604060002060009150905080600001805461132690614108565b80601f016020809104026020016040519081016040528092919081815260200182805461135290614108565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b5050505050908060010160009054906101000a900461ffff16908060010160029054906101000a900461ffff16905083565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461140a90614108565b80601f016020809104026020016040519081016040528092919081815260200182805461143690614108565b80156114835780601f1061145857610100808354040283529160200191611483565b820191906000526020600020905b81548152906001019060200180831161146657829003601f168201915b5050505050905090565b6114956122e2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa90613c13565b60405180910390fd5b80600560006115106122e2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115bd6122e2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161160291906139ee565b60405180910390a35050565b61161783612276565b611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d90613b13565b60405180910390fd5b61165f8361102c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116ca575061169b6113d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090613bd3565b60405180910390fd5b6117116113d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117715750600015156009600085815260200190815260200160002060070160019054906101000a900460ff161515145b6117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a790613b33565b60405180910390fd5b6117b86123f0565b6009600085815260200190815260200160002060010181905550816009600085815260200190815260200160002060000160006101000a81548161ffff021916908360010b61ffff160217905550806009600085815260200190815260200160002060000160026101000a81548161ffff021916908360010b61ffff1602179055507f9f346c8d9c230d921a91ddef8efe587d0a78674ef188fb73cc4db159a2b4579e83838360405161186d93929190613e20565b60405180910390a1505050565b61188383612276565b6118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b990613b13565b60405180910390fd5b6118cb8361102c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061193657506119076113d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c90613bd3565b60405180910390fd5b61197d6113d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806119dd5750600015156009600085815260200190815260200160002060070160019054906101000a900460ff161515145b611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1390613b33565b60405180910390fd5b611a246123f0565b6009600085815260200190815260200160002060020181905550816009600085815260200190815260200160002060030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960008581526020019081526020016000206004018190555060006009600085815260200190815260200160002060070160006101000a81548160ff0219169083151502179055507fe540a12baaacfb50136b8ff6f53301eb84fe28b59e52c56fa7b2128a3355d0af838383604051611b1093929190613de9565b60405180910390a1505050565b611b2e611b286122e2565b8361261e565b611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490613d73565b60405180910390fd5b611b7984848484612958565b50505050565b611b876122e2565b73ffffffffffffffffffffffffffffffffffffffff16611ba56113d1565b73ffffffffffffffffffffffffffffffffffffffff1614611bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf290613d13565b60405180910390fd5b611c0481612276565b611c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a90613b13565b60405180910390fd5b60006009600083815260200190815260200160002060070160016101000a81548160ff02191690831515021790555050565b6060611c8082612276565b611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb690613b13565b60405180910390fd5b600960008381526020019081526020016000206006018054611ce090614108565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0c90614108565b8015611d595780601f10611d2e57610100808354040283529160200191611d59565b820191906000526020600020905b815481529060010190602001808311611d3c57829003601f168201915b50505050509050919050565b611d6e83612276565b611dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da490613b13565b60405180910390fd5b611db68361102c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e215750611df26113d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5790613bd3565b60405180910390fd5b611e686113d1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ec85750600015156009600085815260200190815260200160002060070160019054906101000a900460ff161515145b611f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efe90613b33565b60405180910390fd5b611f0f6123f0565b60096000858152602001908152602001600020600201819055508181600960008681526020019081526020016000206005019190611f4e929190612be9565b5060016009600085815260200190815260200160002060070160006101000a81548160ff0219169083151502179055507f9296d0a8133bb5745f8689e66892f769d092830c6bc1c8b0953178a37d902f01838383604051611fb193929190613e57565b60405180910390a1505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61205a6122e2565b73ffffffffffffffffffffffffffffffffffffffff166120786113d1565b73ffffffffffffffffffffffffffffffffffffffff16146120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c590613d13565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561213e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213590613b93565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081600001549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661235d8361102c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000609082116123b657600090506123eb565b60006123e461138861ffff166123d66090866123f890919063ffffffff16565b61240e90919063ffffffff16565b9050809150505b919050565b600042905090565b600081836124069190614003565b905092915050565b6000818361241c9190613f78565b905092915050565b600081836124329190613fa9565b905092915050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b790613cd3565b60405180910390fd5b6124c981612276565b15612509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250090613bb3565b60405180910390fd5b612515600083836129b4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125659190613f22565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061262982612276565b612668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265f90613c33565b60405180910390fd5b60006126738361102c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126e257508373ffffffffffffffffffffffffffffffffffffffff166126ca846106ca565b73ffffffffffffffffffffffffffffffffffffffff16145b806126f357506126f28185611fbe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661271c8261102c565b73ffffffffffffffffffffffffffffffffffffffff1614612772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276990613d33565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d990613bf3565b60405180910390fd5b6127ed8383836129b4565b6127f86000826122ea565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128489190614003565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461289f9190613f22565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6129638484846126fc565b61296f848484846129b9565b6129ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a590613b73565b60405180910390fd5b50505050565b505050565b60006129da8473ffffffffffffffffffffffffffffffffffffffff16612b50565b15612b43578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a036122e2565b8786866040518563ffffffff1660e01b8152600401612a2594939291906139a2565b602060405180830381600087803b158015612a3f57600080fd5b505af1925050508015612a7057506040513d601f19601f82011682018060405250810190612a6d9190612fdb565b60015b612af3573d8060008114612aa0576040519150601f19603f3d011682016040523d82523d6000602084013e612aa5565b606091505b50600081511415612aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae290613b73565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b48565b600190505b949350505050565b600080823b905060008111915050919050565b828054612b6f90614108565b90600052602060002090601f016020900481019282612b915760008555612bd8565b82601f10612baa57805160ff1916838001178555612bd8565b82800160010185558215612bd8579182015b82811115612bd7578251825591602001919060010190612bbc565b5b509050612be59190612c6f565b5090565b828054612bf590614108565b90600052602060002090601f016020900481019282612c175760008555612c5e565b82601f10612c3057803560ff1916838001178555612c5e565b82800160010185558215612c5e579182015b82811115612c5d578235825591602001919060010190612c42565b5b509050612c6b9190612c6f565b5090565b5b80821115612c88576000816000905550600101612c70565b5090565b6000612c9f612c9a84613eba565b613e89565b905082815260208101848484011115612cb757600080fd5b612cc28482856140c6565b509392505050565b600081359050612cd981614207565b92915050565b600081359050612cee8161421e565b92915050565b600081359050612d0381614235565b92915050565b600081519050612d1881614235565b92915050565b600082601f830112612d2f57600080fd5b8135612d3f848260208601612c8c565b91505092915050565b600081359050612d578161424c565b92915050565b60008083601f840112612d6f57600080fd5b8235905067ffffffffffffffff811115612d8857600080fd5b602083019150836001820283011115612da057600080fd5b9250929050565b600081359050612db681614263565b92915050565b600060208284031215612dce57600080fd5b6000612ddc84828501612cca565b91505092915050565b60008060408385031215612df857600080fd5b6000612e0685828601612cca565b9250506020612e1785828601612cca565b9150509250929050565b600080600060608486031215612e3657600080fd5b6000612e4486828701612cca565b9350506020612e5586828701612cca565b9250506040612e6686828701612da7565b9150509250925092565b60008060008060808587031215612e8657600080fd5b6000612e9487828801612cca565b9450506020612ea587828801612cca565b9350506040612eb687828801612da7565b925050606085013567ffffffffffffffff811115612ed357600080fd5b612edf87828801612d1e565b91505092959194509250565b60008060408385031215612efe57600080fd5b6000612f0c85828601612cca565b9250506020612f1d85828601612cdf565b9150509250929050565b600080600060608486031215612f3c57600080fd5b6000612f4a86828701612cca565b9350506020612f5b86828701612d48565b9250506040612f6c86828701612d48565b9150509250925092565b60008060408385031215612f8957600080fd5b6000612f9785828601612cca565b9250506020612fa885828601612da7565b9150509250929050565b600060208284031215612fc457600080fd5b6000612fd284828501612cf4565b91505092915050565b600060208284031215612fed57600080fd5b6000612ffb84828501612d09565b91505092915050565b60006020828403121561301657600080fd5b600061302484828501612da7565b91505092915050565b60008060006060848603121561304257600080fd5b600061305086828701612da7565b935050602061306186828701612cca565b925050604061307286828701612da7565b9150509250925092565b60008060006060848603121561309157600080fd5b600061309f86828701612da7565b93505060206130b086828701612d48565b92505060406130c186828701612d48565b9150509250925092565b6000806000604084860312156130e057600080fd5b60006130ee86828701612da7565b935050602084013567ffffffffffffffff81111561310b57600080fd5b61311786828701612d5d565b92509250509250925092565b61312c81614037565b82525050565b61313b81614049565b82525050565b600061314c82613eea565b6131568185613f00565b93506131668185602086016140d5565b61316f816141f6565b840191505092915050565b61318381614081565b82525050565b60006131958385613f11565b93506131a28385846140c6565b6131ab836141f6565b840190509392505050565b60006131c182613ef5565b6131cb8185613f11565b93506131db8185602086016140d5565b6131e4816141f6565b840191505092915050565b60006131fc601283613f11565b91507f546f6b656e206d757374206578697374732e00000000000000000000000000006000830152602082019050919050565b600061323c601783613f11565b91507f46524d206d757374206e6f74206265207061757365642e0000000000000000006000830152602082019050919050565b600061327c602183613f11565b91507f4974277320746f6f206561726c7920746f206d696e742061206e65772046524d60008301527f2e000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132e2603283613f11565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613348602683613f11565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133ae601c83613f11565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006133ee602083613f11565b91507f4d75737420626520746f6b656e206f7220636f6e7472616374206f776e65722e6000830152602082019050919050565b600061342e602483613f11565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613494601983613f11565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006134d4602c83613f11565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061353a603883613f11565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006135a0602a83613f11565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613606602983613f11565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061366c604283613f11565b91507f426c6f636b2074696d657374616d70206d75737420636f6d652061667465722060008301527f746865205f6c6173744d696e74426c6f636b54696d657374616d702076616c7560208301527f652e0000000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b60006136f8602083613f11565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613738602c83613f11565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061379e602083613f11565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006137de602983613f11565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613844602183613f11565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138aa603183613f11565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613910602283613f11565b91507f43616e2774206578636565642074686520746f6b656e537570706c794c696d6960008301527f742e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6139728161408e565b82525050565b613981816140bc565b82525050565b600060208201905061399c6000830184613123565b92915050565b60006080820190506139b76000830187613123565b6139c46020830186613123565b6139d16040830185613978565b81810360608301526139e38184613141565b905095945050505050565b6000602082019050613a036000830184613132565b92915050565b600061014082019050613a1f600083018d61317a565b613a2c602083018c61317a565b613a39604083018b613978565b613a46606083018a613978565b613a536080830189613123565b613a6060a0830188613978565b81810360c0830152613a7281876131b6565b905081810360e0830152613a8681866131b6565b9050613a96610100830185613132565b613aa4610120830184613132565b9b9a5050505050505050505050565b60006020820190508181036000830152613acd81846131b6565b905092915050565b60006060820190508181036000830152613aef81866131b6565b9050613afe6020830185613969565b613b0b6040830184613969565b949350505050565b60006020820190508181036000830152613b2c816131ef565b9050919050565b60006020820190508181036000830152613b4c8161322f565b9050919050565b60006020820190508181036000830152613b6c8161326f565b9050919050565b60006020820190508181036000830152613b8c816132d5565b9050919050565b60006020820190508181036000830152613bac8161333b565b9050919050565b60006020820190508181036000830152613bcc816133a1565b9050919050565b60006020820190508181036000830152613bec816133e1565b9050919050565b60006020820190508181036000830152613c0c81613421565b9050919050565b60006020820190508181036000830152613c2c81613487565b9050919050565b60006020820190508181036000830152613c4c816134c7565b9050919050565b60006020820190508181036000830152613c6c8161352d565b9050919050565b60006020820190508181036000830152613c8c81613593565b9050919050565b60006020820190508181036000830152613cac816135f9565b9050919050565b60006020820190508181036000830152613ccc8161365f565b9050919050565b60006020820190508181036000830152613cec816136eb565b9050919050565b60006020820190508181036000830152613d0c8161372b565b9050919050565b60006020820190508181036000830152613d2c81613791565b9050919050565b60006020820190508181036000830152613d4c816137d1565b9050919050565b60006020820190508181036000830152613d6c81613837565b9050919050565b60006020820190508181036000830152613d8c8161389d565b9050919050565b60006020820190508181036000830152613dac81613903565b9050919050565b6000602082019050613dc86000830184613969565b92915050565b6000602082019050613de36000830184613978565b92915050565b6000606082019050613dfe6000830186613978565b613e0b6020830185613123565b613e186040830184613978565b949350505050565b6000606082019050613e356000830186613978565b613e42602083018561317a565b613e4f604083018461317a565b949350505050565b6000604082019050613e6c6000830186613978565b8181036020830152613e7f818486613189565b9050949350505050565b6000604051905081810181811067ffffffffffffffff82111715613eb057613eaf6141c7565b5b8060405250919050565b600067ffffffffffffffff821115613ed557613ed46141c7565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613f2d826140bc565b9150613f38836140bc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f6d57613f6c61413a565b5b828201905092915050565b6000613f83826140bc565b9150613f8e836140bc565b925082613f9e57613f9d614169565b5b828204905092915050565b6000613fb4826140bc565b9150613fbf836140bc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ff857613ff761413a565b5b828202905092915050565b600061400e826140bc565b9150614019836140bc565b92508282101561402c5761402b61413a565b5b828203905092915050565b60006140428261409c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008160010b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140f35780820151818401526020810190506140d8565b83811115614102576000848401525b50505050565b6000600282049050600182168061412057607f821691505b6020821081141561413457614133614198565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61421081614037565b811461421b57600080fd5b50565b61422781614049565b811461423257600080fd5b50565b61423e81614055565b811461424957600080fd5b50565b61425581614081565b811461426057600080fd5b50565b61426c816140bc565b811461427757600080fd5b5056fea2646970667358221220bdc2fcd62ca6400a605d1e4894d502681b038bd9d599efaf3d4e44429c11e24a64736f6c63430008000033
Deployed Bytecode Sourcemap
44433:7154:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21850:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51131:138;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22782:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24249:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23779:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48712:1871;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44622:47;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44776:36;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;25139:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25515:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48100:187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22476:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48491:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22206:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51467:117;;;:::i;:::-;;44819:36;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;36090:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22951:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24542:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46151:598;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46757:699;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25737:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48295:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50615:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47464:580;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24908:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37044:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21850:292;21952:4;21991:25;21976:40;;;:11;:40;;;;:105;;;;22048:33;22033:48;;;:11;:48;;;;21976:105;:158;;;;22098:36;22122:11;22098:23;:36::i;:::-;21976:158;21969:165;;21850:292;;;:::o;51131:138::-;51210:7;51242:19;:9;:17;:19::i;:::-;51235:26;;51131:138;:::o;22782:100::-;22836:13;22869:5;22862:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22782:100;:::o;24249:221::-;24325:7;24353:16;24361:7;24353;:16::i;:::-;24345:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24438:15;:24;24454:7;24438:24;;;;;;;;;;;;;;;;;;;;;24431:31;;24249:221;;;:::o;23779:404::-;23860:13;23876:23;23891:7;23876:14;:23::i;:::-;23860:39;;23924:5;23918:11;;:2;:11;;;;23910:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24004:5;23988:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;24013:44;24037:5;24044:12;:10;:12::i;:::-;24013:23;:44::i;:::-;23988:69;23980:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;24154:21;24163:2;24167:7;24154:8;:21::i;:::-;23779:404;;;:::o;48712:1871::-;36321:12;:10;:12::i;:::-;36310:23;;:7;:5;:7::i;:::-;:23;;;36302:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48823:18:::1;48844:19;:9;:17;:19::i;:::-;48823:40;;44664:5;48882:29;;:10;:29;48874:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;48963:16;48982:24;48995:10;48982:12;:24::i;:::-;48963:43;;49017:22;49042:20;:18;:20::i;:::-;49017:45;;49073:24;49100:2;49073:29;;49149:14;49123:23;;:40;49115:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;49264:3;49250:10;:17;49247:630;;49326:28;49357:43;49376:23;;49357:14;:18;;:43;;;;:::i;:::-;49326:74;;49415:28;49446:42;49471:16;49446:20;:24;;:42;;;;:::i;:::-;49415:73;;49547:34;49584:4;:14;49589:8;49584:14;;;;;;;;;;;:41;;;;;;;;;;;;49547:78;;;;49640:21;49665:52;49690:26;49665:20;:24;;:52;;;;:::i;:::-;49640:77;;49821:6;49804:13;:23;;49796:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;49247:630;;;;;49905:21;:9;:19;:21::i;:::-;49937:18;49958:19;:9;:17;:19::i;:::-;49937:40;;50007:80;;;;;;;;50011:2;50007:80;;;;;;50015:2;50007:80;;;;;;50019:14;50007:80;;;;50035:14;50007:80;;;;50059:1;50007:80;;;;;;50063:1;50007:80;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;50074:5;50007:80;;;;;;50081:5;50007:80;;;;::::0;49988:4:::1;:16;49993:10;49988:16;;;;;;;;;;;:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50098:30;50104:11;50117:10;50098:5;:30::i;:::-;50263:3;50249:10;:17;50246:290;;50281:37;50321:4;:14;50326:8;50321:14;;;;;;;;;;;:44;;;;;;;;;;;;50281:84;;;;50437:16;50405:29;:48;;;;:::i;:::-;50378:23;;:75;;;;;;;:::i;:::-;;;;;;;;50246:290;;;;50510:14;50484:23;:40;;;;50246:290;50553:22;50564:10;50553:22;;;;;;:::i;:::-;;;;;;;;36381:1;;;;;48712:1871:::0;;;:::o;44622:47::-;44664:5;44622:47;:::o;44776:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25139:305::-;25300:41;25319:12;:10;:12::i;:::-;25333:7;25300:18;:41::i;:::-;25292:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25408:28;25418:4;25424:2;25428:7;25408:9;:28::i;:::-;25139:305;;;:::o;25515:151::-;25619:39;25636:4;25642:2;25646:7;25619:39;;;;;;;;;;;;:16;:39::i;:::-;25515:151;;;:::o;48100:187::-;36321:12;:10;:12::i;:::-;36310:23;;:7;:5;:7::i;:::-;:23;;;36302:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48198:17:::1;48206:8;48198:7;:17::i;:::-;48190:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;48275:4;48249;:14;48254:8;48249:14;;;;;;;;;;;:23;;;:30;;;;;;;;;;;;;;;;;;48100:187:::0;:::o;22476:239::-;22548:7;22568:13;22584:7;:16;22592:7;22584:16;;;;;;;;;;;;;;;;;;;;;22568:32;;22636:1;22619:19;;:5;:19;;;;22611:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22702:5;22695:12;;;22476:239;;;:::o;48491:213::-;36321:12;:10;:12::i;:::-;36310:23;;:7;:5;:7::i;:::-;:23;;;36302:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48614:17:::1;48622:8;48614:7;:17::i;:::-;48606:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;48689:7;;48665:4;:14;48670:8;48665:14;;;;;;;;;;;:21;;:31;;;;;;;:::i;:::-;;48491:213:::0;;;:::o;22206:208::-;22278:7;22323:1;22306:19;;:5;:19;;;;22298:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22390:9;:16;22400:5;22390:16;;;;;;;;;;;;;;;;22383:23;;22206:208;;;:::o;51467:117::-;36321:12;:10;:12::i;:::-;36310:23;;:7;:5;:7::i;:::-;:23;;;36302:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51467:117::o;44819:36::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36090:87::-;36136:7;36163:6;;;;;;;;;;;36156:13;;36090:87;:::o;22951:104::-;23007:13;23040:7;23033:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22951:104;:::o;24542:295::-;24657:12;:10;:12::i;:::-;24645:24;;:8;:24;;;;24637:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24757:8;24712:18;:32;24731:12;:10;:12::i;:::-;24712:32;;;;;;;;;;;;;;;:42;24745:8;24712:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24810:8;24781:48;;24796:12;:10;:12::i;:::-;24781:48;;;24820:8;24781:48;;;;;;:::i;:::-;;;;;;;;24542:295;;:::o;46151:598::-;46255:17;46263:8;46255:7;:17::i;:::-;46247:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;46328:17;46336:8;46328:7;:17::i;:::-;46314:31;;:10;:31;;;:56;;;;46363:7;:5;:7::i;:::-;46349:21;;:10;:21;;;46314:56;46306:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;46440:7;:5;:7::i;:::-;46426:21;;:10;:21;;;:57;;;;46478:5;46451:32;;:4;:14;46456:8;46451:14;;;;;;;;;;;:23;;;;;;;;;;;;:32;;;46426:57;46418:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;46577:20;:18;:20::i;:::-;46534:4;:14;46539:8;46534:14;;;;;;;;;;;:40;;:63;;;;46654:2;46635:4;:14;46640:8;46635:14;;;;;;;;;;;:16;;;:21;;;;;;;;;;;;;;;;;;;;46686:2;46667:4;:14;46672:8;46667:14;;;;;;;;;;;:16;;;:21;;;;;;;;;;;;;;;;;;;;46706:35;46724:8;46734:2;46738;46706:35;;;;;;;;:::i;:::-;;;;;;;;46151:598;;;:::o;46757:699::-;46886:17;46894:8;46886:7;:17::i;:::-;46878:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;46959:17;46967:8;46959:7;:17::i;:::-;46945:31;;:10;:31;;;:56;;;;46994:7;:5;:7::i;:::-;46980:21;;:10;:21;;;46945:56;46937:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;47071:7;:5;:7::i;:::-;47057:21;;:10;:21;;;:57;;;;47109:5;47082:32;;:4;:14;47087:8;47082:14;;;;;;;;;;;:23;;;;;;;;;;;;:32;;;47057:57;47049:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;47193:20;:18;:20::i;:::-;47155:4;:14;47160:8;47155:14;;;;;;;;;;;:35;;:58;;;;47260:19;47224:4;:14;47229:8;47224:14;;;;;;;;;;;:33;;;:55;;;;;;;;;;;;;;;;;;47318:11;47290:4;:14;47295:8;47290:14;;;;;;;;;;;:25;;:39;;;;47369:5;47342:4;:14;47347:8;47342:14;;;;;;;;;;;:24;;;:32;;;;;;;;;;;;;;;;;;47392:56;47405:8;47415:19;47436:11;47392:56;;;;;;;;:::i;:::-;;;;;;;;46757:699;;;:::o;25737:285::-;25869:41;25888:12;:10;:12::i;:::-;25902:7;25869:18;:41::i;:::-;25861:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25975:39;25989:4;25995:2;25999:7;26008:5;25975:13;:39::i;:::-;25737:285;;;;:::o;48295:188::-;36321:12;:10;:12::i;:::-;36310:23;;:7;:5;:7::i;:::-;:23;;;36302:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48393:17:::1;48401:8;48393:7;:17::i;:::-;48385:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;48470:5;48444:4;:14;48449:8;48444:14;;;;;;;;;;;:23;;;:31;;;;;;;;;;;;;;;;;;48295:188:::0;:::o;50615:228::-;50717:13;50756:17;50764:8;50756:7;:17::i;:::-;50748:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;50814:4;:14;50819:8;50814:14;;;;;;;;;;;:21;;50807:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50615:228;;;:::o;47464:580::-;47571:17;47579:8;47571:7;:17::i;:::-;47563:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;47644:17;47652:8;47644:7;:17::i;:::-;47630:31;;:10;:31;;;:56;;;;47679:7;:5;:7::i;:::-;47665:21;;:10;:21;;;47630:56;47622:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;47756:7;:5;:7::i;:::-;47742:21;;:10;:21;;;:57;;;;47794:5;47767:32;;:4;:14;47772:8;47767:14;;;;;;;;;;;:23;;;;;;;;;;;;:32;;;47742:57;47734:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;47878:20;:18;:20::i;:::-;47840:4;:14;47845:8;47840:14;;;;;;;;;;;:35;;:58;;;;47933:7;;47909:4;:14;47914:8;47909:14;;;;;;;;;;;:21;;:31;;;;;;;:::i;:::-;;47980:4;47953;:14;47958:8;47953:14;;;;;;;;;;;:24;;;:31;;;;;;;;;;;;;;;;;;48002:34;48018:8;48028:7;;48002:34;;;;;;;;:::i;:::-;;;;;;;;47464:580;;;:::o;24908:164::-;25005:4;25029:18;:25;25048:5;25029:25;;;;;;;;;;;;;;;:35;25055:8;25029:35;;;;;;;;;;;;;;;;;;;;;;;;;25022:42;;24908:164;;;;:::o;37044:244::-;36321:12;:10;:12::i;:::-;36310:23;;:7;:5;:7::i;:::-;:23;;;36302:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37153:1:::1;37133:22;;:8;:22;;;;37125:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37243:8;37214:38;;37235:6;;;;;;;;;;;37214:38;;;;;;;;;;;;37272:8;37263:6;;:17;;;;;;;;;;;;;;;;;;37044:244:::0;:::o;20342:157::-;20427:4;20466:25;20451:40;;;:11;:40;;;;20444:47;;20342:157;;;:::o;34491:114::-;34556:7;34583;:14;;;34576:21;;34491:114;;;:::o;27489:127::-;27554:4;27606:1;27578:30;;:7;:16;27586:7;27578:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27571:37;;27489:127;;;:::o;17122:98::-;17175:7;17202:10;17195:17;;17122:98;:::o;31373:174::-;31475:2;31448:15;:24;31464:7;31448:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31531:7;31527:2;31493:46;;31502:23;31517:7;31502:14;:23::i;:::-;31493:46;;;;;;;;;;;;31373:174;;:::o;50851:272::-;50942:7;50984:3;50970:10;:17;50967:56;;51010:1;51003:8;;;;50967:56;51033:16;51052:37;44713:4;51052:37;;51053:19;51068:3;51053:10;:14;;:19;;;;:::i;:::-;51052:25;;:37;;;;:::i;:::-;51033:56;;51107:8;51100:15;;;50851:272;;;;:::o;51277:182::-;51404:7;51436:15;51429:22;;51277:182;:::o;40474:98::-;40532:7;40563:1;40559;:5;;;;:::i;:::-;40552:12;;40474:98;;;;:::o;41230:::-;41288:7;41319:1;41315;:5;;;;:::i;:::-;41308:12;;41230:98;;;;:::o;40831:::-;40889:7;40920:1;40916;:5;;;;:::i;:::-;40909:12;;40831:98;;;;:::o;34613:127::-;34720:1;34702:7;:14;;;:19;;;;;;;;;;;34613:127;:::o;29403:382::-;29497:1;29483:16;;:2;:16;;;;29475:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29556:16;29564:7;29556;:16::i;:::-;29555:17;29547:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29618:45;29647:1;29651:2;29655:7;29618:20;:45::i;:::-;29693:1;29676:9;:13;29686:2;29676:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29724:2;29705:7;:16;29713:7;29705:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29769:7;29765:2;29744:33;;29761:1;29744:33;;;;;;;;;;;;29403:382;;:::o;27783:355::-;27876:4;27901:16;27909:7;27901;:16::i;:::-;27893:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27977:13;27993:23;28008:7;27993:14;:23::i;:::-;27977:39;;28046:5;28035:16;;:7;:16;;;:51;;;;28079:7;28055:31;;:20;28067:7;28055:11;:20::i;:::-;:31;;;28035:51;:94;;;;28090:39;28114:5;28121:7;28090:23;:39::i;:::-;28035:94;28027:103;;;27783:355;;;;:::o;30711:544::-;30836:4;30809:31;;:23;30824:7;30809:14;:23::i;:::-;:31;;;30801:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30919:1;30905:16;;:2;:16;;;;30897:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30975:39;30996:4;31002:2;31006:7;30975:20;:39::i;:::-;31079:29;31096:1;31100:7;31079:8;:29::i;:::-;31140:1;31121:9;:15;31131:4;31121:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31169:1;31152:9;:13;31162:2;31152:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31200:2;31181:7;:16;31189:7;31181:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31239:7;31235:2;31220:27;;31229:4;31220:27;;;;;;;;;;;;30711:544;;;:::o;26904:272::-;27018:28;27028:4;27034:2;27038:7;27018:9;:28::i;:::-;27065:48;27088:4;27094:2;27098:7;27107:5;27065:22;:48::i;:::-;27057:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26904:272;;;;:::o;33568:93::-;;;;:::o;32112:843::-;32233:4;32259:15;:2;:13;;;:15::i;:::-;32255:693;;;32311:2;32295:36;;;32332:12;:10;:12::i;:::-;32346:4;32352:7;32361:5;32295:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32291:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32558:1;32541:6;:13;:18;32537:341;;;32584:60;;;;;;;;;;:::i;:::-;;;;;;;;32537:341;32828:6;32822:13;32813:6;32809:2;32805:15;32798:38;32291:602;32428:45;;;32418:55;;;:6;:55;;;;32411:62;;;;;32255:693;32932:4;32925:11;;32112:843;;;;;;;:::o;9233:422::-;9293:4;9501:12;9612:7;9600:20;9592:28;;9646:1;9639:4;:8;9632:15;;;9233:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;500:133::-;;581:6;568:20;559:29;;597:30;621:5;597:30;:::i;:::-;549:84;;;;:::o;639:137::-;;722:6;709:20;700:29;;738:32;764:5;738:32;:::i;:::-;690:86;;;;:::o;782:141::-;;869:6;863:13;854:22;;885:32;911:5;885:32;:::i;:::-;844:79;;;;:::o;942:271::-;;1046:3;1039:4;1031:6;1027:17;1023:27;1013:2;;1064:1;1061;1054:12;1013:2;1104:6;1091:20;1129:78;1203:3;1195:6;1188:4;1180:6;1176:17;1129:78;:::i;:::-;1120:87;;1003:210;;;;;:::o;1219:135::-;;1301:6;1288:20;1279:29;;1317:31;1342:5;1317:31;:::i;:::-;1269:85;;;;:::o;1374:352::-;;;1492:3;1485:4;1477:6;1473:17;1469:27;1459:2;;1510:1;1507;1500:12;1459:2;1546:6;1533:20;1523:30;;1576:18;1568:6;1565:30;1562:2;;;1608:1;1605;1598:12;1562:2;1645:4;1637:6;1633:17;1621:29;;1699:3;1691:4;1683:6;1679:17;1669:8;1665:32;1662:41;1659:2;;;1716:1;1713;1706:12;1659:2;1449:277;;;;;:::o;1732:139::-;;1816:6;1803:20;1794:29;;1832:33;1859:5;1832:33;:::i;:::-;1784:87;;;;:::o;1877:262::-;;1985:2;1973:9;1964:7;1960:23;1956:32;1953:2;;;2001:1;1998;1991:12;1953:2;2044:1;2069:53;2114:7;2105:6;2094:9;2090:22;2069:53;:::i;:::-;2059:63;;2015:117;1943:196;;;;:::o;2145:407::-;;;2270:2;2258:9;2249:7;2245:23;2241:32;2238:2;;;2286:1;2283;2276:12;2238:2;2329:1;2354:53;2399:7;2390:6;2379:9;2375:22;2354:53;:::i;:::-;2344:63;;2300:117;2456:2;2482:53;2527:7;2518:6;2507:9;2503:22;2482:53;:::i;:::-;2472:63;;2427:118;2228:324;;;;;:::o;2558:552::-;;;;2700:2;2688:9;2679:7;2675:23;2671:32;2668:2;;;2716:1;2713;2706:12;2668:2;2759:1;2784:53;2829:7;2820:6;2809:9;2805:22;2784:53;:::i;:::-;2774:63;;2730:117;2886:2;2912:53;2957:7;2948:6;2937:9;2933:22;2912:53;:::i;:::-;2902:63;;2857:118;3014:2;3040:53;3085:7;3076:6;3065:9;3061:22;3040:53;:::i;:::-;3030:63;;2985:118;2658:452;;;;;:::o;3116:809::-;;;;;3284:3;3272:9;3263:7;3259:23;3255:33;3252:2;;;3301:1;3298;3291:12;3252:2;3344:1;3369:53;3414:7;3405:6;3394:9;3390:22;3369:53;:::i;:::-;3359:63;;3315:117;3471:2;3497:53;3542:7;3533:6;3522:9;3518:22;3497:53;:::i;:::-;3487:63;;3442:118;3599:2;3625:53;3670:7;3661:6;3650:9;3646:22;3625:53;:::i;:::-;3615:63;;3570:118;3755:2;3744:9;3740:18;3727:32;3786:18;3778:6;3775:30;3772:2;;;3818:1;3815;3808:12;3772:2;3846:62;3900:7;3891:6;3880:9;3876:22;3846:62;:::i;:::-;3836:72;;3698:220;3242:683;;;;;;;:::o;3931:401::-;;;4053:2;4041:9;4032:7;4028:23;4024:32;4021:2;;;4069:1;4066;4059:12;4021:2;4112:1;4137:53;4182:7;4173:6;4162:9;4158:22;4137:53;:::i;:::-;4127:63;;4083:117;4239:2;4265:50;4307:7;4298:6;4287:9;4283:22;4265:50;:::i;:::-;4255:60;;4210:115;4011:321;;;;;:::o;4338:544::-;;;;4476:2;4464:9;4455:7;4451:23;4447:32;4444:2;;;4492:1;4489;4482:12;4444:2;4535:1;4560:53;4605:7;4596:6;4585:9;4581:22;4560:53;:::i;:::-;4550:63;;4506:117;4662:2;4688:51;4731:7;4722:6;4711:9;4707:22;4688:51;:::i;:::-;4678:61;;4633:116;4788:2;4814:51;4857:7;4848:6;4837:9;4833:22;4814:51;:::i;:::-;4804:61;;4759:116;4434:448;;;;;:::o;4888:407::-;;;5013:2;5001:9;4992:7;4988:23;4984:32;4981:2;;;5029:1;5026;5019:12;4981:2;5072:1;5097:53;5142:7;5133:6;5122:9;5118:22;5097:53;:::i;:::-;5087:63;;5043:117;5199:2;5225:53;5270:7;5261:6;5250:9;5246:22;5225:53;:::i;:::-;5215:63;;5170:118;4971:324;;;;;:::o;5301:260::-;;5408:2;5396:9;5387:7;5383:23;5379:32;5376:2;;;5424:1;5421;5414:12;5376:2;5467:1;5492:52;5536:7;5527:6;5516:9;5512:22;5492:52;:::i;:::-;5482:62;;5438:116;5366:195;;;;:::o;5567:282::-;;5685:2;5673:9;5664:7;5660:23;5656:32;5653:2;;;5701:1;5698;5691:12;5653:2;5744:1;5769:63;5824:7;5815:6;5804:9;5800:22;5769:63;:::i;:::-;5759:73;;5715:127;5643:206;;;;:::o;5855:262::-;;5963:2;5951:9;5942:7;5938:23;5934:32;5931:2;;;5979:1;5976;5969:12;5931:2;6022:1;6047:53;6092:7;6083:6;6072:9;6068:22;6047:53;:::i;:::-;6037:63;;5993:117;5921:196;;;;:::o;6123:552::-;;;;6265:2;6253:9;6244:7;6240:23;6236:32;6233:2;;;6281:1;6278;6271:12;6233:2;6324:1;6349:53;6394:7;6385:6;6374:9;6370:22;6349:53;:::i;:::-;6339:63;;6295:117;6451:2;6477:53;6522:7;6513:6;6502:9;6498:22;6477:53;:::i;:::-;6467:63;;6422:118;6579:2;6605:53;6650:7;6641:6;6630:9;6626:22;6605:53;:::i;:::-;6595:63;;6550:118;6223:452;;;;;:::o;6681:544::-;;;;6819:2;6807:9;6798:7;6794:23;6790:32;6787:2;;;6835:1;6832;6825:12;6787:2;6878:1;6903:53;6948:7;6939:6;6928:9;6924:22;6903:53;:::i;:::-;6893:63;;6849:117;7005:2;7031:51;7074:7;7065:6;7054:9;7050:22;7031:51;:::i;:::-;7021:61;;6976:116;7131:2;7157:51;7200:7;7191:6;7180:9;7176:22;7157:51;:::i;:::-;7147:61;;7102:116;6777:448;;;;;:::o;7231:540::-;;;;7376:2;7364:9;7355:7;7351:23;7347:32;7344:2;;;7392:1;7389;7382:12;7344:2;7435:1;7460:53;7505:7;7496:6;7485:9;7481:22;7460:53;:::i;:::-;7450:63;;7406:117;7590:2;7579:9;7575:18;7562:32;7621:18;7613:6;7610:30;7607:2;;;7653:1;7650;7643:12;7607:2;7689:65;7746:7;7737:6;7726:9;7722:22;7689:65;:::i;:::-;7671:83;;;;7533:231;7334:437;;;;;:::o;7777:118::-;7864:24;7882:5;7864:24;:::i;:::-;7859:3;7852:37;7842:53;;:::o;7901:109::-;7982:21;7997:5;7982:21;:::i;:::-;7977:3;7970:34;7960:50;;:::o;8016:360::-;;8130:38;8162:5;8130:38;:::i;:::-;8184:70;8247:6;8242:3;8184:70;:::i;:::-;8177:77;;8263:52;8308:6;8303:3;8296:4;8289:5;8285:16;8263:52;:::i;:::-;8340:29;8362:6;8340:29;:::i;:::-;8335:3;8331:39;8324:46;;8106:270;;;;;:::o;8382:112::-;8465:22;8481:5;8465:22;:::i;:::-;8460:3;8453:35;8443:51;;:::o;8524:304::-;;8643:71;8707:6;8702:3;8643:71;:::i;:::-;8636:78;;8724:43;8760:6;8755:3;8748:5;8724:43;:::i;:::-;8792:29;8814:6;8792:29;:::i;:::-;8787:3;8783:39;8776:46;;8626:202;;;;;:::o;8834:364::-;;8950:39;8983:5;8950:39;:::i;:::-;9005:71;9069:6;9064:3;9005:71;:::i;:::-;8998:78;;9085:52;9130:6;9125:3;9118:4;9111:5;9107:16;9085:52;:::i;:::-;9162:29;9184:6;9162:29;:::i;:::-;9157:3;9153:39;9146:46;;8926:272;;;;;:::o;9204:316::-;;9367:67;9431:2;9426:3;9367:67;:::i;:::-;9360:74;;9464:20;9460:1;9455:3;9451:11;9444:41;9511:2;9506:3;9502:12;9495:19;;9350:170;;;:::o;9526:321::-;;9689:67;9753:2;9748:3;9689:67;:::i;:::-;9682:74;;9786:25;9782:1;9777:3;9773:11;9766:46;9838:2;9833:3;9829:12;9822:19;;9672:175;;;:::o;9853:365::-;;10016:67;10080:2;10075:3;10016:67;:::i;:::-;10009:74;;10113:34;10109:1;10104:3;10100:11;10093:55;10179:3;10174:2;10169:3;10165:12;10158:25;10209:2;10204:3;10200:12;10193:19;;9999:219;;;:::o;10224:382::-;;10387:67;10451:2;10446:3;10387:67;:::i;:::-;10380:74;;10484:34;10480:1;10475:3;10471:11;10464:55;10550:20;10545:2;10540:3;10536:12;10529:42;10597:2;10592:3;10588:12;10581:19;;10370:236;;;:::o;10612:370::-;;10775:67;10839:2;10834:3;10775:67;:::i;:::-;10768:74;;10872:34;10868:1;10863:3;10859:11;10852:55;10938:8;10933:2;10928:3;10924:12;10917:30;10973:2;10968:3;10964:12;10957:19;;10758:224;;;:::o;10988:326::-;;11151:67;11215:2;11210:3;11151:67;:::i;:::-;11144:74;;11248:30;11244:1;11239:3;11235:11;11228:51;11305:2;11300:3;11296:12;11289:19;;11134:180;;;:::o;11320:330::-;;11483:67;11547:2;11542:3;11483:67;:::i;:::-;11476:74;;11580:34;11576:1;11571:3;11567:11;11560:55;11641:2;11636:3;11632:12;11625:19;;11466:184;;;:::o;11656:368::-;;11819:67;11883:2;11878:3;11819:67;:::i;:::-;11812:74;;11916:34;11912:1;11907:3;11903:11;11896:55;11982:6;11977:2;11972:3;11968:12;11961:28;12015:2;12010:3;12006:12;11999:19;;11802:222;;;:::o;12030:323::-;;12193:67;12257:2;12252:3;12193:67;:::i;:::-;12186:74;;12290:27;12286:1;12281:3;12277:11;12270:48;12344:2;12339:3;12335:12;12328:19;;12176:177;;;:::o;12359:376::-;;12522:67;12586:2;12581:3;12522:67;:::i;:::-;12515:74;;12619:34;12615:1;12610:3;12606:11;12599:55;12685:14;12680:2;12675:3;12671:12;12664:36;12726:2;12721:3;12717:12;12710:19;;12505:230;;;:::o;12741:388::-;;12904:67;12968:2;12963:3;12904:67;:::i;:::-;12897:74;;13001:34;12997:1;12992:3;12988:11;12981:55;13067:26;13062:2;13057:3;13053:12;13046:48;13120:2;13115:3;13111:12;13104:19;;12887:242;;;:::o;13135:374::-;;13298:67;13362:2;13357:3;13298:67;:::i;:::-;13291:74;;13395:34;13391:1;13386:3;13382:11;13375:55;13461:12;13456:2;13451:3;13447:12;13440:34;13500:2;13495:3;13491:12;13484:19;;13281:228;;;:::o;13515:373::-;;13678:67;13742:2;13737:3;13678:67;:::i;:::-;13671:74;;13775:34;13771:1;13766:3;13762:11;13755:55;13841:11;13836:2;13831:3;13827:12;13820:33;13879:2;13874:3;13870:12;13863:19;;13661:227;;;:::o;13894:432::-;;14057:67;14121:2;14116:3;14057:67;:::i;:::-;14050:74;;14154:34;14150:1;14145:3;14141:11;14134:55;14220:34;14215:2;14210:3;14206:12;14199:56;14286:4;14281:2;14276:3;14272:12;14265:26;14317:2;14312:3;14308:12;14301:19;;14040:286;;;:::o;14332:330::-;;14495:67;14559:2;14554:3;14495:67;:::i;:::-;14488:74;;14592:34;14588:1;14583:3;14579:11;14572:55;14653:2;14648:3;14644:12;14637:19;;14478:184;;;:::o;14668:376::-;;14831:67;14895:2;14890:3;14831:67;:::i;:::-;14824:74;;14928:34;14924:1;14919:3;14915:11;14908:55;14994:14;14989:2;14984:3;14980:12;14973:36;15035:2;15030:3;15026:12;15019:19;;14814:230;;;:::o;15050:330::-;;15213:67;15277:2;15272:3;15213:67;:::i;:::-;15206:74;;15310:34;15306:1;15301:3;15297:11;15290:55;15371:2;15366:3;15362:12;15355:19;;15196:184;;;:::o;15386:373::-;;15549:67;15613:2;15608:3;15549:67;:::i;:::-;15542:74;;15646:34;15642:1;15637:3;15633:11;15626:55;15712:11;15707:2;15702:3;15698:12;15691:33;15750:2;15745:3;15741:12;15734:19;;15532:227;;;:::o;15765:365::-;;15928:67;15992:2;15987:3;15928:67;:::i;:::-;15921:74;;16025:34;16021:1;16016:3;16012:11;16005:55;16091:3;16086:2;16081:3;16077:12;16070:25;16121:2;16116:3;16112:12;16105:19;;15911:219;;;:::o;16136:381::-;;16299:67;16363:2;16358:3;16299:67;:::i;:::-;16292:74;;16396:34;16392:1;16387:3;16383:11;16376:55;16462:19;16457:2;16452:3;16448:12;16441:41;16508:2;16503:3;16499:12;16492:19;;16282:235;;;:::o;16523:366::-;;16686:67;16750:2;16745:3;16686:67;:::i;:::-;16679:74;;16783:34;16779:1;16774:3;16770:11;16763:55;16849:4;16844:2;16839:3;16835:12;16828:26;16880:2;16875:3;16871:12;16864:19;;16669:220;;;:::o;16895:115::-;16980:23;16997:5;16980:23;:::i;:::-;16975:3;16968:36;16958:52;;:::o;17016:118::-;17103:24;17121:5;17103:24;:::i;:::-;17098:3;17091:37;17081:53;;:::o;17140:222::-;;17271:2;17260:9;17256:18;17248:26;;17284:71;17352:1;17341:9;17337:17;17328:6;17284:71;:::i;:::-;17238:124;;;;:::o;17368:640::-;;17601:3;17590:9;17586:19;17578:27;;17615:71;17683:1;17672:9;17668:17;17659:6;17615:71;:::i;:::-;17696:72;17764:2;17753:9;17749:18;17740:6;17696:72;:::i;:::-;17778;17846:2;17835:9;17831:18;17822:6;17778:72;:::i;:::-;17897:9;17891:4;17887:20;17882:2;17871:9;17867:18;17860:48;17925:76;17996:4;17987:6;17925:76;:::i;:::-;17917:84;;17568:440;;;;;;;:::o;18014:210::-;;18139:2;18128:9;18124:18;18116:26;;18152:65;18214:1;18203:9;18199:17;18190:6;18152:65;:::i;:::-;18106:118;;;;:::o;18230:1361::-;;18633:3;18622:9;18618:19;18610:27;;18647:67;18711:1;18700:9;18696:17;18687:6;18647:67;:::i;:::-;18724:68;18788:2;18777:9;18773:18;18764:6;18724:68;:::i;:::-;18802:72;18870:2;18859:9;18855:18;18846:6;18802:72;:::i;:::-;18884;18952:2;18941:9;18937:18;18928:6;18884:72;:::i;:::-;18966:73;19034:3;19023:9;19019:19;19010:6;18966:73;:::i;:::-;19049;19117:3;19106:9;19102:19;19093:6;19049:73;:::i;:::-;19170:9;19164:4;19160:20;19154:3;19143:9;19139:19;19132:49;19198:78;19271:4;19262:6;19198:78;:::i;:::-;19190:86;;19324:9;19318:4;19314:20;19308:3;19297:9;19293:19;19286:49;19352:78;19425:4;19416:6;19352:78;:::i;:::-;19344:86;;19440:67;19502:3;19491:9;19487:19;19478:6;19440:67;:::i;:::-;19517;19579:3;19568:9;19564:19;19555:6;19517:67;:::i;:::-;18600:991;;;;;;;;;;;;;:::o;19597:313::-;;19748:2;19737:9;19733:18;19725:26;;19797:9;19791:4;19787:20;19783:1;19772:9;19768:17;19761:47;19825:78;19898:4;19889:6;19825:78;:::i;:::-;19817:86;;19715:195;;;;:::o;19916:525::-;;20119:2;20108:9;20104:18;20096:26;;20168:9;20162:4;20158:20;20154:1;20143:9;20139:17;20132:47;20196:78;20269:4;20260:6;20196:78;:::i;:::-;20188:86;;20284:70;20350:2;20339:9;20335:18;20326:6;20284:70;:::i;:::-;20364;20430:2;20419:9;20415:18;20406:6;20364:70;:::i;:::-;20086:355;;;;;;:::o;20447:419::-;;20651:2;20640:9;20636:18;20628:26;;20700:9;20694:4;20690:20;20686:1;20675:9;20671:17;20664:47;20728:131;20854:4;20728:131;:::i;:::-;20720:139;;20618:248;;;:::o;20872:419::-;;21076:2;21065:9;21061:18;21053:26;;21125:9;21119:4;21115:20;21111:1;21100:9;21096:17;21089:47;21153:131;21279:4;21153:131;:::i;:::-;21145:139;;21043:248;;;:::o;21297:419::-;;21501:2;21490:9;21486:18;21478:26;;21550:9;21544:4;21540:20;21536:1;21525:9;21521:17;21514:47;21578:131;21704:4;21578:131;:::i;:::-;21570:139;;21468:248;;;:::o;21722:419::-;;21926:2;21915:9;21911:18;21903:26;;21975:9;21969:4;21965:20;21961:1;21950:9;21946:17;21939:47;22003:131;22129:4;22003:131;:::i;:::-;21995:139;;21893:248;;;:::o;22147:419::-;;22351:2;22340:9;22336:18;22328:26;;22400:9;22394:4;22390:20;22386:1;22375:9;22371:17;22364:47;22428:131;22554:4;22428:131;:::i;:::-;22420:139;;22318:248;;;:::o;22572:419::-;;22776:2;22765:9;22761:18;22753:26;;22825:9;22819:4;22815:20;22811:1;22800:9;22796:17;22789:47;22853:131;22979:4;22853:131;:::i;:::-;22845:139;;22743:248;;;:::o;22997:419::-;;23201:2;23190:9;23186:18;23178:26;;23250:9;23244:4;23240:20;23236:1;23225:9;23221:17;23214:47;23278:131;23404:4;23278:131;:::i;:::-;23270:139;;23168:248;;;:::o;23422:419::-;;23626:2;23615:9;23611:18;23603:26;;23675:9;23669:4;23665:20;23661:1;23650:9;23646:17;23639:47;23703:131;23829:4;23703:131;:::i;:::-;23695:139;;23593:248;;;:::o;23847:419::-;;24051:2;24040:9;24036:18;24028:26;;24100:9;24094:4;24090:20;24086:1;24075:9;24071:17;24064:47;24128:131;24254:4;24128:131;:::i;:::-;24120:139;;24018:248;;;:::o;24272:419::-;;24476:2;24465:9;24461:18;24453:26;;24525:9;24519:4;24515:20;24511:1;24500:9;24496:17;24489:47;24553:131;24679:4;24553:131;:::i;:::-;24545:139;;24443:248;;;:::o;24697:419::-;;24901:2;24890:9;24886:18;24878:26;;24950:9;24944:4;24940:20;24936:1;24925:9;24921:17;24914:47;24978:131;25104:4;24978:131;:::i;:::-;24970:139;;24868:248;;;:::o;25122:419::-;;25326:2;25315:9;25311:18;25303:26;;25375:9;25369:4;25365:20;25361:1;25350:9;25346:17;25339:47;25403:131;25529:4;25403:131;:::i;:::-;25395:139;;25293:248;;;:::o;25547:419::-;;25751:2;25740:9;25736:18;25728:26;;25800:9;25794:4;25790:20;25786:1;25775:9;25771:17;25764:47;25828:131;25954:4;25828:131;:::i;:::-;25820:139;;25718:248;;;:::o;25972:419::-;;26176:2;26165:9;26161:18;26153:26;;26225:9;26219:4;26215:20;26211:1;26200:9;26196:17;26189:47;26253:131;26379:4;26253:131;:::i;:::-;26245:139;;26143:248;;;:::o;26397:419::-;;26601:2;26590:9;26586:18;26578:26;;26650:9;26644:4;26640:20;26636:1;26625:9;26621:17;26614:47;26678:131;26804:4;26678:131;:::i;:::-;26670:139;;26568:248;;;:::o;26822:419::-;;27026:2;27015:9;27011:18;27003:26;;27075:9;27069:4;27065:20;27061:1;27050:9;27046:17;27039:47;27103:131;27229:4;27103:131;:::i;:::-;27095:139;;26993:248;;;:::o;27247:419::-;;27451:2;27440:9;27436:18;27428:26;;27500:9;27494:4;27490:20;27486:1;27475:9;27471:17;27464:47;27528:131;27654:4;27528:131;:::i;:::-;27520:139;;27418:248;;;:::o;27672:419::-;;27876:2;27865:9;27861:18;27853:26;;27925:9;27919:4;27915:20;27911:1;27900:9;27896:17;27889:47;27953:131;28079:4;27953:131;:::i;:::-;27945:139;;27843:248;;;:::o;28097:419::-;;28301:2;28290:9;28286:18;28278:26;;28350:9;28344:4;28340:20;28336:1;28325:9;28321:17;28314:47;28378:131;28504:4;28378:131;:::i;:::-;28370:139;;28268:248;;;:::o;28522:419::-;;28726:2;28715:9;28711:18;28703:26;;28775:9;28769:4;28765:20;28761:1;28750:9;28746:17;28739:47;28803:131;28929:4;28803:131;:::i;:::-;28795:139;;28693:248;;;:::o;28947:419::-;;29151:2;29140:9;29136:18;29128:26;;29200:9;29194:4;29190:20;29186:1;29175:9;29171:17;29164:47;29228:131;29354:4;29228:131;:::i;:::-;29220:139;;29118:248;;;:::o;29372:218::-;;29501:2;29490:9;29486:18;29478:26;;29514:69;29580:1;29569:9;29565:17;29556:6;29514:69;:::i;:::-;29468:122;;;;:::o;29596:222::-;;29727:2;29716:9;29712:18;29704:26;;29740:71;29808:1;29797:9;29793:17;29784:6;29740:71;:::i;:::-;29694:124;;;;:::o;29824:442::-;;30011:2;30000:9;29996:18;29988:26;;30024:71;30092:1;30081:9;30077:17;30068:6;30024:71;:::i;:::-;30105:72;30173:2;30162:9;30158:18;30149:6;30105:72;:::i;:::-;30187;30255:2;30244:9;30240:18;30231:6;30187:72;:::i;:::-;29978:288;;;;;;:::o;30272:426::-;;30451:2;30440:9;30436:18;30428:26;;30464:71;30532:1;30521:9;30517:17;30508:6;30464:71;:::i;:::-;30545:68;30609:2;30598:9;30594:18;30585:6;30545:68;:::i;:::-;30623;30687:2;30676:9;30672:18;30663:6;30623:68;:::i;:::-;30418:280;;;;;;:::o;30704:443::-;;30893:2;30882:9;30878:18;30870:26;;30906:71;30974:1;30963:9;30959:17;30950:6;30906:71;:::i;:::-;31024:9;31018:4;31014:20;31009:2;30998:9;30994:18;30987:48;31052:88;31135:4;31126:6;31118;31052:88;:::i;:::-;31044:96;;30860:287;;;;;;:::o;31153:283::-;;31219:2;31213:9;31203:19;;31261:4;31253:6;31249:17;31368:6;31356:10;31353:22;31332:18;31320:10;31317:34;31314:62;31311:2;;;31379:18;;:::i;:::-;31311:2;31419:10;31415:2;31408:22;31193:243;;;;:::o;31442:331::-;;31593:18;31585:6;31582:30;31579:2;;;31615:18;;:::i;:::-;31579:2;31700:4;31696:9;31689:4;31681:6;31677:17;31673:33;31665:41;;31761:4;31755;31751:15;31743:23;;31508:265;;;:::o;31779:98::-;;31864:5;31858:12;31848:22;;31837:40;;;:::o;31883:99::-;;31969:5;31963:12;31953:22;;31942:40;;;:::o;31988:168::-;;32105:6;32100:3;32093:19;32145:4;32140:3;32136:14;32121:29;;32083:73;;;;:::o;32162:169::-;;32280:6;32275:3;32268:19;32320:4;32315:3;32311:14;32296:29;;32258:73;;;;:::o;32337:305::-;;32396:20;32414:1;32396:20;:::i;:::-;32391:25;;32430:20;32448:1;32430:20;:::i;:::-;32425:25;;32584:1;32516:66;32512:74;32509:1;32506:81;32503:2;;;32590:18;;:::i;:::-;32503:2;32634:1;32631;32627:9;32620:16;;32381:261;;;;:::o;32648:185::-;;32705:20;32723:1;32705:20;:::i;:::-;32700:25;;32739:20;32757:1;32739:20;:::i;:::-;32734:25;;32778:1;32768:2;;32783:18;;:::i;:::-;32768:2;32825:1;32822;32818:9;32813:14;;32690:143;;;;:::o;32839:348::-;;32902:20;32920:1;32902:20;:::i;:::-;32897:25;;32936:20;32954:1;32936:20;:::i;:::-;32931:25;;33124:1;33056:66;33052:74;33049:1;33046:81;33041:1;33034:9;33027:17;33023:105;33020:2;;;33131:18;;:::i;:::-;33020:2;33179:1;33176;33172:9;33161:20;;32887:300;;;;:::o;33193:191::-;;33253:20;33271:1;33253:20;:::i;:::-;33248:25;;33287:20;33305:1;33287:20;:::i;:::-;33282:25;;33326:1;33323;33320:8;33317:2;;;33331:18;;:::i;:::-;33317:2;33376:1;33373;33369:9;33361:17;;33238:146;;;;:::o;33390:96::-;;33456:24;33474:5;33456:24;:::i;:::-;33445:35;;33435:51;;;:::o;33492:90::-;;33569:5;33562:13;33555:21;33544:32;;33534:48;;;:::o;33588:149::-;;33664:66;33657:5;33653:78;33642:89;;33632:105;;;:::o;33743:90::-;;33821:5;33818:1;33807:20;33796:31;;33786:47;;;:::o;33839:89::-;;33915:6;33908:5;33904:18;33893:29;;33883:45;;;:::o;33934:126::-;;34011:42;34004:5;34000:54;33989:65;;33979:81;;;:::o;34066:77::-;;34132:5;34121:16;;34111:32;;;:::o;34149:154::-;34233:6;34228:3;34223;34210:30;34295:1;34286:6;34281:3;34277:16;34270:27;34200:103;;;:::o;34309:307::-;34377:1;34387:113;34401:6;34398:1;34395:13;34387:113;;;34486:1;34481:3;34477:11;34471:18;34467:1;34462:3;34458:11;34451:39;34423:2;34420:1;34416:10;34411:15;;34387:113;;;34518:6;34515:1;34512:13;34509:2;;;34598:1;34589:6;34584:3;34580:16;34573:27;34509:2;34358:258;;;;:::o;34622:320::-;;34703:1;34697:4;34693:12;34683:22;;34750:1;34744:4;34740:12;34771:18;34761:2;;34827:4;34819:6;34815:17;34805:27;;34761:2;34889;34881:6;34878:14;34858:18;34855:38;34852:2;;;34908:18;;:::i;:::-;34852:2;34673:269;;;;:::o;34948:180::-;34996:77;34993:1;34986:88;35093:4;35090:1;35083:15;35117:4;35114:1;35107:15;35134:180;35182:77;35179:1;35172:88;35279:4;35276:1;35269:15;35303:4;35300:1;35293:15;35320:180;35368:77;35365:1;35358:88;35465:4;35462:1;35455:15;35489:4;35486:1;35479:15;35506:180;35554:77;35551:1;35544:88;35651:4;35648:1;35641:15;35675:4;35672:1;35665:15;35692:102;;35784:2;35780:7;35775:2;35768:5;35764:14;35760:28;35750:38;;35740:54;;;:::o;35800:122::-;35873:24;35891:5;35873:24;:::i;:::-;35866:5;35863:35;35853:2;;35912:1;35909;35902:12;35853:2;35843:79;:::o;35928:116::-;35998:21;36013:5;35998:21;:::i;:::-;35991:5;35988:32;35978:2;;36034:1;36031;36024:12;35978:2;35968:76;:::o;36050:120::-;36122:23;36139:5;36122:23;:::i;:::-;36115:5;36112:34;36102:2;;36160:1;36157;36150:12;36102:2;36092:78;:::o;36176:118::-;36247:22;36263:5;36247:22;:::i;:::-;36240:5;36237:33;36227:2;;36284:1;36281;36274:12;36227:2;36217:77;:::o;36300:122::-;36373:24;36391:5;36373:24;:::i;:::-;36366:5;36363:35;36353:2;;36412:1;36409;36402:12;36353:2;36343:79;:::o
Swarm Source
ipfs://bdc2fcd62ca6400a605d1e4894d502681b038bd9d599efaf3d4e44429c11e24a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.