Contract Overview
Balance:
3.1 AVAX
AVAX Value:
$49.38 (@ $15.93/AVAX)
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x872ab4cc69ee6c70b02a59f61432861b57af1aac39e4e4b482ff85fc9ba99b95 | 16586386 | 2 days 21 hrs ago | 0x745bd15c80abab0ed7473346533571b41258b364 | 0xb9fc257a258c5ef6c42a4af5a92353a5570c7d67 | 29.4 AVAX |
[ Download CSV Export ]
Contract Name:
Miner
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-06-23 */ //SPDX-License-Identifier: Unlicense // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: contracts/Diamond.sol pragma solidity ^0.8.4; contract Diamond is ERC20("Diamond", "DIAMOND"), Ownable{ // Setting contract addresses address minerAddress; address mineAddress; address vaultAddress; address eventAddress; constructor(address _vaultAddress){ vaultAddress = _vaultAddress; } // Admin // Setters function setEventAddress(address _eventAddress) external onlyOwner { eventAddress = _eventAddress; } function setMineAddress(address _mineAddress) external onlyOwner { mineAddress = _mineAddress; } function setMinerAddress(address _minerAddress) external onlyOwner { minerAddress = _minerAddress; } function setVaultAddress(address _vaultAddress) external onlyOwner { vaultAddress = _vaultAddress; } function mint(address _to, uint256 _amount) external { require(_msgSender() == mineAddress || _msgSender() == eventAddress, "Only the Mine or event contract can mint"); _mint(_to, _amount); } function burn(address _from, uint256 _amount) external { require(_msgSender() == minerAddress || _msgSender() == eventAddress, "Only the Miner or event contract can burn"); _burn(_from, _amount); } function transferToVault(address _from, uint256 _amount) external { require(_msgSender() == vaultAddress, "Only the Vault contract can call transferToVault"); _transfer(_from, vaultAddress, _amount); } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/Miner.sol pragma solidity ^0.8.4; contract Miner is ERC721Enumerable, Ownable, Pausable { using Strings for uint256; struct Level { uint256 supply; uint256 maxSupply; uint256 price; uint256 yield; } struct MinerInfo { uint256 tokenId; uint256 level; bool revealed; } Diamond public diamond; address public eventAddress; address public mineAddress; address[] public whiteListAddresses; uint256 public constant lockLV = 2; uint256 public constant MAX_PER_MINT = 30; uint256 public MAX_BASE_SUPPLY = 9500; uint256 public MAX_PRESALE_SUPPLY = 500; uint256 public BASE_MINT_PRICE = 2 ether; uint256 public PRESALE_MINT_PRICE = 1.5 ether; uint256 public NFT_TAX = 0.1 ether; uint256 public BASE_SUPER_PERCENTAGE = 5; uint256 public constant UPGRADE_SALES_OFFSET = 2 days; uint256 public baseSupply; uint256 public presaleSupply; uint256 public upgradeSupply; uint256 public presaleStartTime; uint256 public salesStartTime; bool public skipWL = false; mapping(uint256 => uint256) private tokenLevel; Level[] public levels; string BASE_URI = ""; bool revealed = false; constructor( string memory _initBaseURI, string memory _name, string memory _symbol ) ERC721(_name, _symbol) { // supply and price are ignored for the base levels of miners and super miners setBaseURI(_initBaseURI); levels.push(Level({ supply: 0, maxSupply: 0, price: 0, yield: 1 })); levels.push(Level({ supply: 0, maxSupply: 0, price: 0, yield: 5 })); //_mintBaseTokens(5, msg.sender); } /* Minting of base miners */ function mintBase(uint16 _numTokens) external payable { if (msg.sender != owner()){ require(msg.value >= _numTokens * BASE_MINT_PRICE + NFT_TAX, "Incorrect amount sent"); } require(baseSalesOpen(), "The main sale period is not open"); _mintBaseTokens(_numTokens, _msgSender()); } function presaleMintBase(uint16 _numTokens) external payable { if (msg.sender != owner()){ require(msg.value >= _numTokens * PRESALE_MINT_PRICE + NFT_TAX, "Incorrect amount sent"); } require(presaleOpen(), "The presale is not open"); require(presaleSupply + _numTokens <= MAX_PRESALE_SUPPLY, "Insufficient presale supply"); if (!skipWL) { require(isWhiteListed(_msgSender()), "The sender is not whitelisted"); } _mintBaseTokens(_numTokens, _msgSender()); presaleSupply += _numTokens; } function setSalesStartTime(uint256 _startTime) external onlyOwner { require(_startTime > block.timestamp, "Start time must be in the future"); require(!baseSalesOpen(), "Base sales already started"); salesStartTime = _startTime; } function setMAX_BASE_SUPPLY(uint256 _value) external onlyOwner { MAX_BASE_SUPPLY = _value; } function setMAX_PRESALE_SUPPLY(uint256 _value) external onlyOwner { MAX_PRESALE_SUPPLY = _value; } function setPresaleStartTime(uint256 _startTime) external onlyOwner { require(_startTime > block.timestamp, "Start time must be in the future"); require(!baseSalesOpen(), "Base sales already started"); require(!presaleOpen(), "Presale already started"); presaleStartTime = _startTime; } function getCurrentBlockTimestamp() public view returns (uint256) { return block.timestamp; } function baseSalesOpen() public view returns (bool) { return salesStartTime != 0 && block.timestamp >= salesStartTime; } function presaleOpen() public view returns (bool) { return presaleStartTime != 0 && block.timestamp >= presaleStartTime; } function _mintBaseTokens(uint16 _numTokens, address _for) internal { require(baseSupply + _numTokens <= MAX_BASE_SUPPLY, "Insufficient supply"); require(_numTokens <= MAX_PER_MINT, "Too many purchases at once"); for (uint i = 0; i < _numTokens; i++) { uint256 tokenId = baseSupply; _safeMint(_for, tokenId); baseSupply++; if (_rand(totalSupply()) % 100 < BASE_SUPER_PERCENTAGE) { tokenLevel[tokenId] = 1; // super miner } else { tokenLevel[tokenId] = 0; // normal miner } } } function whiteListUsers (address[] calldata _users) public onlyOwner{ //delete whiteListAddresses; for (uint256 i = 0; i<_users.length; i++){ whiteListAddresses.push(_users[i]); } } function giveFreeNFTs (address[] calldata _users) public onlyOwner { for (uint i = 0; i< _users.length; i++){ _mintBaseTokens(1,_users[i]); } } function burnLock(uint256 _id) public{ require(msg.sender == mineAddress, "Only the mine address can burn a lock"); _burn(_id); } function isWhiteListed (address _user) public view returns (bool) { for(uint256 i=0; i<whiteListAddresses.length; i++){ if(whiteListAddresses[i] == _user){ return true; } } return false; } /* Minting of upgrade miners */ function addUpgrade(uint256 _maxSupply, uint256 _price, uint256 _yield) external onlyOwner { levels.push(Level({ supply: 0, maxSupply: _maxSupply, price: _price, yield: _yield })); } function updateUpgradePrice(uint256 _level, uint256 _price) public{ require(msg.sender == eventAddress || msg.sender == owner(), "Must be the owner or event address to set prices"); levels[_level].price = _price; } function mintUpgrade(uint256 _level, uint16 _numTokens) external { require(gameStarted(), "Upgrade sales are not open"); require(_numTokens <= MAX_PER_MINT, "Too many purchases at once"); require(_level < levels.length && _level > 1, "Invalid level"); require(levels[_level].supply + _numTokens <= levels[_level].maxSupply, "Insufficient supply"); require(_level != lockLV, "Locks can only be minted through the event contract"); uint256 totalCost = _numTokens * levels[_level].price; if (msg.sender != owner()){ require(diamond.balanceOf(msg.sender) >= totalCost, "Insufficient DIAMOND balance"); diamond.burn(msg.sender, totalCost); } for (uint256 i = 0; i < _numTokens; i++) { uint256 tokenId = MAX_BASE_SUPPLY + upgradeSupply; _safeMint(msg.sender, tokenId); tokenLevel[tokenId] = _level; levels[_level].supply++; upgradeSupply++; } } function mintLock(uint16 _numTokens, address _to) external { require(gameStarted(), "Upgrade sales are not open"); require(_numTokens <= MAX_PER_MINT, "Too many purchases at once"); require(lockLV < levels.length && lockLV > 1, "Invalid level"); require(levels[lockLV].supply + _numTokens <= levels[lockLV].maxSupply, "Insufficient supply"); require(msg.sender == eventAddress, "Locks can only be minted through the event contract"); uint256 totalCost = _numTokens * levels[lockLV].price; if (msg.sender != owner()){ require(diamond.balanceOf(_to) >= totalCost, "Insufficient DIAMOND balance"); diamond.burn(_to, totalCost); } for (uint256 i = 0; i < _numTokens; i++) { uint256 tokenId = MAX_BASE_SUPPLY + upgradeSupply; _safeMint(_to, tokenId); tokenLevel[tokenId] = lockLV; levels[lockLV].supply++; upgradeSupply++; } } // Views function gameStarted() public view returns (bool) { return baseSalesOpen() && ( block.timestamp >= salesStartTime + UPGRADE_SALES_OFFSET || baseSupply == MAX_BASE_SUPPLY ); } function isUpgrade(uint256 _tokenId) public view returns (bool) { require(_exists(_tokenId), "Invalid token ID"); return _tokenId >= MAX_BASE_SUPPLY; } function tokenRevealed(uint256 _tokenId) public view returns (bool) { return isUpgrade(_tokenId) || revealed; } function revealedTokenLevel(uint256 _tokenId) public view returns (uint256) { require(tokenRevealed(_tokenId), "Token unrevealed"); return tokenLevel[_tokenId]; } function tokenYield(uint256 _tokenId) public view returns (uint256) { uint256 level = revealedTokenLevel(_tokenId); return levels[level].yield; } function setSkipWL() public onlyOwner{ skipWL = !skipWL; } function getWhiteList() public view returns (address[] memory){ return whiteListAddresses; } function setBASE_MINT_PRICE (uint256 value) public onlyOwner{ BASE_MINT_PRICE = value; } function setPRESALE_MINT_PRICE(uint256 value) public onlyOwner{ PRESALE_MINT_PRICE = value; } function setNFT_TAX(uint256 value) public onlyOwner{ NFT_TAX = value; } function setBASE_SUPER_PERCENTAGE(uint256 value) public onlyOwner{ BASE_SUPER_PERCENTAGE = value; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { if (isUpgrade(_tokenId)) { return string(abi.encodePacked(BASE_URI, "level/", revealedTokenLevel(_tokenId).toString(), ".json")); } else if (!tokenRevealed(_tokenId)) { return string(abi.encodePacked(BASE_URI, "unrevealed.json")); } else if (revealedTokenLevel(_tokenId) == 1) { return string(abi.encodePacked(BASE_URI, _tokenId.toString(), "-super.json")); } else { return string(abi.encodePacked(BASE_URI, _tokenId.toString(), "-miner.json")); } } function contractURI() public view returns (string memory) { return string(abi.encodePacked(BASE_URI, "contract-meta.json")); } function batchedMinerOfOwner( address _owner, uint256 _offset, uint256 _maxSize ) public view returns (MinerInfo[] memory) { if (_offset >= balanceOf(_owner)) { return new MinerInfo[](0); } uint256 outputSize = _maxSize; if (_offset + _maxSize >= balanceOf(_owner)) { outputSize = balanceOf(_owner) - _offset; } MinerInfo[] memory miners = new MinerInfo[](outputSize); for (uint256 i = 0; i < outputSize; i++) { uint256 tokenId = tokenOfOwnerByIndex(_owner, _offset + i); uint256 level = 0; if (revealed) { level = revealedTokenLevel(tokenId); } miners[i] = MinerInfo({ tokenId: tokenId, level: level, revealed: revealed }); } return miners; } // Extras function reveal() external onlyOwner{ revealed = true; } function isApprovedForAll(address _owner, address _operator) public view override returns (bool) { if (_operator == mineAddress) { return true; } return super.isApprovedForAll(_owner, _operator); } function setMineAddress(address _mineAddress) public onlyOwner { mineAddress = _mineAddress; } function setEventAddress(address _eventAddress) public onlyOwner { eventAddress = _eventAddress; } function setDiamond(Diamond _diamond) public onlyOwner { diamond = _diamond; } function setBaseURI(string memory _newBaseURI) public onlyOwner { BASE_URI = _newBaseURI; } function withdrawBalance(uint256 _amount) external onlyOwner { require(_amount <= address(this).balance); payable(msg.sender).transfer(_amount); } // Adapted from Sheep Game function _rand(uint256 _seed) internal view returns (uint256) { require(tx.origin == _msgSender(), "Only EOA"); return uint256( keccak256( abi.encodePacked( blockhash(block.number - 4), tx.origin, blockhash(block.number - 2), blockhash(block.number - 3), blockhash(block.number - 1), _seed, block.timestamp ) ) ); } }
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BASE_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_SUPER_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BASE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRESALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_TAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADE_SALES_OFFSET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_yield","type":"uint256"}],"name":"addUpgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseSalesOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_maxSize","type":"uint256"}],"name":"batchedMinerOfOwner","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"bool","name":"revealed","type":"bool"}],"internalType":"struct Miner.MinerInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"burnLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"diamond","outputs":[{"internalType":"contract Diamond","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eventAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBlockTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhiteList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"giveFreeNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isUpgrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"levels","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"yield","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockLV","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mineAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_numTokens","type":"uint16"}],"name":"mintBase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_numTokens","type":"uint16"},{"internalType":"address","name":"_to","type":"address"}],"name":"mintLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_level","type":"uint256"},{"internalType":"uint16","name":"_numTokens","type":"uint16"}],"name":"mintUpgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_numTokens","type":"uint16"}],"name":"presaleMintBase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"revealedTokenLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salesStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setBASE_MINT_PRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setBASE_SUPER_PERCENTAGE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Diamond","name":"_diamond","type":"address"}],"name":"setDiamond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_eventAddress","type":"address"}],"name":"setEventAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMAX_BASE_SUPPLY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMAX_PRESALE_SUPPLY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mineAddress","type":"address"}],"name":"setMineAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setNFT_TAX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setPRESALE_MINT_PRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setPresaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setSalesStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSkipWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skipWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenYield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_level","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateUpgradePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whiteListAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whiteListUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61251c600f556101f4601055671bc16d674ec800006011556714d1120d7b16000060125567016345785d8a00006013556005601455601a805460ff1916905560a06040819052600060808190526200005a91601d91620002f6565b50601e805460ff191690553480156200007257600080fd5b50604051620047a0380380620047a0833981016040819052620000959162000453565b815182908290620000ae906000906020850190620002f6565b508051620000c4906001906020840190620002f6565b505050620000e1620000db6200022860201b60201c565b6200022c565b600a805460ff60a01b19169055620000f9836200027e565b505060408051608080820183526000808352602080840182815284860183815260016060808801828152601c80548085018255818952995160049a8b027f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2118181019290925596517f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2128089019190915595517f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2138089019190915592517f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a214978801558b51998a018c52888a529689018881529a89018881526005938a019384528154948501825597529651919097029384015595519582019590955590519181019190915590519101555062000537565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620002dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620002f290601d906020840190620002f6565b5050565b8280546200030490620004e4565b90600052602060002090601f01602090048101928262000328576000855562000373565b82601f106200034357805160ff191683800117855562000373565b8280016001018555821562000373579182015b828111156200037357825182559160200191906001019062000356565b506200038192915062000385565b5090565b5b8082111562000381576000815560010162000386565b600082601f830112620003ae57600080fd5b81516001600160401b0380821115620003cb57620003cb62000521565b604051601f8301601f19908116603f01168101908282118183101715620003f657620003f662000521565b816040528381526020925086838588010111156200041357600080fd5b600091505b8382101562000437578582018301518183018401529082019062000418565b83821115620004495760008385830101525b9695505050505050565b6000806000606084860312156200046957600080fd5b83516001600160401b03808211156200048157600080fd5b6200048f878388016200039c565b94506020860151915080821115620004a657600080fd5b620004b4878388016200039c565b93506040860151915080821115620004cb57600080fd5b50620004da868287016200039c565b9150509250925092565b600181811c90821680620004f957607f821691505b602082108114156200051b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61425980620005476000396000f3fe6080604052600436106104475760003560e01c8063715018a611610234578063be2bd96c1161012e578063e3b9ac3e116100b6578063f2fde38b1161007a578063f2fde38b14610c87578063f6384e6c14610ca7578063f954127014610cc7578063fad5677914610cda578063fbc4504814610cfa57600080fd5b8063e3b9ac3e14610bfc578063e8a3d48514610c1c578063e985e9c514610c31578063ebe2ca7b14610c51578063f0b7db4e14610c6757600080fd5b8063c87b56dd116100fd578063c87b56dd14610b69578063ca98787a14610b89578063da76d5cd14610b9c578063dbbc3ce814610bbc578063decec7d914610bdc57600080fd5b8063be2bd96c14610aff578063bee6348a14610b1f578063c35d47a714610b34578063c8718dfa14610b5457600080fd5b80639d897351116101bc578063aff485f711610180578063aff485f714610a5e578063b18caadf14610a73578063b2596a6714610a89578063b3a196e914610ac9578063b88d4fde14610adf57600080fd5b80639d897351146109d3578063a22cb465146109f3578063a2c1737214610a13578063a475b5dd14610a33578063a82524b214610a4857600080fd5b80638d63976f116102035780638d63976f1461094b5780638da5cb5b1461096b578063901507f81461098957806395d89b41146109a95780639894a494146109be57600080fd5b8063715018a6146108ea57806376ed535a146108ff578063772eeb251461091f578063860f50481461093557600080fd5b8063296cab551161034557806355f804b3116102cd5780636352211e116102915780636352211e146108545780636b8dc355146108745780636f9170f61461088a57806370242015146108aa57806370a08231146108ca57600080fd5b806355f804b3146107b957806359bf2052146107d95780635a6727f4146107f35780635c975abb146108205780635e123ce41461083f57600080fd5b80633831c97d116103145780633831c97d14610719578063398ac9531461073957806342842e0e14610759578063475fda0e146107795780634f6ccce71461079957600080fd5b8063296cab55146106ac5780632a234e57146106cc5780632f745c59146106e257806337f6727f1461070257600080fd5b80630f28c97d116103d357806318db3c771161039757806318db3c77146106165780631b54c025146106365780631b97228e1461064c5780631f7c55141461066c57806323b872dd1461068c57600080fd5b80630f28c97d1461058e5780630f69aa78146105a157806312566a42146105c157806318160ddd146105e15780631896db54146105f657600080fd5b806306fdde031161041a57806306fdde03146104dd578063081812fc146104ff578063095ea7b31461053757806309a9d76c1461055757806309d42b301461057957600080fd5b806301ffc9a71461044c578063050b9b0814610481578063054ee789146104a3578063064d705e146104c7575b600080fd5b34801561045857600080fd5b5061046c610467366004613ac7565b610d1a565b60405190151581526020015b60405180910390f35b34801561048d57600080fd5b506104a161049c366004613b81565b610d45565b005b3480156104af57600080fd5b506104b960115481565b604051908152602001610478565b3480156104d357600080fd5b506104b9600f5481565b3480156104e957600080fd5b506104f2610d7d565b6040516104789190613ef0565b34801561050b57600080fd5b5061051f61051a366004613b81565b610e0f565b6040516001600160a01b039091168152602001610478565b34801561054357600080fd5b506104a16105523660046139f1565b610ea4565b34801561056357600080fd5b5061056c610fba565b6040516104789190613e48565b34801561058557600080fd5b506104b9601e81565b34801561059a57600080fd5b50426104b9565b3480156105ad57600080fd5b506104a16105bc366004613b81565b61101b565b3480156105cd57600080fd5b5061046c6105dc366004613b81565b6110ee565b3480156105ed57600080fd5b506008546104b9565b34801561060257600080fd5b506104a1610611366004613b81565b61114e565b34801561062257600080fd5b506104a1610631366004613b81565b61117d565b34801561064257600080fd5b506104b960195481565b34801561065857600080fd5b506104b9610667366004613b81565b6111ac565b34801561067857600080fd5b506104a1610687366004613b65565b6111e7565b34801561069857600080fd5b506104a16106a73660046138fd565b611589565b3480156106b857600080fd5b506104a16106c7366004613b81565b6115ba565b3480156106d857600080fd5b506104b960125481565b3480156106ee57600080fd5b506104b96106fd3660046139f1565b6116e2565b34801561070e57600080fd5b506104b96202a30081565b34801561072557600080fd5b506104b9610734366004613b81565b611778565b34801561074557600080fd5b506104a1610754366004613a52565b6117d5565b34801561076557600080fd5b506104a16107743660046138fd565b61184d565b34801561078557600080fd5b506104a1610794366004613a52565b611868565b3480156107a557600080fd5b506104b96107b4366004613b81565b61190a565b3480156107c557600080fd5b506104a16107d4366004613b01565b61199d565b3480156107e557600080fd5b50601a5461046c9060ff1681565b3480156107ff57600080fd5b5061081361080e366004613a1d565b6119de565b6040516104789190613e95565b34801561082c57600080fd5b50600a54600160a01b900460ff1661046c565b34801561084b57600080fd5b5061046c611b86565b34801561086057600080fd5b5061051f61086f366004613b81565b611bbe565b34801561088057600080fd5b506104b960105481565b34801561089657600080fd5b5061046c6108a53660046138a7565b611c35565b3480156108b657600080fd5b506104a16108c53660046138a7565b611c9f565b3480156108d657600080fd5b506104b96108e53660046138a7565b611ceb565b3480156108f657600080fd5b506104a1611d72565b34801561090b57600080fd5b506104a161091a3660046138a7565b611da8565b34801561092b57600080fd5b506104b960145481565b34801561094157600080fd5b506104b960155481565b34801561095757600080fd5b506104a16109663660046138a7565b611df4565b34801561097757600080fd5b50600a546001600160a01b031661051f565b34801561099557600080fd5b506104a16109a4366004613c01565b611e40565b3480156109b557600080fd5b506104f2611f38565b3480156109ca57600080fd5b506104a1611f47565b3480156109df57600080fd5b5061046c6109ee366004613b81565b611f85565b3480156109ff57600080fd5b506104a1610a0e3660046139be565b611fa2565b348015610a1f57600080fd5b506104a1610a2e366004613b81565b611fad565b348015610a3f57600080fd5b506104a1612021565b348015610a5457600080fd5b506104b960185481565b348015610a6a57600080fd5b5061046c61205a565b348015610a7f57600080fd5b506104b960135481565b348015610a9557600080fd5b50610aa9610aa4366004613b81565b612074565b604080519485526020850193909352918301526060820152608001610478565b348015610ad557600080fd5b506104b960165481565b348015610aeb57600080fd5b506104a1610afa36600461393e565b6120ae565b348015610b0b57600080fd5b50600d5461051f906001600160a01b031681565b348015610b2b57600080fd5b5061046c6120e0565b348015610b4057600080fd5b506104a1610b4f366004613b81565b6120fa565b348015610b6057600080fd5b506104b9600281565b348015610b7557600080fd5b506104f2610b84366004613b81565b612129565b6104a1610b97366004613b4a565b6121e0565b348015610ba857600080fd5b506104a1610bb7366004613b81565b612395565b348015610bc857600080fd5b506104a1610bd7366004613b81565b6123f9565b348015610be857600080fd5b506104a1610bf7366004613bb3565b612428565b348015610c0857600080fd5b506104a1610c17366004613b81565b6127b1565b348015610c2857600080fd5b506104f26127e0565b348015610c3d57600080fd5b5061046c610c4c3660046138c4565b612808565b348015610c5d57600080fd5b506104b960175481565b348015610c7357600080fd5b50600b5461051f906001600160a01b031681565b348015610c9357600080fd5b506104a1610ca23660046138a7565b612857565b348015610cb357600080fd5b5061051f610cc2366004613b81565b6128ef565b6104a1610cd5366004613b4a565b612919565b348015610ce657600080fd5b50600c5461051f906001600160a01b031681565b348015610d0657600080fd5b506104a1610d15366004613bdf565b6129ee565b60006001600160e01b0319821663780e9d6360e01b1480610d3f5750610d3f82612aa3565b92915050565b600a546001600160a01b03163314610d785760405162461bcd60e51b8152600401610d6f90613fb9565b60405180910390fd5b601355565b606060008054610d8c90614120565b80601f0160208091040260200160405190810160405280929190818152602001828054610db890614120565b8015610e055780601f10610dda57610100808354040283529160200191610e05565b820191906000526020600020905b815481529060010190602001808311610de857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610e885760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d6f565b506000908152600460205260409020546001600160a01b031690565b6000610eaf82611bbe565b9050806001600160a01b0316836001600160a01b03161415610f1d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d6f565b336001600160a01b0382161480610f395750610f398133612808565b610fab5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d6f565b610fb58383612af3565b505050565b6060600e805480602002602001604051908101604052809291908181526020018280548015610e0557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ff4575050505050905090565b600a546001600160a01b031633146110455760405162461bcd60e51b8152600401610d6f90613fb9565b4281116110945760405162461bcd60e51b815260206004820181905260248201527f53746172742074696d65206d75737420626520696e20746865206675747572656044820152606401610d6f565b61109c61205a565b156110e95760405162461bcd60e51b815260206004820152601a60248201527f426173652073616c657320616c726561647920737461727465640000000000006044820152606401610d6f565b601955565b6000818152600260205260408120546001600160a01b03166111455760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081d1bdad95b88125160821b6044820152606401610d6f565b50600f54111590565b600a546001600160a01b031633146111785760405162461bcd60e51b8152600401610d6f90613fb9565b601255565b600a546001600160a01b031633146111a75760405162461bcd60e51b8152600401610d6f90613fb9565b601055565b6000806111b883611778565b9050601c81815481106111cd576111cd6141cc565b906000526020600020906004020160030154915050919050565b6111ef611b86565b61123b5760405162461bcd60e51b815260206004820152601a60248201527f557067726164652073616c657320617265206e6f74206f70656e0000000000006044820152606401610d6f565b601e8261ffff1611156112605760405162461bcd60e51b8152600401610d6f90613f55565b601c546002108015611270575060015b6112ac5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a59081b195d995b609a1b6044820152606401610d6f565b601c6002815481106112c0576112c06141cc565b9060005260206000209060040201600101548261ffff16601c6002815481106112eb576112eb6141cc565b9060005260206000209060040201600001546113079190614092565b11156113255760405162461bcd60e51b8152600401610d6f90613f8c565b600c546001600160a01b0316331461134f5760405162461bcd60e51b8152600401610d6f90613fee565b6000601c600281548110611365576113656141cc565b9060005260206000209060040201600201548361ffff1661138691906140be565b905061139a600a546001600160a01b031690565b6001600160a01b0316336001600160a01b0316146114e457600b546040516370a0823160e01b81526001600160a01b038481166004830152839216906370a082319060240160206040518083038186803b1580156113f757600080fd5b505afa15801561140b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142f9190613b9a565b101561147d5760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e74204449414d4f4e442062616c616e6365000000006044820152606401610d6f565b600b54604051632770a7eb60e21b81526001600160a01b0384811660048301526024820184905290911690639dc29fac90604401600060405180830381600087803b1580156114cb57600080fd5b505af11580156114df573d6000803e3d6000fd5b505050505b60005b8361ffff16811015611583576000601754600f546115059190614092565b90506115118482612b61565b6000818152601b60205260409020600290819055601c8054909190811061153a5761153a6141cc565b6000918252602082206004909102018054916115558361415b565b90915550506017805490600061156a8361415b565b919050555050808061157b9061415b565b9150506114e7565b50505050565b6115933382612b7b565b6115af5760405162461bcd60e51b8152600401610d6f90614041565b610fb5838383612c52565b600a546001600160a01b031633146115e45760405162461bcd60e51b8152600401610d6f90613fb9565b4281116116335760405162461bcd60e51b815260206004820181905260248201527f53746172742074696d65206d75737420626520696e20746865206675747572656044820152606401610d6f565b61163b61205a565b156116885760405162461bcd60e51b815260206004820152601a60248201527f426173652073616c657320616c726561647920737461727465640000000000006044820152606401610d6f565b6116906120e0565b156116dd5760405162461bcd60e51b815260206004820152601760248201527f50726573616c6520616c726561647920737461727465640000000000000000006044820152606401610d6f565b601855565b60006116ed83611ceb565b821061174f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d6f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600061178382611f85565b6117c25760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881d5b9c995d99585b195960821b6044820152606401610d6f565b506000908152601b602052604090205490565b600a546001600160a01b031633146117ff5760405162461bcd60e51b8152600401610d6f90613fb9565b60005b81811015610fb55761183b6001848484818110611821576118216141cc565b905060200201602081019061183691906138a7565b612df9565b806118458161415b565b915050611802565b610fb5838383604051806020016040528060008152506120ae565b600a546001600160a01b031633146118925760405162461bcd60e51b8152600401610d6f90613fb9565b60005b81811015610fb557600e8383838181106118b1576118b16141cc565b90506020020160208101906118c691906138a7565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055806119028161415b565b915050611895565b600061191560085490565b82106119785760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d6f565b6008828154811061198b5761198b6141cc565b90600052602060002001549050919050565b600a546001600160a01b031633146119c75760405162461bcd60e51b8152600401610d6f90613fb9565b80516119da90601d906020840190613786565b5050565b60606119e984611ceb565b8310611a46576040805160008082526020820190925290611a3e565b611a2b604051806060016040528060008152602001600081526020016000151581525090565b815260200190600190039081611a055790505b509050611b7f565b81611a5085611ceb565b611a5a8486614092565b10611a765783611a6986611ceb565b611a7391906140dd565b90505b60008167ffffffffffffffff811115611a9157611a916141e2565b604051908082528060200260200182016040528015611ae857816020015b611ad5604051806060016040528060008152602001600081526020016000151581525090565b815260200190600190039081611aaf5790505b50905060005b82811015611b7a576000611b06886106fd848a614092565b601e5490915060009060ff1615611b2357611b2082611778565b90505b6040805160608101825283815260208101839052601e5460ff161515918101919091528451859085908110611b5a57611b5a6141cc565b602002602001018190525050508080611b729061415b565b915050611aee565b509150505b9392505050565b6000611b9061205a565b8015611bb957506202a300601954611ba89190614092565b42101580611bb95750600f54601554145b905090565b6000818152600260205260408120546001600160a01b031680610d3f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d6f565b6000805b600e54811015611c9657826001600160a01b0316600e8281548110611c6057611c606141cc565b6000918252602090912001546001600160a01b03161415611c845750600192915050565b80611c8e8161415b565b915050611c39565b50600092915050565b600a546001600160a01b03163314611cc95760405162461bcd60e51b8152600401610d6f90613fb9565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611d565760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d6f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611d9c5760405162461bcd60e51b8152600401610d6f90613fb9565b611da66000612ee2565b565b600a546001600160a01b03163314611dd25760405162461bcd60e51b8152600401610d6f90613fb9565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611e1e5760405162461bcd60e51b8152600401610d6f90613fb9565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314611e6a5760405162461bcd60e51b8152600401610d6f90613fb9565b6040805160808101825260008082526020820195865291810193845260608101928352601c80546001810182559252517f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21160049092029182015592517f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21284015590517f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a213830155517f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21490910155565b606060018054610d8c90614120565b600a546001600160a01b03163314611f715760405162461bcd60e51b8152600401610d6f90613fb9565b601a805460ff19811660ff90911615179055565b6000611f90826110ee565b80610d3f5750601e5460ff1692915050565b6119da338383612f34565b600d546001600160a01b031633146120155760405162461bcd60e51b815260206004820152602560248201527f4f6e6c7920746865206d696e6520616464726573732063616e206275726e2061604482015264206c6f636b60d81b6064820152608401610d6f565b61201e81613003565b50565b600a546001600160a01b0316331461204b5760405162461bcd60e51b8152600401610d6f90613fb9565b601e805460ff19166001179055565b6000601954600014158015611bb957505060195442101590565b601c818154811061208457600080fd5b60009182526020909120600490910201805460018201546002830154600390930154919350919084565b6120b83383612b7b565b6120d45760405162461bcd60e51b8152600401610d6f90614041565b611583848484846130aa565b6000601854600014158015611bb957505060185442101590565b600a546001600160a01b031633146121245760405162461bcd60e51b8152600401610d6f90613fb9565b601455565b6060612134826110ee565b1561217357601d61214c61214784611778565b6130dd565b60405160200161215d929190613dc2565b6040516020818303038152906040529050919050565b61217c82611f85565b61219257601d60405160200161215d9190613d97565b61219b82611778565b600114156121bf57601d6121ae836130dd565b60405160200161215d929190613d2e565b601d6121ca836130dd565b60405160200161215d929190613cf3565b919050565b600a546001600160a01b03163314612257576013546012546122069061ffff84166140be565b6122109190614092565b3410156122575760405162461bcd60e51b8152602060048201526015602482015274125b98dbdc9c9958dd08185b5bdd5b9d081cd95b9d605a1b6044820152606401610d6f565b61225f6120e0565b6122ab5760405162461bcd60e51b815260206004820152601760248201527f5468652070726573616c65206973206e6f74206f70656e0000000000000000006044820152606401610d6f565b6010548161ffff166016546122c09190614092565b111561230e5760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742070726573616c6520737570706c7900000000006044820152606401610d6f565b601a5460ff1661236d5761232133611c35565b61236d5760405162461bcd60e51b815260206004820152601d60248201527f5468652073656e646572206973206e6f742077686974656c69737465640000006044820152606401610d6f565b6123778133612df9565b8061ffff166016600082825461238d9190614092565b909155505050565b600a546001600160a01b031633146123bf5760405162461bcd60e51b8152600401610d6f90613fb9565b478111156123cc57600080fd5b604051339082156108fc029083906000818181858888f193505050501580156119da573d6000803e3d6000fd5b600a546001600160a01b031633146124235760405162461bcd60e51b8152600401610d6f90613fb9565b601155565b612430611b86565b61247c5760405162461bcd60e51b815260206004820152601a60248201527f557067726164652073616c657320617265206e6f74206f70656e0000000000006044820152606401610d6f565b601e8161ffff1611156124a15760405162461bcd60e51b8152600401610d6f90613f55565b601c54821080156124b25750600182115b6124ee5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a59081b195d995b609a1b6044820152606401610d6f565b601c8281548110612501576125016141cc565b9060005260206000209060040201600101548161ffff16601c848154811061252b5761252b6141cc565b9060005260206000209060040201600001546125479190614092565b11156125655760405162461bcd60e51b8152600401610d6f90613f8c565b60028214156125865760405162461bcd60e51b8152600401610d6f90613fee565b6000601c838154811061259b5761259b6141cc565b9060005260206000209060040201600201548261ffff166125bc91906140be565b90506125d0600a546001600160a01b031690565b6001600160a01b0316336001600160a01b03161461271657600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b15801561262b57600080fd5b505afa15801561263f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126639190613b9a565b10156126b15760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e74204449414d4f4e442062616c616e6365000000006044820152606401610d6f565b600b54604051632770a7eb60e21b8152336004820152602481018390526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b1580156126fd57600080fd5b505af1158015612711573d6000803e3d6000fd5b505050505b60005b8261ffff16811015611583576000601754600f546127379190614092565b90506127433382612b61565b6000818152601b60205260409020859055601c805486908110612768576127686141cc565b6000918252602082206004909102018054916127838361415b565b9091555050601780549060006127988361415b565b91905055505080806127a99061415b565b915050612719565b600a546001600160a01b031633146127db5760405162461bcd60e51b8152600401610d6f90613fb9565b600f55565b6060601d6040516020016127f49190613d69565b604051602081830303815290604052905090565b600d546000906001600160a01b038381169116141561282957506001610d3f565b6001600160a01b0380841660009081526005602090815260408083209386168352929052205460ff16611b7f565b600a546001600160a01b031633146128815760405162461bcd60e51b8152600401610d6f90613fb9565b6001600160a01b0381166128e65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d6f565b61201e81612ee2565b600e81815481106128ff57600080fd5b6000918252602090912001546001600160a01b0316905081565b600a546001600160a01b031633146129905760135460115461293f9061ffff84166140be565b6129499190614092565b3410156129905760405162461bcd60e51b8152602060048201526015602482015274125b98dbdc9c9958dd08185b5bdd5b9d081cd95b9d605a1b6044820152606401610d6f565b61299861205a565b6129e45760405162461bcd60e51b815260206004820181905260248201527f546865206d61696e2073616c6520706572696f64206973206e6f74206f70656e6044820152606401610d6f565b61201e8133612df9565b600c546001600160a01b0316331480612a115750600a546001600160a01b031633145b612a765760405162461bcd60e51b815260206004820152603060248201527f4d75737420626520746865206f776e6572206f72206576656e7420616464726560448201526f737320746f207365742070726963657360801b6064820152608401610d6f565b80601c8381548110612a8a57612a8a6141cc565b9060005260206000209060040201600201819055505050565b60006001600160e01b031982166380ac58cd60e01b1480612ad457506001600160e01b03198216635b5e139f60e01b145b80610d3f57506301ffc9a760e01b6001600160e01b0319831614610d3f565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612b2882611bbe565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6119da8282604051806020016040528060008152506131db565b6000818152600260205260408120546001600160a01b0316612bf45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d6f565b6000612bff83611bbe565b9050806001600160a01b0316846001600160a01b03161480612c265750612c268185612808565b80612c4a5750836001600160a01b0316612c3f84610e0f565b6001600160a01b0316145b949350505050565b826001600160a01b0316612c6582611bbe565b6001600160a01b031614612cc95760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d6f565b6001600160a01b038216612d2b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d6f565b612d3683838361320e565b612d41600082612af3565b6001600160a01b0383166000908152600360205260408120805460019290612d6a9084906140dd565b90915550506001600160a01b0382166000908152600360205260408120805460019290612d98908490614092565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600f548261ffff16601554612e0e9190614092565b1115612e2c5760405162461bcd60e51b8152600401610d6f90613f8c565b601e8261ffff161115612e515760405162461bcd60e51b8152600401610d6f90613f55565b60005b8261ffff16811015610fb557601554612e6d8382612b61565b60158054906000612e7d8361415b565b91905055506014546064612e98612e9360085490565b6132c6565b612ea29190614176565b1015612ebf576000818152601b6020526040902060019055612ecf565b6000818152601b60205260408120555b5080612eda8161415b565b915050612e54565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612f965760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d6f565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b600061300e82611bbe565b905061301c8160008461320e565b613027600083612af3565b6001600160a01b03811660009081526003602052604081208054600192906130509084906140dd565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6130b5848484612c52565b6130c18484848461339b565b6115835760405162461bcd60e51b8152600401610d6f90613f03565b6060816131015750506040805180820190915260018152600360fc1b602082015290565b8160005b811561312b57806131158161415b565b91506131249050600a836140aa565b9150613105565b60008167ffffffffffffffff811115613146576131466141e2565b6040519080825280601f01601f191660200182016040528015613170576020820181803683370190505b5090505b8415612c4a576131856001836140dd565b9150613192600a86614176565b61319d906030614092565b60f81b8183815181106131b2576131b26141cc565b60200101906001600160f81b031916908160001a9053506131d4600a866140aa565b9450613174565b6131e583836134a8565b6131f2600084848461339b565b610fb55760405162461bcd60e51b8152600401610d6f90613f03565b6001600160a01b0383166132695761326481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61328c565b816001600160a01b0316836001600160a01b03161461328c5761328c83826135f6565b6001600160a01b0382166132a357610fb581613693565b826001600160a01b0316826001600160a01b031614610fb557610fb58282613742565b60003233146133025760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b6044820152606401610d6f565b61330d6004436140dd565b403261331a6002436140dd565b406133266003436140dd565b406133326001436140dd565b60408051602081019690965260609490941b6bffffffffffffffffffffffff1916938501939093526054840191909152607483015240609482015260b481018390524260d482015260f40160408051601f19818403018152919052805160209091012092915050565b60006001600160a01b0384163b1561349d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906133df903390899088908890600401613e0b565b602060405180830381600087803b1580156133f957600080fd5b505af1925050508015613429575060408051601f3d908101601f1916820190925261342691810190613ae4565b60015b613483573d808015613457576040519150601f19603f3d011682016040523d82523d6000602084013e61345c565b606091505b50805161347b5760405162461bcd60e51b8152600401610d6f90613f03565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612c4a565b506001949350505050565b6001600160a01b0382166134fe5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d6f565b6000818152600260205260409020546001600160a01b0316156135635760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d6f565b61356f6000838361320e565b6001600160a01b0382166000908152600360205260408120805460019290613598908490614092565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161360384611ceb565b61360d91906140dd565b600083815260076020526040902054909150808214613660576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906136a5906001906140dd565b600083815260096020526040812054600880549394509092849081106136cd576136cd6141cc565b9060005260206000200154905080600883815481106136ee576136ee6141cc565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613726576137266141b6565b6001900381819060005260206000200160009055905550505050565b600061374d83611ceb565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461379290614120565b90600052602060002090601f0160209004810192826137b457600085556137fa565b82601f106137cd57805160ff19168380011785556137fa565b828001600101855582156137fa579182015b828111156137fa5782518255916020019190600101906137df565b5061380692915061380a565b5090565b5b80821115613806576000815560010161380b565b600067ffffffffffffffff8084111561383a5761383a6141e2565b604051601f8501601f19908116603f01168101908282118183101715613862576138626141e2565b8160405280935085815286868601111561387b57600080fd5b858560208301376000602087830101525050509392505050565b803561ffff811681146121db57600080fd5b6000602082840312156138b957600080fd5b8135611b7f816141f8565b600080604083850312156138d757600080fd5b82356138e2816141f8565b915060208301356138f2816141f8565b809150509250929050565b60008060006060848603121561391257600080fd5b833561391d816141f8565b9250602084013561392d816141f8565b929592945050506040919091013590565b6000806000806080858703121561395457600080fd5b843561395f816141f8565b9350602085013561396f816141f8565b925060408501359150606085013567ffffffffffffffff81111561399257600080fd5b8501601f810187136139a357600080fd5b6139b28782356020840161381f565b91505092959194509250565b600080604083850312156139d157600080fd5b82356139dc816141f8565b9150602083013580151581146138f257600080fd5b60008060408385031215613a0457600080fd5b8235613a0f816141f8565b946020939093013593505050565b600080600060608486031215613a3257600080fd5b8335613a3d816141f8565b95602085013595506040909401359392505050565b60008060208385031215613a6557600080fd5b823567ffffffffffffffff80821115613a7d57600080fd5b818501915085601f830112613a9157600080fd5b813581811115613aa057600080fd5b8660208260051b8501011115613ab557600080fd5b60209290920196919550909350505050565b600060208284031215613ad957600080fd5b8135611b7f8161420d565b600060208284031215613af657600080fd5b8151611b7f8161420d565b600060208284031215613b1357600080fd5b813567ffffffffffffffff811115613b2a57600080fd5b8201601f81018413613b3b57600080fd5b612c4a8482356020840161381f565b600060208284031215613b5c57600080fd5b611b7f82613895565b60008060408385031215613b7857600080fd5b6138e283613895565b600060208284031215613b9357600080fd5b5035919050565b600060208284031215613bac57600080fd5b5051919050565b60008060408385031215613bc657600080fd5b82359150613bd660208401613895565b90509250929050565b60008060408385031215613bf257600080fd5b50508035926020909101359150565b600080600060608486031215613c1657600080fd5b505081359360208301359350604090920135919050565b60008151808452613c458160208601602086016140f4565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680613c7357607f831692505b6020808410821415613c9557634e487b7160e01b600052602260045260246000fd5b818015613ca95760018114613cba57613ce7565b60ff19861689528489019650613ce7565b60008881526020902060005b86811015613cdf5781548b820152908501908301613cc6565b505084890196505b50505050505092915050565b6000613cff8285613c59565b8351613d0f8183602088016140f4565b6a16b6b4b732b9173539b7b760a91b9101908152600b01949350505050565b6000613d3a8285613c59565b8351613d4a8183602088016140f4565b6a16b9bab832b9173539b7b760a91b9101908152600b01949350505050565b6000613d758284613c59565b7131b7b73a3930b1ba16b6b2ba30973539b7b760711b81526012019392505050565b6000613da38284613c59565b6e3ab73932bb32b0b632b2173539b7b760891b8152600f019392505050565b6000613dce8285613c59565b656c6576656c2f60d01b81528351613ded8160068401602088016140f4565b64173539b7b760d91b60069290910191820152600b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613e3e90830184613c2d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613e895783516001600160a01b031683529284019291840191600101613e64565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015613ee357815180518552868101518786015285015115158585015260609093019290850190600101613eb2565b5091979650505050505050565b602081526000611b7f6020830184613c2d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601a908201527f546f6f206d616e7920707572636861736573206174206f6e6365000000000000604082015260600190565b602080825260139082015272496e73756666696369656e7420737570706c7960681b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f4c6f636b732063616e206f6e6c79206265206d696e746564207468726f756768604082015272081d1a1948195d995b9d0818dbdb9d1c9858dd606a1b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156140a5576140a561418a565b500190565b6000826140b9576140b96141a0565b500490565b60008160001904831182151516156140d8576140d861418a565b500290565b6000828210156140ef576140ef61418a565b500390565b60005b8381101561410f5781810151838201526020016140f7565b838111156115835750506000910152565b600181811c9082168061413457607f821691505b6020821081141561415557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561416f5761416f61418a565b5060010190565b600082614185576141856141a0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461201e57600080fd5b6001600160e01b03198116811461201e57600080fdfea26469706673582212209977672528efb2fa6629e304a51cd641de6f250d5a9b81e478f9f86957a4fd8664736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656963706473663333347835656b326c6f7275337037727832763370706d70706c7179787a6d70356a35627971696f6b666378646c6d2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4d696e657256657273654e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d564e4654000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656963706473663333347835656b326c6f7275337037727832763370706d70706c7179787a6d70356a35627971696f6b666378646c6d2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4d696e657256657273654e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d564e4654000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://bafybeicpdsf334x5ek2loru3p7rx2v3ppmpplqyxzmp5j5byqiokfcxdlm/
Arg [1] : _name (string): MinerVerseNFT
Arg [2] : _symbol (string): MVNFT
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [4] : 697066733a2f2f6261667962656963706473663333347835656b326c6f727533
Arg [5] : 7037727832763370706d70706c7179787a6d70356a35627971696f6b66637864
Arg [6] : 6c6d2f0000000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [8] : 4d696e657256657273654e465400000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [10] : 4d564e4654000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
72735:12849:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44396:224;;;;;;;;;;-1:-1:-1;44396:224:0;;;;;:::i;:::-;;:::i;:::-;;;14498:14:1;;14491:22;14473:41;;14461:2;14446:18;44396:224:0;;;;;;;;82053:85;;;;;;;;;;-1:-1:-1;82053:85:0;;;;;:::i;:::-;;:::i;:::-;;73387:40;;;;;;;;;;;;;;;;;;;28777:25:1;;;28765:2;28750:18;73387:40:0;28631:177:1;73297:37:0;;;;;;;;;;;;;;;;31215:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32775:221::-;;;;;;;;;;-1:-1:-1;32775:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11986:32:1;;;11968:51;;11956:2;11941:18;32775:221:0;11822:203:1;32298:411:0;;;;;;;;;;-1:-1:-1;32298:411:0;;;;;:::i;:::-;;:::i;81718:106::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;73249:41::-;;;;;;;;;;;;73288:2;73249:41;;76269:107;;;;;;;;;;-1:-1:-1;76353:15:0;76269:107;;75428:262;;;;;;;;;;-1:-1:-1;75428:262:0;;;;;:::i;:::-;;:::i;80944:176::-;;;;;;;;;;-1:-1:-1;80944:176:0;;;;;:::i;:::-;;:::i;45036:113::-;;;;;;;;;;-1:-1:-1;45124:10:0;:17;45036:113;;81940:107;;;;;;;;;;-1:-1:-1;81940:107:0;;;;;:::i;:::-;;:::i;75812:112::-;;;;;;;;;;-1:-1:-1;75812:112:0;;;;;:::i;:::-;;:::i;73778:29::-;;;;;;;;;;;;;;;;81458:168;;;;;;;;;;-1:-1:-1;81458:168:0;;;;;:::i;:::-;;:::i;79687:1014::-;;;;;;;;;;-1:-1:-1;79687:1014:0;;;;;:::i;:::-;;:::i;33525:339::-;;;;;;;;;;-1:-1:-1;33525:339:0;;;;;:::i;:::-;;:::i;75932:329::-;;;;;;;;;;-1:-1:-1;75932:329:0;;;;;:::i;:::-;;:::i;73434:45::-;;;;;;;;;;;;;;;;44704:256;;;;;;;;;;-1:-1:-1;44704:256:0;;;;;:::i;:::-;;:::i;73576:53::-;;;;;;;;;;;;73623:6;73576:53;;81263:187;;;;;;;;;;-1:-1:-1;81263:187:0;;;;;:::i;:::-;;:::i;77544:179::-;;;;;;;;;;-1:-1:-1;77544:179:0;;;;;:::i;:::-;;:::i;33935:185::-;;;;;;;;;;-1:-1:-1;33935:185:0;;;;;:::i;:::-;;:::i;77310:226::-;;;;;;;;;;-1:-1:-1;77310:226:0;;;;;:::i;:::-;;:::i;45226:233::-;;;;;;;;;;-1:-1:-1;45226:233:0;;;;;:::i;:::-;;:::i;84699:105::-;;;;;;;;;;-1:-1:-1;84699:105:0;;;;;:::i;:::-;;:::i;73816:26::-;;;;;;;;;;-1:-1:-1;73816:26:0;;;;;;;;83064:941;;;;;;;;;;-1:-1:-1;83064:941:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6874:86::-;;;;;;;;;;-1:-1:-1;6945:7:0;;-1:-1:-1;;;6945:7:0;;;;6874:86;;80726:210;;;;;;;;;;;;;:::i;30909:239::-;;;;;;;;;;-1:-1:-1;30909:239:0;;;;;:::i;:::-;;:::i;73341:39::-;;;;;;;;;;;;;;;;77891:263;;;;;;;;;;-1:-1:-1;77891:263:0;;;;;:::i;:::-;;:::i;84363:108::-;;;;;;;;;;-1:-1:-1;84363:108:0;;;;;:::i;:::-;;:::i;30639:208::-;;;;;;;;;;-1:-1:-1;30639:208:0;;;;;:::i;:::-;;:::i;9773:103::-;;;;;;;;;;;;;:::i;84599:92::-;;;;;;;;;;-1:-1:-1;84599:92:0;;;;;:::i;:::-;;:::i;73529:40::-;;;;;;;;;;;;;;;;73638:25;;;;;;;;;;;;;;;;84479:112;;;;;;;;;;-1:-1:-1;84479:112:0;;;;;:::i;:::-;;:::i;9122:87::-;;;;;;;;;;-1:-1:-1;9195:6:0;;-1:-1:-1;;;;;9195:6:0;9122:87;;78201:196;;;;;;;;;;-1:-1:-1;78201:196:0;;;;;:::i;:::-;;:::i;31384:104::-;;;;;;;;;;;;;:::i;81638:72::-;;;;;;;;;;;;;:::i;81130:125::-;;;;;;;;;;-1:-1:-1;81130:125:0;;;;;:::i;:::-;;:::i;33068:155::-;;;;;;;;;;-1:-1:-1;33068:155:0;;;;;:::i;:::-;;:::i;77731:152::-;;;;;;;;;;-1:-1:-1;77731:152:0;;;;;:::i;:::-;;:::i;84033:70::-;;;;;;;;;;;;;:::i;73740:31::-;;;;;;;;;;;;;;;;76384:134;;;;;;;;;;;;;:::i;73487:34::-;;;;;;;;;;;;;;;;73910:21;;;;;;;;;;-1:-1:-1;73910:21:0;;;;;:::i;:::-;;:::i;:::-;;;;29044:25:1;;;29100:2;29085:18;;29078:34;;;;29128:18;;;29121:34;29186:2;29171:18;;29164:34;29031:3;29016:19;73910:21:0;28813:391:1;73670:28:0;;;;;;;;;;;;;;;;34191:328;;;;;;;;;;-1:-1:-1;34191:328:0;;;;;:::i;:::-;;:::i;73129:26::-;;;;;;;;;;-1:-1:-1;73129:26:0;;;;-1:-1:-1;;;;;73129:26:0;;;76526:136;;;;;;;;;;;;;:::i;82144:113::-;;;;;;;;;;-1:-1:-1;82144:113:0;;;;;:::i;:::-;;:::i;73206:34::-;;;;;;;;;;;;73239:1;73206:34;;82265:642;;;;;;;;;;-1:-1:-1;82265:642:0;;;;;:::i;:::-;;:::i;74840:580::-;;;;;;:::i;:::-;;:::i;84816:169::-;;;;;;;;;;-1:-1:-1;84816:169:0;;;;;:::i;:::-;;:::i;81832:102::-;;;;;;;;;;-1:-1:-1;81832:102:0;;;;;:::i;:::-;;:::i;78650:1029::-;;;;;;;;;;-1:-1:-1;78650:1029:0;;;;;:::i;:::-;;:::i;75698:106::-;;;;;;;;;;-1:-1:-1;75698:106:0;;;;;:::i;:::-;;:::i;82915:141::-;;;;;;;;;;;;;:::i;84111:244::-;;;;;;;;;;-1:-1:-1;84111:244:0;;;;;:::i;:::-;;:::i;73705:28::-;;;;;;;;;;;;;;;;73066:22;;;;;;;;;;-1:-1:-1;73066:22:0;;;;-1:-1:-1;;;;;73066:22:0;;;10031:201;;;;;;;;;;-1:-1:-1;10031:201:0;;;;;:::i;:::-;;:::i;73162:35::-;;;;;;;;;;-1:-1:-1;73162:35:0;;;;;:::i;:::-;;:::i;74503:329::-;;;;;;:::i;:::-;;:::i;73095:27::-;;;;;;;;;;-1:-1:-1;73095:27:0;;;;-1:-1:-1;;;;;73095:27:0;;;78405:237;;;;;;;;;;-1:-1:-1;78405:237:0;;;;;:::i;:::-;;:::i;44396:224::-;44498:4;-1:-1:-1;;;;;;44522:50:0;;-1:-1:-1;;;44522:50:0;;:90;;;44576:36;44600:11;44576:23;:36::i;:::-;44515:97;44396:224;-1:-1:-1;;44396:224:0:o;82053:85::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;;;;;;;;;82115:7:::1;:15:::0;82053:85::o;31215:100::-;31269:13;31302:5;31295:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31215:100;:::o;32775:221::-;32851:7;36118:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36118:16:0;32871:73;;;;-1:-1:-1;;;32871:73:0;;22770:2:1;32871:73:0;;;22752:21:1;22809:2;22789:18;;;22782:30;22848:34;22828:18;;;22821:62;-1:-1:-1;;;22899:18:1;;;22892:42;22951:19;;32871:73:0;22568:408:1;32871:73:0;-1:-1:-1;32964:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32964:24:0;;32775:221::o;32298:411::-;32379:13;32395:23;32410:7;32395:14;:23::i;:::-;32379:39;;32443:5;-1:-1:-1;;;;;32437:11:0;:2;-1:-1:-1;;;;;32437:11:0;;;32429:57;;;;-1:-1:-1;;;32429:57:0;;25480:2:1;32429:57:0;;;25462:21:1;25519:2;25499:18;;;25492:30;25558:34;25538:18;;;25531:62;-1:-1:-1;;;25609:18:1;;;25602:31;25650:19;;32429:57:0;25278:397:1;32429:57:0;5608:10;-1:-1:-1;;;;;32521:21:0;;;;:62;;-1:-1:-1;32546:37:0;32563:5;5608:10;84111:244;:::i;32546:37::-;32499:168;;;;-1:-1:-1;;;32499:168:0;;19748:2:1;32499:168:0;;;19730:21:1;19787:2;19767:18;;;19760:30;19826:34;19806:18;;;19799:62;19897:26;19877:18;;;19870:54;19941:19;;32499:168:0;19546:420:1;32499:168:0;32680:21;32689:2;32693:7;32680:8;:21::i;:::-;32368:341;32298:411;;:::o;81718:106::-;81763:16;81798:18;81791:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81791:25:0;;;;;;;;;;;;;;;;;;;;;;81718:106;:::o;75428:262::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;75526:15:::1;75513:10;:28;75505:73;;;::::0;-1:-1:-1;;;75505:73:0;;22409:2:1;75505:73:0::1;::::0;::::1;22391:21:1::0;;;22428:18;;;22421:30;22487:34;22467:18;;;22460:62;22539:18;;75505:73:0::1;22207:356:1::0;75505:73:0::1;75598:15;:13;:15::i;:::-;75597:16;75589:55;;;::::0;-1:-1:-1;;;75589:55:0;;26234:2:1;75589:55:0::1;::::0;::::1;26216:21:1::0;26273:2;26253:18;;;26246:30;26312:28;26292:18;;;26285:56;26358:18;;75589:55:0::1;26032:350:1::0;75589:55:0::1;75655:14;:27:::0;75428:262::o;80944:176::-;81002:4;36118:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36118:16:0;81019:46;;;;-1:-1:-1;;;81019:46:0;;25135:2:1;81019:46:0;;;25117:21:1;25174:2;25154:18;;;25147:30;-1:-1:-1;;;25193:18:1;;;25186:46;25249:18;;81019:46:0;24933:340:1;81019:46:0;-1:-1:-1;81097:15:0;;-1:-1:-1;81085:27:0;;80944:176::o;81940:107::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;82013:18:::1;:26:::0;81940:107::o;75812:112::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;75889:18:::1;:27:::0;75812:112::o;81458:168::-;81517:7;81537:13;81553:28;81572:8;81553:18;:28::i;:::-;81537:44;;81599:6;81606:5;81599:13;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;81592:26;;;81458:168;;;:::o;79687:1014::-;79765:13;:11;:13::i;:::-;79757:52;;;;-1:-1:-1;;;79757:52:0;;28478:2:1;79757:52:0;;;28460:21:1;28517:2;28497:18;;;28490:30;28556:28;28536:18;;;28529:56;28602:18;;79757:52:0;28276:350:1;79757:52:0;73288:2;79828:10;:26;;;;79820:65;;;;-1:-1:-1;;;79820:65:0;;;;;;;:::i;:::-;79913:6;:13;73239:1;79904:22;:36;;;;-1:-1:-1;79939:1:0;79904:36;79896:62;;;;-1:-1:-1;;;79896:62:0;;21706:2:1;79896:62:0;;;21688:21:1;21745:2;21725:18;;;21718:30;-1:-1:-1;;;21764:18:1;;;21757:43;21817:18;;79896:62:0;21504:337:1;79896:62:0;80015:6;73239:1;80015:14;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;80001:10;79977:34;;:6;73239:1;79977:14;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;;:34;;;;:::i;:::-;:62;;79969:94;;;;-1:-1:-1;;;79969:94:0;;;;;;;:::i;:::-;80096:12;;-1:-1:-1;;;;;80096:12:0;80082:10;:26;80074:90;;;;-1:-1:-1;;;80074:90:0;;;;;;;:::i;:::-;80178:17;80211:6;73239:1;80211:14;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;80198:10;:33;;;;;;:::i;:::-;80178:53;;80262:7;9195:6;;-1:-1:-1;;;;;9195:6:0;;9122:87;80262:7;-1:-1:-1;;;;;80248:21:0;:10;-1:-1:-1;;;;;80248:21:0;;80244:172;;80293:7;;:22;;-1:-1:-1;;;80293:22:0;;-1:-1:-1;;;;;11986:32:1;;;80293:22:0;;;11968:51:1;80319:9:0;;80293:7;;:17;;11941:18:1;;80293:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;80285:76;;;;-1:-1:-1;;;80285:76:0;;20173:2:1;80285:76:0;;;20155:21:1;20212:2;20192:18;;;20185:30;20251;20231:18;;;20224:58;20299:18;;80285:76:0;19971:352:1;80285:76:0;80376:7;;:28;;-1:-1:-1;;;80376:28:0;;-1:-1:-1;;;;;12715:32:1;;;80376:28:0;;;12697:51:1;12764:18;;;12757:34;;;80376:7:0;;;;:12;;12670:18:1;;80376:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80244:172;80433:9;80428:266;80452:10;80448:14;;:1;:14;80428:266;;;80484:15;80520:13;;80502:15;;:31;;;;:::i;:::-;80484:49;;80548:23;80558:3;80563:7;80548:9;:23::i;:::-;80586:19;;;;:10;:19;;;;;73239:1;80586:28;;;;80629:6;:14;;:6;;73239:1;80629:14;;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;80667:13:0;:15;;;:13;:15;;;:::i;:::-;;;;;;80469:225;80464:3;;;;;:::i;:::-;;;;80428:266;;;;79746:955;79687:1014;;:::o;33525:339::-;33720:41;5608:10;33753:7;33720:18;:41::i;:::-;33712:103;;;;-1:-1:-1;;;33712:103:0;;;;;;;:::i;:::-;33828:28;33838:4;33844:2;33848:7;33828:9;:28::i;75932:329::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;76032:15:::1;76019:10;:28;76011:73;;;::::0;-1:-1:-1;;;76011:73:0;;22409:2:1;76011:73:0::1;::::0;::::1;22391:21:1::0;;;22428:18;;;22421:30;22487:34;22467:18;;;22460:62;22539:18;;76011:73:0::1;22207:356:1::0;76011:73:0::1;76104:15;:13;:15::i;:::-;76103:16;76095:55;;;::::0;-1:-1:-1;;;76095:55:0;;26234:2:1;76095:55:0::1;::::0;::::1;26216:21:1::0;26273:2;26253:18;;;26246:30;26312:28;26292:18;;;26285:56;26358:18;;76095:55:0::1;26032:350:1::0;76095:55:0::1;76170:13;:11;:13::i;:::-;76169:14;76161:50;;;::::0;-1:-1:-1;;;76161:50:0;;25882:2:1;76161:50:0::1;::::0;::::1;25864:21:1::0;25921:2;25901:18;;;25894:30;25960:25;25940:18;;;25933:53;26003:18;;76161:50:0::1;25680:347:1::0;76161:50:0::1;76224:16;:29:::0;75932:329::o;44704:256::-;44801:7;44837:23;44854:5;44837:16;:23::i;:::-;44829:5;:31;44821:87;;;;-1:-1:-1;;;44821:87:0;;15175:2:1;44821:87:0;;;15157:21:1;15214:2;15194:18;;;15187:30;15253:34;15233:18;;;15226:62;-1:-1:-1;;;15304:18:1;;;15297:41;15355:19;;44821:87:0;14973:407:1;44821:87:0;-1:-1:-1;;;;;;44926:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;44704:256::o;81263:187::-;81330:7;81358:23;81372:8;81358:13;:23::i;:::-;81350:52;;;;-1:-1:-1;;;81350:52:0;;27781:2:1;81350:52:0;;;27763:21:1;27820:2;27800:18;;;27793:30;-1:-1:-1;;;27839:18:1;;;27832:46;27895:18;;81350:52:0;27579:340:1;81350:52:0;-1:-1:-1;81422:20:0;;;;:10;:20;;;;;;;81263:187::o;77544:179::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;77627:6:::1;77622:94;77639:16:::0;;::::1;77622:94;;;77676:28;77692:1;77694:6;;77701:1;77694:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;77676:15;:28::i;:::-;77657:3:::0;::::1;::::0;::::1;:::i;:::-;;;;77622:94;;33935:185:::0;34073:39;34090:4;34096:2;34100:7;34073:39;;;;;;;;;;;;:16;:39::i;77310:226::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;77432:9:::1;77427:102;77447:15:::0;;::::1;77427:102;;;77483:18;77507:6;;77514:1;77507:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;77483:34:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;77483:34:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;77483:34:0::1;-1:-1:-1::0;;;;;77483:34:0;;::::1;::::0;;;::::1;::::0;;77464:3;::::1;::::0;::::1;:::i;:::-;;;;77427:102;;45226:233:::0;45301:7;45337:30;45124:10;:17;;45036:113;45337:30;45329:5;:38;45321:95;;;;-1:-1:-1;;;45321:95:0;;27007:2:1;45321:95:0;;;26989:21:1;27046:2;27026:18;;;27019:30;27085:34;27065:18;;;27058:62;-1:-1:-1;;;27136:18:1;;;27129:42;27188:19;;45321:95:0;26805:408:1;45321:95:0;45434:10;45445:5;45434:17;;;;;;;;:::i;:::-;;;;;;;;;45427:24;;45226:233;;;:::o;84699:105::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;84774:22;;::::1;::::0;:8:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;84699:105:::0;:::o;83064:941::-;83199:18;83245:17;83255:6;83245:9;:17::i;:::-;83234:7;:28;83230:86;;83286:18;;;83302:1;83286:18;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;83286:18:0;;;;;;;;;;;;;;;;;83279:25;;;;83230:86;83349:8;83394:17;83404:6;83394:9;:17::i;:::-;83372:18;83382:8;83372:7;:18;:::i;:::-;:39;83368:112;;83461:7;83441:17;83451:6;83441:9;:17::i;:::-;:27;;;;:::i;:::-;83428:40;;83368:112;83490:25;83534:10;83518:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;83518:27:0;;;;;;;;;;;;;;;;;83490:55;;83563:9;83558:414;83582:10;83578:1;:14;83558:414;;;83614:15;83632:40;83652:6;83660:11;83670:1;83660:7;:11;:::i;83632:40::-;83723:8;;83614:58;;-1:-1:-1;83687:13:0;;83723:8;;83719:84;;;83760:27;83779:7;83760:18;:27::i;:::-;83752:35;;83719:84;83831:129;;;;;;;;;;;;;;;;;83936:8;;;;83831:129;;;;;;;;;83819:9;;:6;;83826:1;;83819:9;;;;;;:::i;:::-;;;;;;:141;;;;83599:373;;83594:3;;;;;:::i;:::-;;;;83558:414;;;-1:-1:-1;83991:6:0;-1:-1:-1;;83064:941:0;;;;;;:::o;80726:210::-;80770:4;80794:15;:13;:15::i;:::-;:134;;;;;73623:6;80847:14;;:37;;;;:::i;:::-;80828:15;:56;;:89;;;;80902:15;;80888:10;;:29;80828:89;80787:141;;80726:210;:::o;30909:239::-;30981:7;31017:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31017:16:0;31052:19;31044:73;;;;-1:-1:-1;;;31044:73:0;;20941:2:1;31044:73:0;;;20923:21:1;20980:2;20960:18;;;20953:30;21019:34;20999:18;;;20992:62;-1:-1:-1;;;21070:18:1;;;21063:39;21119:19;;31044:73:0;20739:405:1;77891:263:0;77951:4;;77968:156;77987:18;:25;77985:27;;77968:156;;;78061:5;-1:-1:-1;;;;;78036:30:0;:18;78055:1;78036:21;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;78036:21:0;:30;78033:80;;;-1:-1:-1;78093:4:0;;77891:263;-1:-1:-1;;77891:263:0:o;78033:80::-;78014:3;;;;:::i;:::-;;;;77968:156;;;-1:-1:-1;78141:5:0;;77891:263;-1:-1:-1;;77891:263:0:o;84363:108::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;84437:11:::1;:26:::0;;-1:-1:-1;;;;;;84437:26:0::1;-1:-1:-1::0;;;;;84437:26:0;;;::::1;::::0;;;::::1;::::0;;84363:108::o;30639:208::-;30711:7;-1:-1:-1;;;;;30739:19:0;;30731:74;;;;-1:-1:-1;;;30731:74:0;;20530:2:1;30731:74:0;;;20512:21:1;20569:2;20549:18;;;20542:30;20608:34;20588:18;;;20581:62;-1:-1:-1;;;20659:18:1;;;20652:40;20709:19;;30731:74:0;20328:406:1;30731:74:0;-1:-1:-1;;;;;;30823:16:0;;;;;:9;:16;;;;;;;30639:208::o;9773:103::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;9838:30:::1;9865:1;9838:18;:30::i;:::-;9773:103::o:0;84599:92::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;84665:7:::1;:18:::0;;-1:-1:-1;;;;;;84665:18:0::1;-1:-1:-1::0;;;;;84665:18:0;;;::::1;::::0;;;::::1;::::0;;84599:92::o;84479:112::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;84555:12:::1;:28:::0;;-1:-1:-1;;;;;;84555:28:0::1;-1:-1:-1::0;;;;;84555:28:0;;;::::1;::::0;;;::::1;::::0;;84479:112::o;78201:196::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;78315:73:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;78315:73:0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;78303:6:::1;:86:::0;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;78201:196::o;31384:104::-;31440:13;31473:7;31466:14;;;;;:::i;81638:72::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;81696:6:::1;::::0;;-1:-1:-1;;81686:16:0;::::1;81696:6;::::0;;::::1;81695:7;81686:16;::::0;;81638:72::o;81130:125::-;81192:4;81216:19;81226:8;81216:9;:19::i;:::-;:31;;;-1:-1:-1;81239:8:0;;;;81209:38;81130:125;-1:-1:-1;;81130:125:0:o;33068:155::-;33163:52;5608:10;33196:8;33206;33163:18;:52::i;77731:152::-;77801:11;;-1:-1:-1;;;;;77801:11:0;77787:10;:25;77779:75;;;;-1:-1:-1;;;77779:75:0;;24729:2:1;77779:75:0;;;24711:21:1;24768:2;24748:18;;;24741:30;24807:34;24787:18;;;24780:62;-1:-1:-1;;;24858:18:1;;;24851:35;24903:19;;77779:75:0;24527:401:1;77779:75:0;77865:10;77871:3;77865:5;:10::i;:::-;77731:152;:::o;84033:70::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;84080:8:::1;:15:::0;;-1:-1:-1;;84080:15:0::1;84091:4;84080:15;::::0;;84033:70::o;76384:134::-;76430:4;76454:14;;76472:1;76454:19;;:56;;;;-1:-1:-1;;76496:14:0;;76477:15;:33;;;76384:134::o;73910:21::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73910:21:0;;;:::o;34191:328::-;34366:41;5608:10;34399:7;34366:18;:41::i;:::-;34358:103;;;;-1:-1:-1;;;34358:103:0;;;;;;;:::i;:::-;34472:39;34486:4;34492:2;34496:7;34505:5;34472:13;:39::i;76526:136::-;76570:4;76594:16;;76614:1;76594:21;;:60;;;;-1:-1:-1;;76638:16:0;;76619:15;:35;;;76526:136::o;82144:113::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;82220:21:::1;:29:::0;82144:113::o;82265:642::-;82339:13;82369:19;82379:8;82369:9;:19::i;:::-;82365:535;;;82436:8;82456:39;:28;82475:8;82456:18;:28::i;:::-;:37;:39::i;:::-;82419:86;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82405:101;;82265:642;;;:::o;82365:535::-;82529:23;82543:8;82529:13;:23::i;:::-;82524:376;;82600:8;82583:45;;;;;;;;:::i;82524:376::-;82651:28;82670:8;82651:18;:28::i;:::-;82683:1;82651:33;82647:253;;;82732:8;82742:19;:8;:17;:19::i;:::-;82715:62;;;;;;;;;:::i;82647:253::-;82842:8;82852:19;:8;:17;:19::i;:::-;82825:62;;;;;;;;;:::i;82647:253::-;82265:642;;;:::o;74840:580::-;9195:6;;-1:-1:-1;;;;;9195:6:0;74916:10;:21;74912:137;;75004:7;;74983:18;;74970:31;;;;;;:::i;:::-;:41;;;;:::i;:::-;74957:9;:54;;74949:88;;;;-1:-1:-1;;;74949:88:0;;18627:2:1;74949:88:0;;;18609:21:1;18666:2;18646:18;;;18639:30;-1:-1:-1;;;18685:18:1;;;18678:51;18746:18;;74949:88:0;18425:345:1;74949:88:0;75067:13;:11;:13::i;:::-;75059:49;;;;-1:-1:-1;;;75059:49:0;;28126:2:1;75059:49:0;;;28108:21:1;28165:2;28145:18;;;28138:30;28204:25;28184:18;;;28177:53;28247:18;;75059:49:0;27924:347:1;75059:49:0;75157:18;;75143:10;75127:26;;:13;;:26;;;;:::i;:::-;:48;;75119:88;;;;-1:-1:-1;;;75119:88:0;;16006:2:1;75119:88:0;;;15988:21:1;16045:2;16025:18;;;16018:30;16084:29;16064:18;;;16057:57;16131:18;;75119:88:0;15804:351:1;75119:88:0;75223:6;;;;75218:105;;75250:27;5608:10;77891:263;:::i;75250:27::-;75242:69;;;;-1:-1:-1;;;75242:69:0;;19390:2:1;75242:69:0;;;19372:21:1;19429:2;19409:18;;;19402:30;19468:31;19448:18;;;19441:59;19517:18;;75242:69:0;19188:353:1;75242:69:0;75333:41;75349:10;5608;77676:15:::1;:28::i;75333:41::-:0;75402:10;75385:27;;:13;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;;74840:580:0:o;84816:169::-;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;84907:21:::1;84896:7;:32;;84888:41;;;::::0;::::1;;84940:37;::::0;84948:10:::1;::::0;84940:37;::::1;;;::::0;84969:7;;84940:37:::1;::::0;;;84969:7;84948:10;84940:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;81832:102:::0;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;81903:15:::1;:23:::0;81832:102::o;78650:1029::-;78734:13;:11;:13::i;:::-;78726:52;;;;-1:-1:-1;;;78726:52:0;;28478:2:1;78726:52:0;;;28460:21:1;28517:2;28497:18;;;28490:30;28556:28;28536:18;;;28529:56;28602:18;;78726:52:0;28276:350:1;78726:52:0;73288:2;78797:10;:26;;;;78789:65;;;;-1:-1:-1;;;78789:65:0;;;;;;;:::i;:::-;78882:6;:13;78873:22;;:36;;;;;78908:1;78899:6;:10;78873:36;78865:62;;;;-1:-1:-1;;;78865:62:0;;21706:2:1;78865:62:0;;;21688:21:1;21745:2;21725:18;;;21718:30;-1:-1:-1;;;21764:18:1;;;21757:43;21817:18;;78865:62:0;21504:337:1;78865:62:0;78984:6;78991;78984:14;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;78970:10;78946:34;;:6;78953;78946:14;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;;:34;;;;:::i;:::-;:62;;78938:94;;;;-1:-1:-1;;;78938:94:0;;;;;;;:::i;:::-;73239:1;79051:6;:16;;79043:80;;;;-1:-1:-1;;;79043:80:0;;;;;;;:::i;:::-;79137:17;79170:6;79177;79170:14;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;79157:10;:33;;;;;;:::i;:::-;79137:53;;79221:7;9195:6;;-1:-1:-1;;;;;9195:6:0;;9122:87;79221:7;-1:-1:-1;;;;;79207:21:0;:10;-1:-1:-1;;;;;79207:21:0;;79203:186;;79252:7;;:29;;-1:-1:-1;;;79252:29:0;;79270:10;79252:29;;;11968:51:1;79285:9:0;;-1:-1:-1;;;;;79252:7:0;;:17;;11941:18:1;;79252:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;79244:83;;;;-1:-1:-1;;;79244:83:0;;20173:2:1;79244:83:0;;;20155:21:1;20212:2;20192:18;;;20185:30;20251;20231:18;;;20224:58;20299:18;;79244:83:0;19971:352:1;79244:83:0;79342:7;;:35;;-1:-1:-1;;;79342:35:0;;79355:10;79342:35;;;12697:51:1;12764:18;;;12757:34;;;-1:-1:-1;;;;;79342:7:0;;;;:12;;12670:18:1;;79342:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79203:186;79404:9;79399:273;79423:10;79419:14;;:1;:14;79399:273;;;79455:15;79491:13;;79473:15;;:31;;;;:::i;:::-;79455:49;;79519:30;79529:10;79541:7;79519:9;:30::i;:::-;79564:19;;;;:10;:19;;;;;:28;;;79607:6;:14;;79586:6;;79607:14;;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;79645:13:0;:15;;;:13;:15;;;:::i;:::-;;;;;;79440:232;79435:3;;;;;:::i;:::-;;;;79399:273;;75698:106;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;75772:15:::1;:24:::0;75698:106::o;82915:141::-;82959:13;83016:8;82999:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;82985:63;;82915:141;:::o;84111:244::-;84236:11;;84202:4;;-1:-1:-1;;;;;84223:24:0;;;84236:11;;84223:24;84219:68;;;-1:-1:-1;84271:4:0;84264:11;;84219:68;-1:-1:-1;;;;;33415:25:0;;;33391:4;33415:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;84306:41;33294:164;10031:201;9195:6;;-1:-1:-1;;;;;9195:6:0;5608:10;9342:23;9334:68;;;;-1:-1:-1;;;9334:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10120:22:0;::::1;10112:73;;;::::0;-1:-1:-1;;;10112:73:0;;16362:2:1;10112:73:0::1;::::0;::::1;16344:21:1::0;16401:2;16381:18;;;16374:30;16440:34;16420:18;;;16413:62;-1:-1:-1;;;16491:18:1;;;16484:36;16537:19;;10112:73:0::1;16160:402:1::0;10112:73:0::1;10196:28;10215:8;10196:18;:28::i;73162:35::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73162:35:0;;-1:-1:-1;73162:35:0;:::o;74503:329::-;9195:6;;-1:-1:-1;;;;;9195:6:0;74572:10;:21;74568:134;;74657:7;;74639:15;;74626:28;;;;;;:::i;:::-;:38;;;;:::i;:::-;74613:9;:51;;74605:85;;;;-1:-1:-1;;;74605:85:0;;18627:2:1;74605:85:0;;;18609:21:1;18666:2;18646:18;;;18639:30;-1:-1:-1;;;18685:18:1;;;18678:51;18746:18;;74605:85:0;18425:345:1;74605:85:0;74720:15;:13;:15::i;:::-;74712:60;;;;-1:-1:-1;;;74712:60:0;;27420:2:1;74712:60:0;;;27402:21:1;;;27439:18;;;27432:30;27498:34;27478:18;;;27471:62;27550:18;;74712:60:0;27218:356:1;74712:60:0;74783:41;74799:10;5608;77676:15:::1;:28::i;78405:237::-:0;78504:12;;-1:-1:-1;;;;;78504:12:0;78490:10;:26;;:51;;-1:-1:-1;9195:6:0;;-1:-1:-1;;;;;9195:6:0;78520:10;:21;78490:51;78482:112;;;;-1:-1:-1;;;78482:112:0;;23892:2:1;78482:112:0;;;23874:21:1;23931:2;23911:18;;;23904:30;23970:34;23950:18;;;23943:62;-1:-1:-1;;;24021:18:1;;;24014:46;24077:19;;78482:112:0;23690:412:1;78482:112:0;78628:6;78605;78612;78605:14;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;:29;;;;78405:237;;:::o;30270:305::-;30372:4;-1:-1:-1;;;;;;30409:40:0;;-1:-1:-1;;;30409:40:0;;:105;;-1:-1:-1;;;;;;;30466:48:0;;-1:-1:-1;;;30466:48:0;30409:105;:158;;;-1:-1:-1;;;;;;;;;;13535:40:0;;;30531:36;13426:157;40175:174;40250:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;40250:29:0;-1:-1:-1;;;;;40250:29:0;;;;;;;;:24;;40304:23;40250:24;40304:14;:23::i;:::-;-1:-1:-1;;;;;40295:46:0;;;;;;;;;;;40175:174;;:::o;37013:110::-;37089:26;37099:2;37103:7;37089:26;;;;;;;;;;;;:9;:26::i;36323:348::-;36416:4;36118:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36118:16:0;36433:73;;;;-1:-1:-1;;;36433:73:0;;18977:2:1;36433:73:0;;;18959:21:1;19016:2;18996:18;;;18989:30;19055:34;19035:18;;;19028:62;-1:-1:-1;;;19106:18:1;;;19099:42;19158:19;;36433:73:0;18775:408:1;36433:73:0;36517:13;36533:23;36548:7;36533:14;:23::i;:::-;36517:39;;36586:5;-1:-1:-1;;;;;36575:16:0;:7;-1:-1:-1;;;;;36575:16:0;;:52;;;;36595:32;36612:5;36619:7;36595:16;:32::i;:::-;36575:87;;;;36655:7;-1:-1:-1;;;;;36631:31:0;:20;36643:7;36631:11;:20::i;:::-;-1:-1:-1;;;;;36631:31:0;;36575:87;36567:96;36323:348;-1:-1:-1;;;;36323:348:0:o;39432:625::-;39591:4;-1:-1:-1;;;;;39564:31:0;:23;39579:7;39564:14;:23::i;:::-;-1:-1:-1;;;;;39564:31:0;;39556:81;;;;-1:-1:-1;;;39556:81:0;;16769:2:1;39556:81:0;;;16751:21:1;16808:2;16788:18;;;16781:30;16847:34;16827:18;;;16820:62;-1:-1:-1;;;16898:18:1;;;16891:35;16943:19;;39556:81:0;16567:401:1;39556:81:0;-1:-1:-1;;;;;39656:16:0;;39648:65;;;;-1:-1:-1;;;39648:65:0;;17868:2:1;39648:65:0;;;17850:21:1;17907:2;17887:18;;;17880:30;17946:34;17926:18;;;17919:62;-1:-1:-1;;;17997:18:1;;;17990:34;18041:19;;39648:65:0;17666:400:1;39648:65:0;39726:39;39747:4;39753:2;39757:7;39726:20;:39::i;:::-;39830:29;39847:1;39851:7;39830:8;:29::i;:::-;-1:-1:-1;;;;;39872:15:0;;;;;;:9;:15;;;;;:20;;39891:1;;39872:15;:20;;39891:1;;39872:20;:::i;:::-;;;;-1:-1:-1;;;;;;;39903:13:0;;;;;;:9;:13;;;;;:18;;39920:1;;39903:13;:18;;39920:1;;39903:18;:::i;:::-;;;;-1:-1:-1;;39932:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39932:21:0;-1:-1:-1;;;;;39932:21:0;;;;;;;;;39971:27;;39932:16;;39971:27;;;;;;;32368:341;32298:411;;:::o;76670:632::-;76783:15;;76769:10;76756:23;;:10;;:23;;;;:::i;:::-;:42;;76748:74;;;;-1:-1:-1;;;76748:74:0;;;;;;;:::i;:::-;73288:2;76841:10;:26;;;;76833:65;;;;-1:-1:-1;;;76833:65:0;;;;;;;:::i;:::-;76916:6;76911:384;76932:10;76928:14;;:1;:14;76911:384;;;76982:10;;77007:24;77017:4;76982:10;77007:9;:24::i;:::-;77046:10;:12;;;:10;:12;;;:::i;:::-;;;;;;77108:21;;77102:3;77079:20;77085:13;45124:10;:17;;45036:113;77085:13;77079:5;:20::i;:::-;:26;;;;:::i;:::-;:50;77075:209;;;77150:19;;;;:10;:19;;;;;77172:1;77150:23;;77075:209;;;77251:1;77229:19;;;:10;:19;;;;;:23;77075:209;-1:-1:-1;76944:3:0;;;;:::i;:::-;;;;76911:384;;10392:191;10485:6;;;-1:-1:-1;;;;;10502:17:0;;;-1:-1:-1;;;;;;10502:17:0;;;;;;;10535:40;;10485:6;;;10502:17;10485:6;;10535:40;;10466:16;;10535:40;10455:128;10392:191;:::o;40491:315::-;40646:8;-1:-1:-1;;;;;40637:17:0;:5;-1:-1:-1;;;;;40637:17:0;;;40629:55;;;;-1:-1:-1;;;40629:55:0;;18273:2:1;40629:55:0;;;18255:21:1;18312:2;18292:18;;;18285:30;18351:27;18331:18;;;18324:55;18396:18;;40629:55:0;18071:349:1;40629:55:0;-1:-1:-1;;;;;40695:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;40695:46:0;;;;;;;;;;40757:41;;14473::1;;;40757::0;;14446:18:1;40757:41:0;;;;;;;40491:315;;;:::o;38675:420::-;38735:13;38751:23;38766:7;38751:14;:23::i;:::-;38735:39;;38787:48;38808:5;38823:1;38827:7;38787:20;:48::i;:::-;38876:29;38893:1;38897:7;38876:8;:29::i;:::-;-1:-1:-1;;;;;38918:16:0;;;;;;:9;:16;;;;;:21;;38938:1;;38918:16;:21;;38938:1;;38918:21;:::i;:::-;;;;-1:-1:-1;;38957:16:0;;;;:7;:16;;;;;;38950:23;;-1:-1:-1;;;;;;38950:23:0;;;38991:36;38965:7;;38957:16;-1:-1:-1;;;;;38991:36:0;;;;;38957:16;;38991:36;84774:22:::1;84699:105:::0;:::o;35401:315::-;35558:28;35568:4;35574:2;35578:7;35558:9;:28::i;:::-;35605:48;35628:4;35634:2;35638:7;35647:5;35605:22;:48::i;:::-;35597:111;;;;-1:-1:-1;;;35597:111:0;;;;;;;:::i;3090:723::-;3146:13;3367:10;3363:53;;-1:-1:-1;;3394:10:0;;;;;;;;;;;;-1:-1:-1;;;3394:10:0;;;;;3090:723::o;3363:53::-;3441:5;3426:12;3482:78;3489:9;;3482:78;;3515:8;;;;:::i;:::-;;-1:-1:-1;3538:10:0;;-1:-1:-1;3546:2:0;3538:10;;:::i;:::-;;;3482:78;;;3570:19;3602:6;3592:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3592:17:0;;3570:39;;3620:154;3627:10;;3620:154;;3654:11;3664:1;3654:11;;:::i;:::-;;-1:-1:-1;3723:10:0;3731:2;3723:5;:10;:::i;:::-;3710:24;;:2;:24;:::i;:::-;3697:39;;3680:6;3687;3680:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3680:56:0;;;;;;;;-1:-1:-1;3751:11:0;3760:2;3751:11;;:::i;:::-;;;3620:154;;37350:321;37480:18;37486:2;37490:7;37480:5;:18::i;:::-;37531:54;37562:1;37566:2;37570:7;37579:5;37531:22;:54::i;:::-;37509:154;;;;-1:-1:-1;;;37509:154:0;;;;;;;:::i;46072:589::-;-1:-1:-1;;;;;46278:18:0;;46274:187;;46313:40;46345:7;47488:10;:17;;47461:24;;;;:15;:24;;;;;:44;;;47516:24;;;;;;;;;;;;47384:164;46313:40;46274:187;;;46383:2;-1:-1:-1;;;;;46375:10:0;:4;-1:-1:-1;;;;;46375:10:0;;46371:90;;46402:47;46435:4;46441:7;46402:32;:47::i;:::-;-1:-1:-1;;;;;46475:16:0;;46471:183;;46508:45;46545:7;46508:36;:45::i;46471:183::-;46581:4;-1:-1:-1;;;;;46575:10:0;:2;-1:-1:-1;;;;;46575:10:0;;46571:83;;46602:40;46630:2;46634:7;46602:27;:40::i;85025:556::-;85078:7;85106:9;5608:10;85106:25;85098:46;;;;-1:-1:-1;;;85098:46:0;;17532:2:1;85098:46:0;;;17514:21:1;17571:1;17551:18;;;17544:29;-1:-1:-1;;;17589:18:1;;;17582:38;17637:18;;85098:46:0;17330:331:1;85098:46:0;85263:16;85278:1;85263:12;:16;:::i;:::-;85253:27;85303:9;85345:16;85360:1;85345:12;:16;:::i;:::-;85335:27;85395:16;85410:1;85395:12;:16;:::i;:::-;85385:27;85445:16;85460:1;85445:12;:16;:::i;:::-;85214:333;;;;;;8950:19:1;;;;9007:2;9003:15;;;;-1:-1:-1;;8999:53:1;8985:12;;;8978:75;;;;9069:12;;;9062:28;;;;9106:12;;;9099:28;85435:27:0;9143:13:1;;;9136:29;9181:13;;;9174:29;;;85513:15:0;9219:13:1;;;9212:29;9257:13;;85214:333:0;;;-1:-1:-1;;85214:333:0;;;;;;;;;85186:376;;85214:333;85186:376;;;;;85025:556;-1:-1:-1;;85025:556:0:o;41371:799::-;41526:4;-1:-1:-1;;;;;41547:13:0;;21888:19;:23;41543:620;;41583:72;;-1:-1:-1;;;41583:72:0;;-1:-1:-1;;;;;41583:36:0;;;;;:72;;5608:10;;41634:4;;41640:7;;41649:5;;41583:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41583:72:0;;;;;;;;-1:-1:-1;;41583:72:0;;;;;;;;;;;;:::i;:::-;;;41579:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41825:13:0;;41821:272;;41868:60;;-1:-1:-1;;;41868:60:0;;;;;;;:::i;41821:272::-;42043:6;42037:13;42028:6;42024:2;42020:15;42013:38;41579:529;-1:-1:-1;;;;;;41706:51:0;-1:-1:-1;;;41706:51:0;;-1:-1:-1;41699:58:0;;41543:620;-1:-1:-1;42147:4:0;41371:799;;;;;;:::o;38007:439::-;-1:-1:-1;;;;;38087:16:0;;38079:61;;;;-1:-1:-1;;;38079:61:0;;22048:2:1;38079:61:0;;;22030:21:1;;;22067:18;;;22060:30;22126:34;22106:18;;;22099:62;22178:18;;38079:61:0;21846:356:1;38079:61:0;36094:4;36118:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36118:16:0;:30;38151:58;;;;-1:-1:-1;;;38151:58:0;;17175:2:1;38151:58:0;;;17157:21:1;17214:2;17194:18;;;17187:30;17253;17233:18;;;17226:58;17301:18;;38151:58:0;16973:352:1;38151:58:0;38222:45;38251:1;38255:2;38259:7;38222:20;:45::i;:::-;-1:-1:-1;;;;;38280:13:0;;;;;;:9;:13;;;;;:18;;38297:1;;38280:13;:18;;38297:1;;38280:18;:::i;:::-;;;;-1:-1:-1;;38309:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38309:21:0;-1:-1:-1;;;;;38309:21:0;;;;;;;;38348:33;;38309:16;;;38348:33;;38309:16;;38348:33;84774:22:::1;84699:105:::0;:::o;48175:988::-;48441:22;48491:1;48466:22;48483:4;48466:16;:22::i;:::-;:26;;;;:::i;:::-;48503:18;48524:26;;;:17;:26;;;;;;48441:51;;-1:-1:-1;48657:28:0;;;48653:328;;-1:-1:-1;;;;;48724:18:0;;48702:19;48724:18;;;:12;:18;;;;;;;;:34;;;;;;;;;48775:30;;;;;;:44;;;48892:30;;:17;:30;;;;;:43;;;48653:328;-1:-1:-1;49077:26:0;;;;:17;:26;;;;;;;;49070:33;;;-1:-1:-1;;;;;49121:18:0;;;;;:12;:18;;;;;:34;;;;;;;49114:41;48175:988::o;49458:1079::-;49736:10;:17;49711:22;;49736:21;;49756:1;;49736:21;:::i;:::-;49768:18;49789:24;;;:15;:24;;;;;;50162:10;:26;;49711:46;;-1:-1:-1;49789:24:0;;49711:46;;50162:26;;;;;;:::i;:::-;;;;;;;;;50140:48;;50226:11;50201:10;50212;50201:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;50306:28;;;:15;:28;;;;;;;:41;;;50478:24;;;;;50471:31;50513:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49529:1008;;;49458:1079;:::o;46962:221::-;47047:14;47064:20;47081:2;47064:16;:20::i;:::-;-1:-1:-1;;;;;47095:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;47140:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;46962:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:159::-;717:20;;777:6;766:18;;756:29;;746:57;;799:1;796;789:12;814:247;873:6;926:2;914:9;905:7;901:23;897:32;894:52;;;942:1;939;932:12;894:52;981:9;968:23;1000:31;1025:5;1000:31;:::i;1066:388::-;1134:6;1142;1195:2;1183:9;1174:7;1170:23;1166:32;1163:52;;;1211:1;1208;1201:12;1163:52;1250:9;1237:23;1269:31;1294:5;1269:31;:::i;:::-;1319:5;-1:-1:-1;1376:2:1;1361:18;;1348:32;1389:33;1348:32;1389:33;:::i;:::-;1441:7;1431:17;;;1066:388;;;;;:::o;1459:456::-;1536:6;1544;1552;1605:2;1593:9;1584:7;1580:23;1576:32;1573:52;;;1621:1;1618;1611:12;1573:52;1660:9;1647:23;1679:31;1704:5;1679:31;:::i;:::-;1729:5;-1:-1:-1;1786:2:1;1771:18;;1758:32;1799:33;1758:32;1799:33;:::i;:::-;1459:456;;1851:7;;-1:-1:-1;;;1905:2:1;1890:18;;;;1877:32;;1459:456::o;1920:794::-;2015:6;2023;2031;2039;2092:3;2080:9;2071:7;2067:23;2063:33;2060:53;;;2109:1;2106;2099:12;2060:53;2148:9;2135:23;2167:31;2192:5;2167:31;:::i;:::-;2217:5;-1:-1:-1;2274:2:1;2259:18;;2246:32;2287:33;2246:32;2287:33;:::i;:::-;2339:7;-1:-1:-1;2393:2:1;2378:18;;2365:32;;-1:-1:-1;2448:2:1;2433:18;;2420:32;2475:18;2464:30;;2461:50;;;2507:1;2504;2497:12;2461:50;2530:22;;2583:4;2575:13;;2571:27;-1:-1:-1;2561:55:1;;2612:1;2609;2602:12;2561:55;2635:73;2700:7;2695:2;2682:16;2677:2;2673;2669:11;2635:73;:::i;:::-;2625:83;;;1920:794;;;;;;;:::o;2719:416::-;2784:6;2792;2845:2;2833:9;2824:7;2820:23;2816:32;2813:52;;;2861:1;2858;2851:12;2813:52;2900:9;2887:23;2919:31;2944:5;2919:31;:::i;:::-;2969:5;-1:-1:-1;3026:2:1;3011:18;;2998:32;3068:15;;3061:23;3049:36;;3039:64;;3099:1;3096;3089:12;3140:315;3208:6;3216;3269:2;3257:9;3248:7;3244:23;3240:32;3237:52;;;3285:1;3282;3275:12;3237:52;3324:9;3311:23;3343:31;3368:5;3343:31;:::i;:::-;3393:5;3445:2;3430:18;;;;3417:32;;-1:-1:-1;;;3140:315:1:o;3460:383::-;3537:6;3545;3553;3606:2;3594:9;3585:7;3581:23;3577:32;3574:52;;;3622:1;3619;3612:12;3574:52;3661:9;3648:23;3680:31;3705:5;3680:31;:::i;:::-;3730:5;3782:2;3767:18;;3754:32;;-1:-1:-1;3833:2:1;3818:18;;;3805:32;;3460:383;-1:-1:-1;;;3460:383:1:o;3848:615::-;3934:6;3942;3995:2;3983:9;3974:7;3970:23;3966:32;3963:52;;;4011:1;4008;4001:12;3963:52;4051:9;4038:23;4080:18;4121:2;4113:6;4110:14;4107:34;;;4137:1;4134;4127:12;4107:34;4175:6;4164:9;4160:22;4150:32;;4220:7;4213:4;4209:2;4205:13;4201:27;4191:55;;4242:1;4239;4232:12;4191:55;4282:2;4269:16;4308:2;4300:6;4297:14;4294:34;;;4324:1;4321;4314:12;4294:34;4377:7;4372:2;4362:6;4359:1;4355:14;4351:2;4347:23;4343:32;4340:45;4337:65;;;4398:1;4395;4388:12;4337:65;4429:2;4421:11;;;;;4451:6;;-1:-1:-1;3848:615:1;;-1:-1:-1;;;;3848:615:1:o;4468:245::-;4526:6;4579:2;4567:9;4558:7;4554:23;4550:32;4547:52;;;4595:1;4592;4585:12;4547:52;4634:9;4621:23;4653:30;4677:5;4653:30;:::i;4718:249::-;4787:6;4840:2;4828:9;4819:7;4815:23;4811:32;4808:52;;;4856:1;4853;4846:12;4808:52;4888:9;4882:16;4907:30;4931:5;4907:30;:::i;5240:450::-;5309:6;5362:2;5350:9;5341:7;5337:23;5333:32;5330:52;;;5378:1;5375;5368:12;5330:52;5418:9;5405:23;5451:18;5443:6;5440:30;5437:50;;;5483:1;5480;5473:12;5437:50;5506:22;;5559:4;5551:13;;5547:27;-1:-1:-1;5537:55:1;;5588:1;5585;5578:12;5537:55;5611:73;5676:7;5671:2;5658:16;5653:2;5649;5645:11;5611:73;:::i;5695:184::-;5753:6;5806:2;5794:9;5785:7;5781:23;5777:32;5774:52;;;5822:1;5819;5812:12;5774:52;5845:28;5863:9;5845:28;:::i;5884:319::-;5951:6;5959;6012:2;6000:9;5991:7;5987:23;5983:32;5980:52;;;6028:1;6025;6018:12;5980:52;6051:28;6069:9;6051:28;:::i;6208:180::-;6267:6;6320:2;6308:9;6299:7;6295:23;6291:32;6288:52;;;6336:1;6333;6326:12;6288:52;-1:-1:-1;6359:23:1;;6208:180;-1:-1:-1;6208:180:1:o;6393:184::-;6463:6;6516:2;6504:9;6495:7;6491:23;6487:32;6484:52;;;6532:1;6529;6522:12;6484:52;-1:-1:-1;6555:16:1;;6393:184;-1:-1:-1;6393:184:1:o;6582:252::-;6649:6;6657;6710:2;6698:9;6689:7;6685:23;6681:32;6678:52;;;6726:1;6723;6716:12;6678:52;6762:9;6749:23;6739:33;;6791:37;6824:2;6813:9;6809:18;6791:37;:::i;:::-;6781:47;;6582:252;;;;;:::o;6839:248::-;6907:6;6915;6968:2;6956:9;6947:7;6943:23;6939:32;6936:52;;;6984:1;6981;6974:12;6936:52;-1:-1:-1;;7007:23:1;;;7077:2;7062:18;;;7049:32;;-1:-1:-1;6839:248:1:o;7092:316::-;7169:6;7177;7185;7238:2;7226:9;7217:7;7213:23;7209:32;7206:52;;;7254:1;7251;7244:12;7206:52;-1:-1:-1;;7277:23:1;;;7347:2;7332:18;;7319:32;;-1:-1:-1;7398:2:1;7383:18;;;7370:32;;7092:316;-1:-1:-1;7092:316:1:o;7413:257::-;7454:3;7492:5;7486:12;7519:6;7514:3;7507:19;7535:63;7591:6;7584:4;7579:3;7575:14;7568:4;7561:5;7557:16;7535:63;:::i;:::-;7652:2;7631:15;-1:-1:-1;;7627:29:1;7618:39;;;;7659:4;7614:50;;7413:257;-1:-1:-1;;7413:257:1:o;7675:973::-;7760:12;;7725:3;;7815:1;7835:18;;;;7888;;;;7915:61;;7969:4;7961:6;7957:17;7947:27;;7915:61;7995:2;8043;8035:6;8032:14;8012:18;8009:38;8006:161;;;8089:10;8084:3;8080:20;8077:1;8070:31;8124:4;8121:1;8114:15;8152:4;8149:1;8142:15;8006:161;8183:18;8210:104;;;;8328:1;8323:319;;;;8176:466;;8210:104;-1:-1:-1;;8243:24:1;;8231:37;;8288:16;;;;-1:-1:-1;8210:104:1;;8323:319;29282:1;29275:14;;;29319:4;29306:18;;8417:1;8431:165;8445:6;8442:1;8439:13;8431:165;;;8523:14;;8510:11;;;8503:35;8566:16;;;;8460:10;;8431:165;;;8435:3;;8625:6;8620:3;8616:16;8609:23;;8176:466;;;;;;;7675:973;;;;:::o;9281:550::-;9558:3;9586:38;9620:3;9612:6;9586:38;:::i;:::-;9653:6;9647:13;9669:52;9714:6;9710:2;9703:4;9695:6;9691:17;9669:52;:::i;:::-;-1:-1:-1;;;9743:15:1;;9767:28;;;9822:2;9811:14;;9281:550;-1:-1:-1;;;;9281:550:1:o;9836:::-;10113:3;10141:38;10175:3;10167:6;10141:38;:::i;:::-;10208:6;10202:13;10224:52;10269:6;10265:2;10258:4;10250:6;10246:17;10224:52;:::i;:::-;-1:-1:-1;;;10298:15:1;;10322:28;;;10377:2;10366:14;;9836:550;-1:-1:-1;;;;9836:550:1:o;10391:369::-;10620:3;10648:38;10682:3;10674:6;10648:38;:::i;:::-;-1:-1:-1;;;10695:32:1;;10751:2;10743:11;;10391:369;-1:-1:-1;;;10391:369:1:o;10765:366::-;10994:3;11022:38;11056:3;11048:6;11022:38;:::i;:::-;-1:-1:-1;;;11069:29:1;;11122:2;11114:11;;10765:366;-1:-1:-1;;;10765:366:1:o;11136:681::-;11514:3;11542:38;11576:3;11568:6;11542:38;:::i;:::-;-1:-1:-1;;;11596:2:1;11589:20;11638:6;11632:13;11654:60;11707:6;11703:1;11699:2;11695:10;11688:4;11680:6;11676:17;11654:60;:::i;:::-;-1:-1:-1;;;11772:1:1;11733:15;;;;11764:10;;;11757:27;11808:2;11800:11;;11136:681;-1:-1:-1;;;;11136:681:1:o;12030:488::-;-1:-1:-1;;;;;12299:15:1;;;12281:34;;12351:15;;12346:2;12331:18;;12324:43;12398:2;12383:18;;12376:34;;;12446:3;12441:2;12426:18;;12419:31;;;12224:4;;12467:45;;12492:19;;12484:6;12467:45;:::i;:::-;12459:53;12030:488;-1:-1:-1;;;;;;12030:488:1:o;12802:658::-;12973:2;13025:21;;;13095:13;;12998:18;;;13117:22;;;12944:4;;12973:2;13196:15;;;;13170:2;13155:18;;;12944:4;13239:195;13253:6;13250:1;13247:13;13239:195;;;13318:13;;-1:-1:-1;;;;;13314:39:1;13302:52;;13409:15;;;;13374:12;;;;13350:1;13268:9;13239:195;;;-1:-1:-1;13451:3:1;;12802:658;-1:-1:-1;;;;;;12802:658:1:o;13465:863::-;13690:2;13742:21;;;13812:13;;13715:18;;;13834:22;;;13661:4;;13690:2;13875;;13893:18;;;;13934:15;;;13661:4;13977:325;13991:6;13988:1;13985:13;13977:325;;;14050:13;;14088:9;;14076:22;;14138:11;;;14132:18;14118:12;;;14111:40;14205:11;;14199:18;14192:26;14185:34;14171:12;;;14164:56;14249:4;14240:14;;;;14277:15;;;;14013:1;14006:9;13977:325;;;-1:-1:-1;14319:3:1;;13465:863;-1:-1:-1;;;;;;;13465:863:1:o;14749:219::-;14898:2;14887:9;14880:21;14861:4;14918:44;14958:2;14947:9;14943:18;14935:6;14918:44;:::i;15385:414::-;15587:2;15569:21;;;15626:2;15606:18;;;15599:30;15665:34;15660:2;15645:18;;15638:62;-1:-1:-1;;;15731:2:1;15716:18;;15709:48;15789:3;15774:19;;15385:414::o;21149:350::-;21351:2;21333:21;;;21390:2;21370:18;;;21363:30;21429:28;21424:2;21409:18;;21402:56;21490:2;21475:18;;21149:350::o;22981:343::-;23183:2;23165:21;;;23222:2;23202:18;;;23195:30;-1:-1:-1;;;23256:2:1;23241:18;;23234:49;23315:2;23300:18;;22981:343::o;23329:356::-;23531:2;23513:21;;;23550:18;;;23543:30;23609:34;23604:2;23589:18;;23582:62;23676:2;23661:18;;23329:356::o;24107:415::-;24309:2;24291:21;;;24348:2;24328:18;;;24321:30;24387:34;24382:2;24367:18;;24360:62;-1:-1:-1;;;24453:2:1;24438:18;;24431:49;24512:3;24497:19;;24107:415::o;26387:413::-;26589:2;26571:21;;;26628:2;26608:18;;;26601:30;26667:34;26662:2;26647:18;;26640:62;-1:-1:-1;;;26733:2:1;26718:18;;26711:47;26790:3;26775:19;;26387:413::o;29335:128::-;29375:3;29406:1;29402:6;29399:1;29396:13;29393:39;;;29412:18;;:::i;:::-;-1:-1:-1;29448:9:1;;29335:128::o;29468:120::-;29508:1;29534;29524:35;;29539:18;;:::i;:::-;-1:-1:-1;29573:9:1;;29468:120::o;29593:168::-;29633:7;29699:1;29695;29691:6;29687:14;29684:1;29681:21;29676:1;29669:9;29662:17;29658:45;29655:71;;;29706:18;;:::i;:::-;-1:-1:-1;29746:9:1;;29593:168::o;29766:125::-;29806:4;29834:1;29831;29828:8;29825:34;;;29839:18;;:::i;:::-;-1:-1:-1;29876:9:1;;29766:125::o;29896:258::-;29968:1;29978:113;29992:6;29989:1;29986:13;29978:113;;;30068:11;;;30062:18;30049:11;;;30042:39;30014:2;30007:10;29978:113;;;30109:6;30106:1;30103:13;30100:48;;;-1:-1:-1;;30144:1:1;30126:16;;30119:27;29896:258::o;30159:380::-;30238:1;30234:12;;;;30281;;;30302:61;;30356:4;30348:6;30344:17;30334:27;;30302:61;30409:2;30401:6;30398:14;30378:18;30375:38;30372:161;;;30455:10;30450:3;30446:20;30443:1;30436:31;30490:4;30487:1;30480:15;30518:4;30515:1;30508:15;30372:161;;30159:380;;;:::o;30544:135::-;30583:3;-1:-1:-1;;30604:17:1;;30601:43;;;30624:18;;:::i;:::-;-1:-1:-1;30671:1:1;30660:13;;30544:135::o;30684:112::-;30716:1;30742;30732:35;;30747:18;;:::i;:::-;-1:-1:-1;30781:9:1;;30684:112::o;30801:127::-;30862:10;30857:3;30853:20;30850:1;30843:31;30893:4;30890:1;30883:15;30917:4;30914:1;30907:15;30933:127;30994:10;30989:3;30985:20;30982:1;30975:31;31025:4;31022:1;31015:15;31049:4;31046:1;31039:15;31065:127;31126:10;31121:3;31117:20;31114:1;31107:31;31157:4;31154:1;31147:15;31181:4;31178:1;31171:15;31197:127;31258:10;31253:3;31249:20;31246:1;31239:31;31289:4;31286:1;31279:15;31313:4;31310:1;31303:15;31329:127;31390:10;31385:3;31381:20;31378:1;31371:31;31421:4;31418:1;31411:15;31445:4;31442:1;31435:15;31461:131;-1:-1:-1;;;;;31536:31:1;;31526:42;;31516:70;;31582:1;31579;31572:12;31597:131;-1:-1:-1;;;;;;31671:32:1;;31661:43;;31651:71;;31718:1;31715;31708:12
Swarm Source
ipfs://9977672528efb2fa6629e304a51cd641de6f250d5a9b81e478f9f86957a4fd86
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.