ETH Price: $3,355.11 (-3.46%)

Token

MetaIdol Extra (MIE)
 

Overview

Max Total Supply

777 MIE

Holders

177

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
romaconobuta.eth
Balance
5 MIE
0x1d479e00ff02ddd0828530cf3303f6eba930d0c8
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Token

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-30
*/

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.7 <0.9.0;

//import "@openzeppelin/contracts/utils/Strings.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

//import "../utils/Context.sol";
/**
 * @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;
    }
}


//import "@openzeppelin/contracts/access/Ownable.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

//import "../../utils/Address.sol";
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

//import "../../utils/introspection/IERC165.sol";
/**
 * @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);
}


//import "./IERC721.sol";
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

//import "./IERC721Receiver.sol";
/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


//import "./extensions/IERC721Metadata.sol";
/**
 * @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);
}


//import "../../utils/introspection/ERC165.sol";
/**
 * @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;
    }
}


//import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
/**
 * @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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


//import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


//import "./Common/IWhitelist.sol";
//--------------------------------------------
// WHITELIST intterface
//--------------------------------------------
interface IWhitelist {
    //--------------------
    // function
    //--------------------
    function check( address target ) external view returns (bool);
}


//------------------------------------------------------------
// Token(ERC721)
//------------------------------------------------------------
contract Token is Ownable, ERC721, ReentrancyGuard {
    //--------------------------------------------------------
    // 定数
    //--------------------------------------------------------
    string constant private TOKEN_NAME = "MetaIdol Extra";
    string constant private TOKEN_SYMBOL = "MIE";

    // mainnet
    address constant private OWNER_ADDRESS = 0xE2E577A889f2EB52C84c34E4539D33798987B6d2;

/*
    // testnet
    address constant private OWNER_ADDRESS = 0xf7831EA80Fc5179f86f82Af3aedDF2b7a2Ce13Df;
*/

    // constant
    uint256 constant private TOKEN_ID_OFS = 1;
    uint256 constant private BLOCK_SEC_MARGIN = 30;

    // enum
    uint256 constant private INFO_SUSPENDED = 0;
    uint256 constant private INFO_START = 1;
    uint256 constant private INFO_END = 2;
    uint256 constant private INFO_WHITELISTED = 3;
    uint256 constant private INFO_USER_MINTED = 4;
    uint256 constant private INFO_USER_MINTABLE = 5;
    uint256 constant private INFO_MAX = 6;

    uint256 constant private USER_INFO_TYPE = INFO_MAX;
    uint256 constant private USER_INFO_TOTAL_SUPPLY = INFO_MAX + 1;
    uint256 constant private USER_INFO_TOKEN_MAX = INFO_MAX + 2;
    uint256 constant private USER_INFO_MAX = INFO_MAX + 3;

    //--------------------------------------------------------
    // 管理
    //--------------------------------------------------------
    address private _manager;

    //--------------------------------------------------------
    // ストレージ
    //--------------------------------------------------------
    string private _base_uri_for_hidden;
    string private _base_uri_for_revealed;
    uint256 private _token_max;
    uint256 private _token_reserved;
    uint256 private _total_supply;

    // GOLD
    bool private _GOLD_is_suspended;
    uint256 private _GOLD_start;
    uint256 private _GOLD_end;
    uint256 private _GOLD_mintable;
    IWhitelist[] private _GOLD_arr_whitelist;
    mapping( address => uint256 ) private _GOLD_map_user_minted;

    // SILVER
    bool private _SILVER_is_suspended;
    uint256 private _SILVER_start;
    uint256 private _SILVER_end;
    uint256 private _SILVER_mintable;
    IWhitelist[] private _SILVER_arr_whitelist;
    mapping( address => uint256 ) private _SILVER_map_user_minted;

    //--------------------------------------------------------
    // [modifier] onlyOwnerOrManager
    //--------------------------------------------------------
    modifier onlyOwnerOrManager() {
        require( msg.sender == owner() || msg.sender == manager(), "caller is not the owner neither manager" );
        _;
    }

    //--------------------------------------------------------
    // コンストラクタ
    //--------------------------------------------------------
    constructor() Ownable() ERC721( TOKEN_NAME, TOKEN_SYMBOL ) {
        transferOwnership( OWNER_ADDRESS );
        _manager = msg.sender;

        //-----------------------
        // mainnet
        //-----------------------
        _base_uri_for_hidden = "ipfs://QmWSjFf17rHj6coHC2jGQs97gkLDBh3gADirmysmUkQ9Cm/";
        //_base_uri_for_revealed = "";
        _token_max = 777;
        _token_reserved = 20;

        //***********************
        // GOLD
        //***********************
        _GOLD_start = 1667116800;                  // 2022/10/30 17:00:00(JST)
        _GOLD_end   = 1667124000;                  // 2022/10/30 19:00:00(JST)
        _GOLD_mintable = 1;                        // 1 nft
        _GOLD_arr_whitelist.push( IWhitelist(0x3998f6917935bc77E77b52Bb067cf80eC7C837b4) );
        
        //~~~~~~~~~~~~~~~~~~~~~~~
        // SILVER
        //~~~~~~~~~~~~~~~~~~~~~~~
        _SILVER_start = 1667125800;                // 2022/10/30 19:30:00(JST)
        _SILVER_end   = 1667134800;                // 2022/10/30 22:00:00(JST)
        _SILVER_mintable = 5;                      // 5 nft
        _SILVER_arr_whitelist.push( IWhitelist(0x3998f6917935bc77E77b52Bb067cf80eC7C837b4) );   // GOLDはSILVERを兼ねる
        _SILVER_arr_whitelist.push( IWhitelist(0xf4C6DE0DAb70126FDD388b435ce4A81099768175) );

/*
        //-----------------------
        // testnet
        //-----------------------
        _base_uri_for_hidden = "ipfs://QmbuYkDiEuTxASyhRHtW9HRyvCKFPpk2BGEciSNAJ5sGDv/";
        //_base_uri_for_revealed = "";
        _token_max = 20;
        _token_reserved = 5;

        //***********************
        // GOLD
        //***********************
        _GOLD_start = 1667070000;                  // test 2022-10-30 04:00:00(JST)
        _GOLD_end   = 1667073000;                  // test 2022-10-30 04:50:00(JST)
        _GOLD_mintable = 1;                        // 1 nft
        _GOLD_arr_whitelist.push( IWhitelist(0x370324659963b56f34C86fC120d13176a80e0923) );
        
        //~~~~~~~~~~~~~~~~~~~~~~~
        // SILVER
        //~~~~~~~~~~~~~~~~~~~~~~~
        _SILVER_start = 1667073600;                // test 2022-10-30 05:00:00(JST)
        _SILVER_end   = 1667076600;                // test 2022-10-30 05:50:00(JST)
        _SILVER_mintable = 5;                      // 5 nft
        _SILVER_arr_whitelist.push( IWhitelist(0x370324659963b56f34C86fC120d13176a80e0923) );   // GOLDはSILVERを兼ねる
        _SILVER_arr_whitelist.push( IWhitelist(0xF7131FAF9504ffB195730622c7c664cB138f2a67) );
*/
    }

    //--------------------------------------------------------
    // [public] manager
    //--------------------------------------------------------
    function manager() public view returns (address) {
        return( _manager );
    }

    //--------------------------------------------------------
    // [external/onlyOwner] setManager
    //--------------------------------------------------------
    function setManager( address target ) external onlyOwner {
        _manager = target;
    }

    //--------------------------------------------------------
    // [external] get
    //--------------------------------------------------------
    function baseUriForHidden() external view returns (string memory) { return( _base_uri_for_hidden ); }
    function baseUriForRevealed() external view returns (string memory) { return( _base_uri_for_revealed ); }
    function tokenMax() external view returns (uint256) { return( _token_max ); }
    function tokenReserved() external view returns (uint256) { return( _token_reserved ); }
    function totalSupply() external view returns (uint256) { return( _total_supply ); }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] set
    //--------------------------------------------------------
    function setBaseUriForHidden( string calldata uri ) external onlyOwnerOrManager { _base_uri_for_hidden = uri; }
    function setBaseUriForRevealed( string calldata uri ) external onlyOwnerOrManager { _base_uri_for_revealed = uri; }
    function setTokenMax( uint256 max ) external onlyOwnerOrManager { _token_max = max; }
    function setTokenReserved( uint256 reserved ) external onlyOwnerOrManager { _token_reserved = reserved; }

    //--------------------------------------------------------
    // [public/override] tokenURI
    //--------------------------------------------------------
    function tokenURI( uint256 tokenId ) public view override returns (string memory) {
        require( _exists( tokenId ), "nonexistent token" );

        if( bytes(_base_uri_for_revealed).length > 0 ){
            return( string( abi.encodePacked( _base_uri_for_revealed, Strings.toString( tokenId ) ) ) );            
        }

        return( string( abi.encodePacked( _base_uri_for_hidden, Strings.toString( tokenId ) ) ) );
    }

    //********************************************************
    // [public] getInfo - GOLD
    //********************************************************
    function GOLD_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _GOLD_is_suspended ){ arrRet[INFO_SUSPENDED] = 1; }
        arrRet[INFO_START] = _GOLD_start;
        arrRet[INFO_END] = _GOLD_end;
        if( _checkWhitelist( _GOLD_arr_whitelist, target ) ){ arrRet[INFO_WHITELISTED] = 1; }
        arrRet[INFO_USER_MINTED] = _GOLD_map_user_minted[target];
        arrRet[INFO_USER_MINTABLE] = _GOLD_mintable;

        return( arrRet );
    }

    //********************************************************
    // [external/onlyOwnerOrManager] write - GOLD
    //********************************************************
    // is_suspended
    function GOLD_suspend( bool flag ) external onlyOwnerOrManager {
        _GOLD_is_suspended = flag;
    }

    // start-end
    function GOLD_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager {
        _GOLD_start = start;
        _GOLD_end = end;
    }

    // mintable
    function GOLD_setMintable( uint256 mintable ) external onlyOwnerOrManager {
        _GOLD_mintable = mintable;
    }

    // whitelist
    function GOLD_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager {
        delete _GOLD_arr_whitelist;

        for( uint256 i=0; i<lists.length; i++ ){
            require( lists[i] != address(0), "GOLD: invalid list"  );
            _GOLD_arr_whitelist.push( IWhitelist(lists[i]) );
        }
    }

    //********************************************************
    // [external/nonReentrant] mint - GOLD
    //********************************************************
    function GOLD_mint( uint256 num ) external nonReentrant {
        uint256[INFO_MAX] memory arrInfo = GOLD_getInfo( msg.sender );

        require( arrInfo[INFO_SUSPENDED] == 0, "GOLD: suspended" );
        require( arrInfo[INFO_START] == 0 || arrInfo[INFO_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "GOLD: not opend" );
        require( arrInfo[INFO_END] == 0 || (arrInfo[INFO_END]+BLOCK_SEC_MARGIN) > block.timestamp, "GOLD: finished" );
        require( arrInfo[INFO_WHITELISTED] == 1, "GOLD: not whitelisted" );
        require( arrInfo[INFO_USER_MINTABLE] == 0 || arrInfo[INFO_USER_MINTABLE] >= (arrInfo[INFO_USER_MINTED]+num), "GOLD: reached the limit" );

        _mintTokens( msg.sender, num );
        _GOLD_map_user_minted[msg.sender] += num;
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [public] getInfo - SILVER
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function SILVER_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) {
        uint256[INFO_MAX] memory arrRet;

        if( _SILVER_is_suspended ){ arrRet[INFO_SUSPENDED] = 1; }
        arrRet[INFO_START] = _SILVER_start;
        arrRet[INFO_END] = _SILVER_end;
        if( _checkWhitelist( _SILVER_arr_whitelist, target ) ){ arrRet[INFO_WHITELISTED] = 1; }
        arrRet[INFO_USER_MINTED] = _SILVER_map_user_minted[target];
        arrRet[INFO_USER_MINTABLE] = _SILVER_mintable;

        return( arrRet );
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [external/onlyOwnerOrManager] write - SILVER
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // is_suspended
    function SILVER_suspend( bool flag ) external onlyOwnerOrManager {
        _SILVER_is_suspended = flag;
    }

    // start-end
    function SILVER_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager {
        _SILVER_start = start;
        _SILVER_end = end;
    }

    // mintable
    function SILVER_setMintable( uint256 mintable ) external onlyOwnerOrManager {
        _SILVER_mintable = mintable;
    }

    // whitelist
    function SILVER_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager {
        delete _SILVER_arr_whitelist;

        for( uint256 i=0; i<lists.length; i++ ){
            require( lists[i] != address(0), "SILVER: invalid list"  );
            _SILVER_arr_whitelist.push( IWhitelist(lists[i]) );
        }
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // [external/nonReentrant] mint - SILVER
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    function SILVER_mint( uint256 num ) external nonReentrant {
        uint256[INFO_MAX] memory arrInfo = SILVER_getInfo( msg.sender );

        require( arrInfo[INFO_SUSPENDED] == 0, "SILVER: suspended" );
        require( arrInfo[INFO_START] == 0 || arrInfo[INFO_START] <= (block.timestamp+BLOCK_SEC_MARGIN), "SILVER: not opend" );
        require( arrInfo[INFO_END] == 0 || (arrInfo[INFO_END]+BLOCK_SEC_MARGIN) > block.timestamp, "SILVER: finished" );
        require( arrInfo[INFO_WHITELISTED] == 1, "SILVER: not whitelisted" );
        require( arrInfo[INFO_USER_MINTABLE] == 0 || arrInfo[INFO_USER_MINTABLE] >= (arrInfo[INFO_USER_MINTED]+num), "SILVER: reached the limit" );

        _mintTokens( msg.sender, num );
        _SILVER_map_user_minted[msg.sender] += num;
    }

    //--------------------------------------------------------
    // [internal] _checkWhitelist
    //--------------------------------------------------------
    function _checkWhitelist( IWhitelist[] storage lists, address target ) internal view returns (bool) {
        for( uint256 i=0; i<lists.length; i++ ){
            if( lists[i].check(target) ){
                return( true );
            }
        }

        return( false );        
    }

    //--------------------------------------------------------
    // [internal] _mintTokens
    //--------------------------------------------------------
    function _mintTokens( address to, uint256 num ) internal {
        require( _total_supply >= _token_reserved, "reservation not finished" );
        require( (_total_supply+num) <= _token_max, "exceeded the supply range" );

        for( uint256 i=0; i<num; i++ ){
            _mint( to, _total_supply+(TOKEN_ID_OFS+i) );
        }
        _total_supply += num;
    }

    //--------------------------------------------------------
    // [external/onlyOwnerOrManager] reserveTokens
    //--------------------------------------------------------
    function reserveTokens( uint256 num ) external onlyOwnerOrManager {
        require( (_total_supply+num) <= _token_reserved, "exceeded the reservation range" );

        for( uint256 i=0; i<num; i++ ){
            _mint( owner(), _total_supply+(TOKEN_ID_OFS+i) );
        }
        _total_supply += num;
    }

    //--------------------------------------------------------
    // [external] getUserInfo
    //--------------------------------------------------------
    function getUserInfo( address target ) external view returns (uint256[USER_INFO_MAX] memory) {
        uint256[USER_INFO_MAX] memory userInfo;
        uint256[INFO_MAX] memory info;

        // GOLD
        if( _checkWhitelist( _GOLD_arr_whitelist, target ) && (_GOLD_end == 0 || _GOLD_end > (block.timestamp+BLOCK_SEC_MARGIN/2)) ){
            userInfo[USER_INFO_TYPE] = 1;
            info = GOLD_getInfo( target );
        }
        // SILVER
        else{
            userInfo[USER_INFO_TYPE] = 2;
            info = SILVER_getInfo( target );
        }

        for( uint256 i=0; i<INFO_MAX; i++ ){
            userInfo[i] = info[i];
        }

        userInfo[USER_INFO_TOTAL_SUPPLY] = _total_supply;
        userInfo[USER_INFO_TOKEN_MAX] = _token_max;

        return( userInfo );
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"GOLD_getInfo","outputs":[{"internalType":"uint256[6]","name":"","type":"uint256[6]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"GOLD_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintable","type":"uint256"}],"name":"GOLD_setMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"GOLD_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"GOLD_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"GOLD_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"SILVER_getInfo","outputs":[{"internalType":"uint256[6]","name":"","type":"uint256[6]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"SILVER_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintable","type":"uint256"}],"name":"SILVER_setMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"SILVER_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"SILVER_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"SILVER_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriForHidden","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriForRevealed","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256[9]","name":"","type":"uint256[9]"}],"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":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"reserveTokens","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":"uri","type":"string"}],"name":"setBaseUriForHidden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUriForRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setTokenMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reserved","type":"uint256"}],"name":"setTokenReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenReserved","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":"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"}]

60806040523480156200001157600080fd5b506040518060400160405280600e81526020016d4d65746149646f6c20457874726160901b815250604051806040016040528060038152602001624d494560e81b8152506200006f62000069620001f760201b60201c565b620001fb565b8151620000849060019060208501906200032c565b5080516200009a9060029060208401906200032c565b5050600160075550620000c173e2e577a889f2eb52c84c34e4539d33798987b6d26200024b565b600880546001600160a01b031916331790556040805160608101909152603680825262002dea6020830139805162000102916009916020909101906200032c565b50610309600b556014600c5563635e2f00600f5563635e4b2060105560016011819055601280548083019091557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319908116733998f6917935bc77e77b52bb067cf80ec7c837b490811790925563635e522860155563635e7550601655600560175560188054808501825560008290527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e90810180548416909417909355805493840190559101805490911673f4c6de0dab70126fdd388b435ce4a810997681751790556200040f565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b62000255620002ce565b6001600160a01b038116620002c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620002cb81620001fb565b50565b6000546001600160a01b031633146200032a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620002b7565b565b8280546200033a90620003d2565b90600052602060002090601f0160209004810192826200035e5760008555620003a9565b82601f106200037957805160ff1916838001178555620003a9565b82800160010185558215620003a9579182015b82811115620003a95782518255916020019190600101906200038c565b50620003b7929150620003bb565b5090565b5b80821115620003b75760008155600101620003bc565b600181811c90821680620003e757607f821691505b602082108114156200040957634e487b7160e01b600052602260045260246000fd5b50919050565b6129cb806200041f6000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c806370a0823111610146578063b88d4fde116100c3578063e195d09611610087578063e195d0961461050b578063e3b2967914610513578063e985e9c514610526578063f2fde38b14610539578063f7ee70681461054c578063f87f6ed71461055457600080fd5b8063b88d4fde146104ac578063b8911881146104bf578063c87b56dd146104d2578063d031370b146104e5578063d0ebdbe7146104f857600080fd5b8063995c5f511161010a578063995c5f5114610458578063a04e5f7f1461046b578063a22cb46514610473578063ac1349a114610486578063b6202ef91461049957600080fd5b806370a0823114610404578063715018a61461041757806388d2415b1461041f5780638da5cb5b1461043f57806395d89b411461045057600080fd5b806337592618116101d457806352c0295f1161019857806352c0295f146103a35780635340e7ac146103ab5780635d8ceea9146103be5780636352211e146103d15780636386c1c7146103e457600080fd5b806337592618146103465780633bf62990146103595780633cbbebc61461036c57806342842e0e1461037f578063481c6a751461039257600080fd5b806318160ddd1161021b57806318160ddd146102e85780631c846d66146102fa57806323b872dd1461030d57806331a92e941461032057806333770c211461033357600080fd5b806301ffc9a71461025857806306e86b531461028057806306fdde0314610295578063081812fc146102aa578063095ea7b3146102d5575b600080fd5b61026b6102663660046124eb565b610567565b60405190151581526020015b60405180910390f35b61029361028e36600461243c565b6105b9565b005b61029d6106ff565b6040516102779190612746565b6102bd6102b8366004612585565b610791565b6040516001600160a01b039091168152602001610277565b6102936102e3366004612412565b6107b8565b600d545b604051908152602001610277565b61029361030836600461243c565b6108c9565b61029361031b3660046122c3565b610a03565b61029361032e36600461259e565b610a34565b6102936103413660046124b1565b610a7e565b610293610354366004612585565b610ad0565b610293610367366004612585565b610b14565b61029361037a366004612585565b610d77565b61029361038d3660046122c3565b610dbb565b6008546001600160a01b03166102bd565b61029d610dd6565b6102936103b9366004612585565b610de5565b6102936103cc366004612525565b610e29565b6102bd6103df366004612585565b610e74565b6103f76103f236600461226e565b610ed4565b604051610277919061271d565b6102ec61041236600461226e565b610ff0565b610293611076565b61043261042d36600461226e565b61108a565b60405161027791906126ec565b6000546001600160a01b03166102bd565b61029d611102565b6102936104663660046124b1565b611111565b61029d611163565b6102936104813660046123db565b611172565b610293610494366004612525565b611181565b6102936104a7366004612585565b6111cc565b6102936104ba3660046122ff565b611210565b6102936104cd36600461259e565b611248565b61029d6104e0366004612585565b611292565b6102936104f3366004612585565b611341565b61029361050636600461226e565b611449565b600c546102ec565b61043261052136600461226e565b611473565b61026b610534366004612290565b6114e4565b61029361054736600461226e565b611512565b600b546102ec565b610293610562366004612585565b61158b565b60006001600160e01b031982166380ac58cd60e01b148061059857506001600160e01b03198216635b5e139f60e01b145b806105b357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b03163314806105dc57506008546001600160a01b031633145b6106015760405162461bcd60e51b81526004016105f8906127ab565b60405180910390fd5b61060d6012600061215e565b60005b818110156106fa57600083838381811061062c5761062c612945565b9050602002016020810190610641919061226e565b6001600160a01b0316141561068d5760405162461bcd60e51b815260206004820152601260248201527111d3d3110e881a5b9d985b1a59081b1a5cdd60721b60448201526064016105f8565b60128383838181106106a1576106a1612945565b90506020020160208101906106b6919061226e565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055806106f2816128ea565b915050610610565b505050565b60606001805461070e906128af565b80601f016020809104026020016040519081016040528092919081815260200182805461073a906128af565b80156107875780601f1061075c57610100808354040283529160200191610787565b820191906000526020600020905b81548152906001019060200180831161076a57829003601f168201915b5050505050905090565b600061079c826117d2565b506000908152600560205260409020546001600160a01b031690565b60006107c382610e74565b9050806001600160a01b0316836001600160a01b031614156108315760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105f8565b336001600160a01b038216148061084d575061084d81336114e4565b6108bf5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016105f8565b6106fa8383611831565b6000546001600160a01b03163314806108ec57506008546001600160a01b031633145b6109085760405162461bcd60e51b81526004016105f8906127ab565b6109146018600061215e565b60005b818110156106fa57600083838381811061093357610933612945565b9050602002016020810190610948919061226e565b6001600160a01b031614156109965760405162461bcd60e51b815260206004820152601460248201527314d2531591548e881a5b9d985b1a59081b1a5cdd60621b60448201526064016105f8565b60188383838181106109aa576109aa612945565b90506020020160208101906109bf919061226e565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055806109fb816128ea565b915050610917565b610a0d338261189f565b610a295760405162461bcd60e51b81526004016105f8906127f2565b6106fa8383836118fe565b6000546001600160a01b0316331480610a5757506008546001600160a01b031633145b610a735760405162461bcd60e51b81526004016105f8906127ab565b600f91909155601055565b6000546001600160a01b0316331480610aa157506008546001600160a01b031633145b610abd5760405162461bcd60e51b81526004016105f8906127ab565b600e805460ff1916911515919091179055565b6000546001600160a01b0316331480610af357506008546001600160a01b031633145b610b0f5760405162461bcd60e51b81526004016105f8906127ab565b600b55565b60026007541415610b675760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105f8565b60026007556000610b773361108a565b805190915015610bbd5760405162461bcd60e51b815260206004820152601160248201527014d2531591548e881cdd5cdc195b991959607a1b60448201526064016105f8565b60208101511580610bdc5750610bd4601e42612840565b602082015111155b610c1c5760405162461bcd60e51b815260206004820152601160248201527014d2531591548e881b9bdd081bdc195b99607a1b60448201526064016105f8565b60408101511580610c3d575060408101514290610c3b90601e90612840565b115b610c7c5760405162461bcd60e51b815260206004820152601060248201526f14d2531591548e88199a5b9a5cda195960821b60448201526064016105f8565b6060810151600114610cd05760405162461bcd60e51b815260206004820152601760248201527f53494c5645523a206e6f742077686974656c697374656400000000000000000060448201526064016105f8565b60a08101511580610cf457506080810151610cec908390612840565b60a082015110155b610d405760405162461bcd60e51b815260206004820152601960248201527f53494c5645523a207265616368656420746865206c696d69740000000000000060448201526064016105f8565b610d4a3383611a9a565b3360009081526019602052604081208054849290610d69908490612840565b909155505060016007555050565b6000546001600160a01b0316331480610d9a57506008546001600160a01b031633145b610db65760405162461bcd60e51b81526004016105f8906127ab565b601155565b6106fa83838360405180602001604052806000815250611210565b60606009805461070e906128af565b6000546001600160a01b0316331480610e0857506008546001600160a01b031633145b610e245760405162461bcd60e51b81526004016105f8906127ab565b601755565b6000546001600160a01b0316331480610e4c57506008546001600160a01b031633145b610e685760405162461bcd60e51b81526004016105f8906127ab565b6106fa600a838361217c565b6000818152600360205260408120546001600160a01b0316806105b35760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105f8565b610edc612200565b610ee4612200565b610eec61221f565b610ef7601285611b95565b8015610f2357506010541580610f235750610f146002601e612858565b610f1e9042612840565b601054115b15610f3f57600160c0830152610f3884611473565b9050610f52565b600260c0830152610f4f8461108a565b90505b60005b6006811015610f9e57818160068110610f7057610f70612945565b6020020151838260098110610f8757610f87612945565b602002015280610f96816128ea565b915050610f55565b50600d5482610faf60066001612840565b60098110610fbf57610fbf612945565b6020020152600b5482610fd460066002612840565b60098110610fe457610fe4612945565b60200201525092915050565b60006001600160a01b03821661105a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105f8565b506001600160a01b031660009081526004602052604090205490565b61107e611c65565b6110886000611cbf565b565b61109261221f565b61109a61221f565b60145460ff16156110aa57600181525b601554602082015260165460408201526110c5601884611b95565b156110d257600160608201525b6001600160a01b03831660009081526019602052604090205460808201526017548160055b602002015292915050565b60606002805461070e906128af565b6000546001600160a01b031633148061113457506008546001600160a01b031633145b6111505760405162461bcd60e51b81526004016105f8906127ab565b6014805460ff1916911515919091179055565b6060600a805461070e906128af565b61117d338383611d0f565b5050565b6000546001600160a01b03163314806111a457506008546001600160a01b031633145b6111c05760405162461bcd60e51b81526004016105f8906127ab565b6106fa6009838361217c565b6000546001600160a01b03163314806111ef57506008546001600160a01b031633145b61120b5760405162461bcd60e51b81526004016105f8906127ab565b600c55565b61121a338361189f565b6112365760405162461bcd60e51b81526004016105f8906127f2565b61124284848484611dde565b50505050565b6000546001600160a01b031633148061126b57506008546001600160a01b031633145b6112875760405162461bcd60e51b81526004016105f8906127ab565b601591909155601655565b6000818152600360205260409020546060906001600160a01b03166112ed5760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b60448201526064016105f8565b6000600a80546112fc906128af565b9050111561133657600a61130f83611e11565b604051602001611320929190612608565b6040516020818303038152906040529050919050565b600961130f83611e11565b6000546001600160a01b031633148061136457506008546001600160a01b031633145b6113805760405162461bcd60e51b81526004016105f8906127ab565b600c5481600d546113919190612840565b11156113df5760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e6765000060448201526064016105f8565b60005b8181101561142e5761141c6113ff6000546001600160a01b031690565b61140a836001612840565b600d546114179190612840565b611f0f565b80611426816128ea565b9150506113e2565b5080600d60008282546114419190612840565b909155505050565b611451611c65565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61147b61221f565b61148361221f565b600e5460ff161561149357600181525b600f54602082015260105460408201526114ae601284611b95565b156114bb57600160608201525b6001600160a01b03831660009081526013602052604090205460808201526011548160056110f7565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61151a611c65565b6001600160a01b03811661157f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105f8565b61158881611cbf565b50565b600260075414156115de5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105f8565b600260075560006115ee33611473565b8051909150156116325760405162461bcd60e51b815260206004820152600f60248201526e11d3d3110e881cdd5cdc195b991959608a1b60448201526064016105f8565b602081015115806116515750611649601e42612840565b602082015111155b61168f5760405162461bcd60e51b815260206004820152600f60248201526e11d3d3110e881b9bdd081bdc195b99608a1b60448201526064016105f8565b604081015115806116b05750604081015142906116ae90601e90612840565b115b6116ed5760405162461bcd60e51b815260206004820152600e60248201526d11d3d3110e88199a5b9a5cda195960921b60448201526064016105f8565b60608101516001146117395760405162461bcd60e51b815260206004820152601560248201527411d3d3110e881b9bdd081dda1a5d195b1a5cdd1959605a1b60448201526064016105f8565b60a0810151158061175d57506080810151611755908390612840565b60a082015110155b6117a95760405162461bcd60e51b815260206004820152601760248201527f474f4c443a207265616368656420746865206c696d697400000000000000000060448201526064016105f8565b6117b33383611a9a565b3360009081526013602052604081208054849290610d69908490612840565b6000818152600360205260409020546001600160a01b03166115885760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105f8565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061186682610e74565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118ab83610e74565b9050806001600160a01b0316846001600160a01b031614806118d257506118d281856114e4565b806118f65750836001600160a01b03166118eb84610791565b6001600160a01b0316145b949350505050565b826001600160a01b031661191182610e74565b6001600160a01b0316146119755760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105f8565b6001600160a01b0382166119d75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105f8565b6119e2600082611831565b6001600160a01b0383166000908152600460205260408120805460019290611a0b90849061286c565b90915550506001600160a01b0382166000908152600460205260408120805460019290611a39908490612840565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600c54600d541015611aee5760405162461bcd60e51b815260206004820152601860248201527f7265736572766174696f6e206e6f742066696e6973686564000000000000000060448201526064016105f8565b600b5481600d54611aff9190612840565b1115611b4d5760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e67650000000000000060448201526064016105f8565b60005b81811015611b7957611b678361140a836001612840565b80611b71816128ea565b915050611b50565b5080600d6000828254611b8c9190612840565b90915550505050565b6000805b8354811015611c5b57838181548110611bb457611bb4612945565b600091825260209091200154604051631846d2f560e31b81526001600160a01b0385811660048301529091169063c23697a89060240160206040518083038186803b158015611c0257600080fd5b505afa158015611c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3a91906124ce565b15611c495760019150506105b3565b80611c53816128ea565b915050611b99565b5060009392505050565b6000546001600160a01b031633146110885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611d715760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105f8565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611de98484846118fe565b611df584848484612051565b6112425760405162461bcd60e51b81526004016105f890612759565b606081611e355750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e5f5780611e49816128ea565b9150611e589050600a83612858565b9150611e39565b60008167ffffffffffffffff811115611e7a57611e7a61295b565b6040519080825280601f01601f191660200182016040528015611ea4576020820181803683370190505b5090505b84156118f657611eb960018361286c565b9150611ec6600a86612905565b611ed1906030612840565b60f81b818381518110611ee657611ee6612945565b60200101906001600160f81b031916908160001a905350611f08600a86612858565b9450611ea8565b6001600160a01b038216611f655760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105f8565b6000818152600360205260409020546001600160a01b031615611fca5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105f8565b6001600160a01b0382166000908152600460205260408120805460019290611ff3908490612840565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561215357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120959033908990889088906004016126af565b602060405180830381600087803b1580156120af57600080fd5b505af19250505080156120df575060408051601f3d908101601f191682019092526120dc91810190612508565b60015b612139573d80801561210d576040519150601f19603f3d011682016040523d82523d6000602084013e612112565b606091505b5080516121315760405162461bcd60e51b81526004016105f890612759565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118f6565b506001949350505050565b5080546000825590600052602060002090810190611588919061223d565b828054612188906128af565b90600052602060002090601f0160209004810192826121aa57600085556121f0565b82601f106121c35782800160ff198235161785556121f0565b828001600101855582156121f0579182015b828111156121f05782358255916020019190600101906121d5565b506121fc92915061223d565b5090565b6040518061012001604052806009906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b808211156121fc576000815560010161223e565b80356001600160a01b038116811461226957600080fd5b919050565b60006020828403121561228057600080fd5b61228982612252565b9392505050565b600080604083850312156122a357600080fd5b6122ac83612252565b91506122ba60208401612252565b90509250929050565b6000806000606084860312156122d857600080fd5b6122e184612252565b92506122ef60208501612252565b9150604084013590509250925092565b6000806000806080858703121561231557600080fd5b61231e85612252565b935061232c60208601612252565b925060408501359150606085013567ffffffffffffffff8082111561235057600080fd5b818701915087601f83011261236457600080fd5b8135818111156123765761237661295b565b604051601f8201601f19908116603f0116810190838211818310171561239e5761239e61295b565b816040528281528a60208487010111156123b757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156123ee57600080fd5b6123f783612252565b9150602083013561240781612971565b809150509250929050565b6000806040838503121561242557600080fd5b61242e83612252565b946020939093013593505050565b6000806020838503121561244f57600080fd5b823567ffffffffffffffff8082111561246757600080fd5b818501915085601f83011261247b57600080fd5b81358181111561248a57600080fd5b8660208260051b850101111561249f57600080fd5b60209290920196919550909350505050565b6000602082840312156124c357600080fd5b813561228981612971565b6000602082840312156124e057600080fd5b815161228981612971565b6000602082840312156124fd57600080fd5b81356122898161297f565b60006020828403121561251a57600080fd5b81516122898161297f565b6000806020838503121561253857600080fd5b823567ffffffffffffffff8082111561255057600080fd5b818501915085601f83011261256457600080fd5b81358181111561257357600080fd5b86602082850101111561249f57600080fd5b60006020828403121561259757600080fd5b5035919050565b600080604083850312156125b157600080fd5b50508035926020909101359150565b600081518084526125d8816020860160208601612883565b601f01601f19169290920160200192915050565b600081516125fe818560208601612883565b9290920192915050565b600080845481600182811c91508083168061262457607f831692505b602080841082141561264457634e487b7160e01b86526022600452602486fd5b818015612658576001811461266957612696565b60ff19861689528489019650612696565b60008b81526020902060005b8681101561268e5781548b820152908501908301612675565b505084890196505b5050505050506126a681856125ec565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126e2908301846125c0565b9695505050505050565b60c08101818360005b60068110156127145781518352602092830192909101906001016126f5565b50505092915050565b6101208101818360005b6009811015612714578151835260209283019290910190600101612727565b60208152600061228960208301846125c0565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6000821982111561285357612853612919565b500190565b6000826128675761286761292f565b500490565b60008282101561287e5761287e612919565b500390565b60005b8381101561289e578181015183820152602001612886565b838111156112425750506000910152565b600181811c908216806128c357607f821691505b602082108114156128e457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156128fe576128fe612919565b5060010190565b6000826129145761291461292f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461158857600080fd5b6001600160e01b03198116811461158857600080fdfea2646970667358221220adc8a05c9f43c404659c607a6c58980f1c220b3fc02ce7466f0637532b12433f64736f6c63430008070033697066733a2f2f516d57536a4666313772486a36636f4843326a4751733937676b4c4442683367414469726d79736d556b5139436d2f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102535760003560e01c806370a0823111610146578063b88d4fde116100c3578063e195d09611610087578063e195d0961461050b578063e3b2967914610513578063e985e9c514610526578063f2fde38b14610539578063f7ee70681461054c578063f87f6ed71461055457600080fd5b8063b88d4fde146104ac578063b8911881146104bf578063c87b56dd146104d2578063d031370b146104e5578063d0ebdbe7146104f857600080fd5b8063995c5f511161010a578063995c5f5114610458578063a04e5f7f1461046b578063a22cb46514610473578063ac1349a114610486578063b6202ef91461049957600080fd5b806370a0823114610404578063715018a61461041757806388d2415b1461041f5780638da5cb5b1461043f57806395d89b411461045057600080fd5b806337592618116101d457806352c0295f1161019857806352c0295f146103a35780635340e7ac146103ab5780635d8ceea9146103be5780636352211e146103d15780636386c1c7146103e457600080fd5b806337592618146103465780633bf62990146103595780633cbbebc61461036c57806342842e0e1461037f578063481c6a751461039257600080fd5b806318160ddd1161021b57806318160ddd146102e85780631c846d66146102fa57806323b872dd1461030d57806331a92e941461032057806333770c211461033357600080fd5b806301ffc9a71461025857806306e86b531461028057806306fdde0314610295578063081812fc146102aa578063095ea7b3146102d5575b600080fd5b61026b6102663660046124eb565b610567565b60405190151581526020015b60405180910390f35b61029361028e36600461243c565b6105b9565b005b61029d6106ff565b6040516102779190612746565b6102bd6102b8366004612585565b610791565b6040516001600160a01b039091168152602001610277565b6102936102e3366004612412565b6107b8565b600d545b604051908152602001610277565b61029361030836600461243c565b6108c9565b61029361031b3660046122c3565b610a03565b61029361032e36600461259e565b610a34565b6102936103413660046124b1565b610a7e565b610293610354366004612585565b610ad0565b610293610367366004612585565b610b14565b61029361037a366004612585565b610d77565b61029361038d3660046122c3565b610dbb565b6008546001600160a01b03166102bd565b61029d610dd6565b6102936103b9366004612585565b610de5565b6102936103cc366004612525565b610e29565b6102bd6103df366004612585565b610e74565b6103f76103f236600461226e565b610ed4565b604051610277919061271d565b6102ec61041236600461226e565b610ff0565b610293611076565b61043261042d36600461226e565b61108a565b60405161027791906126ec565b6000546001600160a01b03166102bd565b61029d611102565b6102936104663660046124b1565b611111565b61029d611163565b6102936104813660046123db565b611172565b610293610494366004612525565b611181565b6102936104a7366004612585565b6111cc565b6102936104ba3660046122ff565b611210565b6102936104cd36600461259e565b611248565b61029d6104e0366004612585565b611292565b6102936104f3366004612585565b611341565b61029361050636600461226e565b611449565b600c546102ec565b61043261052136600461226e565b611473565b61026b610534366004612290565b6114e4565b61029361054736600461226e565b611512565b600b546102ec565b610293610562366004612585565b61158b565b60006001600160e01b031982166380ac58cd60e01b148061059857506001600160e01b03198216635b5e139f60e01b145b806105b357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b03163314806105dc57506008546001600160a01b031633145b6106015760405162461bcd60e51b81526004016105f8906127ab565b60405180910390fd5b61060d6012600061215e565b60005b818110156106fa57600083838381811061062c5761062c612945565b9050602002016020810190610641919061226e565b6001600160a01b0316141561068d5760405162461bcd60e51b815260206004820152601260248201527111d3d3110e881a5b9d985b1a59081b1a5cdd60721b60448201526064016105f8565b60128383838181106106a1576106a1612945565b90506020020160208101906106b6919061226e565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055806106f2816128ea565b915050610610565b505050565b60606001805461070e906128af565b80601f016020809104026020016040519081016040528092919081815260200182805461073a906128af565b80156107875780601f1061075c57610100808354040283529160200191610787565b820191906000526020600020905b81548152906001019060200180831161076a57829003601f168201915b5050505050905090565b600061079c826117d2565b506000908152600560205260409020546001600160a01b031690565b60006107c382610e74565b9050806001600160a01b0316836001600160a01b031614156108315760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105f8565b336001600160a01b038216148061084d575061084d81336114e4565b6108bf5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016105f8565b6106fa8383611831565b6000546001600160a01b03163314806108ec57506008546001600160a01b031633145b6109085760405162461bcd60e51b81526004016105f8906127ab565b6109146018600061215e565b60005b818110156106fa57600083838381811061093357610933612945565b9050602002016020810190610948919061226e565b6001600160a01b031614156109965760405162461bcd60e51b815260206004820152601460248201527314d2531591548e881a5b9d985b1a59081b1a5cdd60621b60448201526064016105f8565b60188383838181106109aa576109aa612945565b90506020020160208101906109bf919061226e565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b03909216919091179055806109fb816128ea565b915050610917565b610a0d338261189f565b610a295760405162461bcd60e51b81526004016105f8906127f2565b6106fa8383836118fe565b6000546001600160a01b0316331480610a5757506008546001600160a01b031633145b610a735760405162461bcd60e51b81526004016105f8906127ab565b600f91909155601055565b6000546001600160a01b0316331480610aa157506008546001600160a01b031633145b610abd5760405162461bcd60e51b81526004016105f8906127ab565b600e805460ff1916911515919091179055565b6000546001600160a01b0316331480610af357506008546001600160a01b031633145b610b0f5760405162461bcd60e51b81526004016105f8906127ab565b600b55565b60026007541415610b675760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105f8565b60026007556000610b773361108a565b805190915015610bbd5760405162461bcd60e51b815260206004820152601160248201527014d2531591548e881cdd5cdc195b991959607a1b60448201526064016105f8565b60208101511580610bdc5750610bd4601e42612840565b602082015111155b610c1c5760405162461bcd60e51b815260206004820152601160248201527014d2531591548e881b9bdd081bdc195b99607a1b60448201526064016105f8565b60408101511580610c3d575060408101514290610c3b90601e90612840565b115b610c7c5760405162461bcd60e51b815260206004820152601060248201526f14d2531591548e88199a5b9a5cda195960821b60448201526064016105f8565b6060810151600114610cd05760405162461bcd60e51b815260206004820152601760248201527f53494c5645523a206e6f742077686974656c697374656400000000000000000060448201526064016105f8565b60a08101511580610cf457506080810151610cec908390612840565b60a082015110155b610d405760405162461bcd60e51b815260206004820152601960248201527f53494c5645523a207265616368656420746865206c696d69740000000000000060448201526064016105f8565b610d4a3383611a9a565b3360009081526019602052604081208054849290610d69908490612840565b909155505060016007555050565b6000546001600160a01b0316331480610d9a57506008546001600160a01b031633145b610db65760405162461bcd60e51b81526004016105f8906127ab565b601155565b6106fa83838360405180602001604052806000815250611210565b60606009805461070e906128af565b6000546001600160a01b0316331480610e0857506008546001600160a01b031633145b610e245760405162461bcd60e51b81526004016105f8906127ab565b601755565b6000546001600160a01b0316331480610e4c57506008546001600160a01b031633145b610e685760405162461bcd60e51b81526004016105f8906127ab565b6106fa600a838361217c565b6000818152600360205260408120546001600160a01b0316806105b35760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105f8565b610edc612200565b610ee4612200565b610eec61221f565b610ef7601285611b95565b8015610f2357506010541580610f235750610f146002601e612858565b610f1e9042612840565b601054115b15610f3f57600160c0830152610f3884611473565b9050610f52565b600260c0830152610f4f8461108a565b90505b60005b6006811015610f9e57818160068110610f7057610f70612945565b6020020151838260098110610f8757610f87612945565b602002015280610f96816128ea565b915050610f55565b50600d5482610faf60066001612840565b60098110610fbf57610fbf612945565b6020020152600b5482610fd460066002612840565b60098110610fe457610fe4612945565b60200201525092915050565b60006001600160a01b03821661105a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105f8565b506001600160a01b031660009081526004602052604090205490565b61107e611c65565b6110886000611cbf565b565b61109261221f565b61109a61221f565b60145460ff16156110aa57600181525b601554602082015260165460408201526110c5601884611b95565b156110d257600160608201525b6001600160a01b03831660009081526019602052604090205460808201526017548160055b602002015292915050565b60606002805461070e906128af565b6000546001600160a01b031633148061113457506008546001600160a01b031633145b6111505760405162461bcd60e51b81526004016105f8906127ab565b6014805460ff1916911515919091179055565b6060600a805461070e906128af565b61117d338383611d0f565b5050565b6000546001600160a01b03163314806111a457506008546001600160a01b031633145b6111c05760405162461bcd60e51b81526004016105f8906127ab565b6106fa6009838361217c565b6000546001600160a01b03163314806111ef57506008546001600160a01b031633145b61120b5760405162461bcd60e51b81526004016105f8906127ab565b600c55565b61121a338361189f565b6112365760405162461bcd60e51b81526004016105f8906127f2565b61124284848484611dde565b50505050565b6000546001600160a01b031633148061126b57506008546001600160a01b031633145b6112875760405162461bcd60e51b81526004016105f8906127ab565b601591909155601655565b6000818152600360205260409020546060906001600160a01b03166112ed5760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b60448201526064016105f8565b6000600a80546112fc906128af565b9050111561133657600a61130f83611e11565b604051602001611320929190612608565b6040516020818303038152906040529050919050565b600961130f83611e11565b6000546001600160a01b031633148061136457506008546001600160a01b031633145b6113805760405162461bcd60e51b81526004016105f8906127ab565b600c5481600d546113919190612840565b11156113df5760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e6765000060448201526064016105f8565b60005b8181101561142e5761141c6113ff6000546001600160a01b031690565b61140a836001612840565b600d546114179190612840565b611f0f565b80611426816128ea565b9150506113e2565b5080600d60008282546114419190612840565b909155505050565b611451611c65565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61147b61221f565b61148361221f565b600e5460ff161561149357600181525b600f54602082015260105460408201526114ae601284611b95565b156114bb57600160608201525b6001600160a01b03831660009081526013602052604090205460808201526011548160056110f7565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61151a611c65565b6001600160a01b03811661157f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105f8565b61158881611cbf565b50565b600260075414156115de5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105f8565b600260075560006115ee33611473565b8051909150156116325760405162461bcd60e51b815260206004820152600f60248201526e11d3d3110e881cdd5cdc195b991959608a1b60448201526064016105f8565b602081015115806116515750611649601e42612840565b602082015111155b61168f5760405162461bcd60e51b815260206004820152600f60248201526e11d3d3110e881b9bdd081bdc195b99608a1b60448201526064016105f8565b604081015115806116b05750604081015142906116ae90601e90612840565b115b6116ed5760405162461bcd60e51b815260206004820152600e60248201526d11d3d3110e88199a5b9a5cda195960921b60448201526064016105f8565b60608101516001146117395760405162461bcd60e51b815260206004820152601560248201527411d3d3110e881b9bdd081dda1a5d195b1a5cdd1959605a1b60448201526064016105f8565b60a0810151158061175d57506080810151611755908390612840565b60a082015110155b6117a95760405162461bcd60e51b815260206004820152601760248201527f474f4c443a207265616368656420746865206c696d697400000000000000000060448201526064016105f8565b6117b33383611a9a565b3360009081526013602052604081208054849290610d69908490612840565b6000818152600360205260409020546001600160a01b03166115885760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105f8565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061186682610e74565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118ab83610e74565b9050806001600160a01b0316846001600160a01b031614806118d257506118d281856114e4565b806118f65750836001600160a01b03166118eb84610791565b6001600160a01b0316145b949350505050565b826001600160a01b031661191182610e74565b6001600160a01b0316146119755760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105f8565b6001600160a01b0382166119d75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105f8565b6119e2600082611831565b6001600160a01b0383166000908152600460205260408120805460019290611a0b90849061286c565b90915550506001600160a01b0382166000908152600460205260408120805460019290611a39908490612840565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600c54600d541015611aee5760405162461bcd60e51b815260206004820152601860248201527f7265736572766174696f6e206e6f742066696e6973686564000000000000000060448201526064016105f8565b600b5481600d54611aff9190612840565b1115611b4d5760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e67650000000000000060448201526064016105f8565b60005b81811015611b7957611b678361140a836001612840565b80611b71816128ea565b915050611b50565b5080600d6000828254611b8c9190612840565b90915550505050565b6000805b8354811015611c5b57838181548110611bb457611bb4612945565b600091825260209091200154604051631846d2f560e31b81526001600160a01b0385811660048301529091169063c23697a89060240160206040518083038186803b158015611c0257600080fd5b505afa158015611c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3a91906124ce565b15611c495760019150506105b3565b80611c53816128ea565b915050611b99565b5060009392505050565b6000546001600160a01b031633146110885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611d715760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105f8565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611de98484846118fe565b611df584848484612051565b6112425760405162461bcd60e51b81526004016105f890612759565b606081611e355750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e5f5780611e49816128ea565b9150611e589050600a83612858565b9150611e39565b60008167ffffffffffffffff811115611e7a57611e7a61295b565b6040519080825280601f01601f191660200182016040528015611ea4576020820181803683370190505b5090505b84156118f657611eb960018361286c565b9150611ec6600a86612905565b611ed1906030612840565b60f81b818381518110611ee657611ee6612945565b60200101906001600160f81b031916908160001a905350611f08600a86612858565b9450611ea8565b6001600160a01b038216611f655760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105f8565b6000818152600360205260409020546001600160a01b031615611fca5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105f8565b6001600160a01b0382166000908152600460205260408120805460019290611ff3908490612840565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561215357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120959033908990889088906004016126af565b602060405180830381600087803b1580156120af57600080fd5b505af19250505080156120df575060408051601f3d908101601f191682019092526120dc91810190612508565b60015b612139573d80801561210d576040519150601f19603f3d011682016040523d82523d6000602084013e612112565b606091505b5080516121315760405162461bcd60e51b81526004016105f890612759565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118f6565b506001949350505050565b5080546000825590600052602060002090810190611588919061223d565b828054612188906128af565b90600052602060002090601f0160209004810192826121aa57600085556121f0565b82601f106121c35782800160ff198235161785556121f0565b828001600101855582156121f0579182015b828111156121f05782358255916020019190600101906121d5565b506121fc92915061223d565b5090565b6040518061012001604052806009906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b808211156121fc576000815560010161223e565b80356001600160a01b038116811461226957600080fd5b919050565b60006020828403121561228057600080fd5b61228982612252565b9392505050565b600080604083850312156122a357600080fd5b6122ac83612252565b91506122ba60208401612252565b90509250929050565b6000806000606084860312156122d857600080fd5b6122e184612252565b92506122ef60208501612252565b9150604084013590509250925092565b6000806000806080858703121561231557600080fd5b61231e85612252565b935061232c60208601612252565b925060408501359150606085013567ffffffffffffffff8082111561235057600080fd5b818701915087601f83011261236457600080fd5b8135818111156123765761237661295b565b604051601f8201601f19908116603f0116810190838211818310171561239e5761239e61295b565b816040528281528a60208487010111156123b757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156123ee57600080fd5b6123f783612252565b9150602083013561240781612971565b809150509250929050565b6000806040838503121561242557600080fd5b61242e83612252565b946020939093013593505050565b6000806020838503121561244f57600080fd5b823567ffffffffffffffff8082111561246757600080fd5b818501915085601f83011261247b57600080fd5b81358181111561248a57600080fd5b8660208260051b850101111561249f57600080fd5b60209290920196919550909350505050565b6000602082840312156124c357600080fd5b813561228981612971565b6000602082840312156124e057600080fd5b815161228981612971565b6000602082840312156124fd57600080fd5b81356122898161297f565b60006020828403121561251a57600080fd5b81516122898161297f565b6000806020838503121561253857600080fd5b823567ffffffffffffffff8082111561255057600080fd5b818501915085601f83011261256457600080fd5b81358181111561257357600080fd5b86602082850101111561249f57600080fd5b60006020828403121561259757600080fd5b5035919050565b600080604083850312156125b157600080fd5b50508035926020909101359150565b600081518084526125d8816020860160208601612883565b601f01601f19169290920160200192915050565b600081516125fe818560208601612883565b9290920192915050565b600080845481600182811c91508083168061262457607f831692505b602080841082141561264457634e487b7160e01b86526022600452602486fd5b818015612658576001811461266957612696565b60ff19861689528489019650612696565b60008b81526020902060005b8681101561268e5781548b820152908501908301612675565b505084890196505b5050505050506126a681856125ec565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126e2908301846125c0565b9695505050505050565b60c08101818360005b60068110156127145781518352602092830192909101906001016126f5565b50505092915050565b6101208101818360005b6009811015612714578151835260209283019290910190600101612727565b60208152600061228960208301846125c0565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b6000821982111561285357612853612919565b500190565b6000826128675761286761292f565b500490565b60008282101561287e5761287e612919565b500390565b60005b8381101561289e578181015183820152602001612886565b838111156112425750506000910152565b600181811c908216806128c357607f821691505b602082108114156128e457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156128fe576128fe612919565b5060010190565b6000826129145761291461292f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461158857600080fd5b6001600160e01b03198116811461158857600080fdfea2646970667358221220adc8a05c9f43c404659c607a6c58980f1c220b3fc02ce7466f0637532b12433f64736f6c63430008070033

Deployed Bytecode Sourcemap

39929:15657:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23603:305;;;;;;:::i;:::-;;:::i;:::-;;;8855:14:1;;8848:22;8830:41;;8818:2;8803:18;23603:305:0;;;;;;;;49119:325;;;;;;:::i;:::-;;:::i;:::-;;24530:100;;;:::i;:::-;;;;;;;:::i;26043:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7153:32:1;;;7135:51;;7123:2;7108:18;26043:171:0;6989:203:1;25560:417:0;;;;;;:::i;:::-;;:::i;46455:83::-;46520:13;;46455:83;;;20685:25:1;;;20673:2;20658:18;46455:83:0;20539:177:1;51784:333:0;;;;;;:::i;:::-;;:::i;26743:336::-;;;;;;:::i;:::-;;:::i;48802:148::-;;;;;;:::i;:::-;;:::i;48669:107::-;;;;;;:::i;:::-;;:::i;46954:85::-;;;;;;:::i;:::-;;:::i;52299:787::-;;;;;;:::i;:::-;;:::i;48975:118::-;;;;;;:::i;:::-;;:::i;27150:185::-;;;;;;:::i;:::-;;:::i;45547:86::-;45615:8;;-1:-1:-1;;;;;45615:8:0;45547:86;;46061:101;;;:::i;51636:122::-;;;;;;:::i;:::-;;:::i;46833:115::-;;;;;;:::i;:::-;;:::i;24241:222::-;;;;;;:::i;:::-;;:::i;54765:816::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23972:207::-;;;;;;:::i;:::-;;:::i;5039:103::-;;;:::i;50565:545::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4391:87::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;4391:87;;24699:104;;;:::i;51320:111::-;;;;;;:::i;:::-;;:::i;46168:105::-;;;:::i;26286:155::-;;;;;;:::i;:::-;;:::i;46716:111::-;;;;;;:::i;:::-;;:::i;47045:105::-;;;;;;:::i;:::-;;:::i;27406:323::-;;;;;;:::i;:::-;;:::i;51457:154::-;;;;;;:::i;:::-;;:::i;47321:441::-;;;;;;:::i;:::-;;:::i;54282:316::-;;;;;;:::i;:::-;;:::i;45809:93::-;;;;;;:::i;:::-;;:::i;46362:87::-;46429:15;;46362:87;;47930:531;;;;;;:::i;:::-;;:::i;26512:164::-;;;;;;:::i;:::-;;:::i;5297:201::-;;;;;;:::i;:::-;;:::i;46279:77::-;46341:10;;46279:77;;49624:771;;;;;;:::i;:::-;;:::i;23603:305::-;23705:4;-1:-1:-1;;;;;;23742:40:0;;-1:-1:-1;;;23742:40:0;;:105;;-1:-1:-1;;;;;;;23799:48:0;;-1:-1:-1;;;23799:48:0;23742:105;:158;;;-1:-1:-1;;;;;;;;;;22258:40:0;;;23864:36;23722:178;23603:305;-1:-1:-1;;23603:305:0:o;49119:325::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;;;;;;;;;49213:26:::1;49220:19;;49213:26;:::i;:::-;49257:9;49252:185;49270:14:::0;;::::1;49252:185;;;49335:1;49315:5:::0;;49321:1;49315:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49315:22:0::1;;;49306:56;;;::::0;-1:-1:-1;;;49306:56:0;;14967:2:1;49306:56:0::1;::::0;::::1;14949:21:1::0;15006:2;14986:18;;;14979:30;-1:-1:-1;;;15025:18:1;;;15018:48;15083:18;;49306:56:0::1;14765:342:1::0;49306:56:0::1;49377:19;49414:5;;49420:1;49414:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;49377:48:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;49377:48:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;49377:48:0::1;-1:-1:-1::0;;;;;49377:48:0;;::::1;::::0;;;::::1;::::0;;49286:3;::::1;::::0;::::1;:::i;:::-;;;;49252:185;;;;49119:325:::0;;:::o;24530:100::-;24584:13;24617:5;24610:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24530:100;:::o;26043:171::-;26119:7;26139:23;26154:7;26139:14;:23::i;:::-;-1:-1:-1;26182:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26182:24:0;;26043:171::o;25560:417::-;25641:13;25657:23;25672:7;25657:14;:23::i;:::-;25641:39;;25705:5;-1:-1:-1;;;;;25699:11:0;:2;-1:-1:-1;;;;;25699:11:0;;;25691:57;;;;-1:-1:-1;;;25691:57:0;;17066:2:1;25691:57:0;;;17048:21:1;17105:2;17085:18;;;17078:30;17144:34;17124:18;;;17117:62;-1:-1:-1;;;17195:18:1;;;17188:31;17236:19;;25691:57:0;16864:397:1;25691:57:0;3122:10;-1:-1:-1;;;;;25783:21:0;;;;:62;;-1:-1:-1;25808:37:0;25825:5;3122:10;26512:164;:::i;25808:37::-;25761:174;;;;-1:-1:-1;;;25761:174:0;;13823:2:1;25761:174:0;;;13805:21:1;13862:2;13842:18;;;13835:30;13901:34;13881:18;;;13874:62;13972:32;13952:18;;;13945:60;14022:19;;25761:174:0;13621:426:1;25761:174:0;25948:21;25957:2;25961:7;25948:8;:21::i;51784:333::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;51880:28:::1;51887:21;;51880:28;:::i;:::-;51926:9;51921:189;51939:14:::0;;::::1;51921:189;;;52004:1;51984:5:::0;;51990:1;51984:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51984:22:0::1;;;51975:58;;;::::0;-1:-1:-1;;;51975:58:0;;16717:2:1;51975:58:0::1;::::0;::::1;16699:21:1::0;16756:2;16736:18;;;16729:30;-1:-1:-1;;;16775:18:1;;;16768:50;16835:18;;51975:58:0::1;16515:344:1::0;51975:58:0::1;52048:21;52087:5;;52093:1;52087:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52048:50:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;52048:50:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;52048:50:0::1;-1:-1:-1::0;;;;;52048:50:0;;::::1;::::0;;;::::1;::::0;;51955:3;::::1;::::0;::::1;:::i;:::-;;;;51921:189;;26743:336:::0;26938:41;3122:10;26971:7;26938:18;:41::i;:::-;26930:100;;;;-1:-1:-1;;;26930:100:0;;;;;;;:::i;:::-;27043:28;27053:4;27059:2;27063:7;27043:9;:28::i;48802:148::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;48897:11:::1;:19:::0;;;;48927:9:::1;:15:::0;48802:148::o;48669:107::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;48743:18:::1;:25:::0;;-1:-1:-1;;48743:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48669:107::o;46954:85::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;47020:10:::1;:16:::0;46954:85::o;52299:787::-;38504:1;39102:7;;:19;;39094:63;;;;-1:-1:-1;;;39094:63:0;;18994:2:1;39094:63:0;;;18976:21:1;19033:2;19013:18;;;19006:30;19072:33;19052:18;;;19045:61;19123:18;;39094:63:0;18792:355:1;39094:63:0;38504:1;39235:7;:18;52368:32:::1;52403:28;52419:10;52403:14;:28::i;:::-;52453:23:::0;;52368:63;;-1:-1:-1;52453:28:0;52444:60:::1;;;::::0;-1:-1:-1;;;52444:60:0;;19354:2:1;52444:60:0::1;::::0;::::1;19336:21:1::0;19393:2;19373:18;;;19366:30;-1:-1:-1;;;19412:18:1;;;19405:47;19469:18;;52444:60:0::1;19152:341:1::0;52444:60:0::1;52524:19;::::0;::::1;::::0;:24;;:85:::1;;-1:-1:-1::0;52576:32:0::1;40576:2;52576:15;:32;:::i;:::-;52552:19;::::0;::::1;::::0;:57:::1;;52524:85;52515:117;;;::::0;-1:-1:-1;;;52515:117:0;;13477:2:1;52515:117:0::1;::::0;::::1;13459:21:1::0;13516:2;13496:18;;;13489:30;-1:-1:-1;;;13535:18:1;;;13528:47;13592:18;;52515:117:0::1;13275:341:1::0;52515:117:0::1;52652:17:::0;;::::1;::::0;:22;;:80:::1;;-1:-1:-1::0;52679:17:0;;::::1;::::0;52717:15:::1;::::0;52679:34:::1;::::0;40576:2:::1;::::0;52679:34:::1;:::i;:::-;52678:54;52652:80;52643:111;;;::::0;-1:-1:-1;;;52643:111:0;;20396:2:1;52643:111:0::1;::::0;::::1;20378:21:1::0;20435:2;20415:18;;;20408:30;-1:-1:-1;;;20454:18:1;;;20447:46;20510:18;;52643:111:0::1;20194:340:1::0;52643:111:0::1;52774:25:::0;;::::1;::::0;52803:1:::1;52774:30;52765:68;;;::::0;-1:-1:-1;;;52765:68:0;;19700:2:1;52765:68:0::1;::::0;::::1;19682:21:1::0;19739:2;19719:18;;;19712:30;19778:25;19758:18;;;19751:53;19821:18;;52765:68:0::1;19498:347:1::0;52765:68:0::1;52853:27:::0;;::::1;::::0;:32;;:98:::1;;-1:-1:-1::0;52921:25:0;;::::1;::::0;:29:::1;::::0;52947:3;;52921:29:::1;:::i;:::-;52889:27:::0;;::::1;::::0;:62:::1;;52853:98;52844:138;;;::::0;-1:-1:-1;;;52844:138:0;;12010:2:1;52844:138:0::1;::::0;::::1;11992:21:1::0;12049:2;12029:18;;;12022:30;12088:27;12068:18;;;12061:55;12133:18;;52844:138:0::1;11808:349:1::0;52844:138:0::1;52995:30;53008:10;53020:3;52995:11;:30::i;:::-;53060:10;53036:35;::::0;;;:23:::1;:35;::::0;;;;:42;;53075:3;;53036:35;:42:::1;::::0;53075:3;;53036:42:::1;:::i;:::-;::::0;;;-1:-1:-1;;38460:1:0;39414:7;:22;-1:-1:-1;;52299:787:0:o;48975:118::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;49060:14:::1;:25:::0;48975:118::o;27150:185::-;27288:39;27305:4;27311:2;27315:7;27288:39;;;;;;;;;;;;:16;:39::i;46061:101::-;46112:13;46137:20;46129:30;;;;;:::i;51636:122::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;51723:16:::1;:27:::0;51636:122::o;46833:115::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;46917:28:::1;:22;46942:3:::0;;46917:28:::1;:::i;24241:222::-:0;24313:7;24349:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24349:16:0;24384:19;24376:56;;;;-1:-1:-1;;;24376:56:0;;16364:2:1;24376:56:0;;;16346:21:1;16403:2;16383:18;;;16376:30;-1:-1:-1;;;16422:18:1;;;16415:54;16486:18;;24376:56:0;16162:348:1;54765:816:0;54827:29;;:::i;:::-;54869:38;;:::i;:::-;54918:29;;:::i;:::-;54981:46;54998:19;55019:6;54981:15;:46::i;:::-;:118;;;;-1:-1:-1;55032:9:0;;:14;;:66;;-1:-1:-1;55079:18:0;55096:1;40576:2;55079:18;:::i;:::-;55063:34;;:15;:34;:::i;:::-;55050:9;;:48;55032:66;54977:357;;;55143:1;55116:24;;;:28;55166:22;55180:6;55166:12;:22::i;:::-;55159:29;;54977:357;;;55275:1;55248:24;;;:28;55298:24;55314:6;55298:14;:24::i;:::-;55291:31;;54977:357;55351:9;55346:83;40934:1;55364;:10;55346:83;;;55410:4;55415:1;55410:7;;;;;;;:::i;:::-;;;;;55396:8;55405:1;55396:11;;;;;;;:::i;:::-;;;;:21;55376:3;;;;:::i;:::-;;;;55346:83;;;-1:-1:-1;55476:13:0;;55441:8;41051:12;40934:1;41062;41051:12;:::i;:::-;55441:32;;;;;;;:::i;:::-;;;;:48;55532:10;;55500:8;41117:12;40934:1;41128;41117:12;:::i;:::-;55500:29;;;;;;;:::i;:::-;;;;:42;-1:-1:-1;55563:8:0;54765:816;-1:-1:-1;;54765:816:0:o;23972:207::-;24044:7;-1:-1:-1;;;;;24072:19:0;;24064:73;;;;-1:-1:-1;;;24064:73:0;;12364:2:1;24064:73:0;;;12346:21:1;12403:2;12383:18;;;12376:30;12442:34;12422:18;;;12415:62;-1:-1:-1;;;12493:18:1;;;12486:39;12542:19;;24064:73:0;12162:405:1;24064:73:0;-1:-1:-1;;;;;;24155:16:0;;;;;:9;:16;;;;;;;23972:207::o;5039:103::-;4277:13;:11;:13::i;:::-;5104:30:::1;5131:1;5104:18;:30::i;:::-;5039:103::o:0;50565:545::-;50628:24;;:::i;:::-;50665:31;;:::i;:::-;50713:20;;;;50709:57;;;50762:1;50737:26;;50709:57;50797:13;;50776:18;;;:34;50840:11;;50821:16;;;:30;50866:48;50883:21;50906:6;50866:15;:48::i;:::-;50862:87;;;50945:1;50918:24;;;:28;50862:87;-1:-1:-1;;;;;50986:31:0;;;;;;:23;:31;;;;;;50959:24;;;:58;51057:16;;50959:6;40890:1;51028:26;;;;:45;51094:6;50565:545;-1:-1:-1;;50565:545:0:o;24699:104::-;24755:13;24788:7;24781:14;;;;;:::i;51320:111::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;51396:20:::1;:27:::0;;-1:-1:-1;;51396:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;51320:111::o;46168:105::-;46221:13;46246:22;46238:32;;;;;:::i;26286:155::-;26381:52;3122:10;26414:8;26424;26381:18;:52::i;:::-;26286:155;;:::o;46716:111::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;46798:26:::1;:20;46821:3:::0;;46798:26:::1;:::i;47045:105::-:0;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;47121:15:::1;:26:::0;47045:105::o;27406:323::-;27580:41;3122:10;27613:7;27580:18;:41::i;:::-;27572:100;;;;-1:-1:-1;;;27572:100:0;;;;;;;:::i;:::-;27683:38;27697:4;27703:2;27707:7;27716:4;27683:13;:38::i;:::-;27406:323;;;;:::o;51457:154::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;51554:13:::1;:21:::0;;;;51586:11:::1;:17:::0;51457:154::o;47321:441::-;29301:4;29325:16;;;:7;:16;;;;;;47388:13;;-1:-1:-1;;;;;29325:16:0;47414:50;;;;-1:-1:-1;;;47414:50:0;;15314:2:1;47414:50:0;;;15296:21:1;15353:2;15333:18;;;15326:30;-1:-1:-1;;;15372:18:1;;;15365:47;15429:18;;47414:50:0;15112:341:1;47414:50:0;47520:1;47487:22;47481:36;;;;;:::i;:::-;;;:40;47477:176;;;47572:22;47596:27;47614:7;47596:16;:27::i;:::-;47554:71;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47538:91;;47321:441;;;:::o;47477:176::-;47699:20;47721:27;47739:7;47721:16;:27::i;54282:316::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;42489:10;:21;;:48;;-1:-1:-1;45615:8:0;;-1:-1:-1;;;;;45615:8:0;42514:10;:23;42489:48;42480:102;;;;-1:-1:-1;;;42480:102:0;;;;;;;:::i;:::-;54391:15:::1;;54383:3;54369:13;;:17;;;;:::i;:::-;54368:38;;54359:83;;;::::0;-1:-1:-1;;;54359:83:0;;12774:2:1;54359:83:0::1;::::0;::::1;12756:21:1::0;12813:2;12793:18;;;12786:30;12852:32;12832:18;;;12825:60;12902:18;;54359:83:0::1;12572:354:1::0;54359:83:0::1;54460:9;54455:105;54475:3;54473:1;:5;54455:105;;;54500:48;54507:7;4437::::0;4464:6;-1:-1:-1;;;;;4464:6:0;;4391:87;54507:7:::1;54531:14;54544:1:::0;40524::::1;54531:14;:::i;:::-;54516:13;;:30;;;;:::i;:::-;54500:5;:48::i;:::-;54480:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54455:105;;;;54587:3;54570:13;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;54282:316:0:o;45809:93::-;4277:13;:11;:13::i;:::-;45877:8:::1;:17:::0;;-1:-1:-1;;;;;;45877:17:0::1;-1:-1:-1::0;;;;;45877:17:0;;;::::1;::::0;;;::::1;::::0;;45809:93::o;47930:531::-;47991:24;;:::i;:::-;48028:31;;:::i;:::-;48076:18;;;;48072:55;;;48123:1;48098:26;;48072:55;48158:11;;48137:18;;;:32;48199:9;;48180:16;;;:28;48223:46;48240:19;48261:6;48223:15;:46::i;:::-;48219:85;;;48300:1;48273:24;;;:28;48219:85;-1:-1:-1;;;;;48341:29:0;;;;;;:21;:29;;;;;;48314:24;;;:56;48410:14;;48314:6;40890:1;48381:26;;26512:164;-1:-1:-1;;;;;26633:25:0;;;26609:4;26633:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26512:164::o;5297:201::-;4277:13;:11;:13::i;:::-;-1:-1:-1;;;;;5386:22:0;::::1;5378:73;;;::::0;-1:-1:-1;;;5378:73:0;;10081:2:1;5378:73:0::1;::::0;::::1;10063:21:1::0;10120:2;10100:18;;;10093:30;10159:34;10139:18;;;10132:62;-1:-1:-1;;;10210:18:1;;;10203:36;10256:19;;5378:73:0::1;9879:402:1::0;5378:73:0::1;5462:28;5481:8;5462:18;:28::i;:::-;5297:201:::0;:::o;49624:771::-;38504:1;39102:7;;:19;;39094:63;;;;-1:-1:-1;;;39094:63:0;;18994:2:1;39094:63:0;;;18976:21:1;19033:2;19013:18;;;19006:30;19072:33;19052:18;;;19045:61;19123:18;;39094:63:0;18792:355:1;39094:63:0;38504:1;39235:7;:18;49691:32:::1;49726:26;49740:10;49726:12;:26::i;:::-;49774:23:::0;;49691:61;;-1:-1:-1;49774:28:0;49765:58:::1;;;::::0;-1:-1:-1;;;49765:58:0;;13133:2:1;49765:58:0::1;::::0;::::1;13115:21:1::0;13172:2;13152:18;;;13145:30;-1:-1:-1;;;13191:18:1;;;13184:45;13246:18;;49765:58:0::1;12931:339:1::0;49765:58:0::1;49843:19;::::0;::::1;::::0;:24;;:85:::1;;-1:-1:-1::0;49895:32:0::1;40576:2;49895:15;:32;:::i;:::-;49871:19;::::0;::::1;::::0;:57:::1;;49843:85;49834:115;;;::::0;-1:-1:-1;;;49834:115:0;;20052:2:1;49834:115:0::1;::::0;::::1;20034:21:1::0;20091:2;20071:18;;;20064:30;-1:-1:-1;;;20110:18:1;;;20103:45;20165:18;;49834:115:0::1;19850:339:1::0;49834:115:0::1;49969:17:::0;;::::1;::::0;:22;;:80:::1;;-1:-1:-1::0;49996:17:0;;::::1;::::0;50034:15:::1;::::0;49996:34:::1;::::0;40576:2:::1;::::0;49996:34:::1;:::i;:::-;49995:54;49969:80;49960:109;;;::::0;-1:-1:-1;;;49960:109:0;;16021:2:1;49960:109:0::1;::::0;::::1;16003:21:1::0;16060:2;16040:18;;;16033:30;-1:-1:-1;;;16079:18:1;;;16072:44;16133:18;;49960:109:0::1;15819:338:1::0;49960:109:0::1;50089:25:::0;;::::1;::::0;50118:1:::1;50089:30;50080:66;;;::::0;-1:-1:-1;;;50080:66:0;;18644:2:1;50080:66:0::1;::::0;::::1;18626:21:1::0;18683:2;18663:18;;;18656:30;-1:-1:-1;;;18702:18:1;;;18695:51;18763:18;;50080:66:0::1;18442:345:1::0;50080:66:0::1;50166:27:::0;;::::1;::::0;:32;;:98:::1;;-1:-1:-1::0;50234:25:0;;::::1;::::0;:29:::1;::::0;50260:3;;50234:29:::1;:::i;:::-;50202:27:::0;;::::1;::::0;:62:::1;;50166:98;50157:136;;;::::0;-1:-1:-1;;;50157:136:0;;14615:2:1;50157:136:0::1;::::0;::::1;14597:21:1::0;14654:2;14634:18;;;14627:30;14693:25;14673:18;;;14666:53;14736:18;;50157:136:0::1;14413:347:1::0;50157:136:0::1;50306:30;50319:10;50331:3;50306:11;:30::i;:::-;50369:10;50347:33;::::0;;;:21:::1;:33;::::0;;;;:40;;50384:3;;50347:33;:40:::1;::::0;50384:3;;50347:40:::1;:::i;34018:135::-:0;29301:4;29325:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29325:16:0;34092:53;;;;-1:-1:-1;;;34092:53:0;;16364:2:1;34092:53:0;;;16346:21:1;16403:2;16383:18;;;16376:30;-1:-1:-1;;;16422:18:1;;;16415:54;16486:18;;34092:53:0;16162:348:1;33297:174:0;33372:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;33372:29:0;-1:-1:-1;;;;;33372:29:0;;;;;;;;:24;;33426:23;33372:24;33426:14;:23::i;:::-;-1:-1:-1;;;;;33417:46:0;;;;;;;;;;;33297:174;;:::o;29530:264::-;29623:4;29640:13;29656:23;29671:7;29656:14;:23::i;:::-;29640:39;;29709:5;-1:-1:-1;;;;;29698:16:0;:7;-1:-1:-1;;;;;29698:16:0;;:52;;;;29718:32;29735:5;29742:7;29718:16;:32::i;:::-;29698:87;;;;29778:7;-1:-1:-1;;;;;29754:31:0;:20;29766:7;29754:11;:20::i;:::-;-1:-1:-1;;;;;29754:31:0;;29698:87;29690:96;29530:264;-1:-1:-1;;;;29530:264:0:o;32553:625::-;32712:4;-1:-1:-1;;;;;32685:31:0;:23;32700:7;32685:14;:23::i;:::-;-1:-1:-1;;;;;32685:31:0;;32677:81;;;;-1:-1:-1;;;32677:81:0;;10488:2:1;32677:81:0;;;10470:21:1;10527:2;10507:18;;;10500:30;10566:34;10546:18;;;10539:62;-1:-1:-1;;;10617:18:1;;;10610:35;10662:19;;32677:81:0;10286:401:1;32677:81:0;-1:-1:-1;;;;;32777:16:0;;32769:65;;;;-1:-1:-1;;;32769:65:0;;11251:2:1;32769:65:0;;;11233:21:1;11290:2;11270:18;;;11263:30;11329:34;11309:18;;;11302:62;-1:-1:-1;;;11380:18:1;;;11373:34;11424:19;;32769:65:0;11049:400:1;32769:65:0;32951:29;32968:1;32972:7;32951:8;:29::i;:::-;-1:-1:-1;;;;;32993:15:0;;;;;;:9;:15;;;;;:20;;33012:1;;32993:15;:20;;33012:1;;32993:20;:::i;:::-;;;;-1:-1:-1;;;;;;;33024:13:0;;;;;;:9;:13;;;;;:18;;33041:1;;33024:13;:18;;33041:1;;33024:18;:::i;:::-;;;;-1:-1:-1;;33053:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33053:21:0;-1:-1:-1;;;;;33053:21:0;;;;;;;;;33092:27;;33053:16;;33092:27;;;;;;;49252:185:::1;49119:325:::0;;:::o;53720:374::-;53814:15;;53797:13;;:32;;53788:71;;;;-1:-1:-1;;;53788:71:0;;17876:2:1;53788:71:0;;;17858:21:1;17915:2;17895:18;;;17888:30;17954:26;17934:18;;;17927:54;17998:18;;53788:71:0;17674:348:1;53788:71:0;53902:10;;53894:3;53880:13;;:17;;;;:::i;:::-;53879:33;;53870:73;;;;-1:-1:-1;;;53870:73:0;;9308:2:1;53870:73:0;;;9290:21:1;9347:2;9327:18;;;9320:30;9386:27;9366:18;;;9359:55;9431:18;;53870:73:0;9106:349:1;53870:73:0;53961:9;53956:100;53976:3;53974:1;:5;53956:100;;;54001:43;54008:2;54027:14;54040:1;40524;54027:14;:::i;54001:43::-;53981:3;;;;:::i;:::-;;;;53956:100;;;;54083:3;54066:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;53720:374:0:o;53257:296::-;53351:4;;53368:142;53388:12;;53386:14;;53368:142;;;53426:5;53432:1;53426:8;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;-1:-1:-1;;;53426:22:0;;-1:-1:-1;;;;;7153:32:1;;;53426:22:0;;;7135:51:1;53426:8:0;;;;:14;;7108:18:1;;53426:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53422:77;;;53477:4;53469:14;;;;;53422:77;53402:3;;;;:::i;:::-;;;;53368:142;;;-1:-1:-1;53530:5:0;;53257:296;-1:-1:-1;;;53257:296:0:o;4556:132::-;4437:7;4464:6;-1:-1:-1;;;;;4464:6:0;3122:10;4620:23;4612:68;;;;-1:-1:-1;;;4612:68:0;;15660:2:1;4612:68:0;;;15642:21:1;;;15679:18;;;15672:30;15738:34;15718:18;;;15711:62;15790:18;;4612:68:0;15458:356:1;5658:191:0;5732:16;5751:6;;-1:-1:-1;;;;;5768:17:0;;;-1:-1:-1;;;;;;5768:17:0;;;;;;5801:40;;5751:6;;;;;;;5801:40;;5732:16;5801:40;5721:128;5658:191;:::o;33614:315::-;33769:8;-1:-1:-1;;;;;33760:17:0;:5;-1:-1:-1;;;;;33760:17:0;;;33752:55;;;;-1:-1:-1;;;33752:55:0;;11656:2:1;33752:55:0;;;11638:21:1;11695:2;11675:18;;;11668:30;11734:27;11714:18;;;11707:55;11779:18;;33752:55:0;11454:349:1;33752:55:0;-1:-1:-1;;;;;33818:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33818:46:0;;;;;;;;;;33880:41;;8830::1;;;33880::0;;8803:18:1;33880:41:0;;;;;;;33614:315;;;:::o;28610:313::-;28766:28;28776:4;28782:2;28786:7;28766:9;:28::i;:::-;28813:47;28836:4;28842:2;28846:7;28855:4;28813:22;:47::i;:::-;28805:110;;;;-1:-1:-1;;;28805:110:0;;;;;;;:::i;401:723::-;457:13;678:10;674:53;;-1:-1:-1;;705:10:0;;;;;;;;;;;;-1:-1:-1;;;705:10:0;;;;;401:723::o;674:53::-;752:5;737:12;793:78;800:9;;793:78;;826:8;;;;:::i;:::-;;-1:-1:-1;849:10:0;;-1:-1:-1;857:2:0;849:10;;:::i;:::-;;;793:78;;;881:19;913:6;903:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;903:17:0;;881:39;;931:154;938:10;;931:154;;965:11;975:1;965:11;;:::i;:::-;;-1:-1:-1;1034:10:0;1042:2;1034:5;:10;:::i;:::-;1021:24;;:2;:24;:::i;:::-;1008:39;;991:6;998;991:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;991:56:0;;;;;;;;-1:-1:-1;1062:11:0;1071:2;1062:11;;:::i;:::-;;;931:154;;31128:439;-1:-1:-1;;;;;31208:16:0;;31200:61;;;;-1:-1:-1;;;31200:61:0;;14254:2:1;31200:61:0;;;14236:21:1;;;14273:18;;;14266:30;14332:34;14312:18;;;14305:62;14384:18;;31200:61:0;14052:356:1;31200:61:0;29301:4;29325:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29325:16:0;:30;31272:58;;;;-1:-1:-1;;;31272:58:0;;10894:2:1;31272:58:0;;;10876:21:1;10933:2;10913:18;;;10906:30;10972;10952:18;;;10945:58;11020:18;;31272:58:0;10692:352:1;31272:58:0;-1:-1:-1;;;;;31401:13:0;;;;;;:9;:13;;;;;:18;;31418:1;;31401:13;:18;;31418:1;;31401:18;:::i;:::-;;;;-1:-1:-1;;31430:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31430:21:0;-1:-1:-1;;;;;31430:21:0;;;;;;;;31469:33;;31430:16;;;31469:33;;31430:16;;31469:33;26286:155;;:::o;34717:853::-;34871:4;-1:-1:-1;;;;;34892:13:0;;7267:19;:23;34888:675;;34928:71;;-1:-1:-1;;;34928:71:0;;-1:-1:-1;;;;;34928:36:0;;;;;:71;;3122:10;;34979:4;;34985:7;;34994:4;;34928:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34928:71:0;;;;;;;;-1:-1:-1;;34928:71:0;;;;;;;;;;;;:::i;:::-;;;34924:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35169:13:0;;35165:328;;35212:60;;-1:-1:-1;;;35212:60:0;;;;;;;:::i;35165:328::-;35443:6;35437:13;35428:6;35424:2;35420:15;35413:38;34924:584;-1:-1:-1;;;;;;35050:51:0;-1:-1:-1;;;35050:51:0;;-1:-1:-1;35043:58:0;;34888:675;-1:-1:-1;35547:4:0;34717:853;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:315::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2381:28;2403:5;2381:28;:::i;:::-;2428:5;2418:15;;;2124:315;;;;;:::o;2444:254::-;2512:6;2520;2573:2;2561:9;2552:7;2548:23;2544:32;2541:52;;;2589:1;2586;2579:12;2541:52;2612:29;2631:9;2612:29;:::i;:::-;2602:39;2688:2;2673:18;;;;2660:32;;-1:-1:-1;;;2444:254:1:o;2703:615::-;2789:6;2797;2850:2;2838:9;2829:7;2825:23;2821:32;2818:52;;;2866:1;2863;2856:12;2818:52;2906:9;2893:23;2935:18;2976:2;2968:6;2965:14;2962:34;;;2992:1;2989;2982:12;2962:34;3030:6;3019:9;3015:22;3005:32;;3075:7;3068:4;3064:2;3060:13;3056:27;3046:55;;3097:1;3094;3087:12;3046:55;3137:2;3124:16;3163:2;3155:6;3152:14;3149:34;;;3179:1;3176;3169:12;3149:34;3232:7;3227:2;3217:6;3214:1;3210:14;3206:2;3202:23;3198:32;3195:45;3192:65;;;3253:1;3250;3243:12;3192:65;3284:2;3276:11;;;;;3306:6;;-1:-1:-1;2703:615:1;;-1:-1:-1;;;;2703:615:1:o;3323:241::-;3379:6;3432:2;3420:9;3411:7;3407:23;3403:32;3400:52;;;3448:1;3445;3438:12;3400:52;3487:9;3474:23;3506:28;3528:5;3506:28;:::i;3569:245::-;3636:6;3689:2;3677:9;3668:7;3664:23;3660:32;3657:52;;;3705:1;3702;3695:12;3657:52;3737:9;3731:16;3756:28;3778:5;3756:28;:::i;3819:245::-;3877:6;3930:2;3918:9;3909:7;3905:23;3901:32;3898:52;;;3946:1;3943;3936:12;3898:52;3985:9;3972:23;4004:30;4028:5;4004:30;:::i;4069:249::-;4138:6;4191:2;4179:9;4170:7;4166:23;4162:32;4159:52;;;4207:1;4204;4197:12;4159:52;4239:9;4233:16;4258:30;4282:5;4258:30;:::i;4323:592::-;4394:6;4402;4455:2;4443:9;4434:7;4430:23;4426:32;4423:52;;;4471:1;4468;4461:12;4423:52;4511:9;4498:23;4540:18;4581:2;4573:6;4570:14;4567:34;;;4597:1;4594;4587:12;4567:34;4635:6;4624:9;4620:22;4610:32;;4680:7;4673:4;4669:2;4665:13;4661:27;4651:55;;4702:1;4699;4692:12;4651:55;4742:2;4729:16;4768:2;4760:6;4757:14;4754:34;;;4784:1;4781;4774:12;4754:34;4829:7;4824:2;4815:6;4811:2;4807:15;4803:24;4800:37;4797:57;;;4850:1;4847;4840:12;4920:180;4979:6;5032:2;5020:9;5011:7;5007:23;5003:32;5000:52;;;5048:1;5045;5038:12;5000:52;-1:-1:-1;5071:23:1;;4920:180;-1:-1:-1;4920:180:1:o;5105:248::-;5173:6;5181;5234:2;5222:9;5213:7;5209:23;5205:32;5202:52;;;5250:1;5247;5240:12;5202:52;-1:-1:-1;;5273:23:1;;;5343:2;5328:18;;;5315:32;;-1:-1:-1;5105:248:1:o;5358:257::-;5399:3;5437:5;5431:12;5464:6;5459:3;5452:19;5480:63;5536:6;5529:4;5524:3;5520:14;5513:4;5506:5;5502:16;5480:63;:::i;:::-;5597:2;5576:15;-1:-1:-1;;5572:29:1;5563:39;;;;5604:4;5559:50;;5358:257;-1:-1:-1;;5358:257:1:o;5620:185::-;5662:3;5700:5;5694:12;5715:52;5760:6;5755:3;5748:4;5741:5;5737:16;5715:52;:::i;:::-;5783:16;;;;;5620:185;-1:-1:-1;;5620:185:1:o;5810:1174::-;5986:3;6015:1;6048:6;6042:13;6078:3;6100:1;6128:9;6124:2;6120:18;6110:28;;6188:2;6177:9;6173:18;6210;6200:61;;6254:4;6246:6;6242:17;6232:27;;6200:61;6280:2;6328;6320:6;6317:14;6297:18;6294:38;6291:165;;;-1:-1:-1;;;6355:33:1;;6411:4;6408:1;6401:15;6441:4;6362:3;6429:17;6291:165;6472:18;6499:104;;;;6617:1;6612:320;;;;6465:467;;6499:104;-1:-1:-1;;6532:24:1;;6520:37;;6577:16;;;;-1:-1:-1;6499:104:1;;6612:320;20794:1;20787:14;;;20831:4;20818:18;;6707:1;6721:165;6735:6;6732:1;6729:13;6721:165;;;6813:14;;6800:11;;;6793:35;6856:16;;;;6750:10;;6721:165;;;6725:3;;6915:6;6910:3;6906:16;6899:23;;6465:467;;;;;;;6948:30;6974:3;6966:6;6948:30;:::i;:::-;6941:37;5810:1174;-1:-1:-1;;;;;5810:1174:1:o;7197:488::-;-1:-1:-1;;;;;7466:15:1;;;7448:34;;7518:15;;7513:2;7498:18;;7491:43;7565:2;7550:18;;7543:34;;;7613:3;7608:2;7593:18;;7586:31;;;7391:4;;7634:45;;7659:19;;7651:6;7634:45;:::i;:::-;7626:53;7197:488;-1:-1:-1;;;;;;7197:488:1:o;7690:495::-;7870:3;7855:19;;7859:9;7951:6;7828:4;7985:194;7999:4;7996:1;7993:11;7985:194;;;8058:13;;8046:26;;8095:4;8119:12;;;;8154:15;;;;8019:1;8012:9;7985:194;;;7989:3;;;7690:495;;;;:::o;8190:::-;8370:3;8355:19;;8359:9;8451:6;8328:4;8485:194;8499:4;8496:1;8493:11;8485:194;;;8558:13;;8546:26;;8595:4;8619:12;;;;8654:15;;;;8519:1;8512:9;8485:194;;8882:219;9031:2;9020:9;9013:21;8994:4;9051:44;9091:2;9080:9;9076:18;9068:6;9051:44;:::i;9460:414::-;9662:2;9644:21;;;9701:2;9681:18;;;9674:30;9740:34;9735:2;9720:18;;9713:62;-1:-1:-1;;;9806:2:1;9791:18;;9784:48;9864:3;9849:19;;9460:414::o;17266:403::-;17468:2;17450:21;;;17507:2;17487:18;;;17480:30;17546:34;17541:2;17526:18;;17519:62;-1:-1:-1;;;17612:2:1;17597:18;;17590:37;17659:3;17644:19;;17266:403::o;18027:410::-;18229:2;18211:21;;;18268:2;18248:18;;;18241:30;18307:34;18302:2;18287:18;;18280:62;-1:-1:-1;;;18373:2:1;18358:18;;18351:44;18427:3;18412:19;;18027:410::o;20847:128::-;20887:3;20918:1;20914:6;20911:1;20908:13;20905:39;;;20924:18;;:::i;:::-;-1:-1:-1;20960:9:1;;20847:128::o;20980:120::-;21020:1;21046;21036:35;;21051:18;;:::i;:::-;-1:-1:-1;21085:9:1;;20980:120::o;21105:125::-;21145:4;21173:1;21170;21167:8;21164:34;;;21178:18;;:::i;:::-;-1:-1:-1;21215:9:1;;21105:125::o;21235:258::-;21307:1;21317:113;21331:6;21328:1;21325:13;21317:113;;;21407:11;;;21401:18;21388:11;;;21381:39;21353:2;21346:10;21317:113;;;21448:6;21445:1;21442:13;21439:48;;;-1:-1:-1;;21483:1:1;21465:16;;21458:27;21235:258::o;21498:380::-;21577:1;21573:12;;;;21620;;;21641:61;;21695:4;21687:6;21683:17;21673:27;;21641:61;21748:2;21740:6;21737:14;21717:18;21714:38;21711:161;;;21794:10;21789:3;21785:20;21782:1;21775:31;21829:4;21826:1;21819:15;21857:4;21854:1;21847:15;21711:161;;21498:380;;;:::o;21883:135::-;21922:3;-1:-1:-1;;21943:17:1;;21940:43;;;21963:18;;:::i;:::-;-1:-1:-1;22010:1:1;21999:13;;21883:135::o;22023:112::-;22055:1;22081;22071:35;;22086:18;;:::i;:::-;-1:-1:-1;22120:9:1;;22023:112::o;22140:127::-;22201:10;22196:3;22192:20;22189:1;22182:31;22232:4;22229:1;22222:15;22256:4;22253:1;22246:15;22272:127;22333:10;22328:3;22324:20;22321:1;22314:31;22364:4;22361:1;22354:15;22388:4;22385:1;22378:15;22404:127;22465:10;22460:3;22456:20;22453:1;22446:31;22496:4;22493:1;22486:15;22520:4;22517:1;22510:15;22536:127;22597:10;22592:3;22588:20;22585:1;22578:31;22628:4;22625:1;22618:15;22652:4;22649:1;22642:15;22668:118;22754:5;22747:13;22740:21;22733:5;22730:32;22720:60;;22776:1;22773;22766:12;22791:131;-1:-1:-1;;;;;;22865:32:1;;22855:43;;22845:71;;22912:1;22909;22902:12

Swarm Source

ipfs://adc8a05c9f43c404659c607a6c58980f1c220b3fc02ce7466f0637532b12433f
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.