ETH Price: $3,953.05 (+2.16%)

Token

ZNMSFREEMINT (ZMF)
 

Overview

Max Total Supply

0 ZMF

Holders

215

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ZMF
0xF2579606f59Fb3B4182B0566EE2521EA9182cC69
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:
ZONMUSFREEMINT

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-23
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}


// File operator-filter-registry/src/[email protected]


pragma solidity ^0.8.13;

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}


// File operator-filter-registry/src/[email protected]


pragma solidity ^0.8.13;

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}


// File @openzeppelin/contracts/utils/[email protected]


// 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/access/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


// 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/[email protected]


// 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/utils/[email protected]


// 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/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// 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/[email protected]


// 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/token/ERC721/[email protected]


// 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/interfaces/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


// File @openzeppelin/contracts/token/common/[email protected]


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

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;



/**
 * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment
 * information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC721Royalty is ERC2981, ERC721 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }
}


// File contracts/zmfm1222.sol


pragma solidity ^0.8.6;




contract ZONMUSFREEMINT is ERC721Royalty, Ownable, DefaultOperatorFilterer {
    using Strings for uint256;

    constructor() ERC721("ZNMSFREEMINT", "ZMF") {
        _setDefaultRoyalty(feereceiver, 1000);
    }

    string baseURI = 'http://giveaway.zonmus.com/nft/';

    // ━━━━━━━━━━ フリミン期間の設定 ━━━━━━━━━━
    // freemint期間①の設定
    uint256 freeMint1StartTime = 1671765046;
    uint256 freeMint1EndTime = 1671980400;

    uint256 freeMint2StartTime;
    uint256 freeMint2EndTime;

    uint256 freeMint3StartTime;
    uint256 freeMint3EndTime;

    uint256 freeMint4StartTime;
    uint256 freeMint4EndTime;

    uint256 freeMint5StartTime;
    uint256 freeMint5EndTime;
    // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    // ━━━━━━━━━━ mintされた回数のmapping ━━━━━━━━━━
    mapping(address => bool) mint1AddressFinish;
    mapping(address => bool) mint2AddressFinish;
    mapping(address => bool) mint3AddressFinish;
    mapping(address => bool) mint4AddressFinish;
    mapping(address => bool) mint5AddressFinish;
    // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    // ━━━━━━━━━━ mint種類の設定 ━━━━━━━━━━
    mapping(uint256 => uint256) mintVersion;
    // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    // ━━━━━━━━━━ mint個数の設定 ━━━━━━━━━━
    uint256 mint1Counter;
    uint256 mint1MaxAmount = 1000;

    uint256 mint2Counter;
    uint256 mint2MaxAmount = 1000;

    uint256 mint3Counter;
    uint256 mint3MaxAmount = 1000;

    uint256 mint4Counter;
    uint256 mint4MaxAmount = 1000;

    uint256 mint5Counter;
    uint256 mint5MaxAmount = 1000;
    // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    // ━━━━━━━━━━ Royalty fee ━━━━━━━━━━
    address feereceiver = 0x110891d31cAc4498F97FFDeD3aE191BeA5252BEf;
    // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    uint256 tokenIdCounter;

    function setURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }

    function changeRoyalty(address receiver, uint96 fee) public onlyOwner {
        _setDefaultRoyalty(receiver, fee);
    }

    function changeAmount(uint16 version, uint256 amount) public onlyOwner {
        if(version == 1) {
            mint1MaxAmount = amount;
        } else if(version == 2) {
            mint2MaxAmount = amount;
        } else if(version == 3) {
            mint3MaxAmount = amount;
        } else if(version == 4) {
            mint4MaxAmount = amount;
        } else if(version == 5) {
            mint5MaxAmount = amount;
        } else {
            revert('invalid version');
        }
    }

    function setStartTime(uint16 version, uint256 time) public onlyOwner {
        if(version == 1) {
            freeMint1StartTime = time;
        } else if(version == 2) {
            freeMint2StartTime = time;
        } else if(version == 3) {
            freeMint3StartTime = time;
        } else if(version == 4) {
            freeMint4StartTime = time;
        } else if(version == 5) {
            freeMint5StartTime = time;
        } else {
            revert('invalid version');
        }
    }
    
    function setEndTime(uint16 version, uint256 time) public onlyOwner {
        if(version == 1) {
            freeMint1EndTime = time;
        } else if(version == 2) {
            freeMint2EndTime = time;
        } else if(version == 3) {
            freeMint3EndTime = time;
        } else if(version == 4) {
            freeMint4EndTime = time;
        } else if(version == 5) {
            freeMint5EndTime = time;
        } else {
            revert('invalid version');
        }
    }

    function freeMint1() public {
        require(mint1AddressFinish[msg.sender] == false);
        require(block.timestamp > freeMint1StartTime);
        require(block.timestamp < freeMint1EndTime);
        require((mint1Counter + 1) < mint1MaxAmount);
        mintVersion[tokenIdCounter] = 1;
        _safeMint(msg.sender, tokenIdCounter++);
        mint1Counter++;
        mint1AddressFinish[msg.sender] = true;
    }

    function freeMint2() public {
        require(mint2AddressFinish[msg.sender] == false);
        require(block.timestamp > freeMint2StartTime);
        require(block.timestamp < freeMint2EndTime);
        require((mint1Counter + 1) < mint2MaxAmount);
        mintVersion[tokenIdCounter] = 2;
        _safeMint(msg.sender, tokenIdCounter++);
        mint2Counter++;
        mint2AddressFinish[msg.sender] = true;
    }

    function freeMint3() public {
        require(mint3AddressFinish[msg.sender] == false);
        require(block.timestamp > freeMint3StartTime);
        require(block.timestamp < freeMint3EndTime);
        require((mint3Counter + 1) < mint3MaxAmount);
        mintVersion[tokenIdCounter] = 3;
        _safeMint(msg.sender, tokenIdCounter++);
        mint3Counter++;
        mint3AddressFinish[msg.sender] = true;
    }

    function freeMint4() public {
        require(mint4AddressFinish[msg.sender] == false);
        require(block.timestamp > freeMint4StartTime);
        require(block.timestamp < freeMint4EndTime);
        require((mint4Counter + 1) < mint4MaxAmount);
        mintVersion[tokenIdCounter] = 4;
        _safeMint(msg.sender, tokenIdCounter++);
        mint4Counter++;
        mint4AddressFinish[msg.sender] = true;
    }

    function freeMint5() public {
        require(mint5AddressFinish[msg.sender] == false);
        require(block.timestamp > freeMint5StartTime);
        require(block.timestamp < freeMint5EndTime);
        require((mint5Counter + 1) < mint5MaxAmount);
        mintVersion[tokenIdCounter] = 5;
        _safeMint(msg.sender, tokenIdCounter++);
        mint5Counter++;
        mint5AddressFinish[msg.sender] = false;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns(string memory)
    {
        return getURI(tokenId);
    }

    function getURI(uint256 tokenId)
        public
        view
        returns(string memory)
    {
        return string(abi.encodePacked(baseURI, mintVersion[tokenId].toString(), ".json"));
    }

        function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"changeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"fee","type":"uint96"}],"name":"changeRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMint1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMint2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMint3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMint4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMint5","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"version","type":"uint16"},{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setURI","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":[{"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"}]

60806040526040518060400160405280601f81526020017f687474703a2f2f67697665617761792e7a6f6e6d75732e636f6d2f6e66742f00815250600990805190602001906200005192919062000667565b506363a51c36600a556363a86570600b556103e8601b556103e8601d556103e8601f556103e86021556103e860235573110891d31cac4498f97ffded3ae191bea5252bef602460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000e257600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600c81526020017f5a4e4d53465245454d494e5400000000000000000000000000000000000000008152506040518060400160405280600381526020017f5a4d46000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200017e92919062000667565b5080600390805190602001906200019792919062000667565b505050620001ba620001ae620003ed60201b60201c565b620003f560201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003af57801562000275576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200023b9291906200075c565b600060405180830381600087803b1580156200025657600080fd5b505af11580156200026b573d6000803e3d6000fd5b50505050620003ae565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200032f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002f59291906200075c565b600060405180830381600087803b1580156200031057600080fd5b505af115801562000325573d6000803e3d6000fd5b50505050620003ad565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000378919062000789565b600060405180830381600087803b1580156200039357600080fd5b505af1158015620003a8573d6000803e3d6000fd5b505050505b5b5b5050620003e7602460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e8620004bb60201b60201c565b62000925565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004cb6200065d60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200052c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000523906200082d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200059e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000595906200089f565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b8280546200067590620008f0565b90600052602060002090601f016020900481019282620006995760008555620006e5565b82601f10620006b457805160ff1916838001178555620006e5565b82800160010185558215620006e5579182015b82811115620006e4578251825591602001919060010190620006c7565b5b509050620006f49190620006f8565b5090565b5b8082111562000713576000816000905550600101620006f9565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007448262000717565b9050919050565b620007568162000737565b82525050565b60006040820190506200077360008301856200074b565b6200078260208301846200074b565b9392505050565b6000602082019050620007a060008301846200074b565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000815602a83620007a6565b91506200082282620007b7565b604082019050919050565b60006020820190508181036000830152620008488162000806565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000887601983620007a6565b915062000894826200084f565b602082019050919050565b60006020820190508181036000830152620008ba8162000878565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200090957607f821691505b6020821081036200091f576200091e620008c1565b5b50919050565b613f9d80620009356000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636352211e1161010457806396e76060116100a2578063c87b56dd11610071578063c87b56dd146104a5578063d4738d5c146104d5578063e985e9c5146104f1578063f2fde38b14610521576101cf565b806396e7606014610447578063a22cb46514610451578063a7bfd0411461046d578063b88d4fde14610489576101cf565b8063852c6413116100de578063852c6413146103e5578063897463e1146104015780638da5cb5b1461040b57806395d89b4114610429576101cf565b80636352211e1461037b57806370a08231146103ab578063715018a6146103db576101cf565b806323b872dd116101715780632a55205a1161014b5780632a55205a1461030657806341f434341461033757806342842e0e146103555780634d0bf9ab14610371576101cf565b806323b872dd146102c457806323c12a13146102e05780632838b7a7146102ea576101cf565b8063081812fc116101ad578063081812fc1461023e578063095ea7b31461026e5780630dc7324c1461028a5780631aa347dc14610294576101cf565b806301ffc9a7146101d457806302fe53051461020457806306fdde0314610220575b600080fd5b6101ee60048036038101906101e99190612a1b565b61053d565b6040516101fb9190612a63565b60405180910390f35b61021e60048036038101906102199190612bc4565b61054f565b005b610228610571565b6040516102359190612c95565b60405180910390f35b61025860048036038101906102539190612ced565b610603565b6040516102659190612d5b565b60405180910390f35b61028860048036038101906102839190612da2565b610649565b005b610292610662565b005b6102ae60048036038101906102a99190612ced565b6107a4565b6040516102bb9190612c95565b60405180910390f35b6102de60048036038101906102d99190612de2565b6107eb565b005b6102e861083a565b005b61030460048036038101906102ff9190612e6f565b61097c565b005b610320600480360381019061031b9190612eaf565b610a3f565b60405161032e929190612efe565b60405180910390f35b61033f610c29565b60405161034c9190612f86565b60405180910390f35b61036f600480360381019061036a9190612de2565b610c3b565b005b610379610c8a565b005b61039560048036038101906103909190612ced565b610dcc565b6040516103a29190612d5b565b60405180910390f35b6103c560048036038101906103c09190612fa1565b610e7d565b6040516103d29190612fce565b60405180910390f35b6103e3610f34565b005b6103ff60048036038101906103fa9190612e6f565b610f48565b005b61040961100b565b005b61041361114d565b6040516104209190612d5b565b60405180910390f35b610431611177565b60405161043e9190612c95565b60405180910390f35b61044f611209565b005b61046b60048036038101906104669190613015565b61134b565b005b61048760048036038101906104829190612e6f565b611364565b005b6104a3600480360381019061049e91906130f6565b611427565b005b6104bf60048036038101906104ba9190612ced565b611478565b6040516104cc9190612c95565b60405180910390f35b6104ef60048036038101906104ea91906131bd565b61148a565b005b61050b600480360381019061050691906131fd565b6114a0565b6040516105189190612a63565b60405180910390f35b61053b60048036038101906105369190612fa1565b611534565b005b6000610548826115b7565b9050919050565b610557611699565b806009908051906020019061056d92919061290c565b5050565b6060600280546105809061326c565b80601f01602080910402602001604051908101604052809291908181526020018280546105ac9061326c565b80156105f95780601f106105ce576101008083540402835291602001916105f9565b820191906000526020600020905b8154815290600101906020018083116105dc57829003601f168201915b5050505050905090565b600061060e82611717565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8161065381611762565b61065d838361185f565b505050565b60001515601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146106bf57600080fd5b60125442116106cd57600080fd5b60135442106106db57600080fd5b60235460016022546106ed91906132cc565b106106f757600080fd5b600560196000602554815260200190815260200160002081905550610732336025600081548092919061072990613322565b91905055611976565b6022600081548092919061074590613322565b91905055506000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b606060096107c46019600085815260200190815260200160002054611994565b6040516020016107d5929190613486565b6040516020818303038152906040529050919050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108295761082833611762565b5b610834848484611af4565b50505050565b60001515601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461089757600080fd5b600e5442116108a557600080fd5b600f5442106108b357600080fd5b601f546001601e546108c591906132cc565b106108cf57600080fd5b60036019600060255481526020019081526020016000208190555061090a336025600081548092919061090190613322565b91905055611976565b601e600081548092919061091d90613322565b91905055506001601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b610984611699565b60018261ffff160361099c5780601b81905550610a3b565b60028261ffff16036109b45780601d81905550610a3a565b60038261ffff16036109cc5780601f81905550610a39565b60048261ffff16036109e45780602181905550610a38565b60058261ffff16036109fc5780602381905550610a37565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e90613501565b60405180910390fd5b5b5b5b5b5050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610bd45760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610bde611b54565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610c0a9190613521565b610c1491906135aa565b90508160000151819350935050509250929050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c7957610c7833611762565b5b610c84848484611b5e565b50505050565b60001515601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610ce757600080fd5b600a544211610cf557600080fd5b600b544210610d0357600080fd5b601b546001601a54610d1591906132cc565b10610d1f57600080fd5b600160196000602554815260200190815260200160002081905550610d5a3360256000815480929190610d5190613322565b91905055611976565b601a6000815480929190610d6d90613322565b91905055506001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b90613627565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee4906136b9565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f3c611699565b610f466000611b7e565b565b610f50611699565b60018261ffff1603610f685780600a81905550611007565b60028261ffff1603610f805780600c81905550611006565b60038261ffff1603610f985780600e81905550611005565b60048261ffff1603610fb05780601081905550611004565b60058261ffff1603610fc85780601281905550611003565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90613501565b60405180910390fd5b5b5b5b5b5050565b60001515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461106857600080fd5b600c54421161107657600080fd5b600d54421061108457600080fd5b601d546001601a5461109691906132cc565b106110a057600080fd5b6002601960006025548152602001908152602001600020819055506110db33602560008154809291906110d290613322565b91905055611976565b601c60008154809291906110ee90613322565b91905055506001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111869061326c565b80601f01602080910402602001604051908101604052809291908181526020018280546111b29061326c565b80156111ff5780601f106111d4576101008083540402835291602001916111ff565b820191906000526020600020905b8154815290600101906020018083116111e257829003601f168201915b5050505050905090565b60001515601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461126657600080fd5b601054421161127457600080fd5b601154421061128257600080fd5b602154600160205461129491906132cc565b1061129e57600080fd5b6004601960006025548152602001908152602001600020819055506112d933602560008154809291906112d090613322565b91905055611976565b602060008154809291906112ec90613322565b91905055506001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b8161135581611762565b61135f8383611c44565b505050565b61136c611699565b60018261ffff16036113845780600b81905550611423565b60028261ffff160361139c5780600d81905550611422565b60038261ffff16036113b45780600f81905550611421565b60048261ffff16036113cc5780601181905550611420565b60058261ffff16036113e4578060138190555061141f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690613501565b60405180910390fd5b5b5b5b5b5050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114655761146433611762565b5b61147185858585611c5a565b5050505050565b6060611483826107a4565b9050919050565b611492611699565b61149c8282611cbc565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61153c611699565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a29061374b565b60405180910390fd5b6115b481611b7e565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061168257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611692575061169182611e50565b5b9050919050565b6116a1611eca565b73ffffffffffffffffffffffffffffffffffffffff166116bf61114d565b73ffffffffffffffffffffffffffffffffffffffff1614611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c906137b7565b60405180910390fd5b565b61172081611ed2565b61175f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175690613627565b60405180910390fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561185c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016117d99291906137d7565b602060405180830381865afa1580156117f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181a9190613815565b61185b57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016118529190612d5b565b60405180910390fd5b5b50565b600061186a82610dcc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d1906138b4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166118f9611eca565b73ffffffffffffffffffffffffffffffffffffffff161480611928575061192781611922611eca565b6114a0565b5b611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90613946565b60405180910390fd5b6119718383611f3e565b505050565b611990828260405180602001604052806000815250611ff7565b5050565b6060600082036119db576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611aef565b600082905060005b60008214611a0d5780806119f690613322565b915050600a82611a0691906135aa565b91506119e3565b60008167ffffffffffffffff811115611a2957611a28612a99565b5b6040519080825280601f01601f191660200182016040528015611a5b5781602001600182028036833780820191505090505b5090505b60008514611ae857600182611a749190613966565b9150600a85611a83919061399a565b6030611a8f91906132cc565b60f81b818381518110611aa557611aa46139cb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ae191906135aa565b9450611a5f565b8093505050505b919050565b611b05611aff611eca565b82612052565b611b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3b90613a6c565b60405180910390fd5b611b4f8383836120e7565b505050565b6000612710905090565b611b7983838360405180602001604052806000815250611427565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c56611c4f611eca565b838361234d565b5050565b611c6b611c65611eca565b83612052565b611caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca190613a6c565b60405180910390fd5b611cb6848484846124b9565b50505050565b611cc4611b54565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1990613afe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8890613b6a565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ec35750611ec282612515565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611fb183610dcc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612001838361257f565b61200e6000848484612758565b61204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490613bfc565b60405180910390fd5b505050565b60008061205e83610dcc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120a0575061209f81856114a0565b5b806120de57508373ffffffffffffffffffffffffffffffffffffffff166120c684610603565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661210782610dcc565b73ffffffffffffffffffffffffffffffffffffffff161461215d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215490613c8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c390613d20565b60405180910390fd5b6121d78383836128df565b6121e2600082611f3e565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122329190613966565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461228991906132cc565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123488383836128e4565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b290613d8c565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124ac9190612a63565b60405180910390a3505050565b6124c48484846120e7565b6124d084848484612758565b61250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690613bfc565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e590613df8565b60405180910390fd5b6125f781611ed2565b15612637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262e90613e64565b60405180910390fd5b612643600083836128df565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461269391906132cc565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612754600083836128e4565b5050565b60006127798473ffffffffffffffffffffffffffffffffffffffff166128e9565b156128d2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127a2611eca565b8786866040518563ffffffff1660e01b81526004016127c49493929190613ed9565b6020604051808303816000875af192505050801561280057506040513d601f19601f820116820180604052508101906127fd9190613f3a565b60015b612882573d8060008114612830576040519150601f19603f3d011682016040523d82523d6000602084013e612835565b606091505b50600081510361287a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287190613bfc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128d7565b600190505b949350505050565b505050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546129189061326c565b90600052602060002090601f01602090048101928261293a5760008555612981565b82601f1061295357805160ff1916838001178555612981565b82800160010185558215612981579182015b82811115612980578251825591602001919060010190612965565b5b50905061298e9190612992565b5090565b5b808211156129ab576000816000905550600101612993565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129f8816129c3565b8114612a0357600080fd5b50565b600081359050612a15816129ef565b92915050565b600060208284031215612a3157612a306129b9565b5b6000612a3f84828501612a06565b91505092915050565b60008115159050919050565b612a5d81612a48565b82525050565b6000602082019050612a786000830184612a54565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ad182612a88565b810181811067ffffffffffffffff82111715612af057612aef612a99565b5b80604052505050565b6000612b036129af565b9050612b0f8282612ac8565b919050565b600067ffffffffffffffff821115612b2f57612b2e612a99565b5b612b3882612a88565b9050602081019050919050565b82818337600083830152505050565b6000612b67612b6284612b14565b612af9565b905082815260208101848484011115612b8357612b82612a83565b5b612b8e848285612b45565b509392505050565b600082601f830112612bab57612baa612a7e565b5b8135612bbb848260208601612b54565b91505092915050565b600060208284031215612bda57612bd96129b9565b5b600082013567ffffffffffffffff811115612bf857612bf76129be565b5b612c0484828501612b96565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c47578082015181840152602081019050612c2c565b83811115612c56576000848401525b50505050565b6000612c6782612c0d565b612c718185612c18565b9350612c81818560208601612c29565b612c8a81612a88565b840191505092915050565b60006020820190508181036000830152612caf8184612c5c565b905092915050565b6000819050919050565b612cca81612cb7565b8114612cd557600080fd5b50565b600081359050612ce781612cc1565b92915050565b600060208284031215612d0357612d026129b9565b5b6000612d1184828501612cd8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d4582612d1a565b9050919050565b612d5581612d3a565b82525050565b6000602082019050612d706000830184612d4c565b92915050565b612d7f81612d3a565b8114612d8a57600080fd5b50565b600081359050612d9c81612d76565b92915050565b60008060408385031215612db957612db86129b9565b5b6000612dc785828601612d8d565b9250506020612dd885828601612cd8565b9150509250929050565b600080600060608486031215612dfb57612dfa6129b9565b5b6000612e0986828701612d8d565b9350506020612e1a86828701612d8d565b9250506040612e2b86828701612cd8565b9150509250925092565b600061ffff82169050919050565b612e4c81612e35565b8114612e5757600080fd5b50565b600081359050612e6981612e43565b92915050565b60008060408385031215612e8657612e856129b9565b5b6000612e9485828601612e5a565b9250506020612ea585828601612cd8565b9150509250929050565b60008060408385031215612ec657612ec56129b9565b5b6000612ed485828601612cd8565b9250506020612ee585828601612cd8565b9150509250929050565b612ef881612cb7565b82525050565b6000604082019050612f136000830185612d4c565b612f206020830184612eef565b9392505050565b6000819050919050565b6000612f4c612f47612f4284612d1a565b612f27565b612d1a565b9050919050565b6000612f5e82612f31565b9050919050565b6000612f7082612f53565b9050919050565b612f8081612f65565b82525050565b6000602082019050612f9b6000830184612f77565b92915050565b600060208284031215612fb757612fb66129b9565b5b6000612fc584828501612d8d565b91505092915050565b6000602082019050612fe36000830184612eef565b92915050565b612ff281612a48565b8114612ffd57600080fd5b50565b60008135905061300f81612fe9565b92915050565b6000806040838503121561302c5761302b6129b9565b5b600061303a85828601612d8d565b925050602061304b85828601613000565b9150509250929050565b600067ffffffffffffffff8211156130705761306f612a99565b5b61307982612a88565b9050602081019050919050565b600061309961309484613055565b612af9565b9050828152602081018484840111156130b5576130b4612a83565b5b6130c0848285612b45565b509392505050565b600082601f8301126130dd576130dc612a7e565b5b81356130ed848260208601613086565b91505092915050565b600080600080608085870312156131105761310f6129b9565b5b600061311e87828801612d8d565b945050602061312f87828801612d8d565b935050604061314087828801612cd8565b925050606085013567ffffffffffffffff811115613161576131606129be565b5b61316d878288016130c8565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b61319a81613179565b81146131a557600080fd5b50565b6000813590506131b781613191565b92915050565b600080604083850312156131d4576131d36129b9565b5b60006131e285828601612d8d565b92505060206131f3858286016131a8565b9150509250929050565b60008060408385031215613214576132136129b9565b5b600061322285828601612d8d565b925050602061323385828601612d8d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061328457607f821691505b6020821081036132975761329661323d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132d782612cb7565b91506132e283612cb7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133175761331661329d565b5b828201905092915050565b600061332d82612cb7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361335f5761335e61329d565b5b600182019050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546133978161326c565b6133a1818661336a565b945060018216600081146133bc57600181146133cd57613400565b60ff19831686528186019350613400565b6133d685613375565b60005b838110156133f8578154818901526001820191506020810190506133d9565b838801955050505b50505092915050565b600061341482612c0d565b61341e818561336a565b935061342e818560208601612c29565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061347060058361336a565b915061347b8261343a565b600582019050919050565b6000613492828561338a565b915061349e8284613409565b91506134a982613463565b91508190509392505050565b7f696e76616c69642076657273696f6e0000000000000000000000000000000000600082015250565b60006134eb600f83612c18565b91506134f6826134b5565b602082019050919050565b6000602082019050818103600083015261351a816134de565b9050919050565b600061352c82612cb7565b915061353783612cb7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135705761356f61329d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006135b582612cb7565b91506135c083612cb7565b9250826135d0576135cf61357b565b5b828204905092915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613611601883612c18565b915061361c826135db565b602082019050919050565b6000602082019050818103600083015261364081613604565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006136a3602983612c18565b91506136ae82613647565b604082019050919050565b600060208201905081810360008301526136d281613696565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613735602683612c18565b9150613740826136d9565b604082019050919050565b6000602082019050818103600083015261376481613728565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137a1602083612c18565b91506137ac8261376b565b602082019050919050565b600060208201905081810360008301526137d081613794565b9050919050565b60006040820190506137ec6000830185612d4c565b6137f96020830184612d4c565b9392505050565b60008151905061380f81612fe9565b92915050565b60006020828403121561382b5761382a6129b9565b5b600061383984828501613800565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061389e602183612c18565b91506138a982613842565b604082019050919050565b600060208201905081810360008301526138cd81613891565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613930603e83612c18565b915061393b826138d4565b604082019050919050565b6000602082019050818103600083015261395f81613923565b9050919050565b600061397182612cb7565b915061397c83612cb7565b92508282101561398f5761398e61329d565b5b828203905092915050565b60006139a582612cb7565b91506139b083612cb7565b9250826139c0576139bf61357b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613a56602e83612c18565b9150613a61826139fa565b604082019050919050565b60006020820190508181036000830152613a8581613a49565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000613ae8602a83612c18565b9150613af382613a8c565b604082019050919050565b60006020820190508181036000830152613b1781613adb565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000613b54601983612c18565b9150613b5f82613b1e565b602082019050919050565b60006020820190508181036000830152613b8381613b47565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613be6603283612c18565b9150613bf182613b8a565b604082019050919050565b60006020820190508181036000830152613c1581613bd9565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613c78602583612c18565b9150613c8382613c1c565b604082019050919050565b60006020820190508181036000830152613ca781613c6b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d0a602483612c18565b9150613d1582613cae565b604082019050919050565b60006020820190508181036000830152613d3981613cfd565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613d76601983612c18565b9150613d8182613d40565b602082019050919050565b60006020820190508181036000830152613da581613d69565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613de2602083612c18565b9150613ded82613dac565b602082019050919050565b60006020820190508181036000830152613e1181613dd5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613e4e601c83612c18565b9150613e5982613e18565b602082019050919050565b60006020820190508181036000830152613e7d81613e41565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613eab82613e84565b613eb58185613e8f565b9350613ec5818560208601612c29565b613ece81612a88565b840191505092915050565b6000608082019050613eee6000830187612d4c565b613efb6020830186612d4c565b613f086040830185612eef565b8181036060830152613f1a8184613ea0565b905095945050505050565b600081519050613f34816129ef565b92915050565b600060208284031215613f5057613f4f6129b9565b5b6000613f5e84828501613f25565b9150509291505056fea264697066735822122092e568ec508c74e0b2c192438fbdc74e92233d9fab67539e79ba3b6266bd439164736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636352211e1161010457806396e76060116100a2578063c87b56dd11610071578063c87b56dd146104a5578063d4738d5c146104d5578063e985e9c5146104f1578063f2fde38b14610521576101cf565b806396e7606014610447578063a22cb46514610451578063a7bfd0411461046d578063b88d4fde14610489576101cf565b8063852c6413116100de578063852c6413146103e5578063897463e1146104015780638da5cb5b1461040b57806395d89b4114610429576101cf565b80636352211e1461037b57806370a08231146103ab578063715018a6146103db576101cf565b806323b872dd116101715780632a55205a1161014b5780632a55205a1461030657806341f434341461033757806342842e0e146103555780634d0bf9ab14610371576101cf565b806323b872dd146102c457806323c12a13146102e05780632838b7a7146102ea576101cf565b8063081812fc116101ad578063081812fc1461023e578063095ea7b31461026e5780630dc7324c1461028a5780631aa347dc14610294576101cf565b806301ffc9a7146101d457806302fe53051461020457806306fdde0314610220575b600080fd5b6101ee60048036038101906101e99190612a1b565b61053d565b6040516101fb9190612a63565b60405180910390f35b61021e60048036038101906102199190612bc4565b61054f565b005b610228610571565b6040516102359190612c95565b60405180910390f35b61025860048036038101906102539190612ced565b610603565b6040516102659190612d5b565b60405180910390f35b61028860048036038101906102839190612da2565b610649565b005b610292610662565b005b6102ae60048036038101906102a99190612ced565b6107a4565b6040516102bb9190612c95565b60405180910390f35b6102de60048036038101906102d99190612de2565b6107eb565b005b6102e861083a565b005b61030460048036038101906102ff9190612e6f565b61097c565b005b610320600480360381019061031b9190612eaf565b610a3f565b60405161032e929190612efe565b60405180910390f35b61033f610c29565b60405161034c9190612f86565b60405180910390f35b61036f600480360381019061036a9190612de2565b610c3b565b005b610379610c8a565b005b61039560048036038101906103909190612ced565b610dcc565b6040516103a29190612d5b565b60405180910390f35b6103c560048036038101906103c09190612fa1565b610e7d565b6040516103d29190612fce565b60405180910390f35b6103e3610f34565b005b6103ff60048036038101906103fa9190612e6f565b610f48565b005b61040961100b565b005b61041361114d565b6040516104209190612d5b565b60405180910390f35b610431611177565b60405161043e9190612c95565b60405180910390f35b61044f611209565b005b61046b60048036038101906104669190613015565b61134b565b005b61048760048036038101906104829190612e6f565b611364565b005b6104a3600480360381019061049e91906130f6565b611427565b005b6104bf60048036038101906104ba9190612ced565b611478565b6040516104cc9190612c95565b60405180910390f35b6104ef60048036038101906104ea91906131bd565b61148a565b005b61050b600480360381019061050691906131fd565b6114a0565b6040516105189190612a63565b60405180910390f35b61053b60048036038101906105369190612fa1565b611534565b005b6000610548826115b7565b9050919050565b610557611699565b806009908051906020019061056d92919061290c565b5050565b6060600280546105809061326c565b80601f01602080910402602001604051908101604052809291908181526020018280546105ac9061326c565b80156105f95780601f106105ce576101008083540402835291602001916105f9565b820191906000526020600020905b8154815290600101906020018083116105dc57829003601f168201915b5050505050905090565b600061060e82611717565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8161065381611762565b61065d838361185f565b505050565b60001515601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146106bf57600080fd5b60125442116106cd57600080fd5b60135442106106db57600080fd5b60235460016022546106ed91906132cc565b106106f757600080fd5b600560196000602554815260200190815260200160002081905550610732336025600081548092919061072990613322565b91905055611976565b6022600081548092919061074590613322565b91905055506000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b606060096107c46019600085815260200190815260200160002054611994565b6040516020016107d5929190613486565b6040516020818303038152906040529050919050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108295761082833611762565b5b610834848484611af4565b50505050565b60001515601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461089757600080fd5b600e5442116108a557600080fd5b600f5442106108b357600080fd5b601f546001601e546108c591906132cc565b106108cf57600080fd5b60036019600060255481526020019081526020016000208190555061090a336025600081548092919061090190613322565b91905055611976565b601e600081548092919061091d90613322565b91905055506001601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b610984611699565b60018261ffff160361099c5780601b81905550610a3b565b60028261ffff16036109b45780601d81905550610a3a565b60038261ffff16036109cc5780601f81905550610a39565b60048261ffff16036109e45780602181905550610a38565b60058261ffff16036109fc5780602381905550610a37565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e90613501565b60405180910390fd5b5b5b5b5b5050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610bd45760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610bde611b54565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610c0a9190613521565b610c1491906135aa565b90508160000151819350935050509250929050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c7957610c7833611762565b5b610c84848484611b5e565b50505050565b60001515601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610ce757600080fd5b600a544211610cf557600080fd5b600b544210610d0357600080fd5b601b546001601a54610d1591906132cc565b10610d1f57600080fd5b600160196000602554815260200190815260200160002081905550610d5a3360256000815480929190610d5190613322565b91905055611976565b601a6000815480929190610d6d90613322565b91905055506001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b90613627565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee4906136b9565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f3c611699565b610f466000611b7e565b565b610f50611699565b60018261ffff1603610f685780600a81905550611007565b60028261ffff1603610f805780600c81905550611006565b60038261ffff1603610f985780600e81905550611005565b60048261ffff1603610fb05780601081905550611004565b60058261ffff1603610fc85780601281905550611003565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90613501565b60405180910390fd5b5b5b5b5b5050565b60001515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461106857600080fd5b600c54421161107657600080fd5b600d54421061108457600080fd5b601d546001601a5461109691906132cc565b106110a057600080fd5b6002601960006025548152602001908152602001600020819055506110db33602560008154809291906110d290613322565b91905055611976565b601c60008154809291906110ee90613322565b91905055506001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111869061326c565b80601f01602080910402602001604051908101604052809291908181526020018280546111b29061326c565b80156111ff5780601f106111d4576101008083540402835291602001916111ff565b820191906000526020600020905b8154815290600101906020018083116111e257829003601f168201915b5050505050905090565b60001515601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461126657600080fd5b601054421161127457600080fd5b601154421061128257600080fd5b602154600160205461129491906132cc565b1061129e57600080fd5b6004601960006025548152602001908152602001600020819055506112d933602560008154809291906112d090613322565b91905055611976565b602060008154809291906112ec90613322565b91905055506001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b8161135581611762565b61135f8383611c44565b505050565b61136c611699565b60018261ffff16036113845780600b81905550611423565b60028261ffff160361139c5780600d81905550611422565b60038261ffff16036113b45780600f81905550611421565b60048261ffff16036113cc5780601181905550611420565b60058261ffff16036113e4578060138190555061141f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690613501565b60405180910390fd5b5b5b5b5b5050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114655761146433611762565b5b61147185858585611c5a565b5050505050565b6060611483826107a4565b9050919050565b611492611699565b61149c8282611cbc565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61153c611699565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a29061374b565b60405180910390fd5b6115b481611b7e565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061168257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611692575061169182611e50565b5b9050919050565b6116a1611eca565b73ffffffffffffffffffffffffffffffffffffffff166116bf61114d565b73ffffffffffffffffffffffffffffffffffffffff1614611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c906137b7565b60405180910390fd5b565b61172081611ed2565b61175f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175690613627565b60405180910390fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561185c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016117d99291906137d7565b602060405180830381865afa1580156117f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181a9190613815565b61185b57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016118529190612d5b565b60405180910390fd5b5b50565b600061186a82610dcc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d1906138b4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166118f9611eca565b73ffffffffffffffffffffffffffffffffffffffff161480611928575061192781611922611eca565b6114a0565b5b611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90613946565b60405180910390fd5b6119718383611f3e565b505050565b611990828260405180602001604052806000815250611ff7565b5050565b6060600082036119db576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611aef565b600082905060005b60008214611a0d5780806119f690613322565b915050600a82611a0691906135aa565b91506119e3565b60008167ffffffffffffffff811115611a2957611a28612a99565b5b6040519080825280601f01601f191660200182016040528015611a5b5781602001600182028036833780820191505090505b5090505b60008514611ae857600182611a749190613966565b9150600a85611a83919061399a565b6030611a8f91906132cc565b60f81b818381518110611aa557611aa46139cb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ae191906135aa565b9450611a5f565b8093505050505b919050565b611b05611aff611eca565b82612052565b611b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3b90613a6c565b60405180910390fd5b611b4f8383836120e7565b505050565b6000612710905090565b611b7983838360405180602001604052806000815250611427565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c56611c4f611eca565b838361234d565b5050565b611c6b611c65611eca565b83612052565b611caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca190613a6c565b60405180910390fd5b611cb6848484846124b9565b50505050565b611cc4611b54565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1990613afe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8890613b6a565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ec35750611ec282612515565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611fb183610dcc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612001838361257f565b61200e6000848484612758565b61204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490613bfc565b60405180910390fd5b505050565b60008061205e83610dcc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120a0575061209f81856114a0565b5b806120de57508373ffffffffffffffffffffffffffffffffffffffff166120c684610603565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661210782610dcc565b73ffffffffffffffffffffffffffffffffffffffff161461215d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215490613c8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c390613d20565b60405180910390fd5b6121d78383836128df565b6121e2600082611f3e565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122329190613966565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461228991906132cc565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123488383836128e4565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b290613d8c565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124ac9190612a63565b60405180910390a3505050565b6124c48484846120e7565b6124d084848484612758565b61250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690613bfc565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e590613df8565b60405180910390fd5b6125f781611ed2565b15612637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262e90613e64565b60405180910390fd5b612643600083836128df565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461269391906132cc565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612754600083836128e4565b5050565b60006127798473ffffffffffffffffffffffffffffffffffffffff166128e9565b156128d2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127a2611eca565b8786866040518563ffffffff1660e01b81526004016127c49493929190613ed9565b6020604051808303816000875af192505050801561280057506040513d601f19601f820116820180604052508101906127fd9190613f3a565b60015b612882573d8060008114612830576040519150601f19603f3d011682016040523d82523d6000602084013e612835565b606091505b50600081510361287a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287190613bfc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128d7565b600190505b949350505050565b505050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546129189061326c565b90600052602060002090601f01602090048101928261293a5760008555612981565b82601f1061295357805160ff1916838001178555612981565b82800160010185558215612981579182015b82811115612980578251825591602001919060010190612965565b5b50905061298e9190612992565b5090565b5b808211156129ab576000816000905550600101612993565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129f8816129c3565b8114612a0357600080fd5b50565b600081359050612a15816129ef565b92915050565b600060208284031215612a3157612a306129b9565b5b6000612a3f84828501612a06565b91505092915050565b60008115159050919050565b612a5d81612a48565b82525050565b6000602082019050612a786000830184612a54565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ad182612a88565b810181811067ffffffffffffffff82111715612af057612aef612a99565b5b80604052505050565b6000612b036129af565b9050612b0f8282612ac8565b919050565b600067ffffffffffffffff821115612b2f57612b2e612a99565b5b612b3882612a88565b9050602081019050919050565b82818337600083830152505050565b6000612b67612b6284612b14565b612af9565b905082815260208101848484011115612b8357612b82612a83565b5b612b8e848285612b45565b509392505050565b600082601f830112612bab57612baa612a7e565b5b8135612bbb848260208601612b54565b91505092915050565b600060208284031215612bda57612bd96129b9565b5b600082013567ffffffffffffffff811115612bf857612bf76129be565b5b612c0484828501612b96565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c47578082015181840152602081019050612c2c565b83811115612c56576000848401525b50505050565b6000612c6782612c0d565b612c718185612c18565b9350612c81818560208601612c29565b612c8a81612a88565b840191505092915050565b60006020820190508181036000830152612caf8184612c5c565b905092915050565b6000819050919050565b612cca81612cb7565b8114612cd557600080fd5b50565b600081359050612ce781612cc1565b92915050565b600060208284031215612d0357612d026129b9565b5b6000612d1184828501612cd8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d4582612d1a565b9050919050565b612d5581612d3a565b82525050565b6000602082019050612d706000830184612d4c565b92915050565b612d7f81612d3a565b8114612d8a57600080fd5b50565b600081359050612d9c81612d76565b92915050565b60008060408385031215612db957612db86129b9565b5b6000612dc785828601612d8d565b9250506020612dd885828601612cd8565b9150509250929050565b600080600060608486031215612dfb57612dfa6129b9565b5b6000612e0986828701612d8d565b9350506020612e1a86828701612d8d565b9250506040612e2b86828701612cd8565b9150509250925092565b600061ffff82169050919050565b612e4c81612e35565b8114612e5757600080fd5b50565b600081359050612e6981612e43565b92915050565b60008060408385031215612e8657612e856129b9565b5b6000612e9485828601612e5a565b9250506020612ea585828601612cd8565b9150509250929050565b60008060408385031215612ec657612ec56129b9565b5b6000612ed485828601612cd8565b9250506020612ee585828601612cd8565b9150509250929050565b612ef881612cb7565b82525050565b6000604082019050612f136000830185612d4c565b612f206020830184612eef565b9392505050565b6000819050919050565b6000612f4c612f47612f4284612d1a565b612f27565b612d1a565b9050919050565b6000612f5e82612f31565b9050919050565b6000612f7082612f53565b9050919050565b612f8081612f65565b82525050565b6000602082019050612f9b6000830184612f77565b92915050565b600060208284031215612fb757612fb66129b9565b5b6000612fc584828501612d8d565b91505092915050565b6000602082019050612fe36000830184612eef565b92915050565b612ff281612a48565b8114612ffd57600080fd5b50565b60008135905061300f81612fe9565b92915050565b6000806040838503121561302c5761302b6129b9565b5b600061303a85828601612d8d565b925050602061304b85828601613000565b9150509250929050565b600067ffffffffffffffff8211156130705761306f612a99565b5b61307982612a88565b9050602081019050919050565b600061309961309484613055565b612af9565b9050828152602081018484840111156130b5576130b4612a83565b5b6130c0848285612b45565b509392505050565b600082601f8301126130dd576130dc612a7e565b5b81356130ed848260208601613086565b91505092915050565b600080600080608085870312156131105761310f6129b9565b5b600061311e87828801612d8d565b945050602061312f87828801612d8d565b935050604061314087828801612cd8565b925050606085013567ffffffffffffffff811115613161576131606129be565b5b61316d878288016130c8565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b61319a81613179565b81146131a557600080fd5b50565b6000813590506131b781613191565b92915050565b600080604083850312156131d4576131d36129b9565b5b60006131e285828601612d8d565b92505060206131f3858286016131a8565b9150509250929050565b60008060408385031215613214576132136129b9565b5b600061322285828601612d8d565b925050602061323385828601612d8d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061328457607f821691505b6020821081036132975761329661323d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132d782612cb7565b91506132e283612cb7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133175761331661329d565b5b828201905092915050565b600061332d82612cb7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361335f5761335e61329d565b5b600182019050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546133978161326c565b6133a1818661336a565b945060018216600081146133bc57600181146133cd57613400565b60ff19831686528186019350613400565b6133d685613375565b60005b838110156133f8578154818901526001820191506020810190506133d9565b838801955050505b50505092915050565b600061341482612c0d565b61341e818561336a565b935061342e818560208601612c29565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061347060058361336a565b915061347b8261343a565b600582019050919050565b6000613492828561338a565b915061349e8284613409565b91506134a982613463565b91508190509392505050565b7f696e76616c69642076657273696f6e0000000000000000000000000000000000600082015250565b60006134eb600f83612c18565b91506134f6826134b5565b602082019050919050565b6000602082019050818103600083015261351a816134de565b9050919050565b600061352c82612cb7565b915061353783612cb7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135705761356f61329d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006135b582612cb7565b91506135c083612cb7565b9250826135d0576135cf61357b565b5b828204905092915050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613611601883612c18565b915061361c826135db565b602082019050919050565b6000602082019050818103600083015261364081613604565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006136a3602983612c18565b91506136ae82613647565b604082019050919050565b600060208201905081810360008301526136d281613696565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613735602683612c18565b9150613740826136d9565b604082019050919050565b6000602082019050818103600083015261376481613728565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137a1602083612c18565b91506137ac8261376b565b602082019050919050565b600060208201905081810360008301526137d081613794565b9050919050565b60006040820190506137ec6000830185612d4c565b6137f96020830184612d4c565b9392505050565b60008151905061380f81612fe9565b92915050565b60006020828403121561382b5761382a6129b9565b5b600061383984828501613800565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061389e602183612c18565b91506138a982613842565b604082019050919050565b600060208201905081810360008301526138cd81613891565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613930603e83612c18565b915061393b826138d4565b604082019050919050565b6000602082019050818103600083015261395f81613923565b9050919050565b600061397182612cb7565b915061397c83612cb7565b92508282101561398f5761398e61329d565b5b828203905092915050565b60006139a582612cb7565b91506139b083612cb7565b9250826139c0576139bf61357b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613a56602e83612c18565b9150613a61826139fa565b604082019050919050565b60006020820190508181036000830152613a8581613a49565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000613ae8602a83612c18565b9150613af382613a8c565b604082019050919050565b60006020820190508181036000830152613b1781613adb565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000613b54601983612c18565b9150613b5f82613b1e565b602082019050919050565b60006020820190508181036000830152613b8381613b47565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613be6603283612c18565b9150613bf182613b8a565b604082019050919050565b60006020820190508181036000830152613c1581613bd9565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613c78602583612c18565b9150613c8382613c1c565b604082019050919050565b60006020820190508181036000830152613ca781613c6b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d0a602483612c18565b9150613d1582613cae565b604082019050919050565b60006020820190508181036000830152613d3981613cfd565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613d76601983612c18565b9150613d8182613d40565b602082019050919050565b60006020820190508181036000830152613da581613d69565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613de2602083612c18565b9150613ded82613dac565b602082019050919050565b60006020820190508181036000830152613e1181613dd5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613e4e601c83612c18565b9150613e5982613e18565b602082019050919050565b60006020820190508181036000830152613e7d81613e41565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613eab82613e84565b613eb58185613e8f565b9350613ec5818560208601612c29565b613ece81612a88565b840191505092915050565b6000608082019050613eee6000830187612d4c565b613efb6020830186612d4c565b613f086040830185612eef565b8181036060830152613f1a8184613ea0565b905095945050505050565b600081519050613f34816129ef565b92915050565b600060208284031215613f5057613f4f6129b9565b5b6000613f5e84828501613f25565b9150509291505056fea264697066735822122092e568ec508c74e0b2c192438fbdc74e92233d9fab67539e79ba3b6266bd439164736f6c634300080d0033

Deployed Bytecode Sourcemap

50038:7606:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49523:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52394:84;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31135:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32648:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56898:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55898:426;;;:::i;:::-;;56501:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57063:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55032:425;;;:::i;:::-;;52616:506;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45956:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;2897:143;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57234:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54166:425;;;:::i;:::-;;30846:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30577:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8191:103;;;:::i;:::-;;53130:514;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54599:425;;;:::i;:::-;;7543:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31304:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55465:425;;;:::i;:::-;;56714:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53656:502;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57413:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56332:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52486:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33117:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8449:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49523:170;49625:4;49649:36;49673:11;49649:23;:36::i;:::-;49642:43;;49523:170;;;:::o;52394:84::-;7429:13;:11;:13::i;:::-;52467:3:::1;52457:7;:13;;;;;;;;;;;;:::i;:::-;;52394:84:::0;:::o;31135:100::-;31189:13;31222:5;31215:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31135:100;:::o;32648:171::-;32724:7;32744:23;32759:7;32744:14;:23::i;:::-;32787:15;:24;32803:7;32787:24;;;;;;;;;;;;;;;;;;;;;32780:31;;32648:171;;;:::o;56898:157::-;56994:8;4418:30;4439:8;4418:20;:30::i;:::-;57015:32:::1;57029:8;57039:7;57015:13;:32::i;:::-;56898:157:::0;;;:::o;55898:426::-;55979:5;55945:39;;:18;:30;55964:10;55945:30;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;55937:48;;;;;;56022:18;;56004:15;:36;55996:45;;;;;;56078:16;;56060:15;:34;56052:43;;;;;;56135:14;;56130:1;56115:12;;:16;;;;:::i;:::-;56114:35;56106:44;;;;;;56191:1;56161:11;:27;56173:14;;56161:27;;;;;;;;;;;:31;;;;56203:39;56213:10;56225:14;;:16;;;;;;;;;:::i;:::-;;;;;56203:9;:39::i;:::-;56253:12;;:14;;;;;;;;;:::i;:::-;;;;;;56311:5;56278:18;:30;56297:10;56278:30;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;55898:426::o;56501:201::-;56581:13;56643:7;56652:31;:11;:20;56664:7;56652:20;;;;;;;;;;;;:29;:31::i;:::-;56626:67;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56612:82;;56501:201;;;:::o;57063:163::-;57164:4;4246:10;4238:18;;:4;:18;;;4234:83;;4273:32;4294:10;4273:20;:32::i;:::-;4234:83;57181:37:::1;57200:4;57206:2;57210:7;57181:18;:37::i;:::-;57063:163:::0;;;;:::o;55032:425::-;55113:5;55079:39;;:18;:30;55098:10;55079:30;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;55071:48;;;;;;55156:18;;55138:15;:36;55130:45;;;;;;55212:16;;55194:15;:34;55186:43;;;;;;55269:14;;55264:1;55249:12;;:16;;;;:::i;:::-;55248:35;55240:44;;;;;;55325:1;55295:11;:27;55307:14;;55295:27;;;;;;;;;;;:31;;;;55337:39;55347:10;55359:14;;:16;;;;;;;;;:::i;:::-;;;;;55337:9;:39::i;:::-;55387:12;;:14;;;;;;;;;:::i;:::-;;;;;;55445:4;55412:18;:30;55431:10;55412:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;55032:425::o;52616:506::-;7429:13;:11;:13::i;:::-;52712:1:::1;52701:7;:12;;::::0;52698:417:::1;;52747:6;52730:14;:23;;;;52698:417;;;52785:1;52774:7;:12;;::::0;52771:344:::1;;52820:6;52803:14;:23;;;;52771:344;;;52858:1;52847:7;:12;;::::0;52844:271:::1;;52893:6;52876:14;:23;;;;52844:271;;;52931:1;52920:7;:12;;::::0;52917:198:::1;;52966:6;52949:14;:23;;;;52917:198;;;53004:1;52993:7;:12;;::::0;52990:125:::1;;53039:6;53022:14;:23;;;;52990:125;;;53078:25;;;;;;;;;;:::i;:::-;;;;;;;;52990:125;52917:198;52844:271;52771:344;52698:417;52616:506:::0;;:::o;45956:442::-;46053:7;46062;46082:26;46111:17;:27;46129:8;46111:27;;;;;;;;;;;46082:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46183:1;46155:30;;:7;:16;;;:30;;;46151:92;;46212:19;46202:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46151:92;46255:21;46320:17;:15;:17::i;:::-;46279:58;;46293:7;:23;;;46280:36;;:10;:36;;;;:::i;:::-;46279:58;;;;:::i;:::-;46255:82;;46358:7;:16;;;46376:13;46350:40;;;;;;45956:442;;;;;:::o;2897:143::-;2997:42;2897:143;:::o;57234:171::-;57339:4;4246:10;4238:18;;:4;:18;;;4234:83;;4273:32;4294:10;4273:20;:32::i;:::-;4234:83;57356:41:::1;57379:4;57385:2;57389:7;57356:22;:41::i;:::-;57234:171:::0;;;;:::o;54166:425::-;54247:5;54213:39;;:18;:30;54232:10;54213:30;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;54205:48;;;;;;54290:18;;54272:15;:36;54264:45;;;;;;54346:16;;54328:15;:34;54320:43;;;;;;54403:14;;54398:1;54383:12;;:16;;;;:::i;:::-;54382:35;54374:44;;;;;;54459:1;54429:11;:27;54441:14;;54429:27;;;;;;;;;;;:31;;;;54471:39;54481:10;54493:14;;:16;;;;;;;;;:::i;:::-;;;;;54471:9;:39::i;:::-;54521:12;;:14;;;;;;;;;:::i;:::-;;;;;;54579:4;54546:18;:30;54565:10;54546:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;54166:425::o;30846:222::-;30918:7;30938:13;30954:7;:16;30962:7;30954:16;;;;;;;;;;;;;;;;;;;;;30938:32;;31006:1;30989:19;;:5;:19;;;30981:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;31055:5;31048:12;;;30846:222;;;:::o;30577:207::-;30649:7;30694:1;30677:19;;:5;:19;;;30669:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30760:9;:16;30770:5;30760:16;;;;;;;;;;;;;;;;30753:23;;30577:207;;;:::o;8191:103::-;7429:13;:11;:13::i;:::-;8256:30:::1;8283:1;8256:18;:30::i;:::-;8191:103::o:0;53130:514::-;7429:13;:11;:13::i;:::-;53224:1:::1;53213:7;:12;;::::0;53210:427:::1;;53263:4;53242:18;:25;;;;53210:427;;;53299:1;53288:7;:12;;::::0;53285:352:::1;;53338:4;53317:18;:25;;;;53285:352;;;53374:1;53363:7;:12;;::::0;53360:277:::1;;53413:4;53392:18;:25;;;;53360:277;;;53449:1;53438:7;:12;;::::0;53435:202:::1;;53488:4;53467:18;:25;;;;53435:202;;;53524:1;53513:7;:12;;::::0;53510:127:::1;;53563:4;53542:18;:25;;;;53510:127;;;53600:25;;;;;;;;;;:::i;:::-;;;;;;;;53510:127;53435:202;53360:277;53285:352;53210:427;53130:514:::0;;:::o;54599:425::-;54680:5;54646:39;;:18;:30;54665:10;54646:30;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;54638:48;;;;;;54723:18;;54705:15;:36;54697:45;;;;;;54779:16;;54761:15;:34;54753:43;;;;;;54836:14;;54831:1;54816:12;;:16;;;;:::i;:::-;54815:35;54807:44;;;;;;54892:1;54862:11;:27;54874:14;;54862:27;;;;;;;;;;;:31;;;;54904:39;54914:10;54926:14;;:16;;;;;;;;;:::i;:::-;;;;;54904:9;:39::i;:::-;54954:12;;:14;;;;;;;;;:::i;:::-;;;;;;55012:4;54979:18;:30;54998:10;54979:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;54599:425::o;7543:87::-;7589:7;7616:6;;;;;;;;;;;7609:13;;7543:87;:::o;31304:104::-;31360:13;31393:7;31386:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31304:104;:::o;55465:425::-;55546:5;55512:39;;:18;:30;55531:10;55512:30;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;55504:48;;;;;;55589:18;;55571:15;:36;55563:45;;;;;;55645:16;;55627:15;:34;55619:43;;;;;;55702:14;;55697:1;55682:12;;:16;;;;:::i;:::-;55681:35;55673:44;;;;;;55758:1;55728:11;:27;55740:14;;55728:27;;;;;;;;;;;:31;;;;55770:39;55780:10;55792:14;;:16;;;;;;;;;:::i;:::-;;;;;55770:9;:39::i;:::-;55820:12;;:14;;;;;;;;;:::i;:::-;;;;;;55878:4;55845:18;:30;55864:10;55845:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;55465:425::o;56714:176::-;56818:8;4418:30;4439:8;4418:20;:30::i;:::-;56839:43:::1;56863:8;56873;56839:23;:43::i;:::-;56714:176:::0;;;:::o;53656:502::-;7429:13;:11;:13::i;:::-;53748:1:::1;53737:7;:12;;::::0;53734:417:::1;;53785:4;53766:16;:23;;;;53734:417;;;53821:1;53810:7;:12;;::::0;53807:344:::1;;53858:4;53839:16;:23;;;;53807:344;;;53894:1;53883:7;:12;;::::0;53880:271:::1;;53931:4;53912:16;:23;;;;53880:271;;;53967:1;53956:7;:12;;::::0;53953:198:::1;;54004:4;53985:16;:23;;;;53953:198;;;54040:1;54029:7;:12;;::::0;54026:125:::1;;54077:4;54058:16;:23;;;;54026:125;;;54114:25;;;;;;;;;;:::i;:::-;;;;;;;;54026:125;53953:198;53880:271;53807:344;53734:417;53656:502:::0;;:::o;57413:228::-;57564:4;4246:10;4238:18;;:4;:18;;;4234:83;;4273:32;4294:10;4273:20;:32::i;:::-;4234:83;57586:47:::1;57609:4;57615:2;57619:7;57628:4;57586:22;:47::i;:::-;57413:228:::0;;;;;:::o;56332:161::-;56432:13;56470:15;56477:7;56470:6;:15::i;:::-;56463:22;;56332:161;;;:::o;52486:122::-;7429:13;:11;:13::i;:::-;52567:33:::1;52586:8;52596:3;52567:18;:33::i;:::-;52486:122:::0;;:::o;33117:164::-;33214:4;33238:18;:25;33257:5;33238:25;;;;;;;;;;;;;;;:35;33264:8;33238:35;;;;;;;;;;;;;;;;;;;;;;;;;33231:42;;33117:164;;;;:::o;8449:201::-;7429:13;:11;:13::i;:::-;8558:1:::1;8538:22;;:8;:22;;::::0;8530:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8614:28;8633:8;8614:18;:28::i;:::-;8449:201:::0;:::o;30208:305::-;30310:4;30362:25;30347:40;;;:11;:40;;;;:105;;;;30419:33;30404:48;;;:11;:48;;;;30347:105;:158;;;;30469:36;30493:11;30469:23;:36::i;:::-;30347:158;30327:178;;30208:305;;;:::o;7708:132::-;7783:12;:10;:12::i;:::-;7772:23;;:7;:5;:7::i;:::-;:23;;;7764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7708:132::o;40623:135::-;40705:16;40713:7;40705;:16::i;:::-;40697:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;40623:135;:::o;4476:419::-;4715:1;2997:42;4667:45;;;:49;4663:225;;;2997:42;4738;;;4789:4;4796:8;4738:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4733:144;;4852:8;4833:28;;;;;;;;;;;:::i;:::-;;;;;;;;4733:144;4663:225;4476:419;:::o;32165:417::-;32246:13;32262:23;32277:7;32262:14;:23::i;:::-;32246:39;;32310:5;32304:11;;:2;:11;;;32296:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32404:5;32388:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32413:37;32430:5;32437:12;:10;:12::i;:::-;32413:16;:37::i;:::-;32388:62;32366:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;32553:21;32562:2;32566:7;32553:8;:21::i;:::-;32235:347;32165:417;;:::o;36741:110::-;36817:26;36827:2;36831:7;36817:26;;;;;;;;;;;;:9;:26::i;:::-;36741:110;;:::o;9446:723::-;9502:13;9732:1;9723:5;:10;9719:53;;9750:10;;;;;;;;;;;;;;;;;;;;;9719:53;9782:12;9797:5;9782:20;;9813:14;9838:78;9853:1;9845:4;:9;9838:78;;9871:8;;;;;:::i;:::-;;;;9902:2;9894:10;;;;;:::i;:::-;;;9838:78;;;9926:19;9958:6;9948:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9926:39;;9976:154;9992:1;9983:5;:10;9976:154;;10020:1;10010:11;;;;;:::i;:::-;;;10087:2;10079:5;:10;;;;:::i;:::-;10066:2;:24;;;;:::i;:::-;10053:39;;10036:6;10043;10036:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;10116:2;10107:11;;;;;:::i;:::-;;;9976:154;;;10154:6;10140:21;;;;;9446:723;;;;:::o;33348:336::-;33543:41;33562:12;:10;:12::i;:::-;33576:7;33543:18;:41::i;:::-;33535:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;33648:28;33658:4;33664:2;33668:7;33648:9;:28::i;:::-;33348:336;;;:::o;46680:97::-;46738:6;46764:5;46757:12;;46680:97;:::o;33755:185::-;33893:39;33910:4;33916:2;33920:7;33893:39;;;;;;;;;;;;:16;:39::i;:::-;33755:185;;;:::o;8810:191::-;8884:16;8903:6;;;;;;;;;;;8884:25;;8929:8;8920:6;;:17;;;;;;;;;;;;;;;;;;8984:8;8953:40;;8974:8;8953:40;;;;;;;;;;;;8873:128;8810:191;:::o;32891:155::-;32986:52;33005:12;:10;:12::i;:::-;33019:8;33029;32986:18;:52::i;:::-;32891:155;;:::o;34011:323::-;34185:41;34204:12;:10;:12::i;:::-;34218:7;34185:18;:41::i;:::-;34177:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;34288:38;34302:4;34308:2;34312:7;34321:4;34288:13;:38::i;:::-;34011:323;;;;:::o;47048:332::-;47167:17;:15;:17::i;:::-;47151:33;;:12;:33;;;;47143:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;47270:1;47250:22;;:8;:22;;;47242:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;47337:35;;;;;;;;47349:8;47337:35;;;;;;47359:12;47337:35;;;;;47315:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47048:332;;:::o;45686:215::-;45788:4;45827:26;45812:41;;;:11;:41;;;;:81;;;;45857:36;45881:11;45857:23;:36::i;:::-;45812:81;45805:88;;45686:215;;;:::o;6088:98::-;6141:7;6168:10;6161:17;;6088:98;:::o;35841:127::-;35906:4;35958:1;35930:30;;:7;:16;35938:7;35930:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35923:37;;35841:127;;;:::o;39902:174::-;40004:2;39977:15;:24;39993:7;39977:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40060:7;40056:2;40022:46;;40031:23;40046:7;40031:14;:23::i;:::-;40022:46;;;;;;;;;;;;39902:174;;:::o;37078:319::-;37207:18;37213:2;37217:7;37207:5;:18::i;:::-;37258:53;37289:1;37293:2;37297:7;37306:4;37258:22;:53::i;:::-;37236:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;37078:319;;;:::o;36135:264::-;36228:4;36245:13;36261:23;36276:7;36261:14;:23::i;:::-;36245:39;;36314:5;36303:16;;:7;:16;;;:52;;;;36323:32;36340:5;36347:7;36323:16;:32::i;:::-;36303:52;:87;;;;36383:7;36359:31;;:20;36371:7;36359:11;:20::i;:::-;:31;;;36303:87;36295:96;;;36135:264;;;;:::o;39158:625::-;39317:4;39290:31;;:23;39305:7;39290:14;:23::i;:::-;:31;;;39282:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;39396:1;39382:16;;:2;:16;;;39374:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39452:39;39473:4;39479:2;39483:7;39452:20;:39::i;:::-;39556:29;39573:1;39577:7;39556:8;:29::i;:::-;39617:1;39598:9;:15;39608:4;39598:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39646:1;39629:9;:13;39639:2;39629:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39677:2;39658:7;:16;39666:7;39658:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39716:7;39712:2;39697:27;;39706:4;39697:27;;;;;;;;;;;;39737:38;39757:4;39763:2;39767:7;39737:19;:38::i;:::-;39158:625;;;:::o;40219:315::-;40374:8;40365:17;;:5;:17;;;40357:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;40461:8;40423:18;:25;40442:5;40423:25;;;;;;;;;;;;;;;:35;40449:8;40423:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;40507:8;40485:41;;40500:5;40485:41;;;40517:8;40485:41;;;;;;:::i;:::-;;;;;;;;40219:315;;;:::o;35215:313::-;35371:28;35381:4;35387:2;35391:7;35371:9;:28::i;:::-;35418:47;35441:4;35447:2;35451:7;35460:4;35418:22;:47::i;:::-;35410:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;35215:313;;;;:::o;13309:157::-;13394:4;13433:25;13418:40;;;:11;:40;;;;13411:47;;13309:157;;;:::o;37733:439::-;37827:1;37813:16;;:2;:16;;;37805:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37886:16;37894:7;37886;:16::i;:::-;37885:17;37877:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37948:45;37977:1;37981:2;37985:7;37948:20;:45::i;:::-;38023:1;38006:9;:13;38016:2;38006:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38054:2;38035:7;:16;38043:7;38035:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38099:7;38095:2;38074:33;;38091:1;38074:33;;;;;;;;;;;;38120:44;38148:1;38152:2;38156:7;38120:19;:44::i;:::-;37733:439;;:::o;41322:853::-;41476:4;41497:15;:2;:13;;;:15::i;:::-;41493:675;;;41549:2;41533:36;;;41570:12;:10;:12::i;:::-;41584:4;41590:7;41599:4;41533:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41529:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41791:1;41774:6;:13;:18;41770:328;;41817:60;;;;;;;;;;:::i;:::-;;;;;;;;41770:328;42048:6;42042:13;42033:6;42029:2;42025:15;42018:38;41529:584;41665:41;;;41655:51;;;:6;:51;;;;41648:58;;;;;41493:675;42152:4;42145:11;;41322:853;;;;;;;:::o;42747:126::-;;;;:::o;43258:125::-;;;;:::o;14714:326::-;14774:4;15031:1;15009:7;:19;;;:23;15002:30;;14714:326;;;:::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:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:154::-;2878:6;2873:3;2868;2855:30;2940:1;2931:6;2926:3;2922:16;2915:27;2794:154;;;:::o;2954:412::-;3032:5;3057:66;3073:49;3115:6;3073:49;:::i;:::-;3057:66;:::i;:::-;3048:75;;3146:6;3139:5;3132:21;3184:4;3177:5;3173:16;3222:3;3213:6;3208:3;3204:16;3201:25;3198:112;;;3229:79;;:::i;:::-;3198:112;3319:41;3353:6;3348:3;3343;3319:41;:::i;:::-;3038:328;2954:412;;;;;:::o;3386:340::-;3442:5;3491:3;3484:4;3476:6;3472:17;3468:27;3458:122;;3499:79;;:::i;:::-;3458:122;3616:6;3603:20;3641:79;3716:3;3708:6;3701:4;3693:6;3689:17;3641:79;:::i;:::-;3632:88;;3448:278;3386:340;;;;:::o;3732:509::-;3801:6;3850:2;3838:9;3829:7;3825:23;3821:32;3818:119;;;3856:79;;:::i;:::-;3818:119;4004:1;3993:9;3989:17;3976:31;4034:18;4026:6;4023:30;4020:117;;;4056:79;;:::i;:::-;4020:117;4161:63;4216:7;4207:6;4196:9;4192:22;4161:63;:::i;:::-;4151:73;;3947:287;3732:509;;;;:::o;4247:99::-;4299:6;4333:5;4327:12;4317:22;;4247:99;;;:::o;4352:169::-;4436:11;4470:6;4465:3;4458:19;4510:4;4505:3;4501:14;4486:29;;4352:169;;;;:::o;4527:307::-;4595:1;4605:113;4619:6;4616:1;4613:13;4605:113;;;4704:1;4699:3;4695:11;4689:18;4685:1;4680:3;4676:11;4669:39;4641:2;4638:1;4634:10;4629:15;;4605:113;;;4736:6;4733:1;4730:13;4727:101;;;4816:1;4807:6;4802:3;4798:16;4791:27;4727:101;4576:258;4527:307;;;:::o;4840:364::-;4928:3;4956:39;4989:5;4956:39;:::i;:::-;5011:71;5075:6;5070:3;5011:71;:::i;:::-;5004:78;;5091:52;5136:6;5131:3;5124:4;5117:5;5113:16;5091:52;:::i;:::-;5168:29;5190:6;5168:29;:::i;:::-;5163:3;5159:39;5152:46;;4932:272;4840:364;;;;:::o;5210:313::-;5323:4;5361:2;5350:9;5346:18;5338:26;;5410:9;5404:4;5400:20;5396:1;5385:9;5381:17;5374:47;5438:78;5511:4;5502:6;5438:78;:::i;:::-;5430:86;;5210:313;;;;:::o;5529:77::-;5566:7;5595:5;5584:16;;5529:77;;;:::o;5612:122::-;5685:24;5703:5;5685:24;:::i;:::-;5678:5;5675:35;5665:63;;5724:1;5721;5714:12;5665:63;5612:122;:::o;5740:139::-;5786:5;5824:6;5811:20;5802:29;;5840:33;5867:5;5840:33;:::i;:::-;5740:139;;;;:::o;5885:329::-;5944:6;5993:2;5981:9;5972:7;5968:23;5964:32;5961:119;;;5999:79;;:::i;:::-;5961:119;6119:1;6144:53;6189:7;6180:6;6169:9;6165:22;6144:53;:::i;:::-;6134:63;;6090:117;5885:329;;;;:::o;6220:126::-;6257:7;6297:42;6290:5;6286:54;6275:65;;6220:126;;;:::o;6352:96::-;6389:7;6418:24;6436:5;6418:24;:::i;:::-;6407:35;;6352:96;;;:::o;6454:118::-;6541:24;6559:5;6541:24;:::i;:::-;6536:3;6529:37;6454:118;;:::o;6578:222::-;6671:4;6709:2;6698:9;6694:18;6686:26;;6722:71;6790:1;6779:9;6775:17;6766:6;6722:71;:::i;:::-;6578:222;;;;:::o;6806:122::-;6879:24;6897:5;6879:24;:::i;:::-;6872:5;6869:35;6859:63;;6918:1;6915;6908:12;6859:63;6806:122;:::o;6934:139::-;6980:5;7018:6;7005:20;6996:29;;7034:33;7061:5;7034:33;:::i;:::-;6934:139;;;;:::o;7079:474::-;7147:6;7155;7204:2;7192:9;7183:7;7179:23;7175:32;7172:119;;;7210:79;;:::i;:::-;7172:119;7330:1;7355:53;7400:7;7391:6;7380:9;7376:22;7355:53;:::i;:::-;7345:63;;7301:117;7457:2;7483:53;7528:7;7519:6;7508:9;7504:22;7483:53;:::i;:::-;7473:63;;7428:118;7079:474;;;;;:::o;7559:619::-;7636:6;7644;7652;7701:2;7689:9;7680:7;7676:23;7672:32;7669:119;;;7707:79;;:::i;:::-;7669:119;7827:1;7852:53;7897:7;7888:6;7877:9;7873:22;7852:53;:::i;:::-;7842:63;;7798:117;7954:2;7980:53;8025:7;8016:6;8005:9;8001:22;7980:53;:::i;:::-;7970:63;;7925:118;8082:2;8108:53;8153:7;8144:6;8133:9;8129:22;8108:53;:::i;:::-;8098:63;;8053:118;7559:619;;;;;:::o;8184:89::-;8220:7;8260:6;8253:5;8249:18;8238:29;;8184:89;;;:::o;8279:120::-;8351:23;8368:5;8351:23;:::i;:::-;8344:5;8341:34;8331:62;;8389:1;8386;8379:12;8331:62;8279:120;:::o;8405:137::-;8450:5;8488:6;8475:20;8466:29;;8504:32;8530:5;8504:32;:::i;:::-;8405:137;;;;:::o;8548:472::-;8615:6;8623;8672:2;8660:9;8651:7;8647:23;8643:32;8640:119;;;8678:79;;:::i;:::-;8640:119;8798:1;8823:52;8867:7;8858:6;8847:9;8843:22;8823:52;:::i;:::-;8813:62;;8769:116;8924:2;8950:53;8995:7;8986:6;8975:9;8971:22;8950:53;:::i;:::-;8940:63;;8895:118;8548:472;;;;;:::o;9026:474::-;9094:6;9102;9151:2;9139:9;9130:7;9126:23;9122:32;9119:119;;;9157:79;;:::i;:::-;9119:119;9277:1;9302:53;9347:7;9338:6;9327:9;9323:22;9302:53;:::i;:::-;9292:63;;9248:117;9404:2;9430:53;9475:7;9466:6;9455:9;9451:22;9430:53;:::i;:::-;9420:63;;9375:118;9026:474;;;;;:::o;9506:118::-;9593:24;9611:5;9593:24;:::i;:::-;9588:3;9581:37;9506:118;;:::o;9630:332::-;9751:4;9789:2;9778:9;9774:18;9766:26;;9802:71;9870:1;9859:9;9855:17;9846:6;9802:71;:::i;:::-;9883:72;9951:2;9940:9;9936:18;9927:6;9883:72;:::i;:::-;9630:332;;;;;:::o;9968:60::-;9996:3;10017:5;10010:12;;9968:60;;;:::o;10034:142::-;10084:9;10117:53;10135:34;10144:24;10162:5;10144:24;:::i;:::-;10135:34;:::i;:::-;10117:53;:::i;:::-;10104:66;;10034:142;;;:::o;10182:126::-;10232:9;10265:37;10296:5;10265:37;:::i;:::-;10252:50;;10182:126;;;:::o;10314:157::-;10395:9;10428:37;10459:5;10428:37;:::i;:::-;10415:50;;10314:157;;;:::o;10477:193::-;10595:68;10657:5;10595:68;:::i;:::-;10590:3;10583:81;10477:193;;:::o;10676:284::-;10800:4;10838:2;10827:9;10823:18;10815:26;;10851:102;10950:1;10939:9;10935:17;10926:6;10851:102;:::i;:::-;10676:284;;;;:::o;10966:329::-;11025:6;11074:2;11062:9;11053:7;11049:23;11045:32;11042:119;;;11080:79;;:::i;:::-;11042:119;11200:1;11225:53;11270:7;11261:6;11250:9;11246:22;11225:53;:::i;:::-;11215:63;;11171:117;10966:329;;;;:::o;11301:222::-;11394:4;11432:2;11421:9;11417:18;11409:26;;11445:71;11513:1;11502:9;11498:17;11489:6;11445:71;:::i;:::-;11301:222;;;;:::o;11529:116::-;11599:21;11614:5;11599:21;:::i;:::-;11592:5;11589:32;11579:60;;11635:1;11632;11625:12;11579:60;11529:116;:::o;11651:133::-;11694:5;11732:6;11719:20;11710:29;;11748:30;11772:5;11748:30;:::i;:::-;11651:133;;;;:::o;11790:468::-;11855:6;11863;11912:2;11900:9;11891:7;11887:23;11883:32;11880:119;;;11918:79;;:::i;:::-;11880:119;12038:1;12063:53;12108:7;12099:6;12088:9;12084:22;12063:53;:::i;:::-;12053:63;;12009:117;12165:2;12191:50;12233:7;12224:6;12213:9;12209:22;12191:50;:::i;:::-;12181:60;;12136:115;11790:468;;;;;:::o;12264:307::-;12325:4;12415:18;12407:6;12404:30;12401:56;;;12437:18;;:::i;:::-;12401:56;12475:29;12497:6;12475:29;:::i;:::-;12467:37;;12559:4;12553;12549:15;12541:23;;12264:307;;;:::o;12577:410::-;12654:5;12679:65;12695:48;12736:6;12695:48;:::i;:::-;12679:65;:::i;:::-;12670:74;;12767:6;12760:5;12753:21;12805:4;12798:5;12794:16;12843:3;12834:6;12829:3;12825:16;12822:25;12819:112;;;12850:79;;:::i;:::-;12819:112;12940:41;12974:6;12969:3;12964;12940:41;:::i;:::-;12660:327;12577:410;;;;;:::o;13006:338::-;13061:5;13110:3;13103:4;13095:6;13091:17;13087:27;13077:122;;13118:79;;:::i;:::-;13077:122;13235:6;13222:20;13260:78;13334:3;13326:6;13319:4;13311:6;13307:17;13260:78;:::i;:::-;13251:87;;13067:277;13006:338;;;;:::o;13350:943::-;13445:6;13453;13461;13469;13518:3;13506:9;13497:7;13493:23;13489:33;13486:120;;;13525:79;;:::i;:::-;13486:120;13645:1;13670:53;13715:7;13706:6;13695:9;13691:22;13670:53;:::i;:::-;13660:63;;13616:117;13772:2;13798:53;13843:7;13834:6;13823:9;13819:22;13798:53;:::i;:::-;13788:63;;13743:118;13900:2;13926:53;13971:7;13962:6;13951:9;13947:22;13926:53;:::i;:::-;13916:63;;13871:118;14056:2;14045:9;14041:18;14028:32;14087:18;14079:6;14076:30;14073:117;;;14109:79;;:::i;:::-;14073:117;14214:62;14268:7;14259:6;14248:9;14244:22;14214:62;:::i;:::-;14204:72;;13999:287;13350:943;;;;;;;:::o;14299:109::-;14335:7;14375:26;14368:5;14364:38;14353:49;;14299:109;;;:::o;14414:120::-;14486:23;14503:5;14486:23;:::i;:::-;14479:5;14476:34;14466:62;;14524:1;14521;14514:12;14466:62;14414:120;:::o;14540:137::-;14585:5;14623:6;14610:20;14601:29;;14639:32;14665:5;14639:32;:::i;:::-;14540:137;;;;:::o;14683:472::-;14750:6;14758;14807:2;14795:9;14786:7;14782:23;14778:32;14775:119;;;14813:79;;:::i;:::-;14775:119;14933:1;14958:53;15003:7;14994:6;14983:9;14979:22;14958:53;:::i;:::-;14948:63;;14904:117;15060:2;15086:52;15130:7;15121:6;15110:9;15106:22;15086:52;:::i;:::-;15076:62;;15031:117;14683:472;;;;;:::o;15161:474::-;15229:6;15237;15286:2;15274:9;15265:7;15261:23;15257:32;15254:119;;;15292:79;;:::i;:::-;15254:119;15412:1;15437:53;15482:7;15473:6;15462:9;15458:22;15437:53;:::i;:::-;15427:63;;15383:117;15539:2;15565:53;15610:7;15601:6;15590:9;15586:22;15565:53;:::i;:::-;15555:63;;15510:118;15161:474;;;;;:::o;15641:180::-;15689:77;15686:1;15679:88;15786:4;15783:1;15776:15;15810:4;15807:1;15800:15;15827:320;15871:6;15908:1;15902:4;15898:12;15888:22;;15955:1;15949:4;15945:12;15976:18;15966:81;;16032:4;16024:6;16020:17;16010:27;;15966:81;16094:2;16086:6;16083:14;16063:18;16060:38;16057:84;;16113:18;;:::i;:::-;16057:84;15878:269;15827:320;;;:::o;16153:180::-;16201:77;16198:1;16191:88;16298:4;16295:1;16288:15;16322:4;16319:1;16312:15;16339:305;16379:3;16398:20;16416:1;16398:20;:::i;:::-;16393:25;;16432:20;16450:1;16432:20;:::i;:::-;16427:25;;16586:1;16518:66;16514:74;16511:1;16508:81;16505:107;;;16592:18;;:::i;:::-;16505:107;16636:1;16633;16629:9;16622:16;;16339:305;;;;:::o;16650:233::-;16689:3;16712:24;16730:5;16712:24;:::i;:::-;16703:33;;16758:66;16751:5;16748:77;16745:103;;16828:18;;:::i;:::-;16745:103;16875:1;16868:5;16864:13;16857:20;;16650:233;;;:::o;16889:148::-;16991:11;17028:3;17013:18;;16889:148;;;;:::o;17043:141::-;17092:4;17115:3;17107:11;;17138:3;17135:1;17128:14;17172:4;17169:1;17159:18;17151:26;;17043:141;;;:::o;17214:845::-;17317:3;17354:5;17348:12;17383:36;17409:9;17383:36;:::i;:::-;17435:89;17517:6;17512:3;17435:89;:::i;:::-;17428:96;;17555:1;17544:9;17540:17;17571:1;17566:137;;;;17717:1;17712:341;;;;17533:520;;17566:137;17650:4;17646:9;17635;17631:25;17626:3;17619:38;17686:6;17681:3;17677:16;17670:23;;17566:137;;17712:341;17779:38;17811:5;17779:38;:::i;:::-;17839:1;17853:154;17867:6;17864:1;17861:13;17853:154;;;17941:7;17935:14;17931:1;17926:3;17922:11;17915:35;17991:1;17982:7;17978:15;17967:26;;17889:4;17886:1;17882:12;17877:17;;17853:154;;;18036:6;18031:3;18027:16;18020:23;;17719:334;;17533:520;;17321:738;;17214:845;;;;:::o;18065:377::-;18171:3;18199:39;18232:5;18199:39;:::i;:::-;18254:89;18336:6;18331:3;18254:89;:::i;:::-;18247:96;;18352:52;18397:6;18392:3;18385:4;18378:5;18374:16;18352:52;:::i;:::-;18429:6;18424:3;18420:16;18413:23;;18175:267;18065:377;;;;:::o;18448:155::-;18588:7;18584:1;18576:6;18572:14;18565:31;18448:155;:::o;18609:400::-;18769:3;18790:84;18872:1;18867:3;18790:84;:::i;:::-;18783:91;;18883:93;18972:3;18883:93;:::i;:::-;19001:1;18996:3;18992:11;18985:18;;18609:400;;;:::o;19015:695::-;19293:3;19315:92;19403:3;19394:6;19315:92;:::i;:::-;19308:99;;19424:95;19515:3;19506:6;19424:95;:::i;:::-;19417:102;;19536:148;19680:3;19536:148;:::i;:::-;19529:155;;19701:3;19694:10;;19015:695;;;;;:::o;19716:165::-;19856:17;19852:1;19844:6;19840:14;19833:41;19716:165;:::o;19887:366::-;20029:3;20050:67;20114:2;20109:3;20050:67;:::i;:::-;20043:74;;20126:93;20215:3;20126:93;:::i;:::-;20244:2;20239:3;20235:12;20228:19;;19887:366;;;:::o;20259:419::-;20425:4;20463:2;20452:9;20448:18;20440:26;;20512:9;20506:4;20502:20;20498:1;20487:9;20483:17;20476:47;20540:131;20666:4;20540:131;:::i;:::-;20532:139;;20259:419;;;:::o;20684:348::-;20724:7;20747:20;20765:1;20747:20;:::i;:::-;20742:25;;20781:20;20799:1;20781:20;:::i;:::-;20776:25;;20969:1;20901:66;20897:74;20894:1;20891:81;20886:1;20879:9;20872:17;20868:105;20865:131;;;20976:18;;:::i;:::-;20865:131;21024:1;21021;21017:9;21006:20;;20684:348;;;;:::o;21038:180::-;21086:77;21083:1;21076:88;21183:4;21180:1;21173:15;21207:4;21204:1;21197:15;21224:185;21264:1;21281:20;21299:1;21281:20;:::i;:::-;21276:25;;21315:20;21333:1;21315:20;:::i;:::-;21310:25;;21354:1;21344:35;;21359:18;;:::i;:::-;21344:35;21401:1;21398;21394:9;21389:14;;21224:185;;;;:::o;21415:174::-;21555:26;21551:1;21543:6;21539:14;21532:50;21415:174;:::o;21595:366::-;21737:3;21758:67;21822:2;21817:3;21758:67;:::i;:::-;21751:74;;21834:93;21923:3;21834:93;:::i;:::-;21952:2;21947:3;21943:12;21936:19;;21595:366;;;:::o;21967:419::-;22133:4;22171:2;22160:9;22156:18;22148:26;;22220:9;22214:4;22210:20;22206:1;22195:9;22191:17;22184:47;22248:131;22374:4;22248:131;:::i;:::-;22240:139;;21967:419;;;:::o;22392:228::-;22532:34;22528:1;22520:6;22516:14;22509:58;22601:11;22596:2;22588:6;22584:15;22577:36;22392:228;:::o;22626:366::-;22768:3;22789:67;22853:2;22848:3;22789:67;:::i;:::-;22782:74;;22865:93;22954:3;22865:93;:::i;:::-;22983:2;22978:3;22974:12;22967:19;;22626:366;;;:::o;22998:419::-;23164:4;23202:2;23191:9;23187:18;23179:26;;23251:9;23245:4;23241:20;23237:1;23226:9;23222:17;23215:47;23279:131;23405:4;23279:131;:::i;:::-;23271:139;;22998:419;;;:::o;23423:225::-;23563:34;23559:1;23551:6;23547:14;23540:58;23632:8;23627:2;23619:6;23615:15;23608:33;23423:225;:::o;23654:366::-;23796:3;23817:67;23881:2;23876:3;23817:67;:::i;:::-;23810:74;;23893:93;23982:3;23893:93;:::i;:::-;24011:2;24006:3;24002:12;23995:19;;23654:366;;;:::o;24026:419::-;24192:4;24230:2;24219:9;24215:18;24207:26;;24279:9;24273:4;24269:20;24265:1;24254:9;24250:17;24243:47;24307:131;24433:4;24307:131;:::i;:::-;24299:139;;24026:419;;;:::o;24451:182::-;24591:34;24587:1;24579:6;24575:14;24568:58;24451:182;:::o;24639:366::-;24781:3;24802:67;24866:2;24861:3;24802:67;:::i;:::-;24795:74;;24878:93;24967:3;24878:93;:::i;:::-;24996:2;24991:3;24987:12;24980:19;;24639:366;;;:::o;25011:419::-;25177:4;25215:2;25204:9;25200:18;25192:26;;25264:9;25258:4;25254:20;25250:1;25239:9;25235:17;25228:47;25292:131;25418:4;25292:131;:::i;:::-;25284:139;;25011:419;;;:::o;25436:332::-;25557:4;25595:2;25584:9;25580:18;25572:26;;25608:71;25676:1;25665:9;25661:17;25652:6;25608:71;:::i;:::-;25689:72;25757:2;25746:9;25742:18;25733:6;25689:72;:::i;:::-;25436:332;;;;;:::o;25774:137::-;25828:5;25859:6;25853:13;25844:22;;25875:30;25899:5;25875:30;:::i;:::-;25774:137;;;;:::o;25917:345::-;25984:6;26033:2;26021:9;26012:7;26008:23;26004:32;26001:119;;;26039:79;;:::i;:::-;26001:119;26159:1;26184:61;26237:7;26228:6;26217:9;26213:22;26184:61;:::i;:::-;26174:71;;26130:125;25917:345;;;;:::o;26268:220::-;26408:34;26404:1;26396:6;26392:14;26385:58;26477:3;26472:2;26464:6;26460:15;26453:28;26268:220;:::o;26494:366::-;26636:3;26657:67;26721:2;26716:3;26657:67;:::i;:::-;26650:74;;26733:93;26822:3;26733:93;:::i;:::-;26851:2;26846:3;26842:12;26835:19;;26494:366;;;:::o;26866:419::-;27032:4;27070:2;27059:9;27055:18;27047:26;;27119:9;27113:4;27109:20;27105:1;27094:9;27090:17;27083:47;27147:131;27273:4;27147:131;:::i;:::-;27139:139;;26866:419;;;:::o;27291:249::-;27431:34;27427:1;27419:6;27415:14;27408:58;27500:32;27495:2;27487:6;27483:15;27476:57;27291:249;:::o;27546:366::-;27688:3;27709:67;27773:2;27768:3;27709:67;:::i;:::-;27702:74;;27785:93;27874:3;27785:93;:::i;:::-;27903:2;27898:3;27894:12;27887:19;;27546:366;;;:::o;27918:419::-;28084:4;28122:2;28111:9;28107:18;28099:26;;28171:9;28165:4;28161:20;28157:1;28146:9;28142:17;28135:47;28199:131;28325:4;28199:131;:::i;:::-;28191:139;;27918:419;;;:::o;28343:191::-;28383:4;28403:20;28421:1;28403:20;:::i;:::-;28398:25;;28437:20;28455:1;28437:20;:::i;:::-;28432:25;;28476:1;28473;28470:8;28467:34;;;28481:18;;:::i;:::-;28467:34;28526:1;28523;28519:9;28511:17;;28343:191;;;;:::o;28540:176::-;28572:1;28589:20;28607:1;28589:20;:::i;:::-;28584:25;;28623:20;28641:1;28623:20;:::i;:::-;28618:25;;28662:1;28652:35;;28667:18;;:::i;:::-;28652:35;28708:1;28705;28701:9;28696:14;;28540:176;;;;:::o;28722:180::-;28770:77;28767:1;28760:88;28867:4;28864:1;28857:15;28891:4;28888:1;28881:15;28908:233;29048:34;29044:1;29036:6;29032:14;29025:58;29117:16;29112:2;29104:6;29100:15;29093:41;28908:233;:::o;29147:366::-;29289:3;29310:67;29374:2;29369:3;29310:67;:::i;:::-;29303:74;;29386:93;29475:3;29386:93;:::i;:::-;29504:2;29499:3;29495:12;29488:19;;29147:366;;;:::o;29519:419::-;29685:4;29723:2;29712:9;29708:18;29700:26;;29772:9;29766:4;29762:20;29758:1;29747:9;29743:17;29736:47;29800:131;29926:4;29800:131;:::i;:::-;29792:139;;29519:419;;;:::o;29944:229::-;30084:34;30080:1;30072:6;30068:14;30061:58;30153:12;30148:2;30140:6;30136:15;30129:37;29944:229;:::o;30179:366::-;30321:3;30342:67;30406:2;30401:3;30342:67;:::i;:::-;30335:74;;30418:93;30507:3;30418:93;:::i;:::-;30536:2;30531:3;30527:12;30520:19;;30179:366;;;:::o;30551:419::-;30717:4;30755:2;30744:9;30740:18;30732:26;;30804:9;30798:4;30794:20;30790:1;30779:9;30775:17;30768:47;30832:131;30958:4;30832:131;:::i;:::-;30824:139;;30551:419;;;:::o;30976:175::-;31116:27;31112:1;31104:6;31100:14;31093:51;30976:175;:::o;31157:366::-;31299:3;31320:67;31384:2;31379:3;31320:67;:::i;:::-;31313:74;;31396:93;31485:3;31396:93;:::i;:::-;31514:2;31509:3;31505:12;31498:19;;31157:366;;;:::o;31529:419::-;31695:4;31733:2;31722:9;31718:18;31710:26;;31782:9;31776:4;31772:20;31768:1;31757:9;31753:17;31746:47;31810:131;31936:4;31810:131;:::i;:::-;31802:139;;31529:419;;;:::o;31954:237::-;32094:34;32090:1;32082:6;32078:14;32071:58;32163:20;32158:2;32150:6;32146:15;32139:45;31954:237;:::o;32197:366::-;32339:3;32360:67;32424:2;32419:3;32360:67;:::i;:::-;32353:74;;32436:93;32525:3;32436:93;:::i;:::-;32554:2;32549:3;32545:12;32538:19;;32197:366;;;:::o;32569:419::-;32735:4;32773:2;32762:9;32758:18;32750:26;;32822:9;32816:4;32812:20;32808:1;32797:9;32793:17;32786:47;32850:131;32976:4;32850:131;:::i;:::-;32842:139;;32569:419;;;:::o;32994:224::-;33134:34;33130:1;33122:6;33118:14;33111:58;33203:7;33198:2;33190:6;33186:15;33179:32;32994:224;:::o;33224:366::-;33366:3;33387:67;33451:2;33446:3;33387:67;:::i;:::-;33380:74;;33463:93;33552:3;33463:93;:::i;:::-;33581:2;33576:3;33572:12;33565:19;;33224:366;;;:::o;33596:419::-;33762:4;33800:2;33789:9;33785:18;33777:26;;33849:9;33843:4;33839:20;33835:1;33824:9;33820:17;33813:47;33877:131;34003:4;33877:131;:::i;:::-;33869:139;;33596:419;;;:::o;34021:223::-;34161:34;34157:1;34149:6;34145:14;34138:58;34230:6;34225:2;34217:6;34213:15;34206:31;34021:223;:::o;34250:366::-;34392:3;34413:67;34477:2;34472:3;34413:67;:::i;:::-;34406:74;;34489:93;34578:3;34489:93;:::i;:::-;34607:2;34602:3;34598:12;34591:19;;34250:366;;;:::o;34622:419::-;34788:4;34826:2;34815:9;34811:18;34803:26;;34875:9;34869:4;34865:20;34861:1;34850:9;34846:17;34839:47;34903:131;35029:4;34903:131;:::i;:::-;34895:139;;34622:419;;;:::o;35047:175::-;35187:27;35183:1;35175:6;35171:14;35164:51;35047:175;:::o;35228:366::-;35370:3;35391:67;35455:2;35450:3;35391:67;:::i;:::-;35384:74;;35467:93;35556:3;35467:93;:::i;:::-;35585:2;35580:3;35576:12;35569:19;;35228:366;;;:::o;35600:419::-;35766:4;35804:2;35793:9;35789:18;35781:26;;35853:9;35847:4;35843:20;35839:1;35828:9;35824:17;35817:47;35881:131;36007:4;35881:131;:::i;:::-;35873:139;;35600:419;;;:::o;36025:182::-;36165:34;36161:1;36153:6;36149:14;36142:58;36025:182;:::o;36213:366::-;36355:3;36376:67;36440:2;36435:3;36376:67;:::i;:::-;36369:74;;36452:93;36541:3;36452:93;:::i;:::-;36570:2;36565:3;36561:12;36554:19;;36213:366;;;:::o;36585:419::-;36751:4;36789:2;36778:9;36774:18;36766:26;;36838:9;36832:4;36828:20;36824:1;36813:9;36809:17;36802:47;36866:131;36992:4;36866:131;:::i;:::-;36858:139;;36585:419;;;:::o;37010:178::-;37150:30;37146:1;37138:6;37134:14;37127:54;37010:178;:::o;37194:366::-;37336:3;37357:67;37421:2;37416:3;37357:67;:::i;:::-;37350:74;;37433:93;37522:3;37433:93;:::i;:::-;37551:2;37546:3;37542:12;37535:19;;37194:366;;;:::o;37566:419::-;37732:4;37770:2;37759:9;37755:18;37747:26;;37819:9;37813:4;37809:20;37805:1;37794:9;37790:17;37783:47;37847:131;37973:4;37847:131;:::i;:::-;37839:139;;37566:419;;;:::o;37991:98::-;38042:6;38076:5;38070:12;38060:22;;37991:98;;;:::o;38095:168::-;38178:11;38212:6;38207:3;38200:19;38252:4;38247:3;38243:14;38228:29;;38095:168;;;;:::o;38269:360::-;38355:3;38383:38;38415:5;38383:38;:::i;:::-;38437:70;38500:6;38495:3;38437:70;:::i;:::-;38430:77;;38516:52;38561:6;38556:3;38549:4;38542:5;38538:16;38516:52;:::i;:::-;38593:29;38615:6;38593:29;:::i;:::-;38588:3;38584:39;38577:46;;38359:270;38269:360;;;;:::o;38635:640::-;38830:4;38868:3;38857:9;38853:19;38845:27;;38882:71;38950:1;38939:9;38935:17;38926:6;38882:71;:::i;:::-;38963:72;39031:2;39020:9;39016:18;39007:6;38963:72;:::i;:::-;39045;39113:2;39102:9;39098:18;39089:6;39045:72;:::i;:::-;39164:9;39158:4;39154:20;39149:2;39138:9;39134:18;39127:48;39192:76;39263:4;39254:6;39192:76;:::i;:::-;39184:84;;38635:640;;;;;;;:::o;39281:141::-;39337:5;39368:6;39362:13;39353:22;;39384:32;39410:5;39384:32;:::i;:::-;39281:141;;;;:::o;39428:349::-;39497:6;39546:2;39534:9;39525:7;39521:23;39517:32;39514:119;;;39552:79;;:::i;:::-;39514:119;39672:1;39697:63;39752:7;39743:6;39732:9;39728:22;39697:63;:::i;:::-;39687:73;;39643:127;39428:349;;;;:::o

Swarm Source

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