ERC-721
NFT
Overview
Max Total Supply
32 MGG
Holders
25
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MGGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Mogugu
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-21 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/Counters.sol pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/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 pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol 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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/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/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol 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 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 pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/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 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol pragma solidity ^0.8.0; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File: @openzeppelin/contracts/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/ERC721/extensions/ERC721Burnable.sol pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File: MoguguNFT_stage.sol // @title: Mogugu NFT pragma solidity ^0.8.0; contract Mogugu is ERC721Enumerable, Ownable, ERC721Burnable, ERC721Pausable { using SafeMath for uint256; using Counters for Counters.Counter; Counters.Counter private _tokenIdTracker; string public MGG_PROVENANCE; // sha256 string of concatenation of sha256 strings of ordered images uint256 public REVEAL_TIMESTAMP; //Time after which mogugu are randomized and allotted uint256 public startingIndexBlock; uint256 public startingIndex; string public baseTokenURI; bool public IsActive_sale; bool public IsActive_presale; uint256 public Minted_reserve; uint256 public Minted_preSale; uint256 private _ORprice; uint256 public constant MAX_MGG_PURCHASE = 20; //max to mint each time uint256 public constant MAX_MGG = 10000; //total number of MGG uint256 public constant MAX_RESERVE = 300; uint256 public MAX_PRESALE_MGG = 100; //@0.035ETH uint256 public MAX_PROMOTE_MGG = 1000; //@0.05ETH constructor(string memory baseURI, string memory provenanceHash) ERC721("Mogugu", "MGG") { setBaseURI(baseURI); pause(true); setProvenanceHash(provenanceHash); REVEAL_TIMESTAMP = 1634943600 + (7 * 86400); //22OCT4pm PST } function reserveMGG(uint256 numberOfTokens, address _to) public onlyOwner { require(Minted_reserve.add(numberOfTokens) <= MAX_RESERVE, "Reservation exceed"); for (uint256 i; i < numberOfTokens; i++) { _mintMGG(_to); Minted_reserve++; } } function presaleMint(uint256 numberOfTokens, address _to) public payable { require(!paused(), "Contract paused!"); require(msg.sender == tx.origin, "No transaction"); require(IsActive_presale, "Presale not active"); require(numberOfTokens > 0, "numberOfTokens cannot be 0"); require(Minted_preSale.add(numberOfTokens) <= MAX_PRESALE_MGG, "Purchase exceed max presale"); require(numberOfTokens <= MAX_MGG_PURCHASE, "Too many purchase each time"); require(msg.value >= getPrice().mul(numberOfTokens), "Transaction value too low"); for (uint256 i; i < numberOfTokens; i++) { _mintMGG(_to); Minted_preSale++; } } function mint(uint256 numberOfTokens, address _to) public payable { uint256 totalSupply = _totalSupply(); require(!paused(), "Contract paused!"); require(msg.sender == tx.origin, "No transaction"); require(IsActive_sale, "Public Sale not active"); require(totalSupply < MAX_MGG, "All Mogugu minted"); require(numberOfTokens > 0, "numberOfTokens cannot be 0"); require(totalSupply.add(numberOfTokens) <= MAX_MGG.sub(MAX_RESERVE).add(Minted_reserve), "Purchase would exceed max supply"); require(numberOfTokens <= MAX_MGG_PURCHASE, "Too many purchase each time"); require(msg.value >= getPrice().mul(numberOfTokens), "Transaction value too low"); for (uint256 i; i < numberOfTokens; i++) { _mintMGG(_to); } if (startingIndexBlock == 0 && (_totalSupply() == MAX_MGG || block.timestamp >= REVEAL_TIMESTAMP)) { startingIndexBlock = block.number; } } function _mintMGG(address _to) private { uint id = _totalSupply(); _tokenIdTracker.increment(); _safeMint(_to, id); } function _totalSupply() internal view returns(uint) { return _tokenIdTracker.current(); } function totalMint() public view returns(uint256) { return _totalSupply(); } function setRevealTimestamp(uint256 revealTimeStamp) public onlyOwner { REVEAL_TIMESTAMP = revealTimeStamp; } function togglePreSaleState() public onlyOwner { IsActive_presale = !IsActive_presale; } function toggleSaleState() public onlyOwner { IsActive_presale = false; IsActive_sale = !IsActive_sale; } function _baseURI() internal view virtual override returns(string memory) { return baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { baseTokenURI = baseURI; } function setORPrice(uint256 _newWEIPrice) public onlyOwner { _ORprice = _newWEIPrice; } function setMAXPresale(uint256 _presaleQt) public onlyOwner { MAX_PRESALE_MGG = _presaleQt; } function setMAXPromote(uint256 _promoteQt) public onlyOwner { MAX_PROMOTE_MGG = _promoteQt; } function getPrice() public view returns(uint256) { uint256 sales = _totalSupply().sub(Minted_reserve); if (_ORprice > 0) { return _ORprice; } else { if (sales < MAX_PRESALE_MGG) { return 35000000000000000; //0.035 ether }else if (sales >=MAX_PRESALE_MGG && sales < MAX_PROMOTE_MGG.add(MAX_PRESALE_MGG)){ return 50000000000000000; //0.05 ether } else{ return 70000000000000000; //0.07 ether } } } function setProvenanceHash(string memory provenanceHash) public onlyOwner { MGG_PROVENANCE = provenanceHash; } /** * Set the starting index for the collection */ function setStartingIndex() external { require(startingIndex == 0, "Starting index is already set"); require(startingIndexBlock != 0, "Starting index block not set"); startingIndex = uint256(blockhash(startingIndexBlock)) % MAX_MGG; // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes) if (block.number.sub(startingIndexBlock) > 255) { startingIndex = uint256(blockhash(block.number - 1)) % MAX_MGG; } // Prevent default sequence if (startingIndex == 0) { startingIndex = startingIndex.add(1); } } function tokenURI(uint256 tokenId) public view virtual override(ERC721) returns(string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); uint256 sequenceId; sequenceId = (tokenId.add(startingIndex)).mod(MAX_MGG); return bytes(_baseURI()).length > 0 ? string(abi.encodePacked(_baseURI(), toString(sequenceId))) : ""; } function toString(uint256 value) internal pure returns(string memory) { // Inspired by OraclizeAPI's implementation - MIT license 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); } function emergencySetStartingIndexBlock() external onlyOwner { require(startingIndex == 0, "Starting index is already set"); startingIndexBlock = block.number; } function walletOfOwner(address _owner) external view returns(uint256[] memory) { uint256 tokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](tokenCount); for (uint256 i; i < tokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function pause(bool val) public onlyOwner { if (val) { _pause(); return; } _unpause(); } function withdrawAll() public payable onlyOwner { require(payable(msg.sender).send(address(this).balance)); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns(bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"string","name":"provenanceHash","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":"IsActive_presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IsActive_sale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MGG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MGG_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRESALE_MGG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PROMOTE_MGG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MGG_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Minted_preSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Minted_reserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"reserveMGG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleQt","type":"uint256"}],"name":"setMAXPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_promoteQt","type":"uint256"}],"name":"setMAXPromote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWEIPrice","type":"uint256"}],"name":"setORPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"revealTimeStamp","type":"uint256"}],"name":"setRevealTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"togglePreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMint","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":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405260646015556103e86016553480156200001c57600080fd5b506040516200369f3803806200369f8339810160408190526200003f9162000524565b60408051808201825260068152654d6f6775677560d01b6020808301918252835180850190945260038452624d474760e81b9084015281519192916200008891600091620003c7565b5080516200009e906001906020840190620003c7565b505050620000bb620000b5620000fa60201b60201c565b620000fe565b600a805460ff60a01b19169055620000d38262000150565b620000df6001620001b8565b620000ea8162000221565b505063617c7cf0600d55620005e1565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b031633146200019f5760405162461bcd60e51b815260206004820181905260248201526000805160206200367f83398151915260448201526064015b60405180910390fd5b8051620001b4906010906020840190620003c7565b5050565b600a546001600160a01b03163314620002035760405162461bcd60e51b815260206004820181905260248201526000805160206200367f833981519152604482015260640162000196565b801562000217576200021462000281565b50565b6200021462000330565b600a546001600160a01b031633146200026c5760405162461bcd60e51b815260206004820181905260248201526000805160206200367f833981519152604482015260640162000196565b8051620001b490600c906020840190620003c7565b62000295600a54600160a01b900460ff1690565b15620002d75760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640162000196565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620003133390565b6040516001600160a01b03909116815260200160405180910390a1565b62000344600a54600160a01b900460ff1690565b620003925760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640162000196565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3362000313565b828054620003d5906200058e565b90600052602060002090601f016020900481019282620003f9576000855562000444565b82601f106200041457805160ff191683800117855562000444565b8280016001018555821562000444579182015b828111156200044457825182559160200191906001019062000427565b506200045292915062000456565b5090565b5b8082111562000452576000815560010162000457565b600082601f8301126200047f57600080fd5b81516001600160401b03808211156200049c576200049c620005cb565b604051601f8301601f19908116603f01168101908282118183101715620004c757620004c7620005cb565b81604052838152602092508683858801011115620004e457600080fd5b600091505b83821015620005085785820183015181830184015290820190620004e9565b838211156200051a5760008385830101525b9695505050505050565b600080604083850312156200053857600080fd5b82516001600160401b03808211156200055057600080fd5b6200055e868387016200046d565b935060208501519150808211156200057557600080fd5b5062000584858286016200046d565b9150509250929050565b600181811c90821680620005a357607f821691505b60208210811415620005c557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61308e80620005f16000396000f3fe60806040526004361061031a5760003560e01c8063853828b6116101ab578063c5d292fa116100f7578063e36d649811610095578063ea7da0031161006f578063ea7da003146108ab578063eff31e9e146108c5578063f2fde38b146108db578063f41c2698146108fb57600080fd5b8063e36d649814610837578063e985e9c51461084d578063e98665501461089657600080fd5b8063d547cfb7116100d1578063d547cfb7146107d8578063d91f1ad4146107ed578063daaeec8614610802578063dacd1da11461081757600080fd5b8063c5d292fa1461078c578063c87b56dd146107a2578063cb774d47146107c257600080fd5b806395d89b4111610164578063a22cb4651161013e578063a22cb46514610724578063a31a1c7e14610744578063b2e9b03214610759578063b88d4fde1461076c57600080fd5b806395d89b41146106e557806398d5fdca146106fa578063a171c44e1461070f57600080fd5b8063853828b6146106605780638caa484e146106685780638da5cb5b146106885780638fa3dd91146106a65780639134bb93146106bc57806394bf804d146106d257600080fd5b80632f745c591161026a57806359a7715a11610223578063639dcc02116101fd578063639dcc02146105f657806370a0823114610616578063715018a6146106365780637d17fcbe1461064b57600080fd5b806359a7715a146105a25780635c975abb146105b75780636352211e146105d657600080fd5b80632f745c59146104d557806342842e0e146104f557806342966c6814610515578063438b6300146105355780634f6ccce71461056257806355f804b31461058257600080fd5b80630b6f3c99116102d757806318160ddd116102b157806318160ddd1461047457806318e20a381461048957806323b872dd1461049f57806328cdb79b146104bf57600080fd5b80630b6f3c99146104105780631096952314610430578063170455a91461045057600080fd5b8063018a2c371461031f57806301ffc9a71461034157806302329a291461037657806306fdde0314610396578063081812fc146103b8578063095ea7b3146103f0575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612cd9565b61091a565b005b34801561034d57600080fd5b5061036161035c366004612c56565b610952565b60405190151581526020015b60405180910390f35b34801561038257600080fd5b5061033f610391366004612c3b565b610963565b3480156103a257600080fd5b506103ab6109a6565b60405161036d9190612df1565b3480156103c457600080fd5b506103d86103d3366004612cd9565b610a38565b6040516001600160a01b03909116815260200161036d565b3480156103fc57600080fd5b5061033f61040b366004612c11565b610acd565b34801561041c57600080fd5b5061033f61042b366004612cd9565b610be3565b34801561043c57600080fd5b5061033f61044b366004612c90565b610c12565b34801561045c57600080fd5b5061046660155481565b60405190815260200161036d565b34801561048057600080fd5b50600854610466565b34801561049557600080fd5b50610466600d5481565b3480156104ab57600080fd5b5061033f6104ba366004612b2f565b610c53565b3480156104cb57600080fd5b5061046660165481565b3480156104e157600080fd5b506104666104f0366004612c11565b610c85565b34801561050157600080fd5b5061033f610510366004612b2f565b610d1b565b34801561052157600080fd5b5061033f610530366004612cd9565b610d36565b34801561054157600080fd5b50610555610550366004612ae1565b610dad565b60405161036d9190612dad565b34801561056e57600080fd5b5061046661057d366004612cd9565b610e4f565b34801561058e57600080fd5b5061033f61059d366004612c90565b610ee2565b3480156105ae57600080fd5b50610466610f1f565b3480156105c357600080fd5b50600a54600160a01b900460ff16610361565b3480156105e257600080fd5b506103d86105f1366004612cd9565b610f2e565b34801561060257600080fd5b5061033f610611366004612cf2565b610fa5565b34801561062257600080fd5b50610466610631366004612ae1565b61105f565b34801561064257600080fd5b5061033f6110e6565b34801561065757600080fd5b5061033f61111c565b61033f61119c565b34801561067457600080fd5b5061033f610683366004612cd9565b6111ea565b34801561069457600080fd5b50600a546001600160a01b03166103d8565b3480156106b257600080fd5b5061046660135481565b3480156106c857600080fd5b5061046660125481565b61033f6106e0366004612cf2565b611219565b3480156106f157600080fd5b506103ab61150d565b34801561070657600080fd5b5061046661151c565b34801561071b57600080fd5b50610466601481565b34801561073057600080fd5b5061033f61073f366004612be7565b6115a2565b34801561075057600080fd5b506103ab611667565b61033f610767366004612cf2565b6116f5565b34801561077857600080fd5b5061033f610787366004612b6b565b611960565b34801561079857600080fd5b5061046661271081565b3480156107ae57600080fd5b506103ab6107bd366004612cd9565b611998565b3480156107ce57600080fd5b50610466600f5481565b3480156107e457600080fd5b506103ab611a9a565b3480156107f957600080fd5b5061033f611aa7565b34801561080e57600080fd5b5061033f611aee565b34801561082357600080fd5b5061033f610832366004612cd9565b611b2d565b34801561084357600080fd5b50610466600e5481565b34801561085957600080fd5b50610361610868366004612afc565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108a257600080fd5b5061033f611b5c565b3480156108b757600080fd5b506011546103619060ff1681565b3480156108d157600080fd5b5061046661012c81565b3480156108e757600080fd5b5061033f6108f6366004612ae1565b611c5d565b34801561090757600080fd5b5060115461036190610100900460ff1681565b600a546001600160a01b0316331461094d5760405162461bcd60e51b815260040161094490612e56565b60405180910390fd5b600d55565b600061095d82611cf5565b92915050565b600a546001600160a01b0316331461098d5760405162461bcd60e51b815260040161094490612e56565b801561099e5761099b611d1a565b50565b61099b611dbf565b6060600080546109b590612f6a565b80601f01602080910402602001604051908101604052809291908181526020018280546109e190612f6a565b8015610a2e5780601f10610a0357610100808354040283529160200191610a2e565b820191906000526020600020905b815481529060010190602001808311610a1157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610ab15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610944565b506000908152600460205260409020546001600160a01b031690565b6000610ad882610f2e565b9050806001600160a01b0316836001600160a01b03161415610b465760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610944565b336001600160a01b0382161480610b625750610b628133610868565b610bd45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610944565b610bde8383611e43565b505050565b600a546001600160a01b03163314610c0d5760405162461bcd60e51b815260040161094490612e56565b601555565b600a546001600160a01b03163314610c3c5760405162461bcd60e51b815260040161094490612e56565b8051610c4f90600c9060208401906129af565b5050565b610c5e335b82611eb1565b610c7a5760405162461bcd60e51b815260040161094490612e8b565b610bde838383611fa8565b6000610c908361105f565b8210610cf25760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610944565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610bde83838360405180602001604052806000815250611960565b610d3f33610c58565b610da45760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610944565b61099b81612153565b60606000610dba8361105f565b905060008167ffffffffffffffff811115610dd757610dd761302c565b604051908082528060200260200182016040528015610e00578160200160208202803683370190505b50905060005b82811015610e4757610e188582610c85565b828281518110610e2a57610e2a613016565b602090810291909101015280610e3f81612fa5565b915050610e06565b509392505050565b6000610e5a60085490565b8210610ebd5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610944565b60088281548110610ed057610ed0613016565b90600052602060002001549050919050565b600a546001600160a01b03163314610f0c5760405162461bcd60e51b815260040161094490612e56565b8051610c4f9060109060208401906129af565b6000610f296121fa565b905090565b6000818152600260205260408120546001600160a01b03168061095d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610944565b600a546001600160a01b03163314610fcf5760405162461bcd60e51b815260040161094490612e56565b60125461012c90610fe09084612205565b11156110235760405162461bcd60e51b815260206004820152601260248201527114995cd95c9d985d1a5bdb88195e18d9595960721b6044820152606401610944565b60005b82811015610bde5761103782612211565b6012805490600061104783612fa5565b9190505550808061105790612fa5565b915050611026565b60006001600160a01b0382166110ca5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610944565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111105760405162461bcd60e51b815260040161094490612e56565b61111a6000612235565b565b600a546001600160a01b031633146111465760405162461bcd60e51b815260040161094490612e56565b600f54156111965760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610944565b43600e55565b600a546001600160a01b031633146111c65760405162461bcd60e51b815260040161094490612e56565b60405133904780156108fc02916000818181858888f1935050505061111a57600080fd5b600a546001600160a01b031633146112145760405162461bcd60e51b815260040161094490612e56565b601455565b60006112236121fa565b600a54909150600160a01b900460ff16156112735760405162461bcd60e51b815260206004820152601060248201526f436f6e7472616374207061757365642160801b6044820152606401610944565b3332146112b35760405162461bcd60e51b815260206004820152600e60248201526d2737903a3930b739b0b1ba34b7b760911b6044820152606401610944565b60115460ff166112fe5760405162461bcd60e51b81526020600482015260166024820152755075626c69632053616c65206e6f742061637469766560501b6044820152606401610944565b61271081106113435760405162461bcd60e51b8152602060048201526011602482015270105b1b08135bd9dd59dd481b5a5b9d1959607a1b6044820152606401610944565b600083116113935760405162461bcd60e51b815260206004820152601a60248201527f6e756d6265724f66546f6b656e732063616e6e6f7420626520300000000000006044820152606401610944565b6012546113ae906113a861271061012c612287565b90612205565b6113b88285612205565b11156114065760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610944565b60148311156114575760405162461bcd60e51b815260206004820152601b60248201527f546f6f206d616e7920707572636861736520656163682074696d6500000000006044820152606401610944565b6114698361146361151c565b90612293565b3410156114b45760405162461bcd60e51b81526020600482015260196024820152785472616e73616374696f6e2076616c756520746f6f206c6f7760381b6044820152606401610944565b60005b838110156114da576114c883612211565b806114d281612fa5565b9150506114b7565b50600e541580156114ff57506127106114f16121fa565b14806114ff5750600d544210155b15610bde5743600e55505050565b6060600180546109b590612f6a565b60008061153360125461152d6121fa565b90612287565b6014549091501561154657505060145490565b60155481101561155e57667c58508723800091505090565b601554811015801561157d575060155460165461157a91612205565b81105b156115905766b1a2bc2ec5000091505090565b66f8b0a10e47000091505090565b5090565b6001600160a01b0382163314156115fb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610944565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c805461167490612f6a565b80601f01602080910402602001604051908101604052809291908181526020018280546116a090612f6a565b80156116ed5780601f106116c2576101008083540402835291602001916116ed565b820191906000526020600020905b8154815290600101906020018083116116d057829003601f168201915b505050505081565b600a54600160a01b900460ff16156117425760405162461bcd60e51b815260206004820152601060248201526f436f6e7472616374207061757365642160801b6044820152606401610944565b3332146117825760405162461bcd60e51b815260206004820152600e60248201526d2737903a3930b739b0b1ba34b7b760911b6044820152606401610944565b601154610100900460ff166117ce5760405162461bcd60e51b815260206004820152601260248201527150726573616c65206e6f742061637469766560701b6044820152606401610944565b6000821161181e5760405162461bcd60e51b815260206004820152601a60248201527f6e756d6265724f66546f6b656e732063616e6e6f7420626520300000000000006044820152606401610944565b60155460135461182e9084612205565b111561187c5760405162461bcd60e51b815260206004820152601b60248201527f507572636861736520657863656564206d61782070726573616c6500000000006044820152606401610944565b60148211156118cd5760405162461bcd60e51b815260206004820152601b60248201527f546f6f206d616e7920707572636861736520656163682074696d6500000000006044820152606401610944565b6118d98261146361151c565b3410156119245760405162461bcd60e51b81526020600482015260196024820152785472616e73616374696f6e2076616c756520746f6f206c6f7760381b6044820152606401610944565b60005b82811015610bde5761193882612211565b6013805490600061194883612fa5565b9190505550808061195890612fa5565b915050611927565b61196a3383611eb1565b6119865760405162461bcd60e51b815260040161094490612e8b565b6119928484848461229f565b50505050565b6000818152600260205260409020546060906001600160a01b0316611a175760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610944565b6000611a3a612710611a34600f548661220590919063ffffffff16565b906122d2565b90506000611a466122de565b5111611a615760405180602001604052806000815250611a93565b611a696122de565b611a72826122ed565b604051602001611a83929190612d41565b6040516020818303038152906040525b9392505050565b6010805461167490612f6a565b600a546001600160a01b03163314611ad15760405162461bcd60e51b815260040161094490612e56565b6011805461ff001981166101009182900460ff1615909102179055565b600a546001600160a01b03163314611b185760405162461bcd60e51b815260040161094490612e56565b6011805461ffff19811660ff90911615179055565b600a546001600160a01b03163314611b575760405162461bcd60e51b815260040161094490612e56565b601655565b600f5415611bac5760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610944565b600e54611bfb5760405162461bcd60e51b815260206004820152601c60248201527f5374617274696e6720696e64657820626c6f636b206e6f7420736574000000006044820152606401610944565b600e54611c0c906127109040612fc0565b600f55600e5460ff90611c20904390612287565b1115611c4357612710611c34600143612f27565b611c3f919040612fc0565b600f555b600f5461111a57600f54611c58906001612205565b600f55565b600a546001600160a01b03163314611c875760405162461bcd60e51b815260040161094490612e56565b6001600160a01b038116611cec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610944565b61099b81612235565b60006001600160e01b0319821663780e9d6360e01b148061095d575061095d826123eb565b600a54600160a01b900460ff1615611d675760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610944565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611da23390565b6040516001600160a01b03909116815260200160405180910390a1565b600a54600160a01b900460ff16611e0f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610944565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611da2565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e7882610f2e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611f2a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610944565b6000611f3583610f2e565b9050806001600160a01b0316846001600160a01b03161480611f705750836001600160a01b0316611f6584610a38565b6001600160a01b0316145b80611fa057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611fbb82610f2e565b6001600160a01b0316146120235760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610944565b6001600160a01b0382166120855760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610944565b61209083838361243b565b61209b600082611e43565b6001600160a01b03831660009081526003602052604081208054600192906120c4908490612f27565b90915550506001600160a01b03821660009081526003602052604081208054600192906120f2908490612edc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061215e82610f2e565b905061216c8160008461243b565b612177600083611e43565b6001600160a01b03811660009081526003602052604081208054600192906121a0908490612f27565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000610f29600b5490565b6000611a938284612edc565b600061221b6121fa565b905061222b600b80546001019055565b610c4f8282612446565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611a938284612f27565b6000611a938284612f08565b6122aa848484611fa8565b6122b684848484612460565b6119925760405162461bcd60e51b815260040161094490612e04565b6000611a938284612fc0565b6060601080546109b590612f6a565b6060816123115750506040805180820190915260018152600360fc1b602082015290565b8160005b811561233b578061232581612fa5565b91506123349050600a83612ef4565b9150612315565b60008167ffffffffffffffff8111156123565761235661302c565b6040519080825280601f01601f191660200182016040528015612380576020820181803683370190505b5090505b8415611fa057612395600183612f27565b91506123a2600a86612fc0565b6123ad906030612edc565b60f81b8183815181106123c2576123c2613016565b60200101906001600160f81b031916908160001a9053506123e4600a86612ef4565b9450612384565b60006001600160e01b031982166380ac58cd60e01b148061241c57506001600160e01b03198216635b5e139f60e01b145b8061095d57506301ffc9a760e01b6001600160e01b031983161461095d565b610bde83838361256d565b610c4f8282604051806020016040528060008152506125e6565b60006001600160a01b0384163b1561256257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124a4903390899088908890600401612d70565b602060405180830381600087803b1580156124be57600080fd5b505af19250505080156124ee575060408051601f3d908101601f191682019092526124eb91810190612c73565b60015b612548573d80801561251c576040519150601f19603f3d011682016040523d82523d6000602084013e612521565b606091505b5080516125405760405162461bcd60e51b815260040161094490612e04565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611fa0565b506001949350505050565b612578838383612619565b600a54600160a01b900460ff1615610bde5760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b6064820152608401610944565b6125f083836126d1565b6125fd6000848484612460565b610bde5760405162461bcd60e51b815260040161094490612e04565b6001600160a01b0383166126745761266f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612697565b816001600160a01b0316836001600160a01b03161461269757612697838261281f565b6001600160a01b0382166126ae57610bde816128bc565b826001600160a01b0316826001600160a01b031614610bde57610bde828261296b565b6001600160a01b0382166127275760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610944565b6000818152600260205260409020546001600160a01b03161561278c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610944565b6127986000838361243b565b6001600160a01b03821660009081526003602052604081208054600192906127c1908490612edc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161282c8461105f565b6128369190612f27565b600083815260076020526040902054909150808214612889576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906128ce90600190612f27565b600083815260096020526040812054600880549394509092849081106128f6576128f6613016565b90600052602060002001549050806008838154811061291757612917613016565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061294f5761294f613000565b6001900381819060005260206000200160009055905550505050565b60006129768361105f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546129bb90612f6a565b90600052602060002090601f0160209004810192826129dd5760008555612a23565b82601f106129f657805160ff1916838001178555612a23565b82800160010185558215612a23579182015b82811115612a23578251825591602001919060010190612a08565b5061159e9291505b8082111561159e5760008155600101612a2b565b600067ffffffffffffffff80841115612a5a57612a5a61302c565b604051601f8501601f19908116603f01168101908282118183101715612a8257612a8261302c565b81604052809350858152868686011115612a9b57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612acc57600080fd5b919050565b80358015158114612acc57600080fd5b600060208284031215612af357600080fd5b611a9382612ab5565b60008060408385031215612b0f57600080fd5b612b1883612ab5565b9150612b2660208401612ab5565b90509250929050565b600080600060608486031215612b4457600080fd5b612b4d84612ab5565b9250612b5b60208501612ab5565b9150604084013590509250925092565b60008060008060808587031215612b8157600080fd5b612b8a85612ab5565b9350612b9860208601612ab5565b925060408501359150606085013567ffffffffffffffff811115612bbb57600080fd5b8501601f81018713612bcc57600080fd5b612bdb87823560208401612a3f565b91505092959194509250565b60008060408385031215612bfa57600080fd5b612c0383612ab5565b9150612b2660208401612ad1565b60008060408385031215612c2457600080fd5b612c2d83612ab5565b946020939093013593505050565b600060208284031215612c4d57600080fd5b611a9382612ad1565b600060208284031215612c6857600080fd5b8135611a9381613042565b600060208284031215612c8557600080fd5b8151611a9381613042565b600060208284031215612ca257600080fd5b813567ffffffffffffffff811115612cb957600080fd5b8201601f81018413612cca57600080fd5b611fa084823560208401612a3f565b600060208284031215612ceb57600080fd5b5035919050565b60008060408385031215612d0557600080fd5b82359150612b2660208401612ab5565b60008151808452612d2d816020860160208601612f3e565b601f01601f19169290920160200192915050565b60008351612d53818460208801612f3e565b835190830190612d67818360208801612f3e565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612da390830184612d15565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612de557835183529284019291840191600101612dc9565b50909695505050505050565b602081526000611a936020830184612d15565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612eef57612eef612fd4565b500190565b600082612f0357612f03612fea565b500490565b6000816000190483118215151615612f2257612f22612fd4565b500290565b600082821015612f3957612f39612fd4565b500390565b60005b83811015612f59578181015183820152602001612f41565b838111156119925750506000910152565b600181811c90821680612f7e57607f821691505b60208210811415612f9f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612fb957612fb9612fd4565b5060010190565b600082612fcf57612fcf612fea565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461099b57600080fdfea264697066735822122048933a2ac174b63142a163ed8fd35987a0e02f31b6685fe033f57f7f1ff4c8ea64736f6c634300080700334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001868747470733a2f2f6170692e6d6f677567752e636c75622f0000000000000000000000000000000000000000000000000000000000000000000000000000004033303562363139616430663231613630616364356364333064663565316534626438616664353736393435393736313463613432393637613835303036333239
Deployed Bytecode
0x60806040526004361061031a5760003560e01c8063853828b6116101ab578063c5d292fa116100f7578063e36d649811610095578063ea7da0031161006f578063ea7da003146108ab578063eff31e9e146108c5578063f2fde38b146108db578063f41c2698146108fb57600080fd5b8063e36d649814610837578063e985e9c51461084d578063e98665501461089657600080fd5b8063d547cfb7116100d1578063d547cfb7146107d8578063d91f1ad4146107ed578063daaeec8614610802578063dacd1da11461081757600080fd5b8063c5d292fa1461078c578063c87b56dd146107a2578063cb774d47146107c257600080fd5b806395d89b4111610164578063a22cb4651161013e578063a22cb46514610724578063a31a1c7e14610744578063b2e9b03214610759578063b88d4fde1461076c57600080fd5b806395d89b41146106e557806398d5fdca146106fa578063a171c44e1461070f57600080fd5b8063853828b6146106605780638caa484e146106685780638da5cb5b146106885780638fa3dd91146106a65780639134bb93146106bc57806394bf804d146106d257600080fd5b80632f745c591161026a57806359a7715a11610223578063639dcc02116101fd578063639dcc02146105f657806370a0823114610616578063715018a6146106365780637d17fcbe1461064b57600080fd5b806359a7715a146105a25780635c975abb146105b75780636352211e146105d657600080fd5b80632f745c59146104d557806342842e0e146104f557806342966c6814610515578063438b6300146105355780634f6ccce71461056257806355f804b31461058257600080fd5b80630b6f3c99116102d757806318160ddd116102b157806318160ddd1461047457806318e20a381461048957806323b872dd1461049f57806328cdb79b146104bf57600080fd5b80630b6f3c99146104105780631096952314610430578063170455a91461045057600080fd5b8063018a2c371461031f57806301ffc9a71461034157806302329a291461037657806306fdde0314610396578063081812fc146103b8578063095ea7b3146103f0575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612cd9565b61091a565b005b34801561034d57600080fd5b5061036161035c366004612c56565b610952565b60405190151581526020015b60405180910390f35b34801561038257600080fd5b5061033f610391366004612c3b565b610963565b3480156103a257600080fd5b506103ab6109a6565b60405161036d9190612df1565b3480156103c457600080fd5b506103d86103d3366004612cd9565b610a38565b6040516001600160a01b03909116815260200161036d565b3480156103fc57600080fd5b5061033f61040b366004612c11565b610acd565b34801561041c57600080fd5b5061033f61042b366004612cd9565b610be3565b34801561043c57600080fd5b5061033f61044b366004612c90565b610c12565b34801561045c57600080fd5b5061046660155481565b60405190815260200161036d565b34801561048057600080fd5b50600854610466565b34801561049557600080fd5b50610466600d5481565b3480156104ab57600080fd5b5061033f6104ba366004612b2f565b610c53565b3480156104cb57600080fd5b5061046660165481565b3480156104e157600080fd5b506104666104f0366004612c11565b610c85565b34801561050157600080fd5b5061033f610510366004612b2f565b610d1b565b34801561052157600080fd5b5061033f610530366004612cd9565b610d36565b34801561054157600080fd5b50610555610550366004612ae1565b610dad565b60405161036d9190612dad565b34801561056e57600080fd5b5061046661057d366004612cd9565b610e4f565b34801561058e57600080fd5b5061033f61059d366004612c90565b610ee2565b3480156105ae57600080fd5b50610466610f1f565b3480156105c357600080fd5b50600a54600160a01b900460ff16610361565b3480156105e257600080fd5b506103d86105f1366004612cd9565b610f2e565b34801561060257600080fd5b5061033f610611366004612cf2565b610fa5565b34801561062257600080fd5b50610466610631366004612ae1565b61105f565b34801561064257600080fd5b5061033f6110e6565b34801561065757600080fd5b5061033f61111c565b61033f61119c565b34801561067457600080fd5b5061033f610683366004612cd9565b6111ea565b34801561069457600080fd5b50600a546001600160a01b03166103d8565b3480156106b257600080fd5b5061046660135481565b3480156106c857600080fd5b5061046660125481565b61033f6106e0366004612cf2565b611219565b3480156106f157600080fd5b506103ab61150d565b34801561070657600080fd5b5061046661151c565b34801561071b57600080fd5b50610466601481565b34801561073057600080fd5b5061033f61073f366004612be7565b6115a2565b34801561075057600080fd5b506103ab611667565b61033f610767366004612cf2565b6116f5565b34801561077857600080fd5b5061033f610787366004612b6b565b611960565b34801561079857600080fd5b5061046661271081565b3480156107ae57600080fd5b506103ab6107bd366004612cd9565b611998565b3480156107ce57600080fd5b50610466600f5481565b3480156107e457600080fd5b506103ab611a9a565b3480156107f957600080fd5b5061033f611aa7565b34801561080e57600080fd5b5061033f611aee565b34801561082357600080fd5b5061033f610832366004612cd9565b611b2d565b34801561084357600080fd5b50610466600e5481565b34801561085957600080fd5b50610361610868366004612afc565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108a257600080fd5b5061033f611b5c565b3480156108b757600080fd5b506011546103619060ff1681565b3480156108d157600080fd5b5061046661012c81565b3480156108e757600080fd5b5061033f6108f6366004612ae1565b611c5d565b34801561090757600080fd5b5060115461036190610100900460ff1681565b600a546001600160a01b0316331461094d5760405162461bcd60e51b815260040161094490612e56565b60405180910390fd5b600d55565b600061095d82611cf5565b92915050565b600a546001600160a01b0316331461098d5760405162461bcd60e51b815260040161094490612e56565b801561099e5761099b611d1a565b50565b61099b611dbf565b6060600080546109b590612f6a565b80601f01602080910402602001604051908101604052809291908181526020018280546109e190612f6a565b8015610a2e5780601f10610a0357610100808354040283529160200191610a2e565b820191906000526020600020905b815481529060010190602001808311610a1157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610ab15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610944565b506000908152600460205260409020546001600160a01b031690565b6000610ad882610f2e565b9050806001600160a01b0316836001600160a01b03161415610b465760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610944565b336001600160a01b0382161480610b625750610b628133610868565b610bd45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610944565b610bde8383611e43565b505050565b600a546001600160a01b03163314610c0d5760405162461bcd60e51b815260040161094490612e56565b601555565b600a546001600160a01b03163314610c3c5760405162461bcd60e51b815260040161094490612e56565b8051610c4f90600c9060208401906129af565b5050565b610c5e335b82611eb1565b610c7a5760405162461bcd60e51b815260040161094490612e8b565b610bde838383611fa8565b6000610c908361105f565b8210610cf25760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610944565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610bde83838360405180602001604052806000815250611960565b610d3f33610c58565b610da45760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610944565b61099b81612153565b60606000610dba8361105f565b905060008167ffffffffffffffff811115610dd757610dd761302c565b604051908082528060200260200182016040528015610e00578160200160208202803683370190505b50905060005b82811015610e4757610e188582610c85565b828281518110610e2a57610e2a613016565b602090810291909101015280610e3f81612fa5565b915050610e06565b509392505050565b6000610e5a60085490565b8210610ebd5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610944565b60088281548110610ed057610ed0613016565b90600052602060002001549050919050565b600a546001600160a01b03163314610f0c5760405162461bcd60e51b815260040161094490612e56565b8051610c4f9060109060208401906129af565b6000610f296121fa565b905090565b6000818152600260205260408120546001600160a01b03168061095d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610944565b600a546001600160a01b03163314610fcf5760405162461bcd60e51b815260040161094490612e56565b60125461012c90610fe09084612205565b11156110235760405162461bcd60e51b815260206004820152601260248201527114995cd95c9d985d1a5bdb88195e18d9595960721b6044820152606401610944565b60005b82811015610bde5761103782612211565b6012805490600061104783612fa5565b9190505550808061105790612fa5565b915050611026565b60006001600160a01b0382166110ca5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610944565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146111105760405162461bcd60e51b815260040161094490612e56565b61111a6000612235565b565b600a546001600160a01b031633146111465760405162461bcd60e51b815260040161094490612e56565b600f54156111965760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610944565b43600e55565b600a546001600160a01b031633146111c65760405162461bcd60e51b815260040161094490612e56565b60405133904780156108fc02916000818181858888f1935050505061111a57600080fd5b600a546001600160a01b031633146112145760405162461bcd60e51b815260040161094490612e56565b601455565b60006112236121fa565b600a54909150600160a01b900460ff16156112735760405162461bcd60e51b815260206004820152601060248201526f436f6e7472616374207061757365642160801b6044820152606401610944565b3332146112b35760405162461bcd60e51b815260206004820152600e60248201526d2737903a3930b739b0b1ba34b7b760911b6044820152606401610944565b60115460ff166112fe5760405162461bcd60e51b81526020600482015260166024820152755075626c69632053616c65206e6f742061637469766560501b6044820152606401610944565b61271081106113435760405162461bcd60e51b8152602060048201526011602482015270105b1b08135bd9dd59dd481b5a5b9d1959607a1b6044820152606401610944565b600083116113935760405162461bcd60e51b815260206004820152601a60248201527f6e756d6265724f66546f6b656e732063616e6e6f7420626520300000000000006044820152606401610944565b6012546113ae906113a861271061012c612287565b90612205565b6113b88285612205565b11156114065760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610944565b60148311156114575760405162461bcd60e51b815260206004820152601b60248201527f546f6f206d616e7920707572636861736520656163682074696d6500000000006044820152606401610944565b6114698361146361151c565b90612293565b3410156114b45760405162461bcd60e51b81526020600482015260196024820152785472616e73616374696f6e2076616c756520746f6f206c6f7760381b6044820152606401610944565b60005b838110156114da576114c883612211565b806114d281612fa5565b9150506114b7565b50600e541580156114ff57506127106114f16121fa565b14806114ff5750600d544210155b15610bde5743600e55505050565b6060600180546109b590612f6a565b60008061153360125461152d6121fa565b90612287565b6014549091501561154657505060145490565b60155481101561155e57667c58508723800091505090565b601554811015801561157d575060155460165461157a91612205565b81105b156115905766b1a2bc2ec5000091505090565b66f8b0a10e47000091505090565b5090565b6001600160a01b0382163314156115fb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610944565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600c805461167490612f6a565b80601f01602080910402602001604051908101604052809291908181526020018280546116a090612f6a565b80156116ed5780601f106116c2576101008083540402835291602001916116ed565b820191906000526020600020905b8154815290600101906020018083116116d057829003601f168201915b505050505081565b600a54600160a01b900460ff16156117425760405162461bcd60e51b815260206004820152601060248201526f436f6e7472616374207061757365642160801b6044820152606401610944565b3332146117825760405162461bcd60e51b815260206004820152600e60248201526d2737903a3930b739b0b1ba34b7b760911b6044820152606401610944565b601154610100900460ff166117ce5760405162461bcd60e51b815260206004820152601260248201527150726573616c65206e6f742061637469766560701b6044820152606401610944565b6000821161181e5760405162461bcd60e51b815260206004820152601a60248201527f6e756d6265724f66546f6b656e732063616e6e6f7420626520300000000000006044820152606401610944565b60155460135461182e9084612205565b111561187c5760405162461bcd60e51b815260206004820152601b60248201527f507572636861736520657863656564206d61782070726573616c6500000000006044820152606401610944565b60148211156118cd5760405162461bcd60e51b815260206004820152601b60248201527f546f6f206d616e7920707572636861736520656163682074696d6500000000006044820152606401610944565b6118d98261146361151c565b3410156119245760405162461bcd60e51b81526020600482015260196024820152785472616e73616374696f6e2076616c756520746f6f206c6f7760381b6044820152606401610944565b60005b82811015610bde5761193882612211565b6013805490600061194883612fa5565b9190505550808061195890612fa5565b915050611927565b61196a3383611eb1565b6119865760405162461bcd60e51b815260040161094490612e8b565b6119928484848461229f565b50505050565b6000818152600260205260409020546060906001600160a01b0316611a175760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610944565b6000611a3a612710611a34600f548661220590919063ffffffff16565b906122d2565b90506000611a466122de565b5111611a615760405180602001604052806000815250611a93565b611a696122de565b611a72826122ed565b604051602001611a83929190612d41565b6040516020818303038152906040525b9392505050565b6010805461167490612f6a565b600a546001600160a01b03163314611ad15760405162461bcd60e51b815260040161094490612e56565b6011805461ff001981166101009182900460ff1615909102179055565b600a546001600160a01b03163314611b185760405162461bcd60e51b815260040161094490612e56565b6011805461ffff19811660ff90911615179055565b600a546001600160a01b03163314611b575760405162461bcd60e51b815260040161094490612e56565b601655565b600f5415611bac5760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610944565b600e54611bfb5760405162461bcd60e51b815260206004820152601c60248201527f5374617274696e6720696e64657820626c6f636b206e6f7420736574000000006044820152606401610944565b600e54611c0c906127109040612fc0565b600f55600e5460ff90611c20904390612287565b1115611c4357612710611c34600143612f27565b611c3f919040612fc0565b600f555b600f5461111a57600f54611c58906001612205565b600f55565b600a546001600160a01b03163314611c875760405162461bcd60e51b815260040161094490612e56565b6001600160a01b038116611cec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610944565b61099b81612235565b60006001600160e01b0319821663780e9d6360e01b148061095d575061095d826123eb565b600a54600160a01b900460ff1615611d675760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610944565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611da23390565b6040516001600160a01b03909116815260200160405180910390a1565b600a54600160a01b900460ff16611e0f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610944565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611da2565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e7882610f2e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611f2a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610944565b6000611f3583610f2e565b9050806001600160a01b0316846001600160a01b03161480611f705750836001600160a01b0316611f6584610a38565b6001600160a01b0316145b80611fa057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611fbb82610f2e565b6001600160a01b0316146120235760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610944565b6001600160a01b0382166120855760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610944565b61209083838361243b565b61209b600082611e43565b6001600160a01b03831660009081526003602052604081208054600192906120c4908490612f27565b90915550506001600160a01b03821660009081526003602052604081208054600192906120f2908490612edc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061215e82610f2e565b905061216c8160008461243b565b612177600083611e43565b6001600160a01b03811660009081526003602052604081208054600192906121a0908490612f27565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000610f29600b5490565b6000611a938284612edc565b600061221b6121fa565b905061222b600b80546001019055565b610c4f8282612446565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611a938284612f27565b6000611a938284612f08565b6122aa848484611fa8565b6122b684848484612460565b6119925760405162461bcd60e51b815260040161094490612e04565b6000611a938284612fc0565b6060601080546109b590612f6a565b6060816123115750506040805180820190915260018152600360fc1b602082015290565b8160005b811561233b578061232581612fa5565b91506123349050600a83612ef4565b9150612315565b60008167ffffffffffffffff8111156123565761235661302c565b6040519080825280601f01601f191660200182016040528015612380576020820181803683370190505b5090505b8415611fa057612395600183612f27565b91506123a2600a86612fc0565b6123ad906030612edc565b60f81b8183815181106123c2576123c2613016565b60200101906001600160f81b031916908160001a9053506123e4600a86612ef4565b9450612384565b60006001600160e01b031982166380ac58cd60e01b148061241c57506001600160e01b03198216635b5e139f60e01b145b8061095d57506301ffc9a760e01b6001600160e01b031983161461095d565b610bde83838361256d565b610c4f8282604051806020016040528060008152506125e6565b60006001600160a01b0384163b1561256257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124a4903390899088908890600401612d70565b602060405180830381600087803b1580156124be57600080fd5b505af19250505080156124ee575060408051601f3d908101601f191682019092526124eb91810190612c73565b60015b612548573d80801561251c576040519150601f19603f3d011682016040523d82523d6000602084013e612521565b606091505b5080516125405760405162461bcd60e51b815260040161094490612e04565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611fa0565b506001949350505050565b612578838383612619565b600a54600160a01b900460ff1615610bde5760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b6064820152608401610944565b6125f083836126d1565b6125fd6000848484612460565b610bde5760405162461bcd60e51b815260040161094490612e04565b6001600160a01b0383166126745761266f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612697565b816001600160a01b0316836001600160a01b03161461269757612697838261281f565b6001600160a01b0382166126ae57610bde816128bc565b826001600160a01b0316826001600160a01b031614610bde57610bde828261296b565b6001600160a01b0382166127275760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610944565b6000818152600260205260409020546001600160a01b03161561278c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610944565b6127986000838361243b565b6001600160a01b03821660009081526003602052604081208054600192906127c1908490612edc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161282c8461105f565b6128369190612f27565b600083815260076020526040902054909150808214612889576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906128ce90600190612f27565b600083815260096020526040812054600880549394509092849081106128f6576128f6613016565b90600052602060002001549050806008838154811061291757612917613016565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061294f5761294f613000565b6001900381819060005260206000200160009055905550505050565b60006129768361105f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8280546129bb90612f6a565b90600052602060002090601f0160209004810192826129dd5760008555612a23565b82601f106129f657805160ff1916838001178555612a23565b82800160010185558215612a23579182015b82811115612a23578251825591602001919060010190612a08565b5061159e9291505b8082111561159e5760008155600101612a2b565b600067ffffffffffffffff80841115612a5a57612a5a61302c565b604051601f8501601f19908116603f01168101908282118183101715612a8257612a8261302c565b81604052809350858152868686011115612a9b57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612acc57600080fd5b919050565b80358015158114612acc57600080fd5b600060208284031215612af357600080fd5b611a9382612ab5565b60008060408385031215612b0f57600080fd5b612b1883612ab5565b9150612b2660208401612ab5565b90509250929050565b600080600060608486031215612b4457600080fd5b612b4d84612ab5565b9250612b5b60208501612ab5565b9150604084013590509250925092565b60008060008060808587031215612b8157600080fd5b612b8a85612ab5565b9350612b9860208601612ab5565b925060408501359150606085013567ffffffffffffffff811115612bbb57600080fd5b8501601f81018713612bcc57600080fd5b612bdb87823560208401612a3f565b91505092959194509250565b60008060408385031215612bfa57600080fd5b612c0383612ab5565b9150612b2660208401612ad1565b60008060408385031215612c2457600080fd5b612c2d83612ab5565b946020939093013593505050565b600060208284031215612c4d57600080fd5b611a9382612ad1565b600060208284031215612c6857600080fd5b8135611a9381613042565b600060208284031215612c8557600080fd5b8151611a9381613042565b600060208284031215612ca257600080fd5b813567ffffffffffffffff811115612cb957600080fd5b8201601f81018413612cca57600080fd5b611fa084823560208401612a3f565b600060208284031215612ceb57600080fd5b5035919050565b60008060408385031215612d0557600080fd5b82359150612b2660208401612ab5565b60008151808452612d2d816020860160208601612f3e565b601f01601f19169290920160200192915050565b60008351612d53818460208801612f3e565b835190830190612d67818360208801612f3e565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612da390830184612d15565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612de557835183529284019291840191600101612dc9565b50909695505050505050565b602081526000611a936020830184612d15565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612eef57612eef612fd4565b500190565b600082612f0357612f03612fea565b500490565b6000816000190483118215151615612f2257612f22612fd4565b500290565b600082821015612f3957612f39612fd4565b500390565b60005b83811015612f59578181015183820152602001612f41565b838111156119925750506000910152565b600181811c90821680612f7e57607f821691505b60208210811415612f9f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612fb957612fb9612fd4565b5060010190565b600082612fcf57612fcf612fea565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461099b57600080fdfea264697066735822122048933a2ac174b63142a163ed8fd35987a0e02f31b6685fe033f57f7f1ff4c8ea64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001868747470733a2f2f6170692e6d6f677567752e636c75622f0000000000000000000000000000000000000000000000000000000000000000000000000000004033303562363139616430663231613630616364356364333064663565316534626438616664353736393435393736313463613432393637613835303036333239
-----Decoded View---------------
Arg [0] : baseURI (string): https://api.mogugu.club/
Arg [1] : provenanceHash (string): 305b619ad0f21a60acd5cd30df5e1e4bd8afd57694597614ca42967a85006329
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [3] : 68747470733a2f2f6170692e6d6f677567752e636c75622f0000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [5] : 3330356236313961643066323161363061636435636433306466356531653462
Arg [6] : 6438616664353736393435393736313463613432393637613835303036333239
Deployed Bytecode Sourcemap
55469:8360:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59155:123;;;;;;;;;;-1:-1:-1;59155:123:0;;;;;:::i;:::-;;:::i;:::-;;63648:178;;;;;;;;;;-1:-1:-1;63648:178:0;;;;;:::i;:::-;;:::i;:::-;;;6799:14:1;;6792:22;6774:41;;6762:2;6747:18;63648:178:0;;;;;;;;63116:146;;;;;;;;;;-1:-1:-1;63116:146:0;;;;;:::i;:::-;;:::i;35523:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37082:221::-;;;;;;;;;;-1:-1:-1;37082:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5460:32:1;;;5442:51;;5430:2;5415:18;37082:221:0;5296:203:1;36605:411:0;;;;;;;;;;-1:-1:-1;36605:411:0;;;;;:::i;:::-;;:::i;59868:107::-;;;;;;;;;;-1:-1:-1;59868:107:0;;;;;:::i;:::-;;:::i;60676:124::-;;;;;;;;;;-1:-1:-1;60676:124:0;;;;;:::i;:::-;;:::i;56352:36::-;;;;;;;;;;;;;;;;;;;20502:25:1;;;20490:2;20475:18;56352:36:0;20356:177:1;49152:113:0;;;;;;;;;;-1:-1:-1;49240:10:0;:17;49152:113;;55784:31;;;;;;;;;;;;;;;;37972:339;;;;;;;;;;-1:-1:-1;37972:339:0;;;;;:::i;:::-;;:::i;56407:37::-;;;;;;;;;;;;;;;;48820:256;;;;;;;;;;-1:-1:-1;48820:256:0;;;;;:::i;:::-;;:::i;38382:185::-;;;;;;;;;;-1:-1:-1;38382:185:0;;;;;:::i;:::-;;:::i;55117:245::-;;;;;;;;;;-1:-1:-1;55117:245:0;;;;;:::i;:::-;;:::i;62760:348::-;;;;;;;;;;-1:-1:-1;62760:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49342:233::-;;;;;;;;;;-1:-1:-1;49342:233:0;;;;;:::i;:::-;;:::i;59652:101::-;;;;;;;;;;-1:-1:-1;59652:101:0;;;;;:::i;:::-;;:::i;59057:90::-;;;;;;;;;;;;;:::i;14665:86::-;;;;;;;;;;-1:-1:-1;14736:7:0;;-1:-1:-1;;;14736:7:0;;;;14665:86;;35217:239;;;;;;;;;;-1:-1:-1;35217:239:0;;;;;:::i;:::-;;:::i;56746:297::-;;;;;;;;;;-1:-1:-1;56746:297:0;;;;;:::i;:::-;;:::i;34947:208::-;;;;;;;;;;-1:-1:-1;34947:208:0;;;;;:::i;:::-;;:::i;12962:94::-;;;;;;;;;;;;;:::i;62568:184::-;;;;;;;;;;;;;:::i;63270:123::-;;;:::i;59761:101::-;;;;;;;;;;-1:-1:-1;59761:101:0;;;;;:::i;:::-;;:::i;12311:87::-;;;;;;;;;;-1:-1:-1;12384:6:0;;-1:-1:-1;;;;;12384:6:0;12311:87;;56087:29;;;;;;;;;;;;;;;;56051;;;;;;;;;;;;;;;;57785:996;;;;;;:::i;:::-;;:::i;35692:104::-;;;;;;;;;;;;;:::i;60096:570::-;;;;;;;;;;;;;:::i;56160:45::-;;;;;;;;;;;;56203:2;56160:45;;37375:295;;;;;;;;;;-1:-1:-1;37375:295:0;;;;;:::i;:::-;;:::i;55679:28::-;;;;;;;;;;;;;:::i;57051:724::-;;;;;;:::i;:::-;;:::i;38638:328::-;;;;;;;;;;-1:-1:-1;38638:328:0;;;;;:::i;:::-;;:::i;56236:39::-;;;;;;;;;;;;56270:5;56236:39;;61552:400;;;;;;;;;;-1:-1:-1;61552:400:0;;;;;:::i;:::-;;:::i;55916:28::-;;;;;;;;;;;;;;;;55951:26;;;;;;;;;;;;;:::i;59286:102::-;;;;;;;;;;;;;:::i;59396:128::-;;;;;;;;;;;;;:::i;59981:107::-;;;;;;;;;;-1:-1:-1;59981:107:0;;;;;:::i;:::-;;:::i;55876:33::-;;;;;;;;;;;;;;;;37741:164;;;;;;;;;;-1:-1:-1;37741:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;37862:25:0;;;37838:4;37862:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;37741:164;60874:670;;;;;;;;;;;;;:::i;55984:25::-;;;;;;;;;;-1:-1:-1;55984:25:0;;;;;;;;56304:41;;;;;;;;;;;;56342:3;56304:41;;13211:192;;;;;;;;;;-1:-1:-1;13211:192:0;;;;;:::i;:::-;;:::i;56016:28::-;;;;;;;;;;-1:-1:-1;56016:28:0;;;;;;;;;;;59155:123;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;;;;;;;;;59236:16:::1;:34:::0;59155:123::o;63648:178::-;63758:4;63782:36;63806:11;63782:23;:36::i;:::-;63775:43;63648:178;-1:-1:-1;;63648:178:0:o;63116:146::-;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;63173:3:::1;63169:65;;;63193:8;:6;:8::i;:::-;63116:146:::0;:::o;63169:65::-:1;63244:10;:8;:10::i;35523:100::-:0;35577:13;35610:5;35603:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35523:100;:::o;37082:221::-;37158:7;40565:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40565:16:0;37178:73;;;;-1:-1:-1;;;37178:73:0;;16954:2:1;37178:73:0;;;16936:21:1;16993:2;16973:18;;;16966:30;17032:34;17012:18;;;17005:62;-1:-1:-1;;;17083:18:1;;;17076:42;17135:19;;37178:73:0;16752:408:1;37178:73:0;-1:-1:-1;37271:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37271:24:0;;37082:221::o;36605:411::-;36686:13;36702:23;36717:7;36702:14;:23::i;:::-;36686:39;;36750:5;-1:-1:-1;;;;;36744:11:0;:2;-1:-1:-1;;;;;36744:11:0;;;36736:57;;;;-1:-1:-1;;;36736:57:0;;18908:2:1;36736:57:0;;;18890:21:1;18947:2;18927:18;;;18920:30;18986:34;18966:18;;;18959:62;-1:-1:-1;;;19037:18:1;;;19030:31;19078:19;;36736:57:0;18706:397:1;36736:57:0;11179:10;-1:-1:-1;;;;;36828:21:0;;;;:62;;-1:-1:-1;36853:37:0;36870:5;11179:10;37741:164;:::i;36853:37::-;36806:168;;;;-1:-1:-1;;;36806:168:0;;14286:2:1;36806:168:0;;;14268:21:1;14325:2;14305:18;;;14298:30;14364:34;14344:18;;;14337:62;14435:26;14415:18;;;14408:54;14479:19;;36806:168:0;14084:420:1;36806:168:0;36987:21;36996:2;37000:7;36987:8;:21::i;:::-;36675:341;36605:411;;:::o;59868:107::-;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;59939:15:::1;:28:::0;59868:107::o;60676:124::-;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;60761:31;;::::1;::::0;:14:::1;::::0;:31:::1;::::0;::::1;::::0;::::1;:::i;:::-;;60676:124:::0;:::o;37972:339::-;38167:41;11179:10;38186:12;38200:7;38167:18;:41::i;:::-;38159:103;;;;-1:-1:-1;;;38159:103:0;;;;;;;:::i;:::-;38275:28;38285:4;38291:2;38295:7;38275:9;:28::i;48820:256::-;48917:7;48953:23;48970:5;48953:16;:23::i;:::-;48945:5;:31;48937:87;;;;-1:-1:-1;;;48937:87:0;;9070:2:1;48937:87:0;;;9052:21:1;9109:2;9089:18;;;9082:30;9148:34;9128:18;;;9121:62;-1:-1:-1;;;9199:18:1;;;9192:41;9250:19;;48937:87:0;8868:407:1;48937:87:0;-1:-1:-1;;;;;;49042:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;48820:256::o;38382:185::-;38520:39;38537:4;38543:2;38547:7;38520:39;;;;;;;;;;;;:16;:39::i;55117:245::-;55235:41;11179:10;55254:12;11099:98;55235:41;55227:102;;;;-1:-1:-1;;;55227:102:0;;20141:2:1;55227:102:0;;;20123:21:1;20180:2;20160:18;;;20153:30;20219:34;20199:18;;;20192:62;-1:-1:-1;;;20270:18:1;;;20263:46;20326:19;;55227:102:0;19939:412:1;55227:102:0;55340:14;55346:7;55340:5;:14::i;62760:348::-;62821:16;62850:18;62871:17;62881:6;62871:9;:17::i;:::-;62850:38;;62901:25;62943:10;62929:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62929:25:0;;62901:53;;62970:9;62965:108;62985:10;62981:1;:14;62965:108;;;63031:30;63051:6;63059:1;63031:19;:30::i;:::-;63017:8;63026:1;63017:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;62997:3;;;;:::i;:::-;;;;62965:108;;;-1:-1:-1;63092:8:0;62760:348;-1:-1:-1;;;62760:348:0:o;49342:233::-;49417:7;49453:30;49240:10;:17;;49152:113;49453:30;49445:5;:38;49437:95;;;;-1:-1:-1;;;49437:95:0;;19728:2:1;49437:95:0;;;19710:21:1;19767:2;19747:18;;;19740:30;19806:34;19786:18;;;19779:62;-1:-1:-1;;;19857:18:1;;;19850:42;19909:19;;49437:95:0;19526:408:1;49437:95:0;49550:10;49561:5;49550:17;;;;;;;;:::i;:::-;;;;;;;;;49543:24;;49342:233;;;:::o;59652:101::-;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;59723:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;59057:90::-:0;59098:7;59125:14;:12;:14::i;:::-;59118:21;;59057:90;:::o;35217:239::-;35289:7;35325:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35325:16:0;35360:19;35352:73;;;;-1:-1:-1;;;35352:73:0;;15122:2:1;35352:73:0;;;15104:21:1;15161:2;15141:18;;;15134:30;15200:34;15180:18;;;15173:62;-1:-1:-1;;;15251:18:1;;;15244:39;15300:19;;35352:73:0;14920:405:1;56746:297:0;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;56839:14:::1;::::0;56342:3:::1;::::0;56839:34:::1;::::0;56858:14;56839:18:::1;:34::i;:::-;:49;;56831:80;;;::::0;-1:-1:-1;;;56831:80:0;;13238:2:1;56831:80:0::1;::::0;::::1;13220:21:1::0;13277:2;13257:18;;;13250:30;-1:-1:-1;;;13296:18:1;;;13289:48;13354:18;;56831:80:0::1;13036:342:1::0;56831:80:0::1;56929:9;56924:112;56944:14;56940:1;:18;56924:112;;;56980:13;56989:3;56980:8;:13::i;:::-;57008:14;:16:::0;;;:14:::1;:16;::::0;::::1;:::i;:::-;;;;;;56960:3;;;;;:::i;:::-;;;;56924:112;;34947:208:::0;35019:7;-1:-1:-1;;;;;35047:19:0;;35039:74;;;;-1:-1:-1;;;35039:74:0;;14711:2:1;35039:74:0;;;14693:21:1;14750:2;14730:18;;;14723:30;14789:34;14769:18;;;14762:62;-1:-1:-1;;;14840:18:1;;;14833:40;14890:19;;35039:74:0;14509:406:1;35039:74:0;-1:-1:-1;;;;;;35131:16:0;;;;;:9;:16;;;;;;;34947:208::o;12962:94::-;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;13027:21:::1;13045:1;13027:9;:21::i;:::-;12962:94::o:0;62568:184::-;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;62648:13:::1;::::0;:18;62640:60:::1;;;::::0;-1:-1:-1;;;62640:60:0;;12880:2:1;62640:60:0::1;::::0;::::1;12862:21:1::0;12919:2;12899:18;;;12892:30;12958:31;12938:18;;;12931:59;13007:18;;62640:60:0::1;12678:353:1::0;62640:60:0::1;62732:12;62711:18;:33:::0;62568:184::o;63270:123::-;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;63337:47:::1;::::0;63345:10:::1;::::0;63362:21:::1;63337:47:::0;::::1;;;::::0;::::1;::::0;;;63362:21;63345:10;63337:47;::::1;;;;;;63329:56;;;::::0;::::1;59761:101:::0;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;59831:8:::1;:23:::0;59761:101::o;57785:996::-;57862:19;57884:14;:12;:14::i;:::-;14736:7;;57862:36;;-1:-1:-1;;;;14736:7:0;;;;57917:9;57909:38;;;;-1:-1:-1;;;57909:38:0;;11771:2:1;57909:38:0;;;11753:21:1;11810:2;11790:18;;;11783:30;-1:-1:-1;;;11829:18:1;;;11822:46;11885:18;;57909:38:0;11569:340:1;57909:38:0;57966:10;57980:9;57966:23;57958:50;;;;-1:-1:-1;;;57958:50:0;;16250:2:1;57958:50:0;;;16232:21:1;16289:2;16269:18;;;16262:30;-1:-1:-1;;;16308:18:1;;;16301:44;16362:18;;57958:50:0;16048:338:1;57958:50:0;58027:13;;;;58019:48;;;;-1:-1:-1;;;58019:48:0;;12529:2:1;58019:48:0;;;12511:21:1;12568:2;12548:18;;;12541:30;-1:-1:-1;;;12587:18:1;;;12580:52;12649:18;;58019:48:0;12327:346:1;58019:48:0;56270:5;58086:11;:21;58078:51;;;;-1:-1:-1;;;58078:51:0;;8013:2:1;58078:51:0;;;7995:21:1;8052:2;8032:18;;;8025:30;-1:-1:-1;;;8071:18:1;;;8064:47;8128:18;;58078:51:0;7811:341:1;58078:51:0;58165:1;58148:14;:18;58140:57;;;;-1:-1:-1;;;58140:57:0;;8715:2:1;58140:57:0;;;8697:21:1;8754:2;8734:18;;;8727:30;8793:28;8773:18;;;8766:56;8839:18;;58140:57:0;8513:350:1;58140:57:0;58280:14;;58251:44;;:24;56270:5;56342:3;58251:11;:24::i;:::-;:28;;:44::i;:::-;58216:31;:11;58232:14;58216:15;:31::i;:::-;:79;;58208:124;;;;-1:-1:-1;;;58208:124:0;;15889:2:1;58208:124:0;;;15871:21:1;;;15908:18;;;15901:30;15967:34;15947:18;;;15940:62;16019:18;;58208:124:0;15687:356:1;58208:124:0;56203:2;58351:14;:34;;58343:74;;;;-1:-1:-1;;;58343:74:0;;13930:2:1;58343:74:0;;;13912:21:1;13969:2;13949:18;;;13942:30;14008:29;13988:18;;;13981:57;14055:18;;58343:74:0;13728:351:1;58343:74:0;58449:30;58464:14;58449:10;:8;:10::i;:::-;:14;;:30::i;:::-;58436:9;:43;;58428:81;;;;-1:-1:-1;;;58428:81:0;;18554:2:1;58428:81:0;;;18536:21:1;18593:2;18573:18;;;18566:30;-1:-1:-1;;;18612:18:1;;;18605:55;18677:18;;58428:81:0;18352:349:1;58428:81:0;58527:9;58522:81;58542:14;58538:1;:18;58522:81;;;58578:13;58587:3;58578:8;:13::i;:::-;58558:3;;;;:::i;:::-;;;;58522:81;;;-1:-1:-1;58619:18:0;;:23;:93;;;;;56270:5;58647:14;:12;:14::i;:::-;:25;:64;;;;58695:16;;58676:15;:35;;58647:64;58615:159;;;58750:12;58729:18;:33;57851:930;57785:996;;:::o;35692:104::-;35748:13;35781:7;35774:14;;;;;:::i;60096:570::-;60136:7;60156:13;60172:34;60191:14;;60172;:12;:14::i;:::-;:18;;:34::i;:::-;60221:8;;60156:50;;-1:-1:-1;60221:12:0;60217:440;;-1:-1:-1;;60257:8:0;;;60096:570::o;60217:440::-;60310:15;;60302:5;:23;60298:333;;;60353:17;60346:24;;;60096:570;:::o;60298:333::-;60417:15;;60409:5;:23;;:71;;;;-1:-1:-1;60464:15:0;;60444;;:36;;:19;:36::i;:::-;60436:5;:44;60409:71;60405:226;;;60507:17;60500:24;;;60096:570;:::o;60405:226::-;60585:17;60578:24;;;60096:570;:::o;60405:226::-;60145:521;60096:570;:::o;37375:295::-;-1:-1:-1;;;;;37478:24:0;;11179:10;37478:24;;37470:62;;;;-1:-1:-1;;;37470:62:0;;11070:2:1;37470:62:0;;;11052:21:1;11109:2;11089:18;;;11082:30;11148:27;11128:18;;;11121:55;11193:18;;37470:62:0;10868:349:1;37470:62:0;11179:10;37545:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;37545:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;37545:53:0;;;;;;;;;;37614:48;;6774:41:1;;;37545:42:0;;11179:10;37614:48;;6747:18:1;37614:48:0;;;;;;;37375:295;;:::o;55679:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57051:724::-;14736:7;;-1:-1:-1;;;14736:7:0;;;;57145:9;57137:38;;;;-1:-1:-1;;;57137:38:0;;11771:2:1;57137:38:0;;;11753:21:1;11810:2;11790:18;;;11783:30;-1:-1:-1;;;11829:18:1;;;11822:46;11885:18;;57137:38:0;11569:340:1;57137:38:0;57194:10;57208:9;57194:23;57186:50;;;;-1:-1:-1;;;57186:50:0;;16250:2:1;57186:50:0;;;16232:21:1;16289:2;16269:18;;;16262:30;-1:-1:-1;;;16308:18:1;;;16301:44;16362:18;;57186:50:0;16048:338:1;57186:50:0;57255:16;;;;;;;57247:47;;;;-1:-1:-1;;;57247:47:0;;11424:2:1;57247:47:0;;;11406:21:1;11463:2;11443:18;;;11436:30;-1:-1:-1;;;11482:18:1;;;11475:48;11540:18;;57247:47:0;11222:342:1;57247:47:0;57330:1;57313:14;:18;57305:57;;;;-1:-1:-1;;;57305:57:0;;8715:2:1;57305:57:0;;;8697:21:1;8754:2;8734:18;;;8727:30;8793:28;8773:18;;;8766:56;8839:18;;57305:57:0;8513:350:1;57305:57:0;57419:15;;57381:14;;:34;;57400:14;57381:18;:34::i;:::-;:53;;57373:93;;;;-1:-1:-1;;;57373:93:0;;8359:2:1;57373:93:0;;;8341:21:1;8398:2;8378:18;;;8371:30;8437:29;8417:18;;;8410:57;8484:18;;57373:93:0;8157:351:1;57373:93:0;56203:2;57485:14;:34;;57477:74;;;;-1:-1:-1;;;57477:74:0;;13930:2:1;57477:74:0;;;13912:21:1;13969:2;13949:18;;;13942:30;14008:29;13988:18;;;13981:57;14055:18;;57477:74:0;13728:351:1;57477:74:0;57583:30;57598:14;57583:10;:8;:10::i;:30::-;57570:9;:43;;57562:81;;;;-1:-1:-1;;;57562:81:0;;18554:2:1;57562:81:0;;;18536:21:1;18593:2;18573:18;;;18566:30;-1:-1:-1;;;18612:18:1;;;18605:55;18677:18;;57562:81:0;18352:349:1;57562:81:0;57661:9;57656:112;57676:14;57672:1;:18;57656:112;;;57712:13;57721:3;57712:8;:13::i;:::-;57740:14;:16;;;:14;:16;;;:::i;:::-;;;;;;57692:3;;;;;:::i;:::-;;;;57656:112;;38638:328;38813:41;11179:10;38846:7;38813:18;:41::i;:::-;38805:103;;;;-1:-1:-1;;;38805:103:0;;;;;;;:::i;:::-;38919:39;38933:4;38939:2;38943:7;38952:5;38919:13;:39::i;:::-;38638:328;;;;:::o;61552:400::-;40541:4;40565:16;;;:7;:16;;;;;;61632:13;;-1:-1:-1;;;;;40565:16:0;61658:76;;;;-1:-1:-1;;;61658:76:0;;18138:2:1;61658:76:0;;;18120:21:1;18177:2;18157:18;;;18150:30;18216:34;18196:18;;;18189:62;-1:-1:-1;;;18267:18:1;;;18260:45;18322:19;;61658:76:0;17936:411:1;61658:76:0;61747:18;61789:41;56270:5;61790:26;61802:13;;61790:7;:11;;:26;;;;:::i;:::-;61789:32;;:41::i;:::-;61776:54;;61875:1;61854:10;:8;:10::i;:::-;61848:24;:28;:94;;;;;;;;;;;;;;;;;61903:10;:8;:10::i;:::-;61915:20;61924:10;61915:8;:20::i;:::-;61886:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61848:94;61841:101;61552:400;-1:-1:-1;;;61552:400:0:o;55951:26::-;;;;;;;:::i;59286:102::-;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;59364:16:::1;::::0;;-1:-1:-1;;59344:36:0;::::1;59364:16;::::0;;;::::1;;;59363:17;59344:36:::0;;::::1;;::::0;;59286:102::o;59396:128::-;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;59451:16:::1;:24:::0;;-1:-1:-1;;59486:30:0;;59451:24:::1;59503:13:::0;;;59502:14:::1;59486:30;::::0;;59396:128::o;59981:107::-;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;60052:15:::1;:28:::0;59981:107::o;60874:670::-;60930:13;;:18;60922:60;;;;-1:-1:-1;;;60922:60:0;;12880:2:1;60922:60:0;;;12862:21:1;12919:2;12899:18;;;12892:30;12958:31;12938:18;;;12931:59;13007:18;;60922:60:0;12678:353:1;60922:60:0;61001:18;;60993:64;;;;-1:-1:-1;;;60993:64:0;;15532:2:1;60993:64:0;;;15514:21:1;15571:2;15551:18;;;15544:30;15610;15590:18;;;15583:58;15658:18;;60993:64:0;15330:352:1;60993:64:0;61104:18;;61086:48;;56270:5;;61094:29;61086:48;:::i;:::-;61070:13;:64;61287:18;;61309:3;;61270:36;;:12;;:16;:36::i;:::-;:42;61266:137;;;56270:5;61363:16;61378:1;61363:12;:16;:::i;:::-;61345:46;;;61353:27;61345:46;:::i;:::-;61329:13;:62;61266:137;61454:13;;61450:87;;61505:13;;:20;;61523:1;61505:17;:20::i;:::-;61489:13;:36;60874:670::o;13211:192::-;12384:6;;-1:-1:-1;;;;;12384:6:0;11179:10;12531:23;12523:68;;;;-1:-1:-1;;;12523:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13300:22:0;::::1;13292:73;;;::::0;-1:-1:-1;;;13292:73:0;;9901:2:1;13292:73:0::1;::::0;::::1;9883:21:1::0;9940:2;9920:18;;;9913:30;9979:34;9959:18;;;9952:62;-1:-1:-1;;;10030:18:1;;;10023:36;10076:19;;13292:73:0::1;9699:402:1::0;13292:73:0::1;13376:19;13386:8;13376:9;:19::i;48512:224::-:0;48614:4;-1:-1:-1;;;;;;48638:50:0;;-1:-1:-1;;;48638:50:0;;:90;;;48692:36;48716:11;48692:23;:36::i;15465:118::-;14736:7;;-1:-1:-1;;;14736:7:0;;;;14990:9;14982:38;;;;-1:-1:-1;;;14982:38:0;;13585:2:1;14982:38:0;;;13567:21:1;13624:2;13604:18;;;13597:30;-1:-1:-1;;;13643:18:1;;;13636:46;13699:18;;14982:38:0;13383:340:1;14982:38:0;15525:7:::1;:14:::0;;-1:-1:-1;;;;15525:14:0::1;-1:-1:-1::0;;;15525:14:0::1;::::0;;15555:20:::1;15562:12;11179:10:::0;;11099:98;15562:12:::1;15555:20;::::0;-1:-1:-1;;;;;5460:32:1;;;5442:51;;5430:2;5415:18;15555:20:0::1;;;;;;;15465:118::o:0;15724:120::-;14736:7;;-1:-1:-1;;;14736:7:0;;;;15260:41;;;;-1:-1:-1;;;15260:41:0;;7664:2:1;15260:41:0;;;7646:21:1;7703:2;7683:18;;;7676:30;-1:-1:-1;;;7722:18:1;;;7715:50;7782:18;;15260:41:0;7462:344:1;15260:41:0;15783:7:::1;:15:::0;;-1:-1:-1;;;;15783:15:0::1;::::0;;15814:22:::1;11179:10:::0;15823:12:::1;11099:98:::0;44458:174;44533:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;44533:29:0;-1:-1:-1;;;;;44533:29:0;;;;;;;;:24;;44587:23;44533:24;44587:14;:23::i;:::-;-1:-1:-1;;;;;44578:46:0;;;;;;;;;;;44458:174;;:::o;40770:348::-;40863:4;40565:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40565:16:0;40880:73;;;;-1:-1:-1;;;40880:73:0;;12116:2:1;40880:73:0;;;12098:21:1;12155:2;12135:18;;;12128:30;12194:34;12174:18;;;12167:62;-1:-1:-1;;;12245:18:1;;;12238:42;12297:19;;40880:73:0;11914:408:1;40880:73:0;40964:13;40980:23;40995:7;40980:14;:23::i;:::-;40964:39;;41033:5;-1:-1:-1;;;;;41022:16:0;:7;-1:-1:-1;;;;;41022:16:0;;:51;;;;41066:7;-1:-1:-1;;;;;41042:31:0;:20;41054:7;41042:11;:20::i;:::-;-1:-1:-1;;;;;41042:31:0;;41022:51;:87;;;-1:-1:-1;;;;;;37862:25:0;;;37838:4;37862:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;41077:32;41014:96;40770:348;-1:-1:-1;;;;40770:348:0:o;43762:578::-;43921:4;-1:-1:-1;;;;;43894:31:0;:23;43909:7;43894:14;:23::i;:::-;-1:-1:-1;;;;;43894:31:0;;43886:85;;;;-1:-1:-1;;;43886:85:0;;17728:2:1;43886:85:0;;;17710:21:1;17767:2;17747:18;;;17740:30;17806:34;17786:18;;;17779:62;-1:-1:-1;;;17857:18:1;;;17850:39;17906:19;;43886:85:0;17526:405:1;43886:85:0;-1:-1:-1;;;;;43990:16:0;;43982:65;;;;-1:-1:-1;;;43982:65:0;;10665:2:1;43982:65:0;;;10647:21:1;10704:2;10684:18;;;10677:30;10743:34;10723:18;;;10716:62;-1:-1:-1;;;10794:18:1;;;10787:34;10838:19;;43982:65:0;10463:400:1;43982:65:0;44060:39;44081:4;44087:2;44091:7;44060:20;:39::i;:::-;44164:29;44181:1;44185:7;44164:8;:29::i;:::-;-1:-1:-1;;;;;44206:15:0;;;;;;:9;:15;;;;;:20;;44225:1;;44206:15;:20;;44225:1;;44206:20;:::i;:::-;;;;-1:-1:-1;;;;;;;44237:13:0;;;;;;:9;:13;;;;;:18;;44254:1;;44237:13;:18;;44254:1;;44237:18;:::i;:::-;;;;-1:-1:-1;;44266:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;44266:21:0;-1:-1:-1;;;;;44266:21:0;;;;;;;;;44305:27;;44266:16;;44305:27;;;;;;;43762:578;;;:::o;43065:360::-;43125:13;43141:23;43156:7;43141:14;:23::i;:::-;43125:39;;43177:48;43198:5;43213:1;43217:7;43177:20;:48::i;:::-;43266:29;43283:1;43287:7;43266:8;:29::i;:::-;-1:-1:-1;;;;;43308:16:0;;;;;;:9;:16;;;;;:21;;43328:1;;43308:16;:21;;43328:1;;43308:21;:::i;:::-;;;;-1:-1:-1;;43347:16:0;;;;:7;:16;;;;;;43340:23;;-1:-1:-1;;;;;;43340:23:0;;;43381:36;43355:7;;43347:16;-1:-1:-1;;;;;43381:36:0;;;;;43347:16;;43381:36;43114:311;43065:360;:::o;58946:103::-;58992:4;59016:25;:15;946:14;;854:114;4239:98;4297:7;4324:5;4328:1;4324;:5;:::i;58789:149::-;58839:7;58849:14;:12;:14::i;:::-;58839:24;;58874:27;:15;1065:19;;1083:1;1065:19;;;976:127;58874:27;58912:18;58922:3;58927:2;58912:9;:18::i;13411:173::-;13486:6;;;-1:-1:-1;;;;;13503:17:0;;;-1:-1:-1;;;;;;13503:17:0;;;;;;;13536:40;;13486:6;;;13503:17;13486:6;;13536:40;;13467:16;;13536:40;13456:128;13411:173;:::o;4620:98::-;4678:7;4705:5;4709:1;4705;:5;:::i;4977:98::-;5035:7;5062:5;5066:1;5062;:5;:::i;39848:315::-;40005:28;40015:4;40021:2;40025:7;40005:9;:28::i;:::-;40052:48;40075:4;40081:2;40085:7;40094:5;40052:22;:48::i;:::-;40044:111;;;;-1:-1:-1;;;40044:111:0;;;;;;;:::i;5941:98::-;5999:7;6026:5;6030:1;6026;:5;:::i;59532:112::-;59591:13;59624:12;59617:19;;;;;:::i;61960:600::-;62015:13;62114:10;62110:53;;-1:-1:-1;;62141:10:0;;;;;;;;;;;;-1:-1:-1;;;62141:10:0;;;;;61960:600::o;62110:53::-;62188:5;62173:12;62229:78;62236:9;;62229:78;;62262:8;;;;:::i;:::-;;-1:-1:-1;62285:10:0;;-1:-1:-1;62293:2:0;62285:10;;:::i;:::-;;;62229:78;;;62317:19;62349:6;62339:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62339:17:0;;62317:39;;62367:154;62374:10;;62367:154;;62401:11;62411:1;62401:11;;:::i;:::-;;-1:-1:-1;62470:10:0;62478:2;62470:5;:10;:::i;:::-;62457:24;;:2;:24;:::i;:::-;62444:39;;62427:6;62434;62427:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;62427:56:0;;;;;;;;-1:-1:-1;62498:11:0;62507:2;62498:11;;:::i;:::-;;;62367:154;;34578:305;34680:4;-1:-1:-1;;;;;;34717:40:0;;-1:-1:-1;;;34717:40:0;;:105;;-1:-1:-1;;;;;;;34774:48:0;;-1:-1:-1;;;34774:48:0;34717:105;:158;;;-1:-1:-1;;;;;;;;;;26666:40:0;;;34839:36;26557:157;63401:239;63587:45;63614:4;63620:2;63624:7;63587:26;:45::i;41460:110::-;41536:26;41546:2;41550:7;41536:26;;;;;;;;;;;;:9;:26::i;45197:799::-;45352:4;-1:-1:-1;;;;;45373:13:0;;16940:20;16988:8;45369:620;;45409:72;;-1:-1:-1;;;45409:72:0;;-1:-1:-1;;;;;45409:36:0;;;;;:72;;11179:10;;45460:4;;45466:7;;45475:5;;45409:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45409:72:0;;;;;;;;-1:-1:-1;;45409:72:0;;;;;;;;;;;;:::i;:::-;;;45405:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45651:13:0;;45647:272;;45694:60;;-1:-1:-1;;;45694:60:0;;;;;;;:::i;45647:272::-;45869:6;45863:13;45854:6;45850:2;45846:15;45839:38;45405:529;-1:-1:-1;;;;;;45532:51:0;-1:-1:-1;;;45532:51:0;;-1:-1:-1;45525:58:0;;45369:620;-1:-1:-1;45973:4:0;45197:799;;;;;;:::o;47300:275::-;47444:45;47471:4;47477:2;47481:7;47444:26;:45::i;:::-;14736:7;;-1:-1:-1;;;14736:7:0;;;;47510:9;47502:65;;;;-1:-1:-1;;;47502:65:0;;7252:2:1;47502:65:0;;;7234:21:1;7291:2;7271:18;;;7264:30;7330:34;7310:18;;;7303:62;-1:-1:-1;;;7381:18:1;;;7374:41;7432:19;;47502:65:0;7050:407:1;41797:321:0;41927:18;41933:2;41937:7;41927:5;:18::i;:::-;41978:54;42009:1;42013:2;42017:7;42026:5;41978:22;:54::i;:::-;41956:154;;;;-1:-1:-1;;;41956:154:0;;;;;;;:::i;50188:589::-;-1:-1:-1;;;;;50394:18:0;;50390:187;;50429:40;50461:7;51604:10;:17;;51577:24;;;;:15;:24;;;;;:44;;;51632:24;;;;;;;;;;;;51500:164;50429:40;50390:187;;;50499:2;-1:-1:-1;;;;;50491:10:0;:4;-1:-1:-1;;;;;50491:10:0;;50487:90;;50518:47;50551:4;50557:7;50518:32;:47::i;:::-;-1:-1:-1;;;;;50591:16:0;;50587:183;;50624:45;50661:7;50624:36;:45::i;50587:183::-;50697:4;-1:-1:-1;;;;;50691:10:0;:2;-1:-1:-1;;;;;50691:10:0;;50687:83;;50718:40;50746:2;50750:7;50718:27;:40::i;42454:382::-;-1:-1:-1;;;;;42534:16:0;;42526:61;;;;-1:-1:-1;;;42526:61:0;;16593:2:1;42526:61:0;;;16575:21:1;;;16612:18;;;16605:30;16671:34;16651:18;;;16644:62;16723:18;;42526:61:0;16391:356:1;42526:61:0;40541:4;40565:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40565:16:0;:30;42598:58;;;;-1:-1:-1;;;42598:58:0;;10308:2:1;42598:58:0;;;10290:21:1;10347:2;10327:18;;;10320:30;10386;10366:18;;;10359:58;10434:18;;42598:58:0;10106:352:1;42598:58:0;42669:45;42698:1;42702:2;42706:7;42669:20;:45::i;:::-;-1:-1:-1;;;;;42727:13:0;;;;;;:9;:13;;;;;:18;;42744:1;;42727:13;:18;;42744:1;;42727:18;:::i;:::-;;;;-1:-1:-1;;42756:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42756:21:0;-1:-1:-1;;;;;42756:21:0;;;;;;;;42795:33;;42756:16;;;42795:33;;42756:16;;42795:33;42454:382;;:::o;52291:988::-;52557:22;52607:1;52582:22;52599:4;52582:16;:22::i;:::-;:26;;;;:::i;:::-;52619:18;52640:26;;;:17;:26;;;;;;52557:51;;-1:-1:-1;52773:28:0;;;52769:328;;-1:-1:-1;;;;;52840:18:0;;52818:19;52840:18;;;:12;:18;;;;;;;;:34;;;;;;;;;52891:30;;;;;;:44;;;53008:30;;:17;:30;;;;;:43;;;52769:328;-1:-1:-1;53193:26:0;;;;:17;:26;;;;;;;;53186:33;;;-1:-1:-1;;;;;53237:18:0;;;;;:12;:18;;;;;:34;;;;;;;53230:41;52291:988::o;53574:1079::-;53852:10;:17;53827:22;;53852:21;;53872:1;;53852:21;:::i;:::-;53884:18;53905:24;;;:15;:24;;;;;;54278:10;:26;;53827:46;;-1:-1:-1;53905:24:0;;53827:46;;54278:26;;;;;;:::i;:::-;;;;;;;;;54256:48;;54342:11;54317:10;54328;54317:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;54422:28;;;:15;:28;;;;;;;:41;;;54594:24;;;;;54587:31;54629:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;53645:1008;;;53574:1079;:::o;51078:221::-;51163:14;51180:20;51197:2;51180:16;:20::i;:::-;-1:-1:-1;;;;;51211:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;51256:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;51078:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:186;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1144:29;1163:9;1144:29;:::i;1184:260::-;1252:6;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1352:29;1371:9;1352:29;:::i;:::-;1342:39;;1400:38;1434:2;1423:9;1419:18;1400:38;:::i;:::-;1390:48;;1184:260;;;;;:::o;1449:328::-;1526:6;1534;1542;1595:2;1583:9;1574:7;1570:23;1566:32;1563:52;;;1611:1;1608;1601:12;1563:52;1634:29;1653:9;1634:29;:::i;:::-;1624:39;;1682:38;1716:2;1705:9;1701:18;1682:38;:::i;:::-;1672:48;;1767:2;1756:9;1752:18;1739:32;1729:42;;1449:328;;;;;:::o;1782:666::-;1877:6;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;1994:29;2013:9;1994:29;:::i;:::-;1984:39;;2042:38;2076:2;2065:9;2061:18;2042:38;:::i;:::-;2032:48;;2127:2;2116:9;2112:18;2099:32;2089:42;;2182:2;2171:9;2167:18;2154:32;2209:18;2201:6;2198:30;2195:50;;;2241:1;2238;2231:12;2195:50;2264:22;;2317:4;2309:13;;2305:27;-1:-1:-1;2295:55:1;;2346:1;2343;2336:12;2295:55;2369:73;2434:7;2429:2;2416:16;2411:2;2407;2403:11;2369:73;:::i;:::-;2359:83;;;1782:666;;;;;;;:::o;2453:254::-;2518:6;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2618:29;2637:9;2618:29;:::i;:::-;2608:39;;2666:35;2697:2;2686:9;2682:18;2666:35;:::i;2712:254::-;2780:6;2788;2841:2;2829:9;2820:7;2816:23;2812:32;2809:52;;;2857:1;2854;2847:12;2809:52;2880:29;2899:9;2880:29;:::i;:::-;2870:39;2956:2;2941:18;;;;2928:32;;-1:-1:-1;;;2712:254:1:o;2971:180::-;3027:6;3080:2;3068:9;3059:7;3055:23;3051:32;3048:52;;;3096:1;3093;3086:12;3048:52;3119:26;3135:9;3119:26;:::i;3156:245::-;3214:6;3267:2;3255:9;3246:7;3242:23;3238:32;3235:52;;;3283:1;3280;3273:12;3235:52;3322:9;3309:23;3341:30;3365:5;3341:30;:::i;3406:249::-;3475:6;3528:2;3516:9;3507:7;3503:23;3499:32;3496:52;;;3544:1;3541;3534:12;3496:52;3576:9;3570:16;3595:30;3619:5;3595:30;:::i;3660:450::-;3729:6;3782:2;3770:9;3761:7;3757:23;3753:32;3750:52;;;3798:1;3795;3788:12;3750:52;3838:9;3825:23;3871:18;3863:6;3860:30;3857:50;;;3903:1;3900;3893:12;3857:50;3926:22;;3979:4;3971:13;;3967:27;-1:-1:-1;3957:55:1;;4008:1;4005;3998:12;3957:55;4031:73;4096:7;4091:2;4078:16;4073:2;4069;4065:11;4031:73;:::i;4115:180::-;4174:6;4227:2;4215:9;4206:7;4202:23;4198:32;4195:52;;;4243:1;4240;4233:12;4195:52;-1:-1:-1;4266:23:1;;4115:180;-1:-1:-1;4115:180:1:o;4300:254::-;4368:6;4376;4429:2;4417:9;4408:7;4404:23;4400:32;4397:52;;;4445:1;4442;4435:12;4397:52;4481:9;4468:23;4458:33;;4510:38;4544:2;4533:9;4529:18;4510:38;:::i;4559:257::-;4600:3;4638:5;4632:12;4665:6;4660:3;4653:19;4681:63;4737:6;4730:4;4725:3;4721:14;4714:4;4707:5;4703:16;4681:63;:::i;:::-;4798:2;4777:15;-1:-1:-1;;4773:29:1;4764:39;;;;4805:4;4760:50;;4559:257;-1:-1:-1;;4559:257:1:o;4821:470::-;5000:3;5038:6;5032:13;5054:53;5100:6;5095:3;5088:4;5080:6;5076:17;5054:53;:::i;:::-;5170:13;;5129:16;;;;5192:57;5170:13;5129:16;5226:4;5214:17;;5192:57;:::i;:::-;5265:20;;4821:470;-1:-1:-1;;;;4821:470:1:o;5504:488::-;-1:-1:-1;;;;;5773:15:1;;;5755:34;;5825:15;;5820:2;5805:18;;5798:43;5872:2;5857:18;;5850:34;;;5920:3;5915:2;5900:18;;5893:31;;;5698:4;;5941:45;;5966:19;;5958:6;5941:45;:::i;:::-;5933:53;5504:488;-1:-1:-1;;;;;;5504:488:1:o;5997:632::-;6168:2;6220:21;;;6290:13;;6193:18;;;6312:22;;;6139:4;;6168:2;6391:15;;;;6365:2;6350:18;;;6139:4;6434:169;6448:6;6445:1;6442:13;6434:169;;;6509:13;;6497:26;;6578:15;;;;6543:12;;;;6470:1;6463:9;6434:169;;;-1:-1:-1;6620:3:1;;5997:632;-1:-1:-1;;;;;;5997:632:1:o;6826:219::-;6975:2;6964:9;6957:21;6938:4;6995:44;7035:2;7024:9;7020:18;7012:6;6995:44;:::i;9280:414::-;9482:2;9464:21;;;9521:2;9501:18;;;9494:30;9560:34;9555:2;9540:18;;9533:62;-1:-1:-1;;;9626:2:1;9611:18;;9604:48;9684:3;9669:19;;9280:414::o;17165:356::-;17367:2;17349:21;;;17386:18;;;17379:30;17445:34;17440:2;17425:18;;17418:62;17512:2;17497:18;;17165:356::o;19108:413::-;19310:2;19292:21;;;19349:2;19329:18;;;19322:30;19388:34;19383:2;19368:18;;19361:62;-1:-1:-1;;;19454:2:1;19439:18;;19432:47;19511:3;19496:19;;19108:413::o;20538:128::-;20578:3;20609:1;20605:6;20602:1;20599:13;20596:39;;;20615:18;;:::i;:::-;-1:-1:-1;20651:9:1;;20538:128::o;20671:120::-;20711:1;20737;20727:35;;20742:18;;:::i;:::-;-1:-1:-1;20776:9:1;;20671:120::o;20796:168::-;20836:7;20902:1;20898;20894:6;20890:14;20887:1;20884:21;20879:1;20872:9;20865:17;20861:45;20858:71;;;20909:18;;:::i;:::-;-1:-1:-1;20949:9:1;;20796:168::o;20969:125::-;21009:4;21037:1;21034;21031:8;21028:34;;;21042:18;;:::i;:::-;-1:-1:-1;21079:9:1;;20969:125::o;21099:258::-;21171:1;21181:113;21195:6;21192:1;21189:13;21181:113;;;21271:11;;;21265:18;21252:11;;;21245:39;21217:2;21210:10;21181:113;;;21312:6;21309:1;21306:13;21303:48;;;-1:-1:-1;;21347:1:1;21329:16;;21322:27;21099:258::o;21362:380::-;21441:1;21437:12;;;;21484;;;21505:61;;21559:4;21551:6;21547:17;21537:27;;21505:61;21612:2;21604:6;21601:14;21581:18;21578:38;21575:161;;;21658:10;21653:3;21649:20;21646:1;21639:31;21693:4;21690:1;21683:15;21721:4;21718:1;21711:15;21575:161;;21362:380;;;:::o;21747:135::-;21786:3;-1:-1:-1;;21807:17:1;;21804:43;;;21827:18;;:::i;:::-;-1:-1:-1;21874:1:1;21863:13;;21747:135::o;21887:112::-;21919:1;21945;21935:35;;21950:18;;:::i;:::-;-1:-1:-1;21984:9:1;;21887:112::o;22004:127::-;22065:10;22060:3;22056:20;22053:1;22046:31;22096:4;22093:1;22086:15;22120:4;22117:1;22110:15;22136:127;22197:10;22192:3;22188:20;22185:1;22178:31;22228:4;22225:1;22218:15;22252:4;22249:1;22242:15;22268:127;22329:10;22324:3;22320:20;22317:1;22310:31;22360:4;22357:1;22350:15;22384:4;22381:1;22374:15;22400:127;22461:10;22456:3;22452:20;22449:1;22442:31;22492:4;22489:1;22482:15;22516:4;22513:1;22506:15;22532:127;22593:10;22588:3;22584:20;22581:1;22574:31;22624:4;22621:1;22614:15;22648:4;22645:1;22638:15;22664:131;-1:-1:-1;;;;;;22738:32:1;;22728:43;;22718:71;;22785:1;22782;22775:12
Swarm Source
ipfs://48933a2ac174b63142a163ed8fd35987a0e02f31b6685fe033f57f7f1ff4c8ea
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.