ETH Price: $3,115.51 (+1.81%)
Gas: 2 Gwei

Token

NICE NFT (NICE)
 

Overview

Max Total Supply

9,996 NICE

Holders

2,709

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 NICE
0x74c5c82d9952bd6373b1d264ba02ccc02fa0ba25
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

We are the largest metaverse decentralized E-Sports brand. Focusing on the brand, NICE released 10,000 NICE NFTs, looking for real E-sports enthusiasts to build a consensus. Through the joint name with the world's top e-sports brands, combined with trend elements and social event hotspots, NICE OFFICIAL will be brought into the mainstream circle.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NiceNft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-05
*/

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: 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 {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts/INftExtendedMeta.sol


pragma solidity >=0.4.22 <0.9.0;

struct TokenMeta {
    string hash;
    address minter;
}

abstract contract INftExtendedMeta {
    function tokenMeta(uint256 _tokenId) public virtual view returns (TokenMeta memory);
    
    function setTokenAsset(uint256 _tokenId, string memory _hash, address _minter) public virtual;
}

// File: contracts/ISupportMint.sol


pragma solidity >=0.4.22 <0.9.0;

interface ISupportMint {
    function mint(address to, string memory hash, address minter) external;
}

// File: contracts/NiceNft.sol



pragma solidity >=0.4.22 <0.9.0;
pragma experimental ABIEncoderV2;










contract NiceNft is ERC721Enumerable, Ownable, INftExtendedMeta, ISupportMint {
    using Address for address;
    using Strings for uint256;
    using Counters for Counters.Counter;
    using SafeERC20 for IERC20;

    Counters.Counter private _tokenIds;

    mapping (uint256 => TokenMeta) public tokenOnChainMeta;
    mapping (address => bool) public mintWhitelist;
    mapping (address => bool) public whitelist;

    uint256 public MAX_SUPPLY;
    string private baseURI;

    constructor(string memory name_, string memory symbol_, string memory baseUri_, uint maxSupply_)
        ERC721(name_, symbol_)
    {
        MAX_SUPPLY = maxSupply_;
        setBaseURI(baseUri_);
    }

    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    function tokenMeta(uint256 _tokenId) public override view returns (TokenMeta memory) {
        return tokenOnChainMeta[_tokenId];
    }
    
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setTokenAsset(uint256 _tokenId, string memory _hash, address _minter) public override onlyOwner {
        require(_exists(_tokenId), "nft_setTokenAsset_notoken");
        TokenMeta storage meta = tokenOnChainMeta[_tokenId];
        meta.hash = _hash;
        meta.minter = _minter;
        tokenOnChainMeta[_tokenId] = meta;
    }

    function setMintWhitelist(address[] memory values, bool allowed) public onlyOwner {
        for (uint i = 0; i < values.length; ++i) {
            mintWhitelist[values[i]] = allowed;
            whitelist[values[i]] = allowed;
        }
    }

    function setWhitelist(address[] memory values, bool allowed) public onlyOwner {
        for (uint i = 0; i < values.length; ++i) {
            whitelist[values[i]] = allowed;
        }
    }

    function withdraw(address token) public onlyOwner {
        if (token == address(0)) {
            uint balance = address(this).balance;
            Address.sendValue(payable(owner()), balance);
        } else {
            IERC20 erc20 = IERC20(token);
            erc20.safeTransfer(owner(), erc20.balanceOf(address(this)));
        }
    }

    function withdrawNft(address to, uint tokenid) public onlyOwner {
        safeTransferFrom(address(this), to, tokenid);
    }

    function batchTransferFrom(address[] memory receivers, uint[] memory tokenids) public {
        require(receivers.length == tokenids.length, "PARAM_LENGTH_NOT_MET");

        for (uint i = 0; i < receivers.length; ++i) {
            safeTransferFrom(msg.sender, receivers[i], tokenids[i]);
        }
    }

    function mint(address to, string memory hash, address minter) public override {
        require(mintWhitelist[msg.sender], "NEED_MINT_WHITELIST");
        mintOneImpl(to, hash, minter);
    }

    function mintOneImpl(address to, string memory hash, address minter) private returns (uint) {
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        require(newItemId <= MAX_SUPPLY, "MINT_LIMIT");
        _mint(to, newItemId);

        TokenMeta memory meta = TokenMeta(
            hash,
            minter);

        tokenOnChainMeta[newItemId] = meta;
        return newItemId;
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenid) internal override {
        if (Address.isContract(msg.sender)) {
            require(whitelist[msg.sender], "NOT_WHITELIST_CONTRACT");
        }
        if (Address.isContract(to)) {
            require(whitelist[to], "NOT_WHITELIST_CONTRACT");
        }

        super._beforeTokenTransfer(from, to, tokenid);
    }

    // receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseUri_","type":"string"},{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenids","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"hash","type":"string"},{"internalType":"address","name":"minter","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"values","type":"address[]"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setMintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_hash","type":"string"},{"internalType":"address","name":"_minter","type":"address"}],"name":"setTokenAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"values","type":"address[]"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenMeta","outputs":[{"components":[{"internalType":"string","name":"hash","type":"string"},{"internalType":"address","name":"minter","type":"address"}],"internalType":"struct TokenMeta","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOnChainMeta","outputs":[{"internalType":"string","name":"hash","type":"string"},{"internalType":"address","name":"minter","type":"address"}],"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"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"}],"name":"withdrawNft","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620053ac380380620053ac8339818101604052810190620000379190620003a9565b838381600090805190602001906200005192919062000264565b5080600190805190602001906200006a92919062000264565b5050506200008d62000081620000af60201b60201c565b620000b760201b60201c565b80600f81905550620000a5826200017d60201b60201c565b50505050620006a3565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200018d620001a960201b60201c565b8060109080519060200190620001a592919062000264565b5050565b620001b9620000af60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620001df6200023a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000238576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200022f906200049f565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002729062000571565b90600052602060002090601f016020900481019282620002965760008555620002e2565b82601f10620002b157805160ff1916838001178555620002e2565b82800160010185558215620002e2579182015b82811115620002e1578251825591602001919060010190620002c4565b5b509050620002f19190620002f5565b5090565b5b8082111562000310576000816000905550600101620002f6565b5090565b60006200032b6200032584620004ea565b620004c1565b9050828152602081018484840111156200034a576200034962000640565b5b620003578482856200053b565b509392505050565b600082601f8301126200037757620003766200063b565b5b81516200038984826020860162000314565b91505092915050565b600081519050620003a38162000689565b92915050565b60008060008060808587031215620003c657620003c56200064a565b5b600085015167ffffffffffffffff811115620003e757620003e662000645565b5b620003f5878288016200035f565b945050602085015167ffffffffffffffff81111562000419576200041862000645565b5b62000427878288016200035f565b935050604085015167ffffffffffffffff8111156200044b576200044a62000645565b5b62000459878288016200035f565b92505060606200046c8782880162000392565b91505092959194509250565b60006200048760208362000520565b9150620004948262000660565b602082019050919050565b60006020820190508181036000830152620004ba8162000478565b9050919050565b6000620004cd620004e0565b9050620004db8282620005a7565b919050565b6000604051905090565b600067ffffffffffffffff8211156200050857620005076200060c565b5b62000513826200064f565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b838110156200055b5780820151818401526020810190506200053e565b838111156200056b576000848401525b50505050565b600060028204905060018216806200058a57607f821691505b60208210811415620005a157620005a0620005dd565b5b50919050565b620005b2826200064f565b810181811067ffffffffffffffff82111715620005d457620005d36200060c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620006948162000531565b8114620006a057600080fd5b50565b614cf980620006b36000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80636352211e1161010f578063a22cb465116100a2578063d8fc651911610071578063d8fc6519146105da578063e985e9c5146105f6578063f2fde38b14610626578063fa8509c814610642576101f0565b8063a22cb46514610556578063a8e4cb9214610572578063b88d4fde1461058e578063c87b56dd146105aa576101f0565b806388eca516116100de57806388eca516146104ce5780638da5cb5b146104ea57806395d89b41146105085780639b19251a14610526576101f0565b80636352211e1461043357806370a0823114610463578063715018a6146104935780637208616e1461049d576101f0565b806323b872dd1161018757806342842e0e1161015657806342842e0e146103af5780634f6ccce7146103cb57806351cff8d9146103fb57806355f804b314610417576101f0565b806323b872dd146103295780632f745c591461034557806332cb6b0c146103755780633c271a0514610393576101f0565b80630ae7a310116101c35780630ae7a3101461028f5780630ba84e85146102bf57806314d38725146102ef57806318160ddd1461030b576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a91906135e7565b61065e565b60405161021c9190613dc6565b60405180910390f35b61022d6106d8565b60405161023a9190613de1565b60405180910390f35b61025d6004803603810190610258919061368a565b61076a565b60405161026a9190613d36565b60405180910390f35b61028d600480360381019061028891906134a6565b6107b0565b005b6102a960048036038101906102a4919061368a565b6108c8565b6040516102b69190614153565b60405180910390f35b6102d960048036038101906102d491906132b4565b6109dd565b6040516102e69190613dc6565b60405180910390f35b610309600480360381019061030491906134e6565b6109fd565b005b610313610aa2565b6040516103209190614175565b60405180910390f35b610343600480360381019061033e9190613321565b610aaf565b005b61035f600480360381019061035a91906134a6565b610b0f565b60405161036c9190614175565b60405180910390f35b61037d610bb4565b60405161038a9190614175565b60405180910390f35b6103ad60048036038101906103a8919061355e565b610bba565b005b6103c960048036038101906103c49190613321565b610c55565b005b6103e560048036038101906103e0919061368a565b610c75565b6040516103f29190614175565b60405180910390f35b610415600480360381019061041091906132b4565b610ce6565b005b610431600480360381019061042c9190613641565b610e03565b005b61044d6004803603810190610448919061368a565b610e25565b60405161045a9190613d36565b60405180910390f35b61047d600480360381019061047891906132b4565b610ed7565b60405161048a9190614175565b60405180910390f35b61049b610f8f565b005b6104b760048036038101906104b2919061368a565b610fa3565b6040516104c5929190613e03565b60405180910390f35b6104e860048036038101906104e3919061355e565b61106f565b005b6104f261117b565b6040516104ff9190613d36565b60405180910390f35b6105106111a5565b60405161051d9190613de1565b60405180910390f35b610540600480360381019061053b91906132b4565b611237565b60405161054d9190613dc6565b60405180910390f35b610570600480360381019061056b91906133f7565b611257565b005b61058c600480360381019061058791906136e4565b61126d565b005b6105a860048036038101906105a39190613374565b6113d4565b005b6105c460048036038101906105bf919061368a565b611436565b6040516105d19190613de1565b60405180910390f35b6105f460048036038101906105ef91906134a6565b611496565b005b610610600480360381019061060b91906132e1565b6114ad565b60405161061d9190613dc6565b60405180910390f35b610640600480360381019061063b91906132b4565b611541565b005b61065c60048036038101906106579190613437565b6115c5565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106d157506106d082611662565b5b9050919050565b6060600080546106e790614454565b80601f016020809104026020016040519081016040528092919081815260200182805461071390614454565b80156107605780601f1061073557610100808354040283529160200191610760565b820191906000526020600020905b81548152906001019060200180831161074357829003601f168201915b5050505050905090565b600061077582611744565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107bb82610e25565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561082c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610823906140b3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661084b61178f565b73ffffffffffffffffffffffffffffffffffffffff16148061087a57506108798161087461178f565b6114ad565b5b6108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b090614013565b60405180910390fd5b6108c38383611797565b505050565b6108d0612ea5565b600c60008381526020019081526020016000206040518060400160405290816000820180546108fe90614454565b80601f016020809104026020016040519081016040528092919081815260200182805461092a90614454565b80156109775780601f1061094c57610100808354040283529160200191610977565b820191906000526020600020905b81548152906001019060200180831161095a57829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b8051825114610a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3890613e33565b60405180910390fd5b60005b8251811015610a9d57610a8c33848381518110610a6457610a636145ed565b5b6020026020010151848481518110610a7f57610a7e6145ed565b5b6020026020010151610c55565b80610a96906144b7565b9050610a44565b505050565b6000600880549050905090565b610ac0610aba61178f565b82611850565b610aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af690614133565b60405180910390fd5b610b0a8383836118e5565b505050565b6000610b1a83610ed7565b8210610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5290613e73565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600f5481565b610bc2611b4c565b60005b8251811015610c505781600e6000858481518110610be657610be56145ed565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080610c49906144b7565b9050610bc5565b505050565b610c70838383604051806020016040528060008152506113d4565b505050565b6000610c7f610aa2565b8210610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb7906140f3565b60405180910390fd5b60088281548110610cd457610cd36145ed565b5b90600052602060002001549050919050565b610cee611b4c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d3f576000479050610d39610d3361117b565b82611bca565b50610e00565b6000819050610dfe610d4f61117b565b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d889190613d36565b60206040518083038186803b158015610da057600080fd5b505afa158015610db4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd891906136b7565b8373ffffffffffffffffffffffffffffffffffffffff16611cbe9092919063ffffffff16565b505b50565b610e0b611b4c565b8060109080519060200190610e21929190612ed5565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec590614093565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f90613fb3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f97611b4c565b610fa16000611d44565b565b600c602052806000526040600020600091509050806000018054610fc690614454565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff290614454565b801561103f5780601f106110145761010080835404028352916020019161103f565b820191906000526020600020905b81548152906001019060200180831161102257829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b611077611b4c565b60005b82518110156111765781600d600085848151811061109b5761109a6145ed565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600e600085848151811061110c5761110b6145ed565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508061116f906144b7565b905061107a565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111b490614454565b80601f01602080910402602001604051908101604052809291908181526020018280546111e090614454565b801561122d5780601f106112025761010080835404028352916020019161122d565b820191906000526020600020905b81548152906001019060200180831161121057829003601f168201915b5050505050905090565b600e6020528060005260406000206000915054906101000a900460ff1681565b61126961126261178f565b8383611e0a565b5050565b611275611b4c565b61127e83611f77565b6112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b490613fd3565b60405180910390fd5b6000600c60008581526020019081526020016000209050828160000190805190602001906112ec929190612ed5565b50818160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c6000868152602001908152602001600020600082018160000190805461135890614454565b611363929190612f5b565b506001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505050505050565b6113e56113df61178f565b83611850565b611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90614133565b60405180910390fd5b61143084848484611fe3565b50505050565b606060006010805461144790614454565b905011611463576040518060200160405280600081525061148f565b601061146e8361203f565b60405160200161147f929190613cfd565b6040516020818303038152906040525b9050919050565b61149e611b4c565b6114a9308383610c55565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611549611b4c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b090613eb3565b60405180910390fd5b6115c281611d44565b50565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164890613e53565b60405180910390fd5b61165c8383836121a0565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061172d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061173d575061173c826122bf565b5b9050919050565b61174d81611f77565b61178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390614093565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661180a83610e25565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061185c83610e25565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061189e575061189d81856114ad565b5b806118dc57508373ffffffffffffffffffffffffffffffffffffffff166118c48461076a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661190582610e25565b73ffffffffffffffffffffffffffffffffffffffff161461195b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195290613ed3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290613f13565b60405180910390fd5b6119d6838383612329565b6119e1600082611797565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a31919061436a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a8891906142e3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b4783838361246f565b505050565b611b5461178f565b73ffffffffffffffffffffffffffffffffffffffff16611b7261117b565b73ffffffffffffffffffffffffffffffffffffffff1614611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf90614053565b60405180910390fd5b565b80471015611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0490613f73565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611c3390613d21565b60006040518083038185875af1925050503d8060008114611c70576040519150601f19603f3d011682016040523d82523d6000602084013e611c75565b606091505b5050905080611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090613f53565b60405180910390fd5b505050565b611d3f8363a9059cbb60e01b8484604051602401611cdd929190613d9d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612474565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7090613f33565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f6a9190613dc6565b60405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611fee8484846118e5565b611ffa8484848461253b565b612039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203090613e93565b60405180910390fd5b50505050565b60606000821415612087576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061219b565b600082905060005b600082146120b95780806120a2906144b7565b915050600a826120b29190614339565b915061208f565b60008167ffffffffffffffff8111156120d5576120d461461c565b5b6040519080825280601f01601f1916602001820160405280156121075781602001600182028036833780820191505090505b5090505b6000851461219457600182612120919061436a565b9150600a8561212f9190614500565b603061213b91906142e3565b60f81b818381518110612151576121506145ed565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561218d9190614339565b945061210b565b8093505050505b919050565b60006121ac600b6126d2565b60006121b8600b6126e8565b9050600f548111156121ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f690613ff3565b60405180910390fd5b61220985826126f6565b600060405180604001604052808681526020018573ffffffffffffffffffffffffffffffffffffffff16815250905080600c60008481526020019081526020016000206000820151816000019080519060200190612268929190612ed5565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505081925050509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612332336128d0565b156123c457600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166123c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ba90614073565b60405180910390fd5b5b6123cd826128d0565b1561245f57600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661245e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245590614073565b60405180910390fd5b5b61246a8383836128f3565b505050565b505050565b60006124d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a079092919063ffffffff16565b905060008151111561253657808060200190518101906124f691906135ba565b612535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252c90614113565b60405180910390fd5b5b505050565b600061255c8473ffffffffffffffffffffffffffffffffffffffff166128d0565b156126c5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261258561178f565b8786866040518563ffffffff1660e01b81526004016125a79493929190613d51565b602060405180830381600087803b1580156125c157600080fd5b505af19250505080156125f257506040513d601f19601f820116820180604052508101906125ef9190613614565b60015b612675573d8060008114612622576040519150601f19603f3d011682016040523d82523d6000602084013e612627565b606091505b5060008151141561266d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266490613e93565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126ca565b600190505b949350505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275d90614033565b60405180910390fd5b61276f81611f77565b156127af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a690613ef3565b60405180910390fd5b6127bb60008383612329565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461280b91906142e3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128cc6000838361246f565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6128fe838383612a1f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129415761293c81612a24565b612980565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461297f5761297e8382612a6d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c3576129be81612bda565b612a02565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a0157612a008282612cab565b5b5b505050565b6060612a168484600085612d2a565b90509392505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a7a84610ed7565b612a84919061436a565b9050600060076000848152602001908152602001600020549050818114612b69576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612bee919061436a565b9050600060096000848152602001908152602001600020549050600060088381548110612c1e57612c1d6145ed565b5b906000526020600020015490508060088381548110612c4057612c3f6145ed565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c8f57612c8e6145be565b5b6001900381819060005260206000200160009055905550505050565b6000612cb683610ed7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b606082471015612d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6690613f93565b60405180910390fd5b612d78856128d0565b612db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dae906140d3565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612de09190613ce6565b60006040518083038185875af1925050503d8060008114612e1d576040519150601f19603f3d011682016040523d82523d6000602084013e612e22565b606091505b5091509150612e32828286612e3e565b92505050949350505050565b60608315612e4e57829050612e9e565b600083511115612e615782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e959190613de1565b60405180910390fd5b9392505050565b604051806040016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b828054612ee190614454565b90600052602060002090601f016020900481019282612f035760008555612f4a565b82601f10612f1c57805160ff1916838001178555612f4a565b82800160010185558215612f4a579182015b82811115612f49578251825591602001919060010190612f2e565b5b509050612f579190612fe8565b5090565b828054612f6790614454565b90600052602060002090601f016020900481019282612f895760008555612fd7565b82601f10612f9a5780548555612fd7565b82800160010185558215612fd757600052602060002091601f016020900482015b82811115612fd6578254825591600101919060010190612fbb565b5b509050612fe49190612fe8565b5090565b5b80821115613001576000816000905550600101612fe9565b5090565b6000613018613013846141b5565b614190565b9050808382526020820190508285602086028201111561303b5761303a614650565b5b60005b8581101561306b57816130518882613169565b84526020840193506020830192505060018101905061303e565b5050509392505050565b6000613088613083846141e1565b614190565b905080838252602082019050828560208602820111156130ab576130aa614650565b5b60005b858110156130db57816130c1888261328a565b8452602084019350602083019250506001810190506130ae565b5050509392505050565b60006130f86130f38461420d565b614190565b90508281526020810184848401111561311457613113614655565b5b61311f848285614412565b509392505050565b600061313a6131358461423e565b614190565b90508281526020810184848401111561315657613155614655565b5b613161848285614412565b509392505050565b60008135905061317881614c67565b92915050565b600082601f8301126131935761319261464b565b5b81356131a3848260208601613005565b91505092915050565b600082601f8301126131c1576131c061464b565b5b81356131d1848260208601613075565b91505092915050565b6000813590506131e981614c7e565b92915050565b6000815190506131fe81614c7e565b92915050565b60008135905061321381614c95565b92915050565b60008151905061322881614c95565b92915050565b600082601f8301126132435761324261464b565b5b81356132538482602086016130e5565b91505092915050565b600082601f8301126132715761327061464b565b5b8135613281848260208601613127565b91505092915050565b60008135905061329981614cac565b92915050565b6000815190506132ae81614cac565b92915050565b6000602082840312156132ca576132c961465f565b5b60006132d884828501613169565b91505092915050565b600080604083850312156132f8576132f761465f565b5b600061330685828601613169565b925050602061331785828601613169565b9150509250929050565b60008060006060848603121561333a5761333961465f565b5b600061334886828701613169565b935050602061335986828701613169565b925050604061336a8682870161328a565b9150509250925092565b6000806000806080858703121561338e5761338d61465f565b5b600061339c87828801613169565b94505060206133ad87828801613169565b93505060406133be8782880161328a565b925050606085013567ffffffffffffffff8111156133df576133de61465a565b5b6133eb8782880161322e565b91505092959194509250565b6000806040838503121561340e5761340d61465f565b5b600061341c85828601613169565b925050602061342d858286016131da565b9150509250929050565b6000806000606084860312156134505761344f61465f565b5b600061345e86828701613169565b935050602084013567ffffffffffffffff81111561347f5761347e61465a565b5b61348b8682870161325c565b925050604061349c86828701613169565b9150509250925092565b600080604083850312156134bd576134bc61465f565b5b60006134cb85828601613169565b92505060206134dc8582860161328a565b9150509250929050565b600080604083850312156134fd576134fc61465f565b5b600083013567ffffffffffffffff81111561351b5761351a61465a565b5b6135278582860161317e565b925050602083013567ffffffffffffffff8111156135485761354761465a565b5b613554858286016131ac565b9150509250929050565b600080604083850312156135755761357461465f565b5b600083013567ffffffffffffffff8111156135935761359261465a565b5b61359f8582860161317e565b92505060206135b0858286016131da565b9150509250929050565b6000602082840312156135d0576135cf61465f565b5b60006135de848285016131ef565b91505092915050565b6000602082840312156135fd576135fc61465f565b5b600061360b84828501613204565b91505092915050565b60006020828403121561362a5761362961465f565b5b600061363884828501613219565b91505092915050565b6000602082840312156136575761365661465f565b5b600082013567ffffffffffffffff8111156136755761367461465a565b5b6136818482850161325c565b91505092915050565b6000602082840312156136a05761369f61465f565b5b60006136ae8482850161328a565b91505092915050565b6000602082840312156136cd576136cc61465f565b5b60006136db8482850161329f565b91505092915050565b6000806000606084860312156136fd576136fc61465f565b5b600061370b8682870161328a565b935050602084013567ffffffffffffffff81111561372c5761372b61465a565b5b6137388682870161325c565b925050604061374986828701613169565b9150509250925092565b61375c8161439e565b82525050565b61376b8161439e565b82525050565b61377a816143b0565b82525050565b600061378b82614284565b613795818561429a565b93506137a5818560208601614421565b6137ae81614664565b840191505092915050565b60006137c482614284565b6137ce81856142ab565b93506137de818560208601614421565b80840191505092915050565b60006137f58261428f565b6137ff81856142b6565b935061380f818560208601614421565b61381881614664565b840191505092915050565b600061382e8261428f565b61383881856142c7565b9350613848818560208601614421565b61385181614664565b840191505092915050565b60006138678261428f565b61387181856142d8565b9350613881818560208601614421565b80840191505092915050565b6000815461389a81614454565b6138a481866142d8565b945060018216600081146138bf57600181146138d057613903565b60ff19831686528186019350613903565b6138d98561426f565b60005b838110156138fb578154818901526001820191506020810190506138dc565b838801955050505b50505092915050565b60006139196014836142c7565b915061392482614675565b602082019050919050565b600061393c6013836142c7565b91506139478261469e565b602082019050919050565b600061395f602b836142c7565b915061396a826146c7565b604082019050919050565b60006139826032836142c7565b915061398d82614716565b604082019050919050565b60006139a56026836142c7565b91506139b082614765565b604082019050919050565b60006139c86025836142c7565b91506139d3826147b4565b604082019050919050565b60006139eb601c836142c7565b91506139f682614803565b602082019050919050565b6000613a0e6024836142c7565b9150613a198261482c565b604082019050919050565b6000613a316019836142c7565b9150613a3c8261487b565b602082019050919050565b6000613a54603a836142c7565b9150613a5f826148a4565b604082019050919050565b6000613a77601d836142c7565b9150613a82826148f3565b602082019050919050565b6000613a9a6026836142c7565b9150613aa58261491c565b604082019050919050565b6000613abd6029836142c7565b9150613ac88261496b565b604082019050919050565b6000613ae06019836142c7565b9150613aeb826149ba565b602082019050919050565b6000613b03600a836142c7565b9150613b0e826149e3565b602082019050919050565b6000613b26603e836142c7565b9150613b3182614a0c565b604082019050919050565b6000613b496020836142c7565b9150613b5482614a5b565b602082019050919050565b6000613b6c6020836142c7565b9150613b7782614a84565b602082019050919050565b6000613b8f6016836142c7565b9150613b9a82614aad565b602082019050919050565b6000613bb26018836142c7565b9150613bbd82614ad6565b602082019050919050565b6000613bd56021836142c7565b9150613be082614aff565b604082019050919050565b6000613bf86000836142ab565b9150613c0382614b4e565b600082019050919050565b6000613c1b601d836142c7565b9150613c2682614b51565b602082019050919050565b6000613c3e602c836142c7565b9150613c4982614b7a565b604082019050919050565b6000613c61602a836142c7565b9150613c6c82614bc9565b604082019050919050565b6000613c84602e836142c7565b9150613c8f82614c18565b604082019050919050565b60006040830160008301518482036000860152613cb782826137ea565b9150506020830151613ccc6020860182613753565b508091505092915050565b613ce081614408565b82525050565b6000613cf282846137b9565b915081905092915050565b6000613d09828561388d565b9150613d15828461385c565b91508190509392505050565b6000613d2c82613beb565b9150819050919050565b6000602082019050613d4b6000830184613762565b92915050565b6000608082019050613d666000830187613762565b613d736020830186613762565b613d806040830185613cd7565b8181036060830152613d928184613780565b905095945050505050565b6000604082019050613db26000830185613762565b613dbf6020830184613cd7565b9392505050565b6000602082019050613ddb6000830184613771565b92915050565b60006020820190508181036000830152613dfb8184613823565b905092915050565b60006040820190508181036000830152613e1d8185613823565b9050613e2c6020830184613762565b9392505050565b60006020820190508181036000830152613e4c8161390c565b9050919050565b60006020820190508181036000830152613e6c8161392f565b9050919050565b60006020820190508181036000830152613e8c81613952565b9050919050565b60006020820190508181036000830152613eac81613975565b9050919050565b60006020820190508181036000830152613ecc81613998565b9050919050565b60006020820190508181036000830152613eec816139bb565b9050919050565b60006020820190508181036000830152613f0c816139de565b9050919050565b60006020820190508181036000830152613f2c81613a01565b9050919050565b60006020820190508181036000830152613f4c81613a24565b9050919050565b60006020820190508181036000830152613f6c81613a47565b9050919050565b60006020820190508181036000830152613f8c81613a6a565b9050919050565b60006020820190508181036000830152613fac81613a8d565b9050919050565b60006020820190508181036000830152613fcc81613ab0565b9050919050565b60006020820190508181036000830152613fec81613ad3565b9050919050565b6000602082019050818103600083015261400c81613af6565b9050919050565b6000602082019050818103600083015261402c81613b19565b9050919050565b6000602082019050818103600083015261404c81613b3c565b9050919050565b6000602082019050818103600083015261406c81613b5f565b9050919050565b6000602082019050818103600083015261408c81613b82565b9050919050565b600060208201905081810360008301526140ac81613ba5565b9050919050565b600060208201905081810360008301526140cc81613bc8565b9050919050565b600060208201905081810360008301526140ec81613c0e565b9050919050565b6000602082019050818103600083015261410c81613c31565b9050919050565b6000602082019050818103600083015261412c81613c54565b9050919050565b6000602082019050818103600083015261414c81613c77565b9050919050565b6000602082019050818103600083015261416d8184613c9a565b905092915050565b600060208201905061418a6000830184613cd7565b92915050565b600061419a6141ab565b90506141a68282614486565b919050565b6000604051905090565b600067ffffffffffffffff8211156141d0576141cf61461c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141fc576141fb61461c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142285761422761461c565b5b61423182614664565b9050602081019050919050565b600067ffffffffffffffff8211156142595761425861461c565b5b61426282614664565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142ee82614408565b91506142f983614408565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561432e5761432d614531565b5b828201905092915050565b600061434482614408565b915061434f83614408565b92508261435f5761435e614560565b5b828204905092915050565b600061437582614408565b915061438083614408565b92508282101561439357614392614531565b5b828203905092915050565b60006143a9826143e8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561443f578082015181840152602081019050614424565b8381111561444e576000848401525b50505050565b6000600282049050600182168061446c57607f821691505b602082108114156144805761447f61458f565b5b50919050565b61448f82614664565b810181811067ffffffffffffffff821117156144ae576144ad61461c565b5b80604052505050565b60006144c282614408565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144f5576144f4614531565b5b600182019050919050565b600061450b82614408565b915061451683614408565b92508261452657614525614560565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f504152414d5f4c454e4754485f4e4f545f4d4554000000000000000000000000600082015250565b7f4e4545445f4d494e545f57484954454c49535400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f6e66745f736574546f6b656e41737365745f6e6f746f6b656e00000000000000600082015250565b7f4d494e545f4c494d495400000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e4f545f57484954454c4953545f434f4e545241435400000000000000000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b614c708161439e565b8114614c7b57600080fd5b50565b614c87816143b0565b8114614c9257600080fd5b50565b614c9e816143bc565b8114614ca957600080fd5b50565b614cb581614408565b8114614cc057600080fd5b5056fea26469706673582212202c212e8ff6cc458565a86d6220b6de41739832f42f01b769f716d5a1536a92bb64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000084e494345204e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e49434500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c68747470733a2f2f7777772e6e6963652e636c75622f746f6b656e2f00000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80636352211e1161010f578063a22cb465116100a2578063d8fc651911610071578063d8fc6519146105da578063e985e9c5146105f6578063f2fde38b14610626578063fa8509c814610642576101f0565b8063a22cb46514610556578063a8e4cb9214610572578063b88d4fde1461058e578063c87b56dd146105aa576101f0565b806388eca516116100de57806388eca516146104ce5780638da5cb5b146104ea57806395d89b41146105085780639b19251a14610526576101f0565b80636352211e1461043357806370a0823114610463578063715018a6146104935780637208616e1461049d576101f0565b806323b872dd1161018757806342842e0e1161015657806342842e0e146103af5780634f6ccce7146103cb57806351cff8d9146103fb57806355f804b314610417576101f0565b806323b872dd146103295780632f745c591461034557806332cb6b0c146103755780633c271a0514610393576101f0565b80630ae7a310116101c35780630ae7a3101461028f5780630ba84e85146102bf57806314d38725146102ef57806318160ddd1461030b576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a91906135e7565b61065e565b60405161021c9190613dc6565b60405180910390f35b61022d6106d8565b60405161023a9190613de1565b60405180910390f35b61025d6004803603810190610258919061368a565b61076a565b60405161026a9190613d36565b60405180910390f35b61028d600480360381019061028891906134a6565b6107b0565b005b6102a960048036038101906102a4919061368a565b6108c8565b6040516102b69190614153565b60405180910390f35b6102d960048036038101906102d491906132b4565b6109dd565b6040516102e69190613dc6565b60405180910390f35b610309600480360381019061030491906134e6565b6109fd565b005b610313610aa2565b6040516103209190614175565b60405180910390f35b610343600480360381019061033e9190613321565b610aaf565b005b61035f600480360381019061035a91906134a6565b610b0f565b60405161036c9190614175565b60405180910390f35b61037d610bb4565b60405161038a9190614175565b60405180910390f35b6103ad60048036038101906103a8919061355e565b610bba565b005b6103c960048036038101906103c49190613321565b610c55565b005b6103e560048036038101906103e0919061368a565b610c75565b6040516103f29190614175565b60405180910390f35b610415600480360381019061041091906132b4565b610ce6565b005b610431600480360381019061042c9190613641565b610e03565b005b61044d6004803603810190610448919061368a565b610e25565b60405161045a9190613d36565b60405180910390f35b61047d600480360381019061047891906132b4565b610ed7565b60405161048a9190614175565b60405180910390f35b61049b610f8f565b005b6104b760048036038101906104b2919061368a565b610fa3565b6040516104c5929190613e03565b60405180910390f35b6104e860048036038101906104e3919061355e565b61106f565b005b6104f261117b565b6040516104ff9190613d36565b60405180910390f35b6105106111a5565b60405161051d9190613de1565b60405180910390f35b610540600480360381019061053b91906132b4565b611237565b60405161054d9190613dc6565b60405180910390f35b610570600480360381019061056b91906133f7565b611257565b005b61058c600480360381019061058791906136e4565b61126d565b005b6105a860048036038101906105a39190613374565b6113d4565b005b6105c460048036038101906105bf919061368a565b611436565b6040516105d19190613de1565b60405180910390f35b6105f460048036038101906105ef91906134a6565b611496565b005b610610600480360381019061060b91906132e1565b6114ad565b60405161061d9190613dc6565b60405180910390f35b610640600480360381019061063b91906132b4565b611541565b005b61065c60048036038101906106579190613437565b6115c5565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106d157506106d082611662565b5b9050919050565b6060600080546106e790614454565b80601f016020809104026020016040519081016040528092919081815260200182805461071390614454565b80156107605780601f1061073557610100808354040283529160200191610760565b820191906000526020600020905b81548152906001019060200180831161074357829003601f168201915b5050505050905090565b600061077582611744565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107bb82610e25565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561082c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610823906140b3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661084b61178f565b73ffffffffffffffffffffffffffffffffffffffff16148061087a57506108798161087461178f565b6114ad565b5b6108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b090614013565b60405180910390fd5b6108c38383611797565b505050565b6108d0612ea5565b600c60008381526020019081526020016000206040518060400160405290816000820180546108fe90614454565b80601f016020809104026020016040519081016040528092919081815260200182805461092a90614454565b80156109775780601f1061094c57610100808354040283529160200191610977565b820191906000526020600020905b81548152906001019060200180831161095a57829003601f168201915b505050505081526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b8051825114610a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3890613e33565b60405180910390fd5b60005b8251811015610a9d57610a8c33848381518110610a6457610a636145ed565b5b6020026020010151848481518110610a7f57610a7e6145ed565b5b6020026020010151610c55565b80610a96906144b7565b9050610a44565b505050565b6000600880549050905090565b610ac0610aba61178f565b82611850565b610aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af690614133565b60405180910390fd5b610b0a8383836118e5565b505050565b6000610b1a83610ed7565b8210610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5290613e73565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600f5481565b610bc2611b4c565b60005b8251811015610c505781600e6000858481518110610be657610be56145ed565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080610c49906144b7565b9050610bc5565b505050565b610c70838383604051806020016040528060008152506113d4565b505050565b6000610c7f610aa2565b8210610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb7906140f3565b60405180910390fd5b60088281548110610cd457610cd36145ed565b5b90600052602060002001549050919050565b610cee611b4c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d3f576000479050610d39610d3361117b565b82611bca565b50610e00565b6000819050610dfe610d4f61117b565b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d889190613d36565b60206040518083038186803b158015610da057600080fd5b505afa158015610db4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd891906136b7565b8373ffffffffffffffffffffffffffffffffffffffff16611cbe9092919063ffffffff16565b505b50565b610e0b611b4c565b8060109080519060200190610e21929190612ed5565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec590614093565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f90613fb3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f97611b4c565b610fa16000611d44565b565b600c602052806000526040600020600091509050806000018054610fc690614454565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff290614454565b801561103f5780601f106110145761010080835404028352916020019161103f565b820191906000526020600020905b81548152906001019060200180831161102257829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b611077611b4c565b60005b82518110156111765781600d600085848151811061109b5761109a6145ed565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600e600085848151811061110c5761110b6145ed565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508061116f906144b7565b905061107a565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111b490614454565b80601f01602080910402602001604051908101604052809291908181526020018280546111e090614454565b801561122d5780601f106112025761010080835404028352916020019161122d565b820191906000526020600020905b81548152906001019060200180831161121057829003601f168201915b5050505050905090565b600e6020528060005260406000206000915054906101000a900460ff1681565b61126961126261178f565b8383611e0a565b5050565b611275611b4c565b61127e83611f77565b6112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b490613fd3565b60405180910390fd5b6000600c60008581526020019081526020016000209050828160000190805190602001906112ec929190612ed5565b50818160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c6000868152602001908152602001600020600082018160000190805461135890614454565b611363929190612f5b565b506001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505050505050565b6113e56113df61178f565b83611850565b611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90614133565b60405180910390fd5b61143084848484611fe3565b50505050565b606060006010805461144790614454565b905011611463576040518060200160405280600081525061148f565b601061146e8361203f565b60405160200161147f929190613cfd565b6040516020818303038152906040525b9050919050565b61149e611b4c565b6114a9308383610c55565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611549611b4c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b090613eb3565b60405180910390fd5b6115c281611d44565b50565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164890613e53565b60405180910390fd5b61165c8383836121a0565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061172d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061173d575061173c826122bf565b5b9050919050565b61174d81611f77565b61178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390614093565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661180a83610e25565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061185c83610e25565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061189e575061189d81856114ad565b5b806118dc57508373ffffffffffffffffffffffffffffffffffffffff166118c48461076a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661190582610e25565b73ffffffffffffffffffffffffffffffffffffffff161461195b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195290613ed3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290613f13565b60405180910390fd5b6119d6838383612329565b6119e1600082611797565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a31919061436a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a8891906142e3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b4783838361246f565b505050565b611b5461178f565b73ffffffffffffffffffffffffffffffffffffffff16611b7261117b565b73ffffffffffffffffffffffffffffffffffffffff1614611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf90614053565b60405180910390fd5b565b80471015611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0490613f73565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611c3390613d21565b60006040518083038185875af1925050503d8060008114611c70576040519150601f19603f3d011682016040523d82523d6000602084013e611c75565b606091505b5050905080611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090613f53565b60405180910390fd5b505050565b611d3f8363a9059cbb60e01b8484604051602401611cdd929190613d9d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612474565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7090613f33565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f6a9190613dc6565b60405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611fee8484846118e5565b611ffa8484848461253b565b612039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203090613e93565b60405180910390fd5b50505050565b60606000821415612087576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061219b565b600082905060005b600082146120b95780806120a2906144b7565b915050600a826120b29190614339565b915061208f565b60008167ffffffffffffffff8111156120d5576120d461461c565b5b6040519080825280601f01601f1916602001820160405280156121075781602001600182028036833780820191505090505b5090505b6000851461219457600182612120919061436a565b9150600a8561212f9190614500565b603061213b91906142e3565b60f81b818381518110612151576121506145ed565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561218d9190614339565b945061210b565b8093505050505b919050565b60006121ac600b6126d2565b60006121b8600b6126e8565b9050600f548111156121ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f690613ff3565b60405180910390fd5b61220985826126f6565b600060405180604001604052808681526020018573ffffffffffffffffffffffffffffffffffffffff16815250905080600c60008481526020019081526020016000206000820151816000019080519060200190612268929190612ed5565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505081925050509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612332336128d0565b156123c457600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166123c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ba90614073565b60405180910390fd5b5b6123cd826128d0565b1561245f57600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661245e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245590614073565b60405180910390fd5b5b61246a8383836128f3565b505050565b505050565b60006124d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a079092919063ffffffff16565b905060008151111561253657808060200190518101906124f691906135ba565b612535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252c90614113565b60405180910390fd5b5b505050565b600061255c8473ffffffffffffffffffffffffffffffffffffffff166128d0565b156126c5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261258561178f565b8786866040518563ffffffff1660e01b81526004016125a79493929190613d51565b602060405180830381600087803b1580156125c157600080fd5b505af19250505080156125f257506040513d601f19601f820116820180604052508101906125ef9190613614565b60015b612675573d8060008114612622576040519150601f19603f3d011682016040523d82523d6000602084013e612627565b606091505b5060008151141561266d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266490613e93565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126ca565b600190505b949350505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275d90614033565b60405180910390fd5b61276f81611f77565b156127af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a690613ef3565b60405180910390fd5b6127bb60008383612329565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461280b91906142e3565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128cc6000838361246f565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6128fe838383612a1f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129415761293c81612a24565b612980565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461297f5761297e8382612a6d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c3576129be81612bda565b612a02565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a0157612a008282612cab565b5b5b505050565b6060612a168484600085612d2a565b90509392505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a7a84610ed7565b612a84919061436a565b9050600060076000848152602001908152602001600020549050818114612b69576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612bee919061436a565b9050600060096000848152602001908152602001600020549050600060088381548110612c1e57612c1d6145ed565b5b906000526020600020015490508060088381548110612c4057612c3f6145ed565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c8f57612c8e6145be565b5b6001900381819060005260206000200160009055905550505050565b6000612cb683610ed7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b606082471015612d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6690613f93565b60405180910390fd5b612d78856128d0565b612db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dae906140d3565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612de09190613ce6565b60006040518083038185875af1925050503d8060008114612e1d576040519150601f19603f3d011682016040523d82523d6000602084013e612e22565b606091505b5091509150612e32828286612e3e565b92505050949350505050565b60608315612e4e57829050612e9e565b600083511115612e615782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e959190613de1565b60405180910390fd5b9392505050565b604051806040016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b828054612ee190614454565b90600052602060002090601f016020900481019282612f035760008555612f4a565b82601f10612f1c57805160ff1916838001178555612f4a565b82800160010185558215612f4a579182015b82811115612f49578251825591602001919060010190612f2e565b5b509050612f579190612fe8565b5090565b828054612f6790614454565b90600052602060002090601f016020900481019282612f895760008555612fd7565b82601f10612f9a5780548555612fd7565b82800160010185558215612fd757600052602060002091601f016020900482015b82811115612fd6578254825591600101919060010190612fbb565b5b509050612fe49190612fe8565b5090565b5b80821115613001576000816000905550600101612fe9565b5090565b6000613018613013846141b5565b614190565b9050808382526020820190508285602086028201111561303b5761303a614650565b5b60005b8581101561306b57816130518882613169565b84526020840193506020830192505060018101905061303e565b5050509392505050565b6000613088613083846141e1565b614190565b905080838252602082019050828560208602820111156130ab576130aa614650565b5b60005b858110156130db57816130c1888261328a565b8452602084019350602083019250506001810190506130ae565b5050509392505050565b60006130f86130f38461420d565b614190565b90508281526020810184848401111561311457613113614655565b5b61311f848285614412565b509392505050565b600061313a6131358461423e565b614190565b90508281526020810184848401111561315657613155614655565b5b613161848285614412565b509392505050565b60008135905061317881614c67565b92915050565b600082601f8301126131935761319261464b565b5b81356131a3848260208601613005565b91505092915050565b600082601f8301126131c1576131c061464b565b5b81356131d1848260208601613075565b91505092915050565b6000813590506131e981614c7e565b92915050565b6000815190506131fe81614c7e565b92915050565b60008135905061321381614c95565b92915050565b60008151905061322881614c95565b92915050565b600082601f8301126132435761324261464b565b5b81356132538482602086016130e5565b91505092915050565b600082601f8301126132715761327061464b565b5b8135613281848260208601613127565b91505092915050565b60008135905061329981614cac565b92915050565b6000815190506132ae81614cac565b92915050565b6000602082840312156132ca576132c961465f565b5b60006132d884828501613169565b91505092915050565b600080604083850312156132f8576132f761465f565b5b600061330685828601613169565b925050602061331785828601613169565b9150509250929050565b60008060006060848603121561333a5761333961465f565b5b600061334886828701613169565b935050602061335986828701613169565b925050604061336a8682870161328a565b9150509250925092565b6000806000806080858703121561338e5761338d61465f565b5b600061339c87828801613169565b94505060206133ad87828801613169565b93505060406133be8782880161328a565b925050606085013567ffffffffffffffff8111156133df576133de61465a565b5b6133eb8782880161322e565b91505092959194509250565b6000806040838503121561340e5761340d61465f565b5b600061341c85828601613169565b925050602061342d858286016131da565b9150509250929050565b6000806000606084860312156134505761344f61465f565b5b600061345e86828701613169565b935050602084013567ffffffffffffffff81111561347f5761347e61465a565b5b61348b8682870161325c565b925050604061349c86828701613169565b9150509250925092565b600080604083850312156134bd576134bc61465f565b5b60006134cb85828601613169565b92505060206134dc8582860161328a565b9150509250929050565b600080604083850312156134fd576134fc61465f565b5b600083013567ffffffffffffffff81111561351b5761351a61465a565b5b6135278582860161317e565b925050602083013567ffffffffffffffff8111156135485761354761465a565b5b613554858286016131ac565b9150509250929050565b600080604083850312156135755761357461465f565b5b600083013567ffffffffffffffff8111156135935761359261465a565b5b61359f8582860161317e565b92505060206135b0858286016131da565b9150509250929050565b6000602082840312156135d0576135cf61465f565b5b60006135de848285016131ef565b91505092915050565b6000602082840312156135fd576135fc61465f565b5b600061360b84828501613204565b91505092915050565b60006020828403121561362a5761362961465f565b5b600061363884828501613219565b91505092915050565b6000602082840312156136575761365661465f565b5b600082013567ffffffffffffffff8111156136755761367461465a565b5b6136818482850161325c565b91505092915050565b6000602082840312156136a05761369f61465f565b5b60006136ae8482850161328a565b91505092915050565b6000602082840312156136cd576136cc61465f565b5b60006136db8482850161329f565b91505092915050565b6000806000606084860312156136fd576136fc61465f565b5b600061370b8682870161328a565b935050602084013567ffffffffffffffff81111561372c5761372b61465a565b5b6137388682870161325c565b925050604061374986828701613169565b9150509250925092565b61375c8161439e565b82525050565b61376b8161439e565b82525050565b61377a816143b0565b82525050565b600061378b82614284565b613795818561429a565b93506137a5818560208601614421565b6137ae81614664565b840191505092915050565b60006137c482614284565b6137ce81856142ab565b93506137de818560208601614421565b80840191505092915050565b60006137f58261428f565b6137ff81856142b6565b935061380f818560208601614421565b61381881614664565b840191505092915050565b600061382e8261428f565b61383881856142c7565b9350613848818560208601614421565b61385181614664565b840191505092915050565b60006138678261428f565b61387181856142d8565b9350613881818560208601614421565b80840191505092915050565b6000815461389a81614454565b6138a481866142d8565b945060018216600081146138bf57600181146138d057613903565b60ff19831686528186019350613903565b6138d98561426f565b60005b838110156138fb578154818901526001820191506020810190506138dc565b838801955050505b50505092915050565b60006139196014836142c7565b915061392482614675565b602082019050919050565b600061393c6013836142c7565b91506139478261469e565b602082019050919050565b600061395f602b836142c7565b915061396a826146c7565b604082019050919050565b60006139826032836142c7565b915061398d82614716565b604082019050919050565b60006139a56026836142c7565b91506139b082614765565b604082019050919050565b60006139c86025836142c7565b91506139d3826147b4565b604082019050919050565b60006139eb601c836142c7565b91506139f682614803565b602082019050919050565b6000613a0e6024836142c7565b9150613a198261482c565b604082019050919050565b6000613a316019836142c7565b9150613a3c8261487b565b602082019050919050565b6000613a54603a836142c7565b9150613a5f826148a4565b604082019050919050565b6000613a77601d836142c7565b9150613a82826148f3565b602082019050919050565b6000613a9a6026836142c7565b9150613aa58261491c565b604082019050919050565b6000613abd6029836142c7565b9150613ac88261496b565b604082019050919050565b6000613ae06019836142c7565b9150613aeb826149ba565b602082019050919050565b6000613b03600a836142c7565b9150613b0e826149e3565b602082019050919050565b6000613b26603e836142c7565b9150613b3182614a0c565b604082019050919050565b6000613b496020836142c7565b9150613b5482614a5b565b602082019050919050565b6000613b6c6020836142c7565b9150613b7782614a84565b602082019050919050565b6000613b8f6016836142c7565b9150613b9a82614aad565b602082019050919050565b6000613bb26018836142c7565b9150613bbd82614ad6565b602082019050919050565b6000613bd56021836142c7565b9150613be082614aff565b604082019050919050565b6000613bf86000836142ab565b9150613c0382614b4e565b600082019050919050565b6000613c1b601d836142c7565b9150613c2682614b51565b602082019050919050565b6000613c3e602c836142c7565b9150613c4982614b7a565b604082019050919050565b6000613c61602a836142c7565b9150613c6c82614bc9565b604082019050919050565b6000613c84602e836142c7565b9150613c8f82614c18565b604082019050919050565b60006040830160008301518482036000860152613cb782826137ea565b9150506020830151613ccc6020860182613753565b508091505092915050565b613ce081614408565b82525050565b6000613cf282846137b9565b915081905092915050565b6000613d09828561388d565b9150613d15828461385c565b91508190509392505050565b6000613d2c82613beb565b9150819050919050565b6000602082019050613d4b6000830184613762565b92915050565b6000608082019050613d666000830187613762565b613d736020830186613762565b613d806040830185613cd7565b8181036060830152613d928184613780565b905095945050505050565b6000604082019050613db26000830185613762565b613dbf6020830184613cd7565b9392505050565b6000602082019050613ddb6000830184613771565b92915050565b60006020820190508181036000830152613dfb8184613823565b905092915050565b60006040820190508181036000830152613e1d8185613823565b9050613e2c6020830184613762565b9392505050565b60006020820190508181036000830152613e4c8161390c565b9050919050565b60006020820190508181036000830152613e6c8161392f565b9050919050565b60006020820190508181036000830152613e8c81613952565b9050919050565b60006020820190508181036000830152613eac81613975565b9050919050565b60006020820190508181036000830152613ecc81613998565b9050919050565b60006020820190508181036000830152613eec816139bb565b9050919050565b60006020820190508181036000830152613f0c816139de565b9050919050565b60006020820190508181036000830152613f2c81613a01565b9050919050565b60006020820190508181036000830152613f4c81613a24565b9050919050565b60006020820190508181036000830152613f6c81613a47565b9050919050565b60006020820190508181036000830152613f8c81613a6a565b9050919050565b60006020820190508181036000830152613fac81613a8d565b9050919050565b60006020820190508181036000830152613fcc81613ab0565b9050919050565b60006020820190508181036000830152613fec81613ad3565b9050919050565b6000602082019050818103600083015261400c81613af6565b9050919050565b6000602082019050818103600083015261402c81613b19565b9050919050565b6000602082019050818103600083015261404c81613b3c565b9050919050565b6000602082019050818103600083015261406c81613b5f565b9050919050565b6000602082019050818103600083015261408c81613b82565b9050919050565b600060208201905081810360008301526140ac81613ba5565b9050919050565b600060208201905081810360008301526140cc81613bc8565b9050919050565b600060208201905081810360008301526140ec81613c0e565b9050919050565b6000602082019050818103600083015261410c81613c31565b9050919050565b6000602082019050818103600083015261412c81613c54565b9050919050565b6000602082019050818103600083015261414c81613c77565b9050919050565b6000602082019050818103600083015261416d8184613c9a565b905092915050565b600060208201905061418a6000830184613cd7565b92915050565b600061419a6141ab565b90506141a68282614486565b919050565b6000604051905090565b600067ffffffffffffffff8211156141d0576141cf61461c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141fc576141fb61461c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142285761422761461c565b5b61423182614664565b9050602081019050919050565b600067ffffffffffffffff8211156142595761425861461c565b5b61426282614664565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142ee82614408565b91506142f983614408565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561432e5761432d614531565b5b828201905092915050565b600061434482614408565b915061434f83614408565b92508261435f5761435e614560565b5b828204905092915050565b600061437582614408565b915061438083614408565b92508282101561439357614392614531565b5b828203905092915050565b60006143a9826143e8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561443f578082015181840152602081019050614424565b8381111561444e576000848401525b50505050565b6000600282049050600182168061446c57607f821691505b602082108114156144805761447f61458f565b5b50919050565b61448f82614664565b810181811067ffffffffffffffff821117156144ae576144ad61461c565b5b80604052505050565b60006144c282614408565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144f5576144f4614531565b5b600182019050919050565b600061450b82614408565b915061451683614408565b92508261452657614525614560565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f504152414d5f4c454e4754485f4e4f545f4d4554000000000000000000000000600082015250565b7f4e4545445f4d494e545f57484954454c49535400000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f6e66745f736574546f6b656e41737365745f6e6f746f6b656e00000000000000600082015250565b7f4d494e545f4c494d495400000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e4f545f57484954454c4953545f434f4e545241435400000000000000000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b614c708161439e565b8114614c7b57600080fd5b50565b614c87816143b0565b8114614c9257600080fd5b50565b614c9e816143bc565b8114614ca957600080fd5b50565b614cb581614408565b8114614cc057600080fd5b5056fea26469706673582212202c212e8ff6cc458565a86d6220b6de41739832f42f01b769f716d5a1536a92bb64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000084e494345204e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e49434500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c68747470733a2f2f7777772e6e6963652e636c75622f746f6b656e2f00000000

-----Decoded View---------------
Arg [0] : name_ (string): NICE NFT
Arg [1] : symbol_ (string): NICE
Arg [2] : baseUri_ (string): https://www.nice.club/token/
Arg [3] : maxSupply_ (uint256): 10000

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 4e494345204e4654000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4e49434500000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000001c
Arg [9] : 68747470733a2f2f7777772e6e6963652e636c75622f746f6b656e2f00000000


Deployed Bytecode Sourcemap

65123:3886:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37329:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22987:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24500:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24017:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66043:137;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65453:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67607:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37969:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25200:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37637:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65557:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66912:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25607:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38159:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67114:350;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66192:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22698:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22429:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46823:103;;;:::i;:::-;;65392:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;66657:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46175:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23156:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65506:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24743:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66304:345;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25863:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65835:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67472:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24969:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47081:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67926:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37329:224;37431:4;37470:35;37455:50;;;:11;:50;;;;:90;;;;37509:36;37533:11;37509:23;:36::i;:::-;37455:90;37448:97;;37329:224;;;:::o;22987:100::-;23041:13;23074:5;23067:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22987:100;:::o;24500:171::-;24576:7;24596:23;24611:7;24596:14;:23::i;:::-;24639:15;:24;24655:7;24639:24;;;;;;;;;;;;;;;;;;;;;24632:31;;24500:171;;;:::o;24017:417::-;24098:13;24114:23;24129:7;24114:14;:23::i;:::-;24098:39;;24162:5;24156:11;;:2;:11;;;;24148:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24256:5;24240:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24265:37;24282:5;24289:12;:10;:12::i;:::-;24265:16;:37::i;:::-;24240:62;24218:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;24405:21;24414:2;24418:7;24405:8;:21::i;:::-;24087:347;24017:417;;:::o;66043:137::-;66110:16;;:::i;:::-;66146;:26;66163:8;66146:26;;;;;;;;;;;66139:33;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66043:137;;;:::o;65453:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;67607:311::-;67732:8;:15;67712:9;:16;:35;67704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67790:6;67785:126;67806:9;:16;67802:1;:20;67785:126;;;67844:55;67861:10;67873:9;67883:1;67873:12;;;;;;;;:::i;:::-;;;;;;;;67887:8;67896:1;67887:11;;;;;;;;:::i;:::-;;;;;;;;67844:16;:55::i;:::-;67824:3;;;;:::i;:::-;;;67785:126;;;;67607:311;;:::o;37969:113::-;38030:7;38057:10;:17;;;;38050:24;;37969:113;:::o;25200:336::-;25395:41;25414:12;:10;:12::i;:::-;25428:7;25395:18;:41::i;:::-;25387:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25500:28;25510:4;25516:2;25520:7;25500:9;:28::i;:::-;25200:336;;;:::o;37637:256::-;37734:7;37770:23;37787:5;37770:16;:23::i;:::-;37762:5;:31;37754:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37859:12;:19;37872:5;37859:19;;;;;;;;;;;;;;;:26;37879:5;37859:26;;;;;;;;;;;;37852:33;;37637:256;;;;:::o;65557:25::-;;;;:::o;66912:194::-;46061:13;:11;:13::i;:::-;67006:6:::1;67001:98;67022:6;:13;67018:1;:17;67001:98;;;67080:7;67057:9;:20;67067:6;67074:1;67067:9;;;;;;;;:::i;:::-;;;;;;;;67057:20;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;67037:3;;;;:::i;:::-;;;67001:98;;;;66912:194:::0;;:::o;25607:185::-;25745:39;25762:4;25768:2;25772:7;25745:39;;;;;;;;;;;;:16;:39::i;:::-;25607:185;;;:::o;38159:233::-;38234:7;38270:30;:28;:30::i;:::-;38262:5;:38;38254:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38367:10;38378:5;38367:17;;;;;;;;:::i;:::-;;;;;;;;;;38360:24;;38159:233;;;:::o;67114:350::-;46061:13;:11;:13::i;:::-;67196:1:::1;67179:19;;:5;:19;;;67175:282;;;67215:12;67230:21;67215:36;;67266:44;67292:7;:5;:7::i;:::-;67302;67266:17;:44::i;:::-;67200:122;67175:282;;;67343:12;67365:5;67343:28;;67386:59;67405:7;:5;:7::i;:::-;67414:5;:15;;;67438:4;67414:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67386:5;:18;;;;:59;;;;;:::i;:::-;67328:129;67175:282;67114:350:::0;:::o;66192:104::-;46061:13;:11;:13::i;:::-;66277:11:::1;66267:7;:21;;;;;;;;;;;;:::i;:::-;;66192:104:::0;:::o;22698:222::-;22770:7;22790:13;22806:7;:16;22814:7;22806:16;;;;;;;;;;;;;;;;;;;;;22790:32;;22858:1;22841:19;;:5;:19;;;;22833:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;22907:5;22900:12;;;22698:222;;;:::o;22429:207::-;22501:7;22546:1;22529:19;;:5;:19;;;;22521:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22612:9;:16;22622:5;22612:16;;;;;;;;;;;;;;;;22605:23;;22429:207;;;:::o;46823:103::-;46061:13;:11;:13::i;:::-;46888:30:::1;46915:1;46888:18;:30::i;:::-;46823:103::o:0;65392:54::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66657:247::-;46061:13;:11;:13::i;:::-;66755:6:::1;66750:147;66771:6;:13;66767:1;:17;66750:147;;;66833:7;66806:13;:24;66820:6;66827:1;66820:9;;;;;;;;:::i;:::-;;;;;;;;66806:24;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;66878:7;66855:9;:20;66865:6;66872:1;66865:9;;;;;;;;:::i;:::-;;;;;;;;66855:20;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;66786:3;;;;:::i;:::-;;;66750:147;;;;66657:247:::0;;:::o;46175:87::-;46221:7;46248:6;;;;;;;;;;;46241:13;;46175:87;:::o;23156:104::-;23212:13;23245:7;23238:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23156:104;:::o;65506:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;24743:155::-;24838:52;24857:12;:10;:12::i;:::-;24871:8;24881;24838:18;:52::i;:::-;24743:155;;:::o;66304:345::-;46061:13;:11;:13::i;:::-;66428:17:::1;66436:8;66428:7;:17::i;:::-;66420:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;66486:22;66511:16;:26;66528:8;66511:26;;;;;;;;;;;66486:51;;66560:5;66548:4;:9;;:17;;;;;;;;;;;;:::i;:::-;;66590:7;66576:4;:11;;;:21;;;;;;;;;;;;;;;;;;66637:4;66608:16;:26;66625:8;66608:26;;;;;;;;;;;:33;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66409:240;66304:345:::0;;;:::o;25863:323::-;26037:41;26056:12;:10;:12::i;:::-;26070:7;26037:18;:41::i;:::-;26029:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;26140:38;26154:4;26160:2;26164:7;26173:4;26140:13;:38::i;:::-;25863:323;;;;:::o;65835:200::-;65908:13;65965:1;65947:7;65941:21;;;;;:::i;:::-;;;:25;:86;;;;;;;;;;;;;;;;;65993:7;66002:18;:7;:16;:18::i;:::-;65976:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65941:86;65934:93;;65835:200;;;:::o;67472:127::-;46061:13;:11;:13::i;:::-;67547:44:::1;67572:4;67579:2;67583:7;67547:16;:44::i;:::-;67472:127:::0;;:::o;24969:164::-;25066:4;25090:18;:25;25109:5;25090:25;;;;;;;;;;;;;;;:35;25116:8;25090:35;;;;;;;;;;;;;;;;;;;;;;;;;25083:42;;24969:164;;;;:::o;47081:201::-;46061:13;:11;:13::i;:::-;47190:1:::1;47170:22;;:8;:22;;;;47162:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47246:28;47265:8;47246:18;:28::i;:::-;47081:201:::0;:::o;67926:194::-;68023:13;:25;68037:10;68023:25;;;;;;;;;;;;;;;;;;;;;;;;;68015:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;68083:29;68095:2;68099:4;68105:6;68083:11;:29::i;:::-;;67926:194;;;:::o;22060:305::-;22162:4;22214:25;22199:40;;;:11;:40;;;;:105;;;;22271:33;22256:48;;;:11;:48;;;;22199:105;:158;;;;22321:36;22345:11;22321:23;:36::i;:::-;22199:158;22179:178;;22060:305;;;:::o;32475:135::-;32557:16;32565:7;32557;:16::i;:::-;32549:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32475:135;:::o;16917:98::-;16970:7;16997:10;16990:17;;16917:98;:::o;31754:174::-;31856:2;31829:15;:24;31845:7;31829:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31912:7;31908:2;31874:46;;31883:23;31898:7;31883:14;:23::i;:::-;31874:46;;;;;;;;;;;;31754:174;;:::o;27987:264::-;28080:4;28097:13;28113:23;28128:7;28113:14;:23::i;:::-;28097:39;;28166:5;28155:16;;:7;:16;;;:52;;;;28175:32;28192:5;28199:7;28175:16;:32::i;:::-;28155:52;:87;;;;28235:7;28211:31;;:20;28223:7;28211:11;:20::i;:::-;:31;;;28155:87;28147:96;;;27987:264;;;;:::o;31010:625::-;31169:4;31142:31;;:23;31157:7;31142:14;:23::i;:::-;:31;;;31134:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31248:1;31234:16;;:2;:16;;;;31226:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31304:39;31325:4;31331:2;31335:7;31304:20;:39::i;:::-;31408:29;31425:1;31429:7;31408:8;:29::i;:::-;31469:1;31450:9;:15;31460:4;31450:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31498:1;31481:9;:13;31491:2;31481:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31529:2;31510:7;:16;31518:7;31510:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31568:7;31564:2;31549:27;;31558:4;31549:27;;;;;;;;;;;;31589:38;31609:4;31615:2;31619:7;31589:19;:38::i;:::-;31010:625;;;:::o;46340:132::-;46415:12;:10;:12::i;:::-;46404:23;;:7;:5;:7::i;:::-;:23;;;46396:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46340:132::o;10179:317::-;10294:6;10269:21;:31;;10261:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10348:12;10366:9;:14;;10388:6;10366:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10347:52;;;10418:7;10410:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;10250:246;10179:317;;:::o;60637:211::-;60754:86;60774:5;60804:23;;;60829:2;60833:5;60781:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60754:19;:86::i;:::-;60637:211;;;:::o;47442:191::-;47516:16;47535:6;;;;;;;;;;;47516:25;;47561:8;47552:6;;:17;;;;;;;;;;;;;;;;;;47616:8;47585:40;;47606:8;47585:40;;;;;;;;;;;;47505:128;47442:191;:::o;32071:315::-;32226:8;32217:17;;:5;:17;;;;32209:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32313:8;32275:18;:25;32294:5;32275:25;;;;;;;;;;;;;;;:35;32301:8;32275:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32359:8;32337:41;;32352:5;32337:41;;;32369:8;32337:41;;;;;;:::i;:::-;;;;;;;;32071:315;;;:::o;27693:127::-;27758:4;27810:1;27782:30;;:7;:16;27790:7;27782:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27775:37;;27693:127;;;:::o;27067:313::-;27223:28;27233:4;27239:2;27243:7;27223:9;:28::i;:::-;27270:47;27293:4;27299:2;27303:7;27312:4;27270:22;:47::i;:::-;27262:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27067:313;;;;:::o;17561:723::-;17617:13;17847:1;17838:5;:10;17834:53;;;17865:10;;;;;;;;;;;;;;;;;;;;;17834:53;17897:12;17912:5;17897:20;;17928:14;17953:78;17968:1;17960:4;:9;17953:78;;17986:8;;;;;:::i;:::-;;;;18017:2;18009:10;;;;;:::i;:::-;;;17953:78;;;18041:19;18073:6;18063:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18041:39;;18091:154;18107:1;18098:5;:10;18091:154;;18135:1;18125:11;;;;;:::i;:::-;;;18202:2;18194:5;:10;;;;:::i;:::-;18181:2;:24;;;;:::i;:::-;18168:39;;18151:6;18158;18151:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18231:2;18222:11;;;;;:::i;:::-;;;18091:154;;;18269:6;18255:21;;;;;17561:723;;;;:::o;68128:431::-;68214:4;68231:21;:9;:19;:21::i;:::-;68263:17;68283:19;:9;:17;:19::i;:::-;68263:39;;68334:10;;68321:9;:23;;68313:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;68370:20;68376:2;68380:9;68370:5;:20::i;:::-;68403:21;68427:50;;;;;;;;68451:4;68427:50;;;;68470:6;68427:50;;;;;68403:74;;68520:4;68490:16;:27;68507:9;68490:27;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68542:9;68535:16;;;;68128:431;;;;;:::o;20491:157::-;20576:4;20615:25;20600:40;;;:11;:40;;;;20593:47;;20491:157;;;:::o;68567:399::-;68673:30;68692:10;68673:18;:30::i;:::-;68669:119;;;68728:9;:21;68738:10;68728:21;;;;;;;;;;;;;;;;;;;;;;;;;68720:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;68669:119;68802:22;68821:2;68802:18;:22::i;:::-;68798:103;;;68849:9;:13;68859:2;68849:13;;;;;;;;;;;;;;;;;;;;;;;;;68841:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;68798:103;68913:45;68940:4;68946:2;68950:7;68913:26;:45::i;:::-;68567:399;;;:::o;35110:125::-;;;;:::o;63704:716::-;64128:23;64154:69;64182:4;64154:69;;;;;;;;;;;;;;;;;64162:5;64154:27;;;;:69;;;;;:::i;:::-;64128:95;;64258:1;64238:10;:17;:21;64234:179;;;64335:10;64324:30;;;;;;;;;;;;:::i;:::-;64316:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;64234:179;63774:646;63704:716;;:::o;33174:853::-;33328:4;33349:15;:2;:13;;;:15::i;:::-;33345:675;;;33401:2;33385:36;;;33422:12;:10;:12::i;:::-;33436:4;33442:7;33451:4;33385:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33381:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33643:1;33626:6;:13;:18;33622:328;;;33669:60;;;;;;;;;;:::i;:::-;;;;;;;;33622:328;33900:6;33894:13;33885:6;33881:2;33877:15;33870:38;33381:584;33517:41;;;33507:51;;;:6;:51;;;;33500:58;;;;;33345:675;34004:4;33997:11;;33174:853;;;;;;;:::o;44471:127::-;44578:1;44560:7;:14;;;:19;;;;;;;;;;;44471:127;:::o;44349:114::-;44414:7;44441;:14;;;44434:21;;44349:114;;;:::o;29585:439::-;29679:1;29665:16;;:2;:16;;;;29657:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29738:16;29746:7;29738;:16::i;:::-;29737:17;29729:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29800:45;29829:1;29833:2;29837:7;29800:20;:45::i;:::-;29875:1;29858:9;:13;29868:2;29858:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29906:2;29887:7;:16;29895:7;29887:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29951:7;29947:2;29926:33;;29943:1;29926:33;;;;;;;;;;;;29972:44;30000:1;30004:2;30008:7;29972:19;:44::i;:::-;29585:439;;:::o;8918:326::-;8978:4;9235:1;9213:7;:19;;;:23;9206:30;;8918:326;;;:::o;39005:589::-;39149:45;39176:4;39182:2;39186:7;39149:26;:45::i;:::-;39227:1;39211:18;;:4;:18;;;39207:187;;;39246:40;39278:7;39246:31;:40::i;:::-;39207:187;;;39316:2;39308:10;;:4;:10;;;39304:90;;39335:47;39368:4;39374:7;39335:32;:47::i;:::-;39304:90;39207:187;39422:1;39408:16;;:2;:16;;;39404:183;;;39441:45;39478:7;39441:36;:45::i;:::-;39404:183;;;39514:4;39508:10;;:2;:10;;;39504:83;;39535:40;39563:2;39567:7;39535:27;:40::i;:::-;39504:83;39404:183;39005:589;;;:::o;11663:229::-;11800:12;11832:52;11854:6;11862:4;11868:1;11871:12;11832:21;:52::i;:::-;11825:59;;11663:229;;;;;:::o;34599:126::-;;;;:::o;40317:164::-;40421:10;:17;;;;40394:15;:24;40410:7;40394:24;;;;;;;;;;;:44;;;;40449:10;40465:7;40449:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40317:164;:::o;41108:988::-;41374:22;41424:1;41399:22;41416:4;41399:16;:22::i;:::-;:26;;;;:::i;:::-;41374:51;;41436:18;41457:17;:26;41475:7;41457:26;;;;;;;;;;;;41436:47;;41604:14;41590:10;:28;41586:328;;41635:19;41657:12;:18;41670:4;41657:18;;;;;;;;;;;;;;;:34;41676:14;41657:34;;;;;;;;;;;;41635:56;;41741:11;41708:12;:18;41721:4;41708:18;;;;;;;;;;;;;;;:30;41727:10;41708:30;;;;;;;;;;;:44;;;;41858:10;41825:17;:30;41843:11;41825:30;;;;;;;;;;;:43;;;;41620:294;41586:328;42010:17;:26;42028:7;42010:26;;;;;;;;;;;42003:33;;;42054:12;:18;42067:4;42054:18;;;;;;;;;;;;;;;:34;42073:14;42054:34;;;;;;;;;;;42047:41;;;41189:907;;41108:988;;:::o;42391:1079::-;42644:22;42689:1;42669:10;:17;;;;:21;;;;:::i;:::-;42644:46;;42701:18;42722:15;:24;42738:7;42722:24;;;;;;;;;;;;42701:45;;43073:19;43095:10;43106:14;43095:26;;;;;;;;:::i;:::-;;;;;;;;;;43073:48;;43159:11;43134:10;43145;43134:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43270:10;43239:15;:28;43255:11;43239:28;;;;;;;;;;;:41;;;;43411:15;:24;43427:7;43411:24;;;;;;;;;;;43404:31;;;43446:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42462:1008;;;42391:1079;:::o;39895:221::-;39980:14;39997:20;40014:2;39997:16;:20::i;:::-;39980:37;;40055:7;40028:12;:16;40041:2;40028:16;;;;;;;;;;;;;;;:24;40045:6;40028:24;;;;;;;;;;;:34;;;;40102:6;40073:17;:26;40091:7;40073:26;;;;;;;;;;;:35;;;;39969:147;39895:221;;:::o;12783:510::-;12953:12;13011:5;12986:21;:30;;12978:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;13078:18;13089:6;13078:10;:18::i;:::-;13070:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;13144:12;13158:23;13185:6;:11;;13204:5;13211:4;13185:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13143:73;;;;13234:51;13251:7;13260:10;13272:12;13234:16;:51::i;:::-;13227:58;;;;12783:510;;;;;;:::o;15469:762::-;15619:12;15648:7;15644:580;;;15679:10;15672:17;;;;15644:580;15813:1;15793:10;:17;:21;15789:424;;;16041:10;16035:17;16102:15;16089:10;16085:2;16081:19;16074:44;15789:424;16184:12;16177:20;;;;;;;;;;;:::i;:::-;;;;;;;;15469:762;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3455:5;3486:6;3480:13;3471:22;;3502:30;3526:5;3502:30;:::i;:::-;3401:137;;;;:::o;3544:::-;3589:5;3627:6;3614:20;3605:29;;3643:32;3669:5;3643:32;:::i;:::-;3544:137;;;;:::o;3687:141::-;3743:5;3774:6;3768:13;3759:22;;3790:32;3816:5;3790:32;:::i;:::-;3687:141;;;;:::o;3847:338::-;3902:5;3951:3;3944:4;3936:6;3932:17;3928:27;3918:122;;3959:79;;:::i;:::-;3918:122;4076:6;4063:20;4101:78;4175:3;4167:6;4160:4;4152:6;4148:17;4101:78;:::i;:::-;4092:87;;3908:277;3847:338;;;;:::o;4205:340::-;4261:5;4310:3;4303:4;4295:6;4291:17;4287:27;4277:122;;4318:79;;:::i;:::-;4277:122;4435:6;4422:20;4460:79;4535:3;4527:6;4520:4;4512:6;4508:17;4460:79;:::i;:::-;4451:88;;4267:278;4205:340;;;;:::o;4551:139::-;4597:5;4635:6;4622:20;4613:29;;4651:33;4678:5;4651:33;:::i;:::-;4551:139;;;;:::o;4696:143::-;4753:5;4784:6;4778:13;4769:22;;4800:33;4827:5;4800:33;:::i;:::-;4696:143;;;;:::o;4845:329::-;4904:6;4953:2;4941:9;4932:7;4928:23;4924:32;4921:119;;;4959:79;;:::i;:::-;4921:119;5079:1;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;:::i;:::-;5094:63;;5050:117;4845:329;;;;:::o;5180:474::-;5248:6;5256;5305:2;5293:9;5284:7;5280:23;5276:32;5273:119;;;5311:79;;:::i;:::-;5273:119;5431:1;5456:53;5501:7;5492:6;5481:9;5477:22;5456:53;:::i;:::-;5446:63;;5402:117;5558:2;5584:53;5629:7;5620:6;5609:9;5605:22;5584:53;:::i;:::-;5574:63;;5529:118;5180:474;;;;;:::o;5660:619::-;5737:6;5745;5753;5802:2;5790:9;5781:7;5777:23;5773:32;5770:119;;;5808:79;;:::i;:::-;5770:119;5928:1;5953:53;5998:7;5989:6;5978:9;5974:22;5953:53;:::i;:::-;5943:63;;5899:117;6055:2;6081:53;6126:7;6117:6;6106:9;6102:22;6081:53;:::i;:::-;6071:63;;6026:118;6183:2;6209:53;6254:7;6245:6;6234:9;6230:22;6209:53;:::i;:::-;6199:63;;6154:118;5660:619;;;;;:::o;6285:943::-;6380:6;6388;6396;6404;6453:3;6441:9;6432:7;6428:23;6424:33;6421:120;;;6460:79;;:::i;:::-;6421:120;6580:1;6605:53;6650:7;6641:6;6630:9;6626:22;6605:53;:::i;:::-;6595:63;;6551:117;6707:2;6733:53;6778:7;6769:6;6758:9;6754:22;6733:53;:::i;:::-;6723:63;;6678:118;6835:2;6861:53;6906:7;6897:6;6886:9;6882:22;6861:53;:::i;:::-;6851:63;;6806:118;6991:2;6980:9;6976:18;6963:32;7022:18;7014:6;7011:30;7008:117;;;7044:79;;:::i;:::-;7008:117;7149:62;7203:7;7194:6;7183:9;7179:22;7149:62;:::i;:::-;7139:72;;6934:287;6285:943;;;;;;;:::o;7234:468::-;7299:6;7307;7356:2;7344:9;7335:7;7331:23;7327:32;7324:119;;;7362:79;;:::i;:::-;7324:119;7482:1;7507:53;7552:7;7543:6;7532:9;7528:22;7507:53;:::i;:::-;7497:63;;7453:117;7609:2;7635:50;7677:7;7668:6;7657:9;7653:22;7635:50;:::i;:::-;7625:60;;7580:115;7234:468;;;;;:::o;7708:799::-;7795:6;7803;7811;7860:2;7848:9;7839:7;7835:23;7831:32;7828:119;;;7866:79;;:::i;:::-;7828:119;7986:1;8011:53;8056:7;8047:6;8036:9;8032:22;8011:53;:::i;:::-;8001:63;;7957:117;8141:2;8130:9;8126:18;8113:32;8172:18;8164:6;8161:30;8158:117;;;8194:79;;:::i;:::-;8158:117;8299:63;8354:7;8345:6;8334:9;8330:22;8299:63;:::i;:::-;8289:73;;8084:288;8411:2;8437:53;8482:7;8473:6;8462:9;8458:22;8437:53;:::i;:::-;8427:63;;8382:118;7708:799;;;;;:::o;8513:474::-;8581:6;8589;8638:2;8626:9;8617:7;8613:23;8609:32;8606:119;;;8644:79;;:::i;:::-;8606:119;8764:1;8789:53;8834:7;8825:6;8814:9;8810:22;8789:53;:::i;:::-;8779:63;;8735:117;8891:2;8917:53;8962:7;8953:6;8942:9;8938:22;8917:53;:::i;:::-;8907:63;;8862:118;8513:474;;;;;:::o;8993:894::-;9111:6;9119;9168:2;9156:9;9147:7;9143:23;9139:32;9136:119;;;9174:79;;:::i;:::-;9136:119;9322:1;9311:9;9307:17;9294:31;9352:18;9344:6;9341:30;9338:117;;;9374:79;;:::i;:::-;9338:117;9479:78;9549:7;9540:6;9529:9;9525:22;9479:78;:::i;:::-;9469:88;;9265:302;9634:2;9623:9;9619:18;9606:32;9665:18;9657:6;9654:30;9651:117;;;9687:79;;:::i;:::-;9651:117;9792:78;9862:7;9853:6;9842:9;9838:22;9792:78;:::i;:::-;9782:88;;9577:303;8993:894;;;;;:::o;9893:678::-;9983:6;9991;10040:2;10028:9;10019:7;10015:23;10011:32;10008:119;;;10046:79;;:::i;:::-;10008:119;10194:1;10183:9;10179:17;10166:31;10224:18;10216:6;10213:30;10210:117;;;10246:79;;:::i;:::-;10210:117;10351:78;10421:7;10412:6;10401:9;10397:22;10351:78;:::i;:::-;10341:88;;10137:302;10478:2;10504:50;10546:7;10537:6;10526:9;10522:22;10504:50;:::i;:::-;10494:60;;10449:115;9893:678;;;;;:::o;10577:345::-;10644:6;10693:2;10681:9;10672:7;10668:23;10664:32;10661:119;;;10699:79;;:::i;:::-;10661:119;10819:1;10844:61;10897:7;10888:6;10877:9;10873:22;10844:61;:::i;:::-;10834:71;;10790:125;10577:345;;;;:::o;10928:327::-;10986:6;11035:2;11023:9;11014:7;11010:23;11006:32;11003:119;;;11041:79;;:::i;:::-;11003:119;11161:1;11186:52;11230:7;11221:6;11210:9;11206:22;11186:52;:::i;:::-;11176:62;;11132:116;10928:327;;;;:::o;11261:349::-;11330:6;11379:2;11367:9;11358:7;11354:23;11350:32;11347:119;;;11385:79;;:::i;:::-;11347:119;11505:1;11530:63;11585:7;11576:6;11565:9;11561:22;11530:63;:::i;:::-;11520:73;;11476:127;11261:349;;;;:::o;11616:509::-;11685:6;11734:2;11722:9;11713:7;11709:23;11705:32;11702:119;;;11740:79;;:::i;:::-;11702:119;11888:1;11877:9;11873:17;11860:31;11918:18;11910:6;11907:30;11904:117;;;11940:79;;:::i;:::-;11904:117;12045:63;12100:7;12091:6;12080:9;12076:22;12045:63;:::i;:::-;12035:73;;11831:287;11616:509;;;;:::o;12131:329::-;12190:6;12239:2;12227:9;12218:7;12214:23;12210:32;12207:119;;;12245:79;;:::i;:::-;12207:119;12365:1;12390:53;12435:7;12426:6;12415:9;12411:22;12390:53;:::i;:::-;12380:63;;12336:117;12131:329;;;;:::o;12466:351::-;12536:6;12585:2;12573:9;12564:7;12560:23;12556:32;12553:119;;;12591:79;;:::i;:::-;12553:119;12711:1;12736:64;12792:7;12783:6;12772:9;12768:22;12736:64;:::i;:::-;12726:74;;12682:128;12466:351;;;;:::o;12823:799::-;12910:6;12918;12926;12975:2;12963:9;12954:7;12950:23;12946:32;12943:119;;;12981:79;;:::i;:::-;12943:119;13101:1;13126:53;13171:7;13162:6;13151:9;13147:22;13126:53;:::i;:::-;13116:63;;13072:117;13256:2;13245:9;13241:18;13228:32;13287:18;13279:6;13276:30;13273:117;;;13309:79;;:::i;:::-;13273:117;13414:63;13469:7;13460:6;13449:9;13445:22;13414:63;:::i;:::-;13404:73;;13199:288;13526:2;13552:53;13597:7;13588:6;13577:9;13573:22;13552:53;:::i;:::-;13542:63;;13497:118;12823:799;;;;;:::o;13628:108::-;13705:24;13723:5;13705:24;:::i;:::-;13700:3;13693:37;13628:108;;:::o;13742:118::-;13829:24;13847:5;13829:24;:::i;:::-;13824:3;13817:37;13742:118;;:::o;13866:109::-;13947:21;13962:5;13947:21;:::i;:::-;13942:3;13935:34;13866:109;;:::o;13981:360::-;14067:3;14095:38;14127:5;14095:38;:::i;:::-;14149:70;14212:6;14207:3;14149:70;:::i;:::-;14142:77;;14228:52;14273:6;14268:3;14261:4;14254:5;14250:16;14228:52;:::i;:::-;14305:29;14327:6;14305:29;:::i;:::-;14300:3;14296:39;14289:46;;14071:270;13981:360;;;;:::o;14347:373::-;14451:3;14479:38;14511:5;14479:38;:::i;:::-;14533:88;14614:6;14609:3;14533:88;:::i;:::-;14526:95;;14630:52;14675:6;14670:3;14663:4;14656:5;14652:16;14630:52;:::i;:::-;14707:6;14702:3;14698:16;14691:23;;14455:265;14347:373;;;;:::o;14726:344::-;14804:3;14832:39;14865:5;14832:39;:::i;:::-;14887:61;14941:6;14936:3;14887:61;:::i;:::-;14880:68;;14957:52;15002:6;14997:3;14990:4;14983:5;14979:16;14957:52;:::i;:::-;15034:29;15056:6;15034:29;:::i;:::-;15029:3;15025:39;15018:46;;14808:262;14726:344;;;;:::o;15076:364::-;15164:3;15192:39;15225:5;15192:39;:::i;:::-;15247:71;15311:6;15306:3;15247:71;:::i;:::-;15240:78;;15327:52;15372:6;15367:3;15360:4;15353:5;15349:16;15327:52;:::i;:::-;15404:29;15426:6;15404:29;:::i;:::-;15399:3;15395:39;15388:46;;15168:272;15076:364;;;;:::o;15446:377::-;15552:3;15580:39;15613:5;15580:39;:::i;:::-;15635:89;15717:6;15712:3;15635:89;:::i;:::-;15628:96;;15733:52;15778:6;15773:3;15766:4;15759:5;15755:16;15733:52;:::i;:::-;15810:6;15805:3;15801:16;15794:23;;15556:267;15446:377;;;;:::o;15853:845::-;15956:3;15993:5;15987:12;16022:36;16048:9;16022:36;:::i;:::-;16074:89;16156:6;16151:3;16074:89;:::i;:::-;16067:96;;16194:1;16183:9;16179:17;16210:1;16205:137;;;;16356:1;16351:341;;;;16172:520;;16205:137;16289:4;16285:9;16274;16270:25;16265:3;16258:38;16325:6;16320:3;16316:16;16309:23;;16205:137;;16351:341;16418:38;16450:5;16418:38;:::i;:::-;16478:1;16492:154;16506:6;16503:1;16500:13;16492:154;;;16580:7;16574:14;16570:1;16565:3;16561:11;16554:35;16630:1;16621:7;16617:15;16606:26;;16528:4;16525:1;16521:12;16516:17;;16492:154;;;16675:6;16670:3;16666:16;16659:23;;16358:334;;16172:520;;15960:738;;15853:845;;;;:::o;16704:366::-;16846:3;16867:67;16931:2;16926:3;16867:67;:::i;:::-;16860:74;;16943:93;17032:3;16943:93;:::i;:::-;17061:2;17056:3;17052:12;17045:19;;16704:366;;;:::o;17076:::-;17218:3;17239:67;17303:2;17298:3;17239:67;:::i;:::-;17232:74;;17315:93;17404:3;17315:93;:::i;:::-;17433:2;17428:3;17424:12;17417:19;;17076:366;;;:::o;17448:::-;17590:3;17611:67;17675:2;17670:3;17611:67;:::i;:::-;17604:74;;17687:93;17776:3;17687:93;:::i;:::-;17805:2;17800:3;17796:12;17789:19;;17448:366;;;:::o;17820:::-;17962:3;17983:67;18047:2;18042:3;17983:67;:::i;:::-;17976:74;;18059:93;18148:3;18059:93;:::i;:::-;18177:2;18172:3;18168:12;18161:19;;17820:366;;;:::o;18192:::-;18334:3;18355:67;18419:2;18414:3;18355:67;:::i;:::-;18348:74;;18431:93;18520:3;18431:93;:::i;:::-;18549:2;18544:3;18540:12;18533:19;;18192:366;;;:::o;18564:::-;18706:3;18727:67;18791:2;18786:3;18727:67;:::i;:::-;18720:74;;18803:93;18892:3;18803:93;:::i;:::-;18921:2;18916:3;18912:12;18905:19;;18564:366;;;:::o;18936:::-;19078:3;19099:67;19163:2;19158:3;19099:67;:::i;:::-;19092:74;;19175:93;19264:3;19175:93;:::i;:::-;19293:2;19288:3;19284:12;19277:19;;18936:366;;;:::o;19308:::-;19450:3;19471:67;19535:2;19530:3;19471:67;:::i;:::-;19464:74;;19547:93;19636:3;19547:93;:::i;:::-;19665:2;19660:3;19656:12;19649:19;;19308:366;;;:::o;19680:::-;19822:3;19843:67;19907:2;19902:3;19843:67;:::i;:::-;19836:74;;19919:93;20008:3;19919:93;:::i;:::-;20037:2;20032:3;20028:12;20021:19;;19680:366;;;:::o;20052:::-;20194:3;20215:67;20279:2;20274:3;20215:67;:::i;:::-;20208:74;;20291:93;20380:3;20291:93;:::i;:::-;20409:2;20404:3;20400:12;20393:19;;20052:366;;;:::o;20424:::-;20566:3;20587:67;20651:2;20646:3;20587:67;:::i;:::-;20580:74;;20663:93;20752:3;20663:93;:::i;:::-;20781:2;20776:3;20772:12;20765:19;;20424:366;;;:::o;20796:::-;20938:3;20959:67;21023:2;21018:3;20959:67;:::i;:::-;20952:74;;21035:93;21124:3;21035:93;:::i;:::-;21153:2;21148:3;21144:12;21137:19;;20796:366;;;:::o;21168:::-;21310:3;21331:67;21395:2;21390:3;21331:67;:::i;:::-;21324:74;;21407:93;21496:3;21407:93;:::i;:::-;21525:2;21520:3;21516:12;21509:19;;21168:366;;;:::o;21540:::-;21682:3;21703:67;21767:2;21762:3;21703:67;:::i;:::-;21696:74;;21779:93;21868:3;21779:93;:::i;:::-;21897:2;21892:3;21888:12;21881:19;;21540:366;;;:::o;21912:::-;22054:3;22075:67;22139:2;22134:3;22075:67;:::i;:::-;22068:74;;22151:93;22240:3;22151:93;:::i;:::-;22269:2;22264:3;22260:12;22253:19;;21912:366;;;:::o;22284:::-;22426:3;22447:67;22511:2;22506:3;22447:67;:::i;:::-;22440:74;;22523:93;22612:3;22523:93;:::i;:::-;22641:2;22636:3;22632:12;22625:19;;22284:366;;;:::o;22656:::-;22798:3;22819:67;22883:2;22878:3;22819:67;:::i;:::-;22812:74;;22895:93;22984:3;22895:93;:::i;:::-;23013:2;23008:3;23004:12;22997:19;;22656:366;;;:::o;23028:::-;23170:3;23191:67;23255:2;23250:3;23191:67;:::i;:::-;23184:74;;23267:93;23356:3;23267:93;:::i;:::-;23385:2;23380:3;23376:12;23369:19;;23028:366;;;:::o;23400:::-;23542:3;23563:67;23627:2;23622:3;23563:67;:::i;:::-;23556:74;;23639:93;23728:3;23639:93;:::i;:::-;23757:2;23752:3;23748:12;23741:19;;23400:366;;;:::o;23772:::-;23914:3;23935:67;23999:2;23994:3;23935:67;:::i;:::-;23928:74;;24011:93;24100:3;24011:93;:::i;:::-;24129:2;24124:3;24120:12;24113:19;;23772:366;;;:::o;24144:::-;24286:3;24307:67;24371:2;24366:3;24307:67;:::i;:::-;24300:74;;24383:93;24472:3;24383:93;:::i;:::-;24501:2;24496:3;24492:12;24485:19;;24144:366;;;:::o;24516:398::-;24675:3;24696:83;24777:1;24772:3;24696:83;:::i;:::-;24689:90;;24788:93;24877:3;24788:93;:::i;:::-;24906:1;24901:3;24897:11;24890:18;;24516:398;;;:::o;24920:366::-;25062:3;25083:67;25147:2;25142:3;25083:67;:::i;:::-;25076:74;;25159:93;25248:3;25159:93;:::i;:::-;25277:2;25272:3;25268:12;25261:19;;24920:366;;;:::o;25292:::-;25434:3;25455:67;25519:2;25514:3;25455:67;:::i;:::-;25448:74;;25531:93;25620:3;25531:93;:::i;:::-;25649:2;25644:3;25640:12;25633:19;;25292:366;;;:::o;25664:::-;25806:3;25827:67;25891:2;25886:3;25827:67;:::i;:::-;25820:74;;25903:93;25992:3;25903:93;:::i;:::-;26021:2;26016:3;26012:12;26005:19;;25664:366;;;:::o;26036:::-;26178:3;26199:67;26263:2;26258:3;26199:67;:::i;:::-;26192:74;;26275:93;26364:3;26275:93;:::i;:::-;26393:2;26388:3;26384:12;26377:19;;26036:366;;;:::o;26452:612::-;26575:3;26611:4;26606:3;26602:14;26698:4;26691:5;26687:16;26681:23;26751:3;26745:4;26741:14;26734:4;26729:3;26725:14;26718:38;26777:73;26845:4;26831:12;26777:73;:::i;:::-;26769:81;;26626:235;26945:4;26938:5;26934:16;26928:23;26964:63;27021:4;27016:3;27012:14;26998:12;26964:63;:::i;:::-;26871:166;27054:4;27047:11;;26580:484;26452:612;;;;:::o;27070:118::-;27157:24;27175:5;27157:24;:::i;:::-;27152:3;27145:37;27070:118;;:::o;27194:271::-;27324:3;27346:93;27435:3;27426:6;27346:93;:::i;:::-;27339:100;;27456:3;27449:10;;27194:271;;;;:::o;27471:429::-;27648:3;27670:92;27758:3;27749:6;27670:92;:::i;:::-;27663:99;;27779:95;27870:3;27861:6;27779:95;:::i;:::-;27772:102;;27891:3;27884:10;;27471:429;;;;;:::o;27906:379::-;28090:3;28112:147;28255:3;28112:147;:::i;:::-;28105:154;;28276:3;28269:10;;27906:379;;;:::o;28291:222::-;28384:4;28422:2;28411:9;28407:18;28399:26;;28435:71;28503:1;28492:9;28488:17;28479:6;28435:71;:::i;:::-;28291:222;;;;:::o;28519:640::-;28714:4;28752:3;28741:9;28737:19;28729:27;;28766:71;28834:1;28823:9;28819:17;28810:6;28766:71;:::i;:::-;28847:72;28915:2;28904:9;28900:18;28891:6;28847:72;:::i;:::-;28929;28997:2;28986:9;28982:18;28973:6;28929:72;:::i;:::-;29048:9;29042:4;29038:20;29033:2;29022:9;29018:18;29011:48;29076:76;29147:4;29138:6;29076:76;:::i;:::-;29068:84;;28519:640;;;;;;;:::o;29165:332::-;29286:4;29324:2;29313:9;29309:18;29301:26;;29337:71;29405:1;29394:9;29390:17;29381:6;29337:71;:::i;:::-;29418:72;29486:2;29475:9;29471:18;29462:6;29418:72;:::i;:::-;29165:332;;;;;:::o;29503:210::-;29590:4;29628:2;29617:9;29613:18;29605:26;;29641:65;29703:1;29692:9;29688:17;29679:6;29641:65;:::i;:::-;29503:210;;;;:::o;29719:313::-;29832:4;29870:2;29859:9;29855:18;29847:26;;29919:9;29913:4;29909:20;29905:1;29894:9;29890:17;29883:47;29947:78;30020:4;30011:6;29947:78;:::i;:::-;29939:86;;29719:313;;;;:::o;30038:423::-;30179:4;30217:2;30206:9;30202:18;30194:26;;30266:9;30260:4;30256:20;30252:1;30241:9;30237:17;30230:47;30294:78;30367:4;30358:6;30294:78;:::i;:::-;30286:86;;30382:72;30450:2;30439:9;30435:18;30426:6;30382:72;:::i;:::-;30038:423;;;;;:::o;30467:419::-;30633:4;30671:2;30660:9;30656:18;30648:26;;30720:9;30714:4;30710:20;30706:1;30695:9;30691:17;30684:47;30748:131;30874:4;30748:131;:::i;:::-;30740:139;;30467:419;;;:::o;30892:::-;31058:4;31096:2;31085:9;31081:18;31073:26;;31145:9;31139:4;31135:20;31131:1;31120:9;31116:17;31109:47;31173:131;31299:4;31173:131;:::i;:::-;31165:139;;30892:419;;;:::o;31317:::-;31483:4;31521:2;31510:9;31506:18;31498:26;;31570:9;31564:4;31560:20;31556:1;31545:9;31541:17;31534:47;31598:131;31724:4;31598:131;:::i;:::-;31590:139;;31317:419;;;:::o;31742:::-;31908:4;31946:2;31935:9;31931:18;31923:26;;31995:9;31989:4;31985:20;31981:1;31970:9;31966:17;31959:47;32023:131;32149:4;32023:131;:::i;:::-;32015:139;;31742:419;;;:::o;32167:::-;32333:4;32371:2;32360:9;32356:18;32348:26;;32420:9;32414:4;32410:20;32406:1;32395:9;32391:17;32384:47;32448:131;32574:4;32448:131;:::i;:::-;32440:139;;32167:419;;;:::o;32592:::-;32758:4;32796:2;32785:9;32781:18;32773:26;;32845:9;32839:4;32835:20;32831:1;32820:9;32816:17;32809:47;32873:131;32999:4;32873:131;:::i;:::-;32865:139;;32592:419;;;:::o;33017:::-;33183:4;33221:2;33210:9;33206:18;33198:26;;33270:9;33264:4;33260:20;33256:1;33245:9;33241:17;33234:47;33298:131;33424:4;33298:131;:::i;:::-;33290:139;;33017:419;;;:::o;33442:::-;33608:4;33646:2;33635:9;33631:18;33623:26;;33695:9;33689:4;33685:20;33681:1;33670:9;33666:17;33659:47;33723:131;33849:4;33723:131;:::i;:::-;33715:139;;33442:419;;;:::o;33867:::-;34033:4;34071:2;34060:9;34056:18;34048:26;;34120:9;34114:4;34110:20;34106:1;34095:9;34091:17;34084:47;34148:131;34274:4;34148:131;:::i;:::-;34140:139;;33867:419;;;:::o;34292:::-;34458:4;34496:2;34485:9;34481:18;34473:26;;34545:9;34539:4;34535:20;34531:1;34520:9;34516:17;34509:47;34573:131;34699:4;34573:131;:::i;:::-;34565:139;;34292:419;;;:::o;34717:::-;34883:4;34921:2;34910:9;34906:18;34898:26;;34970:9;34964:4;34960:20;34956:1;34945:9;34941:17;34934:47;34998:131;35124:4;34998:131;:::i;:::-;34990:139;;34717:419;;;:::o;35142:::-;35308:4;35346:2;35335:9;35331:18;35323:26;;35395:9;35389:4;35385:20;35381:1;35370:9;35366:17;35359:47;35423:131;35549:4;35423:131;:::i;:::-;35415:139;;35142:419;;;:::o;35567:::-;35733:4;35771:2;35760:9;35756:18;35748:26;;35820:9;35814:4;35810:20;35806:1;35795:9;35791:17;35784:47;35848:131;35974:4;35848:131;:::i;:::-;35840:139;;35567:419;;;:::o;35992:::-;36158:4;36196:2;36185:9;36181:18;36173:26;;36245:9;36239:4;36235:20;36231:1;36220:9;36216:17;36209:47;36273:131;36399:4;36273:131;:::i;:::-;36265:139;;35992:419;;;:::o;36417:::-;36583:4;36621:2;36610:9;36606:18;36598:26;;36670:9;36664:4;36660:20;36656:1;36645:9;36641:17;36634:47;36698:131;36824:4;36698:131;:::i;:::-;36690:139;;36417:419;;;:::o;36842:::-;37008:4;37046:2;37035:9;37031:18;37023:26;;37095:9;37089:4;37085:20;37081:1;37070:9;37066:17;37059:47;37123:131;37249:4;37123:131;:::i;:::-;37115:139;;36842:419;;;:::o;37267:::-;37433:4;37471:2;37460:9;37456:18;37448:26;;37520:9;37514:4;37510:20;37506:1;37495:9;37491:17;37484:47;37548:131;37674:4;37548:131;:::i;:::-;37540:139;;37267:419;;;:::o;37692:::-;37858:4;37896:2;37885:9;37881:18;37873:26;;37945:9;37939:4;37935:20;37931:1;37920:9;37916:17;37909:47;37973:131;38099:4;37973:131;:::i;:::-;37965:139;;37692:419;;;:::o;38117:::-;38283:4;38321:2;38310:9;38306:18;38298:26;;38370:9;38364:4;38360:20;38356:1;38345:9;38341:17;38334:47;38398:131;38524:4;38398:131;:::i;:::-;38390:139;;38117:419;;;:::o;38542:::-;38708:4;38746:2;38735:9;38731:18;38723:26;;38795:9;38789:4;38785:20;38781:1;38770:9;38766:17;38759:47;38823:131;38949:4;38823:131;:::i;:::-;38815:139;;38542:419;;;:::o;38967:::-;39133:4;39171:2;39160:9;39156:18;39148:26;;39220:9;39214:4;39210:20;39206:1;39195:9;39191:17;39184:47;39248:131;39374:4;39248:131;:::i;:::-;39240:139;;38967:419;;;:::o;39392:::-;39558:4;39596:2;39585:9;39581:18;39573:26;;39645:9;39639:4;39635:20;39631:1;39620:9;39616:17;39609:47;39673:131;39799:4;39673:131;:::i;:::-;39665:139;;39392:419;;;:::o;39817:::-;39983:4;40021:2;40010:9;40006:18;39998:26;;40070:9;40064:4;40060:20;40056:1;40045:9;40041:17;40034:47;40098:131;40224:4;40098:131;:::i;:::-;40090:139;;39817:419;;;:::o;40242:::-;40408:4;40446:2;40435:9;40431:18;40423:26;;40495:9;40489:4;40485:20;40481:1;40470:9;40466:17;40459:47;40523:131;40649:4;40523:131;:::i;:::-;40515:139;;40242:419;;;:::o;40667:::-;40833:4;40871:2;40860:9;40856:18;40848:26;;40920:9;40914:4;40910:20;40906:1;40895:9;40891:17;40884:47;40948:131;41074:4;40948:131;:::i;:::-;40940:139;;40667:419;;;:::o;41092:381::-;41239:4;41277:2;41266:9;41262:18;41254:26;;41326:9;41320:4;41316:20;41312:1;41301:9;41297:17;41290:47;41354:112;41461:4;41452:6;41354:112;:::i;:::-;41346:120;;41092:381;;;;:::o;41479:222::-;41572:4;41610:2;41599:9;41595:18;41587:26;;41623:71;41691:1;41680:9;41676:17;41667:6;41623:71;:::i;:::-;41479:222;;;;:::o;41707:129::-;41741:6;41768:20;;:::i;:::-;41758:30;;41797:33;41825:4;41817:6;41797:33;:::i;:::-;41707:129;;;:::o;41842:75::-;41875:6;41908:2;41902:9;41892:19;;41842:75;:::o;41923:311::-;42000:4;42090:18;42082:6;42079:30;42076:56;;;42112:18;;:::i;:::-;42076:56;42162:4;42154:6;42150:17;42142:25;;42222:4;42216;42212:15;42204:23;;41923:311;;;:::o;42240:::-;42317:4;42407:18;42399:6;42396:30;42393:56;;;42429:18;;:::i;:::-;42393:56;42479:4;42471:6;42467:17;42459:25;;42539:4;42533;42529:15;42521:23;;42240:311;;;:::o;42557:307::-;42618:4;42708:18;42700:6;42697:30;42694:56;;;42730:18;;:::i;:::-;42694:56;42768:29;42790:6;42768:29;:::i;:::-;42760:37;;42852:4;42846;42842:15;42834:23;;42557:307;;;:::o;42870:308::-;42932:4;43022:18;43014:6;43011:30;43008:56;;;43044:18;;:::i;:::-;43008:56;43082:29;43104:6;43082:29;:::i;:::-;43074:37;;43166:4;43160;43156:15;43148:23;;42870:308;;;:::o;43184:141::-;43233:4;43256:3;43248:11;;43279:3;43276:1;43269:14;43313:4;43310:1;43300:18;43292:26;;43184:141;;;:::o;43331:98::-;43382:6;43416:5;43410:12;43400:22;;43331:98;;;:::o;43435:99::-;43487:6;43521:5;43515:12;43505:22;;43435:99;;;:::o;43540:168::-;43623:11;43657:6;43652:3;43645:19;43697:4;43692:3;43688:14;43673:29;;43540:168;;;;:::o;43714:147::-;43815:11;43852:3;43837:18;;43714:147;;;;:::o;43867:159::-;43941:11;43975:6;43970:3;43963:19;44015:4;44010:3;44006:14;43991:29;;43867:159;;;;:::o;44032:169::-;44116:11;44150:6;44145:3;44138:19;44190:4;44185:3;44181:14;44166:29;;44032:169;;;;:::o;44207:148::-;44309:11;44346:3;44331:18;;44207:148;;;;:::o;44361:305::-;44401:3;44420:20;44438:1;44420:20;:::i;:::-;44415:25;;44454:20;44472:1;44454:20;:::i;:::-;44449:25;;44608:1;44540:66;44536:74;44533:1;44530:81;44527:107;;;44614:18;;:::i;:::-;44527:107;44658:1;44655;44651:9;44644:16;;44361:305;;;;:::o;44672:185::-;44712:1;44729:20;44747:1;44729:20;:::i;:::-;44724:25;;44763:20;44781:1;44763:20;:::i;:::-;44758:25;;44802:1;44792:35;;44807:18;;:::i;:::-;44792:35;44849:1;44846;44842:9;44837:14;;44672:185;;;;:::o;44863:191::-;44903:4;44923:20;44941:1;44923:20;:::i;:::-;44918:25;;44957:20;44975:1;44957:20;:::i;:::-;44952:25;;44996:1;44993;44990:8;44987:34;;;45001:18;;:::i;:::-;44987:34;45046:1;45043;45039:9;45031:17;;44863:191;;;;:::o;45060:96::-;45097:7;45126:24;45144:5;45126:24;:::i;:::-;45115:35;;45060:96;;;:::o;45162:90::-;45196:7;45239:5;45232:13;45225:21;45214:32;;45162:90;;;:::o;45258:149::-;45294:7;45334:66;45327:5;45323:78;45312:89;;45258:149;;;:::o;45413:126::-;45450:7;45490:42;45483:5;45479:54;45468:65;;45413:126;;;:::o;45545:77::-;45582:7;45611:5;45600:16;;45545:77;;;:::o;45628:154::-;45712:6;45707:3;45702;45689:30;45774:1;45765:6;45760:3;45756:16;45749:27;45628:154;;;:::o;45788:307::-;45856:1;45866:113;45880:6;45877:1;45874:13;45866:113;;;45965:1;45960:3;45956:11;45950:18;45946:1;45941:3;45937:11;45930:39;45902:2;45899:1;45895:10;45890:15;;45866:113;;;45997:6;45994:1;45991:13;45988:101;;;46077:1;46068:6;46063:3;46059:16;46052:27;45988:101;45837:258;45788:307;;;:::o;46101:320::-;46145:6;46182:1;46176:4;46172:12;46162:22;;46229:1;46223:4;46219:12;46250:18;46240:81;;46306:4;46298:6;46294:17;46284:27;;46240:81;46368:2;46360:6;46357:14;46337:18;46334:38;46331:84;;;46387:18;;:::i;:::-;46331:84;46152:269;46101:320;;;:::o;46427:281::-;46510:27;46532:4;46510:27;:::i;:::-;46502:6;46498:40;46640:6;46628:10;46625:22;46604:18;46592:10;46589:34;46586:62;46583:88;;;46651:18;;:::i;:::-;46583:88;46691:10;46687:2;46680:22;46470:238;46427:281;;:::o;46714:233::-;46753:3;46776:24;46794:5;46776:24;:::i;:::-;46767:33;;46822:66;46815:5;46812:77;46809:103;;;46892:18;;:::i;:::-;46809:103;46939:1;46932:5;46928:13;46921:20;;46714:233;;;:::o;46953:176::-;46985:1;47002:20;47020:1;47002:20;:::i;:::-;46997:25;;47036:20;47054:1;47036:20;:::i;:::-;47031:25;;47075:1;47065:35;;47080:18;;:::i;:::-;47065:35;47121:1;47118;47114:9;47109:14;;46953:176;;;;:::o;47135:180::-;47183:77;47180:1;47173:88;47280:4;47277:1;47270:15;47304:4;47301:1;47294:15;47321:180;47369:77;47366:1;47359:88;47466:4;47463:1;47456:15;47490:4;47487:1;47480:15;47507:180;47555:77;47552:1;47545:88;47652:4;47649:1;47642:15;47676:4;47673:1;47666:15;47693:180;47741:77;47738:1;47731:88;47838:4;47835:1;47828:15;47862:4;47859:1;47852:15;47879:180;47927:77;47924:1;47917:88;48024:4;48021:1;48014:15;48048:4;48045:1;48038:15;48065:180;48113:77;48110:1;48103:88;48210:4;48207:1;48200:15;48234:4;48231:1;48224:15;48251:117;48360:1;48357;48350:12;48374:117;48483:1;48480;48473:12;48497:117;48606:1;48603;48596:12;48620:117;48729:1;48726;48719:12;48743:117;48852:1;48849;48842:12;48866:102;48907:6;48958:2;48954:7;48949:2;48942:5;48938:14;48934:28;48924:38;;48866:102;;;:::o;48974:170::-;49114:22;49110:1;49102:6;49098:14;49091:46;48974:170;:::o;49150:169::-;49290:21;49286:1;49278:6;49274:14;49267:45;49150:169;:::o;49325:230::-;49465:34;49461:1;49453:6;49449:14;49442:58;49534:13;49529:2;49521:6;49517:15;49510:38;49325:230;:::o;49561:237::-;49701:34;49697:1;49689:6;49685:14;49678:58;49770:20;49765:2;49757:6;49753:15;49746:45;49561:237;:::o;49804:225::-;49944:34;49940:1;49932:6;49928:14;49921:58;50013:8;50008:2;50000:6;49996:15;49989:33;49804:225;:::o;50035:224::-;50175:34;50171:1;50163:6;50159:14;50152:58;50244:7;50239:2;50231:6;50227:15;50220:32;50035:224;:::o;50265:178::-;50405:30;50401:1;50393:6;50389:14;50382:54;50265:178;:::o;50449:223::-;50589:34;50585:1;50577:6;50573:14;50566:58;50658:6;50653:2;50645:6;50641:15;50634:31;50449:223;:::o;50678:175::-;50818:27;50814:1;50806:6;50802:14;50795:51;50678:175;:::o;50859:245::-;50999:34;50995:1;50987:6;50983:14;50976:58;51068:28;51063:2;51055:6;51051:15;51044:53;50859:245;:::o;51110:179::-;51250:31;51246:1;51238:6;51234:14;51227:55;51110:179;:::o;51295:225::-;51435:34;51431:1;51423:6;51419:14;51412:58;51504:8;51499:2;51491:6;51487:15;51480:33;51295:225;:::o;51526:228::-;51666:34;51662:1;51654:6;51650:14;51643:58;51735:11;51730:2;51722:6;51718:15;51711:36;51526:228;:::o;51760:175::-;51900:27;51896:1;51888:6;51884:14;51877:51;51760:175;:::o;51941:160::-;52081:12;52077:1;52069:6;52065:14;52058:36;51941:160;:::o;52107:249::-;52247:34;52243:1;52235:6;52231:14;52224:58;52316:32;52311:2;52303:6;52299:15;52292:57;52107:249;:::o;52362:182::-;52502:34;52498:1;52490:6;52486:14;52479:58;52362:182;:::o;52550:::-;52690:34;52686:1;52678:6;52674:14;52667:58;52550:182;:::o;52738:172::-;52878:24;52874:1;52866:6;52862:14;52855:48;52738:172;:::o;52916:174::-;53056:26;53052:1;53044:6;53040:14;53033:50;52916:174;:::o;53096:220::-;53236:34;53232:1;53224:6;53220:14;53213:58;53305:3;53300:2;53292:6;53288:15;53281:28;53096:220;:::o;53322:114::-;;:::o;53442:179::-;53582:31;53578:1;53570:6;53566:14;53559:55;53442:179;:::o;53627:231::-;53767:34;53763:1;53755:6;53751:14;53744:58;53836:14;53831:2;53823:6;53819:15;53812:39;53627:231;:::o;53864:229::-;54004:34;54000:1;53992:6;53988:14;53981:58;54073:12;54068:2;54060:6;54056:15;54049:37;53864:229;:::o;54099:233::-;54239:34;54235:1;54227:6;54223:14;54216:58;54308:16;54303:2;54295:6;54291:15;54284:41;54099:233;:::o;54338:122::-;54411:24;54429:5;54411:24;:::i;:::-;54404:5;54401:35;54391:63;;54450:1;54447;54440:12;54391:63;54338:122;:::o;54466:116::-;54536:21;54551:5;54536:21;:::i;:::-;54529:5;54526:32;54516:60;;54572:1;54569;54562:12;54516:60;54466:116;:::o;54588:120::-;54660:23;54677:5;54660:23;:::i;:::-;54653:5;54650:34;54640:62;;54698:1;54695;54688:12;54640:62;54588:120;:::o;54714:122::-;54787:24;54805:5;54787:24;:::i;:::-;54780:5;54777:35;54767:63;;54826:1;54823;54816:12;54767:63;54714:122;:::o

Swarm Source

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