ETH Price: $3,481.91 (+0.96%)

Token

Fumiko (NFT)
 

Overview

Max Total Supply

888 NFT

Holders

766

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
impaper.eth
Balance
2 NFT
0x314EFdC75B58E1E09c187AC3cEe9E75A42d4590d
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
NFT

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// 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/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/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.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/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/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/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/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: contracts/NFT.sol



pragma solidity ^0.8.9;



contract NFT is ERC721, Ownable {
    using Strings for uint256;

    uint public constant MAX_TOKENS = 888;
    uint private constant TOKENS_RESERVED = 2;
    uint public price = 100000000000000000;
    uint256 public constant MAX_MINT_PER_TX = 50;

    bool public isSaleActive;
    uint256 public totalSupply;
    mapping(address => uint256) private mintedPerWallet;

    string public baseUri;
    string public baseExtesion = ".json";

    constructor() ERC721("Fumiko", "NFT") {
        baseUri = "ipfs://QmStrP353QfMTAC2yWJSpoqnqQ6Ad1zteUPxAEmbeLRuVW/";
        for(uint256 i = 1; i <= TOKENS_RESERVED; ++i) {
            _safeMint(msg.sender, i);
        }
        totalSupply = TOKENS_RESERVED;
    }

    // Public Functions
    function mint(uint256 _numTokens) external payable {
        require(isSaleActive, "The sale is paused.");
        require(_numTokens <= MAX_MINT_PER_TX, "You cannot mint that many in one transaction.");
        require(mintedPerWallet[msg.sender] + _numTokens <= MAX_MINT_PER_TX, "You cannot mint that many total.");
        uint256 curTotalSupply = totalSupply;
        require(curTotalSupply + _numTokens <= MAX_TOKENS, "Exceeds total supply.");
        require(_numTokens * price <= msg.value, "Insufficient funds.");

        for(uint256 i = 1; i <= _numTokens; ++i) {
            _safeMint(msg.sender, curTotalSupply + 1);
        }
        mintedPerWallet[msg.sender] += _numTokens;
        totalSupply += _numTokens;
    }

    // Owner-only functions
    function flipSaleState() external onlyOwner {
        isSaleActive = !isSaleActive;
    }

    function setBaseUri(string memory _baseUri) external onlyOwner {
        baseUri = _baseUri;
    }

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function withdrawAll() external payable onlyOwner {
        uint256 balance = address(this).balance;
        uint256 balanceOne = balance * 70 / 100;
        uint256 balanceTwo = balance * 30 / 100;
        ( bool transferOne, ) = payable(0x6Ee9f6A1c5CA4DB474b34E9e401D6b92a5Daa925).call{value: balanceOne}("");
        ( bool transferTwo, ) = payable(0x6Ee9f6A1c5CA4DB474b34E9e401D6b92a5Daa925).call{value: balanceTwo}("");
        require(transferOne && transferTwo, "Transfer failed.");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtesion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","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":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","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":"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":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

608060405267016345785d8a00006007556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005d92919062000752565b503480156200006b57600080fd5b506040518060400160405280600681526020017f46756d696b6f00000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4e465400000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f092919062000752565b5080600190805190602001906200010992919062000752565b5050506200012c62000120620001a360201b60201c565b620001ab60201b60201c565b604051806060016040528060368152602001620042d860369139600b90805190602001906200015d92919062000752565b506000600190505b6002811162000194576200018033826200027160201b60201c565b806200018c906200083b565b905062000165565b50600260098190555062000cba565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002938282604051806020016040528060008152506200029760201b60201c565b5050565b620002a983836200030560201b60201c565b620002be6000848484620004ff60201b60201c565b62000300576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f79062000910565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000378576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036f9062000982565b60405180910390fd5b6200038981620006b960201b60201c565b15620003cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c390620009f4565b60405180910390fd5b620003e0600083836200072560201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000432919062000a16565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620004fb600083836200072a60201b60201c565b5050565b60006200052d8473ffffffffffffffffffffffffffffffffffffffff166200072f60201b620013ae1760201c565b15620006ac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200055f620001a360201b60201c565b8786866040518563ffffffff1660e01b815260040162000583949392919062000b6d565b602060405180830381600087803b1580156200059e57600080fd5b505af1925050508015620005d257506040513d601f19601f82011682018060405250810190620005cf919062000c23565b60015b6200065b573d806000811462000605576040519150601f19603f3d011682016040523d82523d6000602084013e6200060a565b606091505b5060008151141562000653576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200064a9062000910565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620006b1565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054620007609062000c84565b90600052602060002090601f016020900481019282620007845760008555620007d0565b82601f106200079f57805160ff1916838001178555620007d0565b82800160010185558215620007d0579182015b82811115620007cf578251825591602001919060010190620007b2565b5b509050620007df9190620007e3565b5090565b5b80821115620007fe576000816000905550600101620007e4565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000620008488262000831565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200087e576200087d62000802565b5b600182019050919050565b600082825260208201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000620008f860328362000889565b915062000905826200089a565b604082019050919050565b600060208201905081810360008301526200092b81620008e9565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006200096a60208362000889565b9150620009778262000932565b602082019050919050565b600060208201905081810360008301526200099d816200095b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000620009dc601c8362000889565b9150620009e982620009a4565b602082019050919050565b6000602082019050818103600083015262000a0f81620009cd565b9050919050565b600062000a238262000831565b915062000a308362000831565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a685762000a6762000802565b5b828201905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000aa08262000a73565b9050919050565b62000ab28162000a93565b82525050565b62000ac38162000831565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000b0557808201518184015260208101905062000ae8565b8381111562000b15576000848401525b50505050565b6000601f19601f8301169050919050565b600062000b398262000ac9565b62000b45818562000ad4565b935062000b5781856020860162000ae5565b62000b628162000b1b565b840191505092915050565b600060808201905062000b84600083018762000aa7565b62000b93602083018662000aa7565b62000ba2604083018562000ab8565b818103606083015262000bb6818462000b2c565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000bfd8162000bc6565b811462000c0957600080fd5b50565b60008151905062000c1d8162000bf2565b92915050565b60006020828403121562000c3c5762000c3b62000bc1565b5b600062000c4c8482850162000c0c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c9d57607f821691505b6020821081141562000cb45762000cb362000c55565b5b50919050565b61360e8062000cca6000396000f3fe6080604052600436106101b75760003560e01c80638ecad721116100ec578063a22cb4651161008a578063d6960ffb11610064578063d6960ffb146105b8578063e985e9c5146105e3578063f2fde38b14610620578063f47c84c514610649576101b7565b8063a22cb46514610529578063b88d4fde14610552578063c87b56dd1461057b576101b7565b80639abc8320116100c65780639abc83201461048e578063a035b1fe146104b9578063a0712d68146104e4578063a0bcfc7f14610500576101b7565b80638ecad7211461040f57806391b7f5ed1461043a57806395d89b4114610463576101b7565b806342842e0e1161015957806370a082311161013357806370a0823114610386578063715018a6146103c3578063853828b6146103da5780638da5cb5b146103e4576101b7565b806342842e0e146102f5578063564566a81461031e5780636352211e14610349576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a57806323b872dd146102b557806334918dfd146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612237565b610674565b6040516101f0919061227f565b60405180910390f35b34801561020557600080fd5b5061020e610756565b60405161021b9190612333565b60405180910390f35b34801561023057600080fd5b5061024b6004803603810190610246919061238b565b6107e8565b60405161025891906123f9565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612440565b61082e565b005b34801561029657600080fd5b5061029f610946565b6040516102ac919061248f565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d791906124aa565b61094c565b005b3480156102ea57600080fd5b506102f36109ac565b005b34801561030157600080fd5b5061031c600480360381019061031791906124aa565b6109e0565b005b34801561032a57600080fd5b50610333610a00565b604051610340919061227f565b60405180910390f35b34801561035557600080fd5b50610370600480360381019061036b919061238b565b610a13565b60405161037d91906123f9565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a891906124fd565b610ac5565b6040516103ba919061248f565b60405180910390f35b3480156103cf57600080fd5b506103d8610b7d565b005b6103e2610b91565b005b3480156103f057600080fd5b506103f9610d28565b60405161040691906123f9565b60405180910390f35b34801561041b57600080fd5b50610424610d52565b604051610431919061248f565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c919061238b565b610d57565b005b34801561046f57600080fd5b50610478610d69565b6040516104859190612333565b60405180910390f35b34801561049a57600080fd5b506104a3610dfb565b6040516104b09190612333565b60405180910390f35b3480156104c557600080fd5b506104ce610e89565b6040516104db919061248f565b60405180910390f35b6104fe60048036038101906104f9919061238b565b610e8f565b005b34801561050c57600080fd5b506105276004803603810190610522919061265f565b611100565b005b34801561053557600080fd5b50610550600480360381019061054b91906126d4565b611122565b005b34801561055e57600080fd5b50610579600480360381019061057491906127b5565b611138565b005b34801561058757600080fd5b506105a2600480360381019061059d919061238b565b61119a565b6040516105af9190612333565b60405180910390f35b3480156105c457600080fd5b506105cd611202565b6040516105da9190612333565b60405180910390f35b3480156105ef57600080fd5b5061060a60048036038101906106059190612838565b611290565b604051610617919061227f565b60405180910390f35b34801561062c57600080fd5b50610647600480360381019061064291906124fd565b611324565b005b34801561065557600080fd5b5061065e6113a8565b60405161066b919061248f565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061074f575061074e826113d1565b5b9050919050565b606060008054610765906128a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610791906128a7565b80156107de5780601f106107b3576101008083540402835291602001916107de565b820191906000526020600020905b8154815290600101906020018083116107c157829003601f168201915b5050505050905090565b60006107f38261143b565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083982610a13565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a19061294b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108c9611486565b73ffffffffffffffffffffffffffffffffffffffff1614806108f857506108f7816108f2611486565b611290565b5b610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092e906129dd565b60405180910390fd5b610941838361148e565b505050565b60095481565b61095d610957611486565b82611547565b61099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390612a6f565b60405180910390fd5b6109a78383836115dc565b505050565b6109b4611843565b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b6109fb83838360405180602001604052806000815250611138565b505050565b600860009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab390612adb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90612b6d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b85611843565b610b8f60006118c1565b565b610b99611843565b600047905060006064604683610baf9190612bbc565b610bb99190612c45565b905060006064601e84610bcc9190612bbc565b610bd69190612c45565b90506000736ee9f6a1c5ca4db474b34e9e401d6b92a5daa92573ffffffffffffffffffffffffffffffffffffffff1683604051610c1290612ca7565b60006040518083038185875af1925050503d8060008114610c4f576040519150601f19603f3d011682016040523d82523d6000602084013e610c54565b606091505b505090506000736ee9f6a1c5ca4db474b34e9e401d6b92a5daa92573ffffffffffffffffffffffffffffffffffffffff1683604051610c9290612ca7565b60006040518083038185875af1925050503d8060008114610ccf576040519150601f19603f3d011682016040523d82523d6000602084013e610cd4565b606091505b50509050818015610ce25750805b610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1890612d08565b60405180910390fd5b5050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b603281565b610d5f611843565b8060078190555050565b606060018054610d78906128a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610da4906128a7565b8015610df15780601f10610dc657610100808354040283529160200191610df1565b820191906000526020600020905b815481529060010190602001808311610dd457829003601f168201915b5050505050905090565b600b8054610e08906128a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610e34906128a7565b8015610e815780601f10610e5657610100808354040283529160200191610e81565b820191906000526020600020905b815481529060010190602001808311610e6457829003601f168201915b505050505081565b60075481565b600860009054906101000a900460ff16610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590612d74565b60405180910390fd5b6032811115610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1990612e06565b60405180910390fd5b603281600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f6f9190612e26565b1115610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa790612ec8565b60405180910390fd5b600060095490506103788282610fc69190612e26565b1115611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe90612f34565b60405180910390fd5b34600754836110169190612bbc565b1115611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90612fa0565b60405180910390fd5b6000600190505b82811161108c5761107b336001846110769190612e26565b611987565b8061108590612fc0565b905061105e565b5081600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110dc9190612e26565b9250508190555081600960008282546110f59190612e26565b925050819055505050565b611108611843565b80600b908051906020019061111e929190612128565b5050565b61113461112d611486565b83836119a5565b5050565b611149611143611486565b83611547565b611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90612a6f565b60405180910390fd5b61119484848484611b12565b50505050565b60606111a58261143b565b60006111af611b6e565b905060008151116111cf57604051806020016040528060008152506111fa565b806111d984611b85565b6040516020016111ea929190613045565b6040516020818303038152906040525b915050919050565b600c805461120f906128a7565b80601f016020809104026020016040519081016040528092919081815260200182805461123b906128a7565b80156112885780601f1061125d57610100808354040283529160200191611288565b820191906000526020600020905b81548152906001019060200180831161126b57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61132c611843565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561139c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611393906130db565b60405180910390fd5b6113a5816118c1565b50565b61037881565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61144481611ce6565b611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a90612adb565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661150183610a13565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061155383610a13565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061159557506115948185611290565b5b806115d357508373ffffffffffffffffffffffffffffffffffffffff166115bb846107e8565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115fc82610a13565b73ffffffffffffffffffffffffffffffffffffffff1614611652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116499061316d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b9906131ff565b60405180910390fd5b6116cd838383611d52565b6116d860008261148e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611728919061321f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461177f9190612e26565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461183e838383611d57565b505050565b61184b611486565b73ffffffffffffffffffffffffffffffffffffffff16611869610d28565b73ffffffffffffffffffffffffffffffffffffffff16146118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b69061329f565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6119a1828260405180602001604052806000815250611d5c565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b9061330b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b05919061227f565b60405180910390a3505050565b611b1d8484846115dc565b611b2984848484611db7565b611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f9061339d565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000821415611bcd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ce1565b600082905060005b60008214611bff578080611be890612fc0565b915050600a82611bf89190612c45565b9150611bd5565b60008167ffffffffffffffff811115611c1b57611c1a612534565b5b6040519080825280601f01601f191660200182016040528015611c4d5781602001600182028036833780820191505090505b5090505b60008514611cda57600182611c66919061321f565b9150600a85611c7591906133bd565b6030611c819190612e26565b60f81b818381518110611c9757611c966133ee565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611cd39190612c45565b9450611c51565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b611d668383611f4e565b611d736000848484611db7565b611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da99061339d565b60405180910390fd5b505050565b6000611dd88473ffffffffffffffffffffffffffffffffffffffff166113ae565b15611f41578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e01611486565b8786866040518563ffffffff1660e01b8152600401611e239493929190613472565b602060405180830381600087803b158015611e3d57600080fd5b505af1925050508015611e6e57506040513d601f19601f82011682018060405250810190611e6b91906134d3565b60015b611ef1573d8060008114611e9e576040519150601f19603f3d011682016040523d82523d6000602084013e611ea3565b606091505b50600081511415611ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee09061339d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f46565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb59061354c565b60405180910390fd5b611fc781611ce6565b15612007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffe906135b8565b60405180910390fd5b61201360008383611d52565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120639190612e26565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461212460008383611d57565b5050565b828054612134906128a7565b90600052602060002090601f016020900481019282612156576000855561219d565b82601f1061216f57805160ff191683800117855561219d565b8280016001018555821561219d579182015b8281111561219c578251825591602001919060010190612181565b5b5090506121aa91906121ae565b5090565b5b808211156121c75760008160009055506001016121af565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612214816121df565b811461221f57600080fd5b50565b6000813590506122318161220b565b92915050565b60006020828403121561224d5761224c6121d5565b5b600061225b84828501612222565b91505092915050565b60008115159050919050565b61227981612264565b82525050565b60006020820190506122946000830184612270565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122d45780820151818401526020810190506122b9565b838111156122e3576000848401525b50505050565b6000601f19601f8301169050919050565b60006123058261229a565b61230f81856122a5565b935061231f8185602086016122b6565b612328816122e9565b840191505092915050565b6000602082019050818103600083015261234d81846122fa565b905092915050565b6000819050919050565b61236881612355565b811461237357600080fd5b50565b6000813590506123858161235f565b92915050565b6000602082840312156123a1576123a06121d5565b5b60006123af84828501612376565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123e3826123b8565b9050919050565b6123f3816123d8565b82525050565b600060208201905061240e60008301846123ea565b92915050565b61241d816123d8565b811461242857600080fd5b50565b60008135905061243a81612414565b92915050565b60008060408385031215612457576124566121d5565b5b60006124658582860161242b565b925050602061247685828601612376565b9150509250929050565b61248981612355565b82525050565b60006020820190506124a46000830184612480565b92915050565b6000806000606084860312156124c3576124c26121d5565b5b60006124d18682870161242b565b93505060206124e28682870161242b565b92505060406124f386828701612376565b9150509250925092565b600060208284031215612513576125126121d5565b5b60006125218482850161242b565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61256c826122e9565b810181811067ffffffffffffffff8211171561258b5761258a612534565b5b80604052505050565b600061259e6121cb565b90506125aa8282612563565b919050565b600067ffffffffffffffff8211156125ca576125c9612534565b5b6125d3826122e9565b9050602081019050919050565b82818337600083830152505050565b60006126026125fd846125af565b612594565b90508281526020810184848401111561261e5761261d61252f565b5b6126298482856125e0565b509392505050565b600082601f8301126126465761264561252a565b5b81356126568482602086016125ef565b91505092915050565b600060208284031215612675576126746121d5565b5b600082013567ffffffffffffffff811115612693576126926121da565b5b61269f84828501612631565b91505092915050565b6126b181612264565b81146126bc57600080fd5b50565b6000813590506126ce816126a8565b92915050565b600080604083850312156126eb576126ea6121d5565b5b60006126f98582860161242b565b925050602061270a858286016126bf565b9150509250929050565b600067ffffffffffffffff82111561272f5761272e612534565b5b612738826122e9565b9050602081019050919050565b600061275861275384612714565b612594565b9050828152602081018484840111156127745761277361252f565b5b61277f8482856125e0565b509392505050565b600082601f83011261279c5761279b61252a565b5b81356127ac848260208601612745565b91505092915050565b600080600080608085870312156127cf576127ce6121d5565b5b60006127dd8782880161242b565b94505060206127ee8782880161242b565b93505060406127ff87828801612376565b925050606085013567ffffffffffffffff8111156128205761281f6121da565b5b61282c87828801612787565b91505092959194509250565b6000806040838503121561284f5761284e6121d5565b5b600061285d8582860161242b565b925050602061286e8582860161242b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806128bf57607f821691505b602082108114156128d3576128d2612878565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006129356021836122a5565b9150612940826128d9565b604082019050919050565b6000602082019050818103600083015261296481612928565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b60006129c7603e836122a5565b91506129d28261296b565b604082019050919050565b600060208201905081810360008301526129f6816129ba565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612a59602e836122a5565b9150612a64826129fd565b604082019050919050565b60006020820190508181036000830152612a8881612a4c565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612ac56018836122a5565b9150612ad082612a8f565b602082019050919050565b60006020820190508181036000830152612af481612ab8565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612b576029836122a5565b9150612b6282612afb565b604082019050919050565b60006020820190508181036000830152612b8681612b4a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612bc782612355565b9150612bd283612355565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c0b57612c0a612b8d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c5082612355565b9150612c5b83612355565b925082612c6b57612c6a612c16565b5b828204905092915050565b600081905092915050565b50565b6000612c91600083612c76565b9150612c9c82612c81565b600082019050919050565b6000612cb282612c84565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000612cf26010836122a5565b9150612cfd82612cbc565b602082019050919050565b60006020820190508181036000830152612d2181612ce5565b9050919050565b7f5468652073616c65206973207061757365642e00000000000000000000000000600082015250565b6000612d5e6013836122a5565b9150612d6982612d28565b602082019050919050565b60006020820190508181036000830152612d8d81612d51565b9050919050565b7f596f752063616e6e6f74206d696e742074686174206d616e7920696e206f6e6560008201527f207472616e73616374696f6e2e00000000000000000000000000000000000000602082015250565b6000612df0602d836122a5565b9150612dfb82612d94565b604082019050919050565b60006020820190508181036000830152612e1f81612de3565b9050919050565b6000612e3182612355565b9150612e3c83612355565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e7157612e70612b8d565b5b828201905092915050565b7f596f752063616e6e6f74206d696e742074686174206d616e7920746f74616c2e600082015250565b6000612eb26020836122a5565b9150612ebd82612e7c565b602082019050919050565b60006020820190508181036000830152612ee181612ea5565b9050919050565b7f4578636565647320746f74616c20737570706c792e0000000000000000000000600082015250565b6000612f1e6015836122a5565b9150612f2982612ee8565b602082019050919050565b60006020820190508181036000830152612f4d81612f11565b9050919050565b7f496e73756666696369656e742066756e64732e00000000000000000000000000600082015250565b6000612f8a6013836122a5565b9150612f9582612f54565b602082019050919050565b60006020820190508181036000830152612fb981612f7d565b9050919050565b6000612fcb82612355565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ffe57612ffd612b8d565b5b600182019050919050565b600081905092915050565b600061301f8261229a565b6130298185613009565b93506130398185602086016122b6565b80840191505092915050565b60006130518285613014565b915061305d8284613014565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006130c56026836122a5565b91506130d082613069565b604082019050919050565b600060208201905081810360008301526130f4816130b8565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006131576025836122a5565b9150613162826130fb565b604082019050919050565b600060208201905081810360008301526131868161314a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131e96024836122a5565b91506131f48261318d565b604082019050919050565b60006020820190508181036000830152613218816131dc565b9050919050565b600061322a82612355565b915061323583612355565b92508282101561324857613247612b8d565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006132896020836122a5565b915061329482613253565b602082019050919050565b600060208201905081810360008301526132b88161327c565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006132f56019836122a5565b9150613300826132bf565b602082019050919050565b60006020820190508181036000830152613324816132e8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006133876032836122a5565b91506133928261332b565b604082019050919050565b600060208201905081810360008301526133b68161337a565b9050919050565b60006133c882612355565b91506133d383612355565b9250826133e3576133e2612c16565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006134448261341d565b61344e8185613428565b935061345e8185602086016122b6565b613467816122e9565b840191505092915050565b600060808201905061348760008301876123ea565b61349460208301866123ea565b6134a16040830185612480565b81810360608301526134b38184613439565b905095945050505050565b6000815190506134cd8161220b565b92915050565b6000602082840312156134e9576134e86121d5565b5b60006134f7848285016134be565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006135366020836122a5565b915061354182613500565b602082019050919050565b6000602082019050818103600083015261356581613529565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006135a2601c836122a5565b91506135ad8261356c565b602082019050919050565b600060208201905081810360008301526135d181613595565b905091905056fea264697066735822122015eebe91569ae0bb34e2d5a712947ecd533291179cfb4fdc4f321fee3cd7334964736f6c63430008090033697066733a2f2f516d5374725033353351664d5441433279574a53706f716e7151364164317a746555507841456d62654c527556572f

Deployed Bytecode

0x6080604052600436106101b75760003560e01c80638ecad721116100ec578063a22cb4651161008a578063d6960ffb11610064578063d6960ffb146105b8578063e985e9c5146105e3578063f2fde38b14610620578063f47c84c514610649576101b7565b8063a22cb46514610529578063b88d4fde14610552578063c87b56dd1461057b576101b7565b80639abc8320116100c65780639abc83201461048e578063a035b1fe146104b9578063a0712d68146104e4578063a0bcfc7f14610500576101b7565b80638ecad7211461040f57806391b7f5ed1461043a57806395d89b4114610463576101b7565b806342842e0e1161015957806370a082311161013357806370a0823114610386578063715018a6146103c3578063853828b6146103da5780638da5cb5b146103e4576101b7565b806342842e0e146102f5578063564566a81461031e5780636352211e14610349576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a57806323b872dd146102b557806334918dfd146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612237565b610674565b6040516101f0919061227f565b60405180910390f35b34801561020557600080fd5b5061020e610756565b60405161021b9190612333565b60405180910390f35b34801561023057600080fd5b5061024b6004803603810190610246919061238b565b6107e8565b60405161025891906123f9565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612440565b61082e565b005b34801561029657600080fd5b5061029f610946565b6040516102ac919061248f565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d791906124aa565b61094c565b005b3480156102ea57600080fd5b506102f36109ac565b005b34801561030157600080fd5b5061031c600480360381019061031791906124aa565b6109e0565b005b34801561032a57600080fd5b50610333610a00565b604051610340919061227f565b60405180910390f35b34801561035557600080fd5b50610370600480360381019061036b919061238b565b610a13565b60405161037d91906123f9565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a891906124fd565b610ac5565b6040516103ba919061248f565b60405180910390f35b3480156103cf57600080fd5b506103d8610b7d565b005b6103e2610b91565b005b3480156103f057600080fd5b506103f9610d28565b60405161040691906123f9565b60405180910390f35b34801561041b57600080fd5b50610424610d52565b604051610431919061248f565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c919061238b565b610d57565b005b34801561046f57600080fd5b50610478610d69565b6040516104859190612333565b60405180910390f35b34801561049a57600080fd5b506104a3610dfb565b6040516104b09190612333565b60405180910390f35b3480156104c557600080fd5b506104ce610e89565b6040516104db919061248f565b60405180910390f35b6104fe60048036038101906104f9919061238b565b610e8f565b005b34801561050c57600080fd5b506105276004803603810190610522919061265f565b611100565b005b34801561053557600080fd5b50610550600480360381019061054b91906126d4565b611122565b005b34801561055e57600080fd5b50610579600480360381019061057491906127b5565b611138565b005b34801561058757600080fd5b506105a2600480360381019061059d919061238b565b61119a565b6040516105af9190612333565b60405180910390f35b3480156105c457600080fd5b506105cd611202565b6040516105da9190612333565b60405180910390f35b3480156105ef57600080fd5b5061060a60048036038101906106059190612838565b611290565b604051610617919061227f565b60405180910390f35b34801561062c57600080fd5b50610647600480360381019061064291906124fd565b611324565b005b34801561065557600080fd5b5061065e6113a8565b60405161066b919061248f565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061074f575061074e826113d1565b5b9050919050565b606060008054610765906128a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610791906128a7565b80156107de5780601f106107b3576101008083540402835291602001916107de565b820191906000526020600020905b8154815290600101906020018083116107c157829003601f168201915b5050505050905090565b60006107f38261143b565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083982610a13565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a19061294b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108c9611486565b73ffffffffffffffffffffffffffffffffffffffff1614806108f857506108f7816108f2611486565b611290565b5b610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092e906129dd565b60405180910390fd5b610941838361148e565b505050565b60095481565b61095d610957611486565b82611547565b61099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390612a6f565b60405180910390fd5b6109a78383836115dc565b505050565b6109b4611843565b600860009054906101000a900460ff1615600860006101000a81548160ff021916908315150217905550565b6109fb83838360405180602001604052806000815250611138565b505050565b600860009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab390612adb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90612b6d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b85611843565b610b8f60006118c1565b565b610b99611843565b600047905060006064604683610baf9190612bbc565b610bb99190612c45565b905060006064601e84610bcc9190612bbc565b610bd69190612c45565b90506000736ee9f6a1c5ca4db474b34e9e401d6b92a5daa92573ffffffffffffffffffffffffffffffffffffffff1683604051610c1290612ca7565b60006040518083038185875af1925050503d8060008114610c4f576040519150601f19603f3d011682016040523d82523d6000602084013e610c54565b606091505b505090506000736ee9f6a1c5ca4db474b34e9e401d6b92a5daa92573ffffffffffffffffffffffffffffffffffffffff1683604051610c9290612ca7565b60006040518083038185875af1925050503d8060008114610ccf576040519150601f19603f3d011682016040523d82523d6000602084013e610cd4565b606091505b50509050818015610ce25750805b610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1890612d08565b60405180910390fd5b5050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b603281565b610d5f611843565b8060078190555050565b606060018054610d78906128a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610da4906128a7565b8015610df15780601f10610dc657610100808354040283529160200191610df1565b820191906000526020600020905b815481529060010190602001808311610dd457829003601f168201915b5050505050905090565b600b8054610e08906128a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610e34906128a7565b8015610e815780601f10610e5657610100808354040283529160200191610e81565b820191906000526020600020905b815481529060010190602001808311610e6457829003601f168201915b505050505081565b60075481565b600860009054906101000a900460ff16610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590612d74565b60405180910390fd5b6032811115610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1990612e06565b60405180910390fd5b603281600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f6f9190612e26565b1115610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa790612ec8565b60405180910390fd5b600060095490506103788282610fc69190612e26565b1115611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe90612f34565b60405180910390fd5b34600754836110169190612bbc565b1115611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90612fa0565b60405180910390fd5b6000600190505b82811161108c5761107b336001846110769190612e26565b611987565b8061108590612fc0565b905061105e565b5081600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110dc9190612e26565b9250508190555081600960008282546110f59190612e26565b925050819055505050565b611108611843565b80600b908051906020019061111e929190612128565b5050565b61113461112d611486565b83836119a5565b5050565b611149611143611486565b83611547565b611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90612a6f565b60405180910390fd5b61119484848484611b12565b50505050565b60606111a58261143b565b60006111af611b6e565b905060008151116111cf57604051806020016040528060008152506111fa565b806111d984611b85565b6040516020016111ea929190613045565b6040516020818303038152906040525b915050919050565b600c805461120f906128a7565b80601f016020809104026020016040519081016040528092919081815260200182805461123b906128a7565b80156112885780601f1061125d57610100808354040283529160200191611288565b820191906000526020600020905b81548152906001019060200180831161126b57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61132c611843565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561139c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611393906130db565b60405180910390fd5b6113a5816118c1565b50565b61037881565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61144481611ce6565b611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147a90612adb565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661150183610a13565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061155383610a13565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061159557506115948185611290565b5b806115d357508373ffffffffffffffffffffffffffffffffffffffff166115bb846107e8565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115fc82610a13565b73ffffffffffffffffffffffffffffffffffffffff1614611652576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116499061316d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b9906131ff565b60405180910390fd5b6116cd838383611d52565b6116d860008261148e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611728919061321f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461177f9190612e26565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461183e838383611d57565b505050565b61184b611486565b73ffffffffffffffffffffffffffffffffffffffff16611869610d28565b73ffffffffffffffffffffffffffffffffffffffff16146118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b69061329f565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6119a1828260405180602001604052806000815250611d5c565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b9061330b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b05919061227f565b60405180910390a3505050565b611b1d8484846115dc565b611b2984848484611db7565b611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f9061339d565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000821415611bcd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ce1565b600082905060005b60008214611bff578080611be890612fc0565b915050600a82611bf89190612c45565b9150611bd5565b60008167ffffffffffffffff811115611c1b57611c1a612534565b5b6040519080825280601f01601f191660200182016040528015611c4d5781602001600182028036833780820191505090505b5090505b60008514611cda57600182611c66919061321f565b9150600a85611c7591906133bd565b6030611c819190612e26565b60f81b818381518110611c9757611c966133ee565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611cd39190612c45565b9450611c51565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b611d668383611f4e565b611d736000848484611db7565b611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da99061339d565b60405180910390fd5b505050565b6000611dd88473ffffffffffffffffffffffffffffffffffffffff166113ae565b15611f41578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e01611486565b8786866040518563ffffffff1660e01b8152600401611e239493929190613472565b602060405180830381600087803b158015611e3d57600080fd5b505af1925050508015611e6e57506040513d601f19601f82011682018060405250810190611e6b91906134d3565b60015b611ef1573d8060008114611e9e576040519150601f19603f3d011682016040523d82523d6000602084013e611ea3565b606091505b50600081511415611ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee09061339d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f46565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb59061354c565b60405180910390fd5b611fc781611ce6565b15612007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffe906135b8565b60405180910390fd5b61201360008383611d52565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120639190612e26565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461212460008383611d57565b5050565b828054612134906128a7565b90600052602060002090601f016020900481019282612156576000855561219d565b82601f1061216f57805160ff191683800117855561219d565b8280016001018555821561219d579182015b8281111561219c578251825591602001919060010190612181565b5b5090506121aa91906121ae565b5090565b5b808211156121c75760008160009055506001016121af565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612214816121df565b811461221f57600080fd5b50565b6000813590506122318161220b565b92915050565b60006020828403121561224d5761224c6121d5565b5b600061225b84828501612222565b91505092915050565b60008115159050919050565b61227981612264565b82525050565b60006020820190506122946000830184612270565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122d45780820151818401526020810190506122b9565b838111156122e3576000848401525b50505050565b6000601f19601f8301169050919050565b60006123058261229a565b61230f81856122a5565b935061231f8185602086016122b6565b612328816122e9565b840191505092915050565b6000602082019050818103600083015261234d81846122fa565b905092915050565b6000819050919050565b61236881612355565b811461237357600080fd5b50565b6000813590506123858161235f565b92915050565b6000602082840312156123a1576123a06121d5565b5b60006123af84828501612376565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123e3826123b8565b9050919050565b6123f3816123d8565b82525050565b600060208201905061240e60008301846123ea565b92915050565b61241d816123d8565b811461242857600080fd5b50565b60008135905061243a81612414565b92915050565b60008060408385031215612457576124566121d5565b5b60006124658582860161242b565b925050602061247685828601612376565b9150509250929050565b61248981612355565b82525050565b60006020820190506124a46000830184612480565b92915050565b6000806000606084860312156124c3576124c26121d5565b5b60006124d18682870161242b565b93505060206124e28682870161242b565b92505060406124f386828701612376565b9150509250925092565b600060208284031215612513576125126121d5565b5b60006125218482850161242b565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61256c826122e9565b810181811067ffffffffffffffff8211171561258b5761258a612534565b5b80604052505050565b600061259e6121cb565b90506125aa8282612563565b919050565b600067ffffffffffffffff8211156125ca576125c9612534565b5b6125d3826122e9565b9050602081019050919050565b82818337600083830152505050565b60006126026125fd846125af565b612594565b90508281526020810184848401111561261e5761261d61252f565b5b6126298482856125e0565b509392505050565b600082601f8301126126465761264561252a565b5b81356126568482602086016125ef565b91505092915050565b600060208284031215612675576126746121d5565b5b600082013567ffffffffffffffff811115612693576126926121da565b5b61269f84828501612631565b91505092915050565b6126b181612264565b81146126bc57600080fd5b50565b6000813590506126ce816126a8565b92915050565b600080604083850312156126eb576126ea6121d5565b5b60006126f98582860161242b565b925050602061270a858286016126bf565b9150509250929050565b600067ffffffffffffffff82111561272f5761272e612534565b5b612738826122e9565b9050602081019050919050565b600061275861275384612714565b612594565b9050828152602081018484840111156127745761277361252f565b5b61277f8482856125e0565b509392505050565b600082601f83011261279c5761279b61252a565b5b81356127ac848260208601612745565b91505092915050565b600080600080608085870312156127cf576127ce6121d5565b5b60006127dd8782880161242b565b94505060206127ee8782880161242b565b93505060406127ff87828801612376565b925050606085013567ffffffffffffffff8111156128205761281f6121da565b5b61282c87828801612787565b91505092959194509250565b6000806040838503121561284f5761284e6121d5565b5b600061285d8582860161242b565b925050602061286e8582860161242b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806128bf57607f821691505b602082108114156128d3576128d2612878565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006129356021836122a5565b9150612940826128d9565b604082019050919050565b6000602082019050818103600083015261296481612928565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b60006129c7603e836122a5565b91506129d28261296b565b604082019050919050565b600060208201905081810360008301526129f6816129ba565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612a59602e836122a5565b9150612a64826129fd565b604082019050919050565b60006020820190508181036000830152612a8881612a4c565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612ac56018836122a5565b9150612ad082612a8f565b602082019050919050565b60006020820190508181036000830152612af481612ab8565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612b576029836122a5565b9150612b6282612afb565b604082019050919050565b60006020820190508181036000830152612b8681612b4a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612bc782612355565b9150612bd283612355565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c0b57612c0a612b8d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c5082612355565b9150612c5b83612355565b925082612c6b57612c6a612c16565b5b828204905092915050565b600081905092915050565b50565b6000612c91600083612c76565b9150612c9c82612c81565b600082019050919050565b6000612cb282612c84565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000612cf26010836122a5565b9150612cfd82612cbc565b602082019050919050565b60006020820190508181036000830152612d2181612ce5565b9050919050565b7f5468652073616c65206973207061757365642e00000000000000000000000000600082015250565b6000612d5e6013836122a5565b9150612d6982612d28565b602082019050919050565b60006020820190508181036000830152612d8d81612d51565b9050919050565b7f596f752063616e6e6f74206d696e742074686174206d616e7920696e206f6e6560008201527f207472616e73616374696f6e2e00000000000000000000000000000000000000602082015250565b6000612df0602d836122a5565b9150612dfb82612d94565b604082019050919050565b60006020820190508181036000830152612e1f81612de3565b9050919050565b6000612e3182612355565b9150612e3c83612355565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e7157612e70612b8d565b5b828201905092915050565b7f596f752063616e6e6f74206d696e742074686174206d616e7920746f74616c2e600082015250565b6000612eb26020836122a5565b9150612ebd82612e7c565b602082019050919050565b60006020820190508181036000830152612ee181612ea5565b9050919050565b7f4578636565647320746f74616c20737570706c792e0000000000000000000000600082015250565b6000612f1e6015836122a5565b9150612f2982612ee8565b602082019050919050565b60006020820190508181036000830152612f4d81612f11565b9050919050565b7f496e73756666696369656e742066756e64732e00000000000000000000000000600082015250565b6000612f8a6013836122a5565b9150612f9582612f54565b602082019050919050565b60006020820190508181036000830152612fb981612f7d565b9050919050565b6000612fcb82612355565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ffe57612ffd612b8d565b5b600182019050919050565b600081905092915050565b600061301f8261229a565b6130298185613009565b93506130398185602086016122b6565b80840191505092915050565b60006130518285613014565b915061305d8284613014565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006130c56026836122a5565b91506130d082613069565b604082019050919050565b600060208201905081810360008301526130f4816130b8565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006131576025836122a5565b9150613162826130fb565b604082019050919050565b600060208201905081810360008301526131868161314a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131e96024836122a5565b91506131f48261318d565b604082019050919050565b60006020820190508181036000830152613218816131dc565b9050919050565b600061322a82612355565b915061323583612355565b92508282101561324857613247612b8d565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006132896020836122a5565b915061329482613253565b602082019050919050565b600060208201905081810360008301526132b88161327c565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006132f56019836122a5565b9150613300826132bf565b602082019050919050565b60006020820190508181036000830152613324816132e8565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006133876032836122a5565b91506133928261332b565b604082019050919050565b600060208201905081810360008301526133b68161337a565b9050919050565b60006133c882612355565b91506133d383612355565b9250826133e3576133e2612c16565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006134448261341d565b61344e8185613428565b935061345e8185602086016122b6565b613467816122e9565b840191505092915050565b600060808201905061348760008301876123ea565b61349460208301866123ea565b6134a16040830185612480565b81810360608301526134b38184613439565b905095945050505050565b6000815190506134cd8161220b565b92915050565b6000602082840312156134e9576134e86121d5565b5b60006134f7848285016134be565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006135366020836122a5565b915061354182613500565b602082019050919050565b6000602082019050818103600083015261356581613529565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006135a2601c836122a5565b91506135ad8261356c565b602082019050919050565b600060208201905081810360008301526135d181613595565b905091905056fea264697066735822122015eebe91569ae0bb34e2d5a712947ecd533291179cfb4fdc4f321fee3cd7334964736f6c63430008090033

Deployed Bytecode Sourcemap

37984:2349:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22037:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22964:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24477:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23994:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38278:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25177:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39527:91;;;;;;;;;;;;;:::i;:::-;;25584:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38247:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22675:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22406:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37102:103;;;;;;;;;;;;;:::i;:::-;;39828:502;;;:::i;:::-;;36454:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38194:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39734:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23133:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38371:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38149:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38747:743;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39626:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24720:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25840:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23308:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38399:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24946:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37360:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38057:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22037:305;22139:4;22191:25;22176:40;;;:11;:40;;;;:105;;;;22248:33;22233:48;;;:11;:48;;;;22176:105;:158;;;;22298:36;22322:11;22298:23;:36::i;:::-;22176:158;22156:178;;22037:305;;;:::o;22964:100::-;23018:13;23051:5;23044:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22964:100;:::o;24477:171::-;24553:7;24573:23;24588:7;24573:14;:23::i;:::-;24616:15;:24;24632:7;24616:24;;;;;;;;;;;;;;;;;;;;;24609:31;;24477:171;;;:::o;23994:417::-;24075:13;24091:23;24106:7;24091:14;:23::i;:::-;24075:39;;24139:5;24133:11;;:2;:11;;;;24125:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24233:5;24217:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24242:37;24259:5;24266:12;:10;:12::i;:::-;24242:16;:37::i;:::-;24217:62;24195:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;24382:21;24391:2;24395:7;24382:8;:21::i;:::-;24064:347;23994:417;;:::o;38278:26::-;;;;:::o;25177:336::-;25372:41;25391:12;:10;:12::i;:::-;25405:7;25372:18;:41::i;:::-;25364:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25477:28;25487:4;25493:2;25497:7;25477:9;:28::i;:::-;25177:336;;;:::o;39527:91::-;36340:13;:11;:13::i;:::-;39598:12:::1;;;;;;;;;;;39597:13;39582:12;;:28;;;;;;;;;;;;;;;;;;39527:91::o:0;25584:185::-;25722:39;25739:4;25745:2;25749:7;25722:39;;;;;;;;;;;;:16;:39::i;:::-;25584:185;;;:::o;38247:24::-;;;;;;;;;;;;;:::o;22675:222::-;22747:7;22767:13;22783:7;:16;22791:7;22783:16;;;;;;;;;;;;;;;;;;;;;22767:32;;22835:1;22818:19;;:5;:19;;;;22810:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;22884:5;22877:12;;;22675:222;;;:::o;22406:207::-;22478:7;22523:1;22506:19;;:5;:19;;;;22498:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22589:9;:16;22599:5;22589:16;;;;;;;;;;;;;;;;22582:23;;22406:207;;;:::o;37102:103::-;36340:13;:11;:13::i;:::-;37167:30:::1;37194:1;37167:18;:30::i;:::-;37102:103::o:0;39828:502::-;36340:13;:11;:13::i;:::-;39889:15:::1;39907:21;39889:39;;39939:18;39975:3;39970:2;39960:7;:12;;;;:::i;:::-;:18;;;;:::i;:::-;39939:39;;39989:18;40025:3;40020:2;40010:7;:12;;;;:::i;:::-;:18;;;;:::i;:::-;39989:39;;40041:16;40071:42;40063:56;;40127:10;40063:79;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40039:103;;;40155:16;40185:42;40177:56;;40241:10;40177:79;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40153:103;;;40275:11;:26;;;;;40290:11;40275:26;40267:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39878:452;;;;;39828:502::o:0;36454:87::-;36500:7;36527:6;;;;;;;;;;;36520:13;;36454:87;:::o;38194:44::-;38236:2;38194:44;:::o;39734:86::-;36340:13;:11;:13::i;:::-;39806:6:::1;39798:5;:14;;;;39734:86:::0;:::o;23133:104::-;23189:13;23222:7;23215:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23133:104;:::o;38371:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38149:38::-;;;;:::o;38747:743::-;38817:12;;;;;;;;;;;38809:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;38236:2;38872:10;:29;;38864:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38236:2;39000:10;38970:15;:27;38986:10;38970:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:59;;38962:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;39077:22;39102:11;;39077:36;;38091:3;39149:10;39132:14;:27;;;;:::i;:::-;:41;;39124:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;39240:9;39231:5;;39218:10;:18;;;;:::i;:::-;:31;;39210:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;39290:9;39302:1;39290:13;;39286:109;39310:10;39305:1;:15;39286:109;;39342:41;39352:10;39381:1;39364:14;:18;;;;:::i;:::-;39342:9;:41::i;:::-;39322:3;;;;:::i;:::-;;;39286:109;;;;39436:10;39405:15;:27;39421:10;39405:27;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;39472:10;39457:11;;:25;;;;;;;:::i;:::-;;;;;;;;38798:692;38747:743;:::o;39626:100::-;36340:13;:11;:13::i;:::-;39710:8:::1;39700:7;:18;;;;;;;;;;;;:::i;:::-;;39626:100:::0;:::o;24720:155::-;24815:52;24834:12;:10;:12::i;:::-;24848:8;24858;24815:18;:52::i;:::-;24720:155;;:::o;25840:323::-;26014:41;26033:12;:10;:12::i;:::-;26047:7;26014:18;:41::i;:::-;26006:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;26117:38;26131:4;26137:2;26141:7;26150:4;26117:13;:38::i;:::-;25840:323;;;;:::o;23308:281::-;23381:13;23407:23;23422:7;23407:14;:23::i;:::-;23443:21;23467:10;:8;:10::i;:::-;23443:34;;23519:1;23501:7;23495:21;:25;:86;;;;;;;;;;;;;;;;;23547:7;23556:18;:7;:16;:18::i;:::-;23530:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23495:86;23488:93;;;23308:281;;;:::o;38399:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24946:164::-;25043:4;25067:18;:25;25086:5;25067:25;;;;;;;;;;;;;;;:35;25093:8;25067:35;;;;;;;;;;;;;;;;;;;;;;;;;25060:42;;24946:164;;;;:::o;37360:201::-;36340:13;:11;:13::i;:::-;37469:1:::1;37449:22;;:8;:22;;;;37441:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37525:28;37544:8;37525:18;:28::i;:::-;37360:201:::0;:::o;38057:37::-;38091:3;38057:37;:::o;3730:326::-;3790:4;4047:1;4025:7;:19;;;:23;4018:30;;3730:326;;;:::o;13886:157::-;13971:4;14010:25;13995:40;;;:11;:40;;;;13988:47;;13886:157;;;:::o;32452:135::-;32534:16;32542:7;32534;:16::i;:::-;32526:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32452:135;:::o;20416:98::-;20469:7;20496:10;20489:17;;20416:98;:::o;31731:174::-;31833:2;31806:15;:24;31822:7;31806:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31889:7;31885:2;31851:46;;31860:23;31875:7;31860:14;:23::i;:::-;31851:46;;;;;;;;;;;;31731:174;;:::o;27964:264::-;28057:4;28074:13;28090:23;28105:7;28090:14;:23::i;:::-;28074:39;;28143:5;28132:16;;:7;:16;;;:52;;;;28152:32;28169:5;28176:7;28152:16;:32::i;:::-;28132:52;:87;;;;28212:7;28188:31;;:20;28200:7;28188:11;:20::i;:::-;:31;;;28132:87;28124:96;;;27964:264;;;;:::o;30987:625::-;31146:4;31119:31;;:23;31134:7;31119:14;:23::i;:::-;:31;;;31111:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31225:1;31211:16;;:2;:16;;;;31203:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31281:39;31302:4;31308:2;31312:7;31281:20;:39::i;:::-;31385:29;31402:1;31406:7;31385:8;:29::i;:::-;31446:1;31427:9;:15;31437:4;31427:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31475:1;31458:9;:13;31468:2;31458:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31506:2;31487:7;:16;31495:7;31487:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31545:7;31541:2;31526:27;;31535:4;31526:27;;;;;;;;;;;;31566:38;31586:4;31592:2;31596:7;31566:19;:38::i;:::-;30987:625;;;:::o;36619:132::-;36694:12;:10;:12::i;:::-;36683:23;;:7;:5;:7::i;:::-;:23;;;36675:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36619:132::o;37721:191::-;37795:16;37814:6;;;;;;;;;;;37795:25;;37840:8;37831:6;;:17;;;;;;;;;;;;;;;;;;37895:8;37864:40;;37885:8;37864:40;;;;;;;;;;;;37784:128;37721:191;:::o;28570:110::-;28646:26;28656:2;28660:7;28646:26;;;;;;;;;;;;:9;:26::i;:::-;28570:110;;:::o;32048:315::-;32203:8;32194:17;;:5;:17;;;;32186:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32290:8;32252:18;:25;32271:5;32252:25;;;;;;;;;;;;;;;:35;32278:8;32252:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32336:8;32314:41;;32329:5;32314:41;;;32346:8;32314:41;;;;;;:::i;:::-;;;;;;;;32048:315;;;:::o;27044:313::-;27200:28;27210:4;27216:2;27220:7;27200:9;:28::i;:::-;27247:47;27270:4;27276:2;27280:7;27289:4;27247:22;:47::i;:::-;27239:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27044:313;;;;:::o;23838:94::-;23889:13;23915:9;;;;;;;;;;;;;;23838:94;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;27670:127::-;27735:4;27787:1;27759:30;;:7;:16;27767:7;27759:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27752:37;;27670:127;;;:::o;34576:126::-;;;;:::o;35087:125::-;;;;:::o;28907:319::-;29036:18;29042:2;29046:7;29036:5;:18::i;:::-;29087:53;29118:1;29122:2;29126:7;29135:4;29087:22;:53::i;:::-;29065:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;28907:319;;;:::o;33151:853::-;33305:4;33326:15;:2;:13;;;:15::i;:::-;33322:675;;;33378:2;33362:36;;;33399:12;:10;:12::i;:::-;33413:4;33419:7;33428:4;33362:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33358:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33620:1;33603:6;:13;:18;33599:328;;;33646:60;;;;;;;;;;:::i;:::-;;;;;;;;33599:328;33877:6;33871:13;33862:6;33858:2;33854:15;33847:38;33358:584;33494:41;;;33484:51;;;:6;:51;;;;33477:58;;;;;33322:675;33981:4;33974:11;;33151:853;;;;;;;:::o;29562:439::-;29656:1;29642:16;;:2;:16;;;;29634:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29715:16;29723:7;29715;:16::i;:::-;29714:17;29706:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29777:45;29806:1;29810:2;29814:7;29777:20;:45::i;:::-;29852:1;29835:9;:13;29845:2;29835:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29883:2;29864:7;:16;29872:7;29864:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29928:7;29924:2;29903:33;;29920:1;29903:33;;;;;;;;;;;;29949:44;29977:1;29981:2;29985:7;29949:19;:44::i;:::-;29562:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:474::-;11709:6;11717;11766:2;11754:9;11745:7;11741:23;11737:32;11734:119;;;11772:79;;:::i;:::-;11734:119;11892:1;11917:53;11962:7;11953:6;11942:9;11938:22;11917:53;:::i;:::-;11907:63;;11863:117;12019:2;12045:53;12090:7;12081:6;12070:9;12066:22;12045:53;:::i;:::-;12035:63;;11990:118;11641:474;;;;;:::o;12121:180::-;12169:77;12166:1;12159:88;12266:4;12263:1;12256:15;12290:4;12287:1;12280:15;12307:320;12351:6;12388:1;12382:4;12378:12;12368:22;;12435:1;12429:4;12425:12;12456:18;12446:81;;12512:4;12504:6;12500:17;12490:27;;12446:81;12574:2;12566:6;12563:14;12543:18;12540:38;12537:84;;;12593:18;;:::i;:::-;12537:84;12358:269;12307:320;;;:::o;12633:220::-;12773:34;12769:1;12761:6;12757:14;12750:58;12842:3;12837:2;12829:6;12825:15;12818:28;12633:220;:::o;12859:366::-;13001:3;13022:67;13086:2;13081:3;13022:67;:::i;:::-;13015:74;;13098:93;13187:3;13098:93;:::i;:::-;13216:2;13211:3;13207:12;13200:19;;12859:366;;;:::o;13231:419::-;13397:4;13435:2;13424:9;13420:18;13412:26;;13484:9;13478:4;13474:20;13470:1;13459:9;13455:17;13448:47;13512:131;13638:4;13512:131;:::i;:::-;13504:139;;13231:419;;;:::o;13656:249::-;13796:34;13792:1;13784:6;13780:14;13773:58;13865:32;13860:2;13852:6;13848:15;13841:57;13656:249;:::o;13911:366::-;14053:3;14074:67;14138:2;14133:3;14074:67;:::i;:::-;14067:74;;14150:93;14239:3;14150:93;:::i;:::-;14268:2;14263:3;14259:12;14252:19;;13911:366;;;:::o;14283:419::-;14449:4;14487:2;14476:9;14472:18;14464:26;;14536:9;14530:4;14526:20;14522:1;14511:9;14507:17;14500:47;14564:131;14690:4;14564:131;:::i;:::-;14556:139;;14283:419;;;:::o;14708:233::-;14848:34;14844:1;14836:6;14832:14;14825:58;14917:16;14912:2;14904:6;14900:15;14893:41;14708:233;:::o;14947:366::-;15089:3;15110:67;15174:2;15169:3;15110:67;:::i;:::-;15103:74;;15186:93;15275:3;15186:93;:::i;:::-;15304:2;15299:3;15295:12;15288:19;;14947:366;;;:::o;15319:419::-;15485:4;15523:2;15512:9;15508:18;15500:26;;15572:9;15566:4;15562:20;15558:1;15547:9;15543:17;15536:47;15600:131;15726:4;15600:131;:::i;:::-;15592:139;;15319:419;;;:::o;15744:174::-;15884:26;15880:1;15872:6;15868:14;15861:50;15744:174;:::o;15924:366::-;16066:3;16087:67;16151:2;16146:3;16087:67;:::i;:::-;16080:74;;16163:93;16252:3;16163:93;:::i;:::-;16281:2;16276:3;16272:12;16265:19;;15924:366;;;:::o;16296:419::-;16462:4;16500:2;16489:9;16485:18;16477:26;;16549:9;16543:4;16539:20;16535:1;16524:9;16520:17;16513:47;16577:131;16703:4;16577:131;:::i;:::-;16569:139;;16296:419;;;:::o;16721:228::-;16861:34;16857:1;16849:6;16845:14;16838:58;16930:11;16925:2;16917:6;16913:15;16906:36;16721:228;:::o;16955:366::-;17097:3;17118:67;17182:2;17177:3;17118:67;:::i;:::-;17111:74;;17194:93;17283:3;17194:93;:::i;:::-;17312:2;17307:3;17303:12;17296:19;;16955:366;;;:::o;17327:419::-;17493:4;17531:2;17520:9;17516:18;17508:26;;17580:9;17574:4;17570:20;17566:1;17555:9;17551:17;17544:47;17608:131;17734:4;17608:131;:::i;:::-;17600:139;;17327:419;;;:::o;17752:180::-;17800:77;17797:1;17790:88;17897:4;17894:1;17887:15;17921:4;17918:1;17911:15;17938:348;17978:7;18001:20;18019:1;18001:20;:::i;:::-;17996:25;;18035:20;18053:1;18035:20;:::i;:::-;18030:25;;18223:1;18155:66;18151:74;18148:1;18145:81;18140:1;18133:9;18126:17;18122:105;18119:131;;;18230:18;;:::i;:::-;18119:131;18278:1;18275;18271:9;18260:20;;17938:348;;;;:::o;18292:180::-;18340:77;18337:1;18330:88;18437:4;18434:1;18427:15;18461:4;18458:1;18451:15;18478:185;18518:1;18535:20;18553:1;18535:20;:::i;:::-;18530:25;;18569:20;18587:1;18569:20;:::i;:::-;18564:25;;18608:1;18598:35;;18613:18;;:::i;:::-;18598:35;18655:1;18652;18648:9;18643:14;;18478:185;;;;:::o;18669:147::-;18770:11;18807:3;18792:18;;18669:147;;;;:::o;18822:114::-;;:::o;18942:398::-;19101:3;19122:83;19203:1;19198:3;19122:83;:::i;:::-;19115:90;;19214:93;19303:3;19214:93;:::i;:::-;19332:1;19327:3;19323:11;19316:18;;18942:398;;;:::o;19346:379::-;19530:3;19552:147;19695:3;19552:147;:::i;:::-;19545:154;;19716:3;19709:10;;19346:379;;;:::o;19731:166::-;19871:18;19867:1;19859:6;19855:14;19848:42;19731:166;:::o;19903:366::-;20045:3;20066:67;20130:2;20125:3;20066:67;:::i;:::-;20059:74;;20142:93;20231:3;20142:93;:::i;:::-;20260:2;20255:3;20251:12;20244:19;;19903:366;;;:::o;20275:419::-;20441:4;20479:2;20468:9;20464:18;20456:26;;20528:9;20522:4;20518:20;20514:1;20503:9;20499:17;20492:47;20556:131;20682:4;20556:131;:::i;:::-;20548:139;;20275:419;;;:::o;20700:169::-;20840:21;20836:1;20828:6;20824:14;20817:45;20700:169;:::o;20875:366::-;21017:3;21038:67;21102:2;21097:3;21038:67;:::i;:::-;21031:74;;21114:93;21203:3;21114:93;:::i;:::-;21232:2;21227:3;21223:12;21216:19;;20875:366;;;:::o;21247:419::-;21413:4;21451:2;21440:9;21436:18;21428:26;;21500:9;21494:4;21490:20;21486:1;21475:9;21471:17;21464:47;21528:131;21654:4;21528:131;:::i;:::-;21520:139;;21247:419;;;:::o;21672:232::-;21812:34;21808:1;21800:6;21796:14;21789:58;21881:15;21876:2;21868:6;21864:15;21857:40;21672:232;:::o;21910:366::-;22052:3;22073:67;22137:2;22132:3;22073:67;:::i;:::-;22066:74;;22149:93;22238:3;22149:93;:::i;:::-;22267:2;22262:3;22258:12;22251:19;;21910:366;;;:::o;22282:419::-;22448:4;22486:2;22475:9;22471:18;22463:26;;22535:9;22529:4;22525:20;22521:1;22510:9;22506:17;22499:47;22563:131;22689:4;22563:131;:::i;:::-;22555:139;;22282:419;;;:::o;22707:305::-;22747:3;22766:20;22784:1;22766:20;:::i;:::-;22761:25;;22800:20;22818:1;22800:20;:::i;:::-;22795:25;;22954:1;22886:66;22882:74;22879:1;22876:81;22873:107;;;22960:18;;:::i;:::-;22873:107;23004:1;23001;22997:9;22990:16;;22707:305;;;;:::o;23018:182::-;23158:34;23154:1;23146:6;23142:14;23135:58;23018:182;:::o;23206:366::-;23348:3;23369:67;23433:2;23428:3;23369:67;:::i;:::-;23362:74;;23445:93;23534:3;23445:93;:::i;:::-;23563:2;23558:3;23554:12;23547:19;;23206:366;;;:::o;23578:419::-;23744:4;23782:2;23771:9;23767:18;23759:26;;23831:9;23825:4;23821:20;23817:1;23806:9;23802:17;23795:47;23859:131;23985:4;23859:131;:::i;:::-;23851:139;;23578:419;;;:::o;24003:171::-;24143:23;24139:1;24131:6;24127:14;24120:47;24003:171;:::o;24180:366::-;24322:3;24343:67;24407:2;24402:3;24343:67;:::i;:::-;24336:74;;24419:93;24508:3;24419:93;:::i;:::-;24537:2;24532:3;24528:12;24521:19;;24180:366;;;:::o;24552:419::-;24718:4;24756:2;24745:9;24741:18;24733:26;;24805:9;24799:4;24795:20;24791:1;24780:9;24776:17;24769:47;24833:131;24959:4;24833:131;:::i;:::-;24825:139;;24552:419;;;:::o;24977:169::-;25117:21;25113:1;25105:6;25101:14;25094:45;24977:169;:::o;25152:366::-;25294:3;25315:67;25379:2;25374:3;25315:67;:::i;:::-;25308:74;;25391:93;25480:3;25391:93;:::i;:::-;25509:2;25504:3;25500:12;25493:19;;25152:366;;;:::o;25524:419::-;25690:4;25728:2;25717:9;25713:18;25705:26;;25777:9;25771:4;25767:20;25763:1;25752:9;25748:17;25741:47;25805:131;25931:4;25805:131;:::i;:::-;25797:139;;25524:419;;;:::o;25949:233::-;25988:3;26011:24;26029:5;26011:24;:::i;:::-;26002:33;;26057:66;26050:5;26047:77;26044:103;;;26127:18;;:::i;:::-;26044:103;26174:1;26167:5;26163:13;26156:20;;25949:233;;;:::o;26188:148::-;26290:11;26327:3;26312:18;;26188:148;;;;:::o;26342:377::-;26448:3;26476:39;26509:5;26476:39;:::i;:::-;26531:89;26613:6;26608:3;26531:89;:::i;:::-;26524:96;;26629:52;26674:6;26669:3;26662:4;26655:5;26651:16;26629:52;:::i;:::-;26706:6;26701:3;26697:16;26690:23;;26452:267;26342:377;;;;:::o;26725:435::-;26905:3;26927:95;27018:3;27009:6;26927:95;:::i;:::-;26920:102;;27039:95;27130:3;27121:6;27039:95;:::i;:::-;27032:102;;27151:3;27144:10;;26725:435;;;;;:::o;27166:225::-;27306:34;27302:1;27294:6;27290:14;27283:58;27375:8;27370:2;27362:6;27358:15;27351:33;27166:225;:::o;27397:366::-;27539:3;27560:67;27624:2;27619:3;27560:67;:::i;:::-;27553:74;;27636:93;27725:3;27636:93;:::i;:::-;27754:2;27749:3;27745:12;27738:19;;27397:366;;;:::o;27769:419::-;27935:4;27973:2;27962:9;27958:18;27950:26;;28022:9;28016:4;28012:20;28008:1;27997:9;27993:17;27986:47;28050:131;28176:4;28050:131;:::i;:::-;28042:139;;27769:419;;;:::o;28194:224::-;28334:34;28330:1;28322:6;28318:14;28311:58;28403:7;28398:2;28390:6;28386:15;28379:32;28194:224;:::o;28424:366::-;28566:3;28587:67;28651:2;28646:3;28587:67;:::i;:::-;28580:74;;28663:93;28752:3;28663:93;:::i;:::-;28781:2;28776:3;28772:12;28765:19;;28424:366;;;:::o;28796:419::-;28962:4;29000:2;28989:9;28985:18;28977:26;;29049:9;29043:4;29039:20;29035:1;29024:9;29020:17;29013:47;29077:131;29203:4;29077:131;:::i;:::-;29069:139;;28796:419;;;:::o;29221:223::-;29361:34;29357:1;29349:6;29345:14;29338:58;29430:6;29425:2;29417:6;29413:15;29406:31;29221:223;:::o;29450:366::-;29592:3;29613:67;29677:2;29672:3;29613:67;:::i;:::-;29606:74;;29689:93;29778:3;29689:93;:::i;:::-;29807:2;29802:3;29798:12;29791:19;;29450:366;;;:::o;29822:419::-;29988:4;30026:2;30015:9;30011:18;30003:26;;30075:9;30069:4;30065:20;30061:1;30050:9;30046:17;30039:47;30103:131;30229:4;30103:131;:::i;:::-;30095:139;;29822:419;;;:::o;30247:191::-;30287:4;30307:20;30325:1;30307:20;:::i;:::-;30302:25;;30341:20;30359:1;30341:20;:::i;:::-;30336:25;;30380:1;30377;30374:8;30371:34;;;30385:18;;:::i;:::-;30371:34;30430:1;30427;30423:9;30415:17;;30247:191;;;;:::o;30444:182::-;30584:34;30580:1;30572:6;30568:14;30561:58;30444:182;:::o;30632:366::-;30774:3;30795:67;30859:2;30854:3;30795:67;:::i;:::-;30788:74;;30871:93;30960:3;30871:93;:::i;:::-;30989:2;30984:3;30980:12;30973:19;;30632:366;;;:::o;31004:419::-;31170:4;31208:2;31197:9;31193:18;31185:26;;31257:9;31251:4;31247:20;31243:1;31232:9;31228:17;31221:47;31285:131;31411:4;31285:131;:::i;:::-;31277:139;;31004:419;;;:::o;31429:175::-;31569:27;31565:1;31557:6;31553:14;31546:51;31429:175;:::o;31610:366::-;31752:3;31773:67;31837:2;31832:3;31773:67;:::i;:::-;31766:74;;31849:93;31938:3;31849:93;:::i;:::-;31967:2;31962:3;31958:12;31951:19;;31610:366;;;:::o;31982:419::-;32148:4;32186:2;32175:9;32171:18;32163:26;;32235:9;32229:4;32225:20;32221:1;32210:9;32206:17;32199:47;32263:131;32389:4;32263:131;:::i;:::-;32255:139;;31982:419;;;:::o;32407:237::-;32547:34;32543:1;32535:6;32531:14;32524:58;32616:20;32611:2;32603:6;32599:15;32592:45;32407:237;:::o;32650:366::-;32792:3;32813:67;32877:2;32872:3;32813:67;:::i;:::-;32806:74;;32889:93;32978:3;32889:93;:::i;:::-;33007:2;33002:3;32998:12;32991:19;;32650:366;;;:::o;33022:419::-;33188:4;33226:2;33215:9;33211:18;33203:26;;33275:9;33269:4;33265:20;33261:1;33250:9;33246:17;33239:47;33303:131;33429:4;33303:131;:::i;:::-;33295:139;;33022:419;;;:::o;33447:176::-;33479:1;33496:20;33514:1;33496:20;:::i;:::-;33491:25;;33530:20;33548:1;33530:20;:::i;:::-;33525:25;;33569:1;33559:35;;33574:18;;:::i;:::-;33559:35;33615:1;33612;33608:9;33603:14;;33447:176;;;;:::o;33629:180::-;33677:77;33674:1;33667:88;33774:4;33771:1;33764:15;33798:4;33795:1;33788:15;33815:98;33866:6;33900:5;33894:12;33884:22;;33815:98;;;:::o;33919:168::-;34002:11;34036:6;34031:3;34024:19;34076:4;34071:3;34067:14;34052:29;;33919:168;;;;:::o;34093:360::-;34179:3;34207:38;34239:5;34207:38;:::i;:::-;34261:70;34324:6;34319:3;34261:70;:::i;:::-;34254:77;;34340:52;34385:6;34380:3;34373:4;34366:5;34362:16;34340:52;:::i;:::-;34417:29;34439:6;34417:29;:::i;:::-;34412:3;34408:39;34401:46;;34183:270;34093:360;;;;:::o;34459:640::-;34654:4;34692:3;34681:9;34677:19;34669:27;;34706:71;34774:1;34763:9;34759:17;34750:6;34706:71;:::i;:::-;34787:72;34855:2;34844:9;34840:18;34831:6;34787:72;:::i;:::-;34869;34937:2;34926:9;34922:18;34913:6;34869:72;:::i;:::-;34988:9;34982:4;34978:20;34973:2;34962:9;34958:18;34951:48;35016:76;35087:4;35078:6;35016:76;:::i;:::-;35008:84;;34459:640;;;;;;;:::o;35105:141::-;35161:5;35192:6;35186:13;35177:22;;35208:32;35234:5;35208:32;:::i;:::-;35105:141;;;;:::o;35252:349::-;35321:6;35370:2;35358:9;35349:7;35345:23;35341:32;35338:119;;;35376:79;;:::i;:::-;35338:119;35496:1;35521:63;35576:7;35567:6;35556:9;35552:22;35521:63;:::i;:::-;35511:73;;35467:127;35252:349;;;;:::o;35607:182::-;35747:34;35743:1;35735:6;35731:14;35724:58;35607:182;:::o;35795:366::-;35937:3;35958:67;36022:2;36017:3;35958:67;:::i;:::-;35951:74;;36034:93;36123:3;36034:93;:::i;:::-;36152:2;36147:3;36143:12;36136:19;;35795:366;;;:::o;36167:419::-;36333:4;36371:2;36360:9;36356:18;36348:26;;36420:9;36414:4;36410:20;36406:1;36395:9;36391:17;36384:47;36448:131;36574:4;36448:131;:::i;:::-;36440:139;;36167:419;;;:::o;36592:178::-;36732:30;36728:1;36720:6;36716:14;36709:54;36592:178;:::o;36776:366::-;36918:3;36939:67;37003:2;36998:3;36939:67;:::i;:::-;36932:74;;37015:93;37104:3;37015:93;:::i;:::-;37133:2;37128:3;37124:12;37117:19;;36776:366;;;:::o;37148:419::-;37314:4;37352:2;37341:9;37337:18;37329:26;;37401:9;37395:4;37391:20;37387:1;37376:9;37372:17;37365:47;37429:131;37555:4;37429:131;:::i;:::-;37421:139;;37148:419;;;:::o

Swarm Source

ipfs://15eebe91569ae0bb34e2d5a712947ecd533291179cfb4fdc4f321fee3cd73349
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.