ETH Price: $3,250.85 (+4.36%)
Gas: 2 Gwei

Catch-22 (C22)
 

Overview

TokenID

213

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
Catch22

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-26
*/

pragma solidity ^0.8.7;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _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: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

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

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

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

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

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

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

        _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 a {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 a {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 Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}

contract Catch22 is ERC721, ERC721Enumerable, Ownable {
    uint256 public constant maxSupply = 222;

    constructor() ERC721("Catch-22", "C22") {}

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal override(ERC721) {
        super._burn(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function mint() public {
        uint256 supply = totalSupply();
        require(supply < maxSupply, "SOLD OUT!");
        _safeMint(msg.sender, supply + 1);
    }

    function random(uint number, uint seed) public view returns(uint){
        return uint(keccak256(abi.encodePacked(seed))) % (number + 1);
    }

    function getSvg(uint tokenId) private view returns (string memory) {
        string memory svg;
        svg = string(abi.encodePacked(
            "<svg width='350px' height='350px' viewBox='0 0 350 350' fill='none' xmlns='http://www.w3.org/2000/svg'>",
            "<rect width='100%' height='100%' fill='rgb(",
            uint2str(random(222, tokenId + 7) + 10),
            ",",
            uint2str(random(222, tokenId + 3) + 10),
            ",",
            uint2str(random(222, tokenId + 1) + 10),
            ")'/>",
            "<text x='50%' y='50%' fill='black' font-family='fantasy' font-size='220px' dominant-baseline='middle' text-anchor='middle'>22</text>",
            "<text x='", uint2str(random(70, tokenId + 1) + 15), "%' y='", uint2str(random(75, tokenId + 2) + 15), "%' fill='white' font-family='fantasy' font-size='100px' dominant-baseline='middle' text-anchor='middle'>2</text>",
            "<text x='", uint2str(random(70, tokenId + 3) + 15), "%' y='", uint2str(random(75, tokenId + 5) + 15), "%' fill='white' font-family='fantasy' font-size='100px' dominant-baseline='middle' text-anchor='middle'>22</text> </svg>"
        ));
        return svg;
    }

    function tokenURI(uint256 tokenId) override(ERC721) public view returns (string memory) {
        string memory json = Base64.encode(
            bytes(string(
                abi.encodePacked(
                    '{"name": "#',
                        uint2str(tokenId),
                    '",',
                    '"image_data": "',
                        getSvg(tokenId),
                    '",',
                    '"attributes": [',
                        '{"trait_type": "Year", "value": "22" },',
                        '{"trait_type": "Month", "value": "2" },',
                        '{"trait_type": "Day", "value": "22" }',
                    ']}'
                )
            ))
        );
        return string(abi.encodePacked('data:application/json;base64,', json));
    }    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"random","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600881526020017f43617463682d32320000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4332320000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000256565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b600060028204905060018216806200026f57607f821691505b602082108114156200028657620002856200028c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61412380620002cb6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a9dd12251161007c578063a9dd122514610363578063b88d4fde14610393578063c87b56dd146103af578063d5abeb01146103df578063e985e9c5146103fd578063f2fde38b1461042d57610142565b806370a08231146102d1578063715018a6146103015780638da5cb5b1461030b57806395d89b4114610329578063a22cb4651461034757610142565b806318160ddd1161010a57806318160ddd146101eb57806323b872dd146102095780632f745c591461022557806342842e0e146102555780634f6ccce7146102715780636352211e146102a157610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c55780631249c58b146101e1575b600080fd5b610161600480360381019061015c9190612605565b610449565b60405161016e9190612eb3565b60405180910390f35b61017f61045b565b60405161018c9190612ece565b60405180910390f35b6101af60048036038101906101aa919061265f565b6104ed565b6040516101bc9190612e4c565b60405180910390f35b6101df60048036038101906101da91906125c5565b610572565b005b6101e961068a565b005b6101f36106f2565b6040516102009190613130565b60405180910390f35b610223600480360381019061021e91906124af565b6106ff565b005b61023f600480360381019061023a91906125c5565b61075f565b60405161024c9190613130565b60405180910390f35b61026f600480360381019061026a91906124af565b610804565b005b61028b6004803603810190610286919061265f565b610824565b6040516102989190613130565b60405180910390f35b6102bb60048036038101906102b6919061265f565b610895565b6040516102c89190612e4c565b60405180910390f35b6102eb60048036038101906102e69190612442565b610947565b6040516102f89190613130565b60405180910390f35b6103096109ff565b005b610313610a87565b6040516103209190612e4c565b60405180910390f35b610331610ab1565b60405161033e9190612ece565b60405180910390f35b610361600480360381019061035c9190612585565b610b43565b005b61037d6004803603810190610378919061268c565b610b59565b60405161038a9190613130565b60405180910390f35b6103ad60048036038101906103a89190612502565b610ba4565b005b6103c960048036038101906103c4919061265f565b610c06565b6040516103d69190612ece565b60405180910390f35b6103e7610c6e565b6040516103f49190613130565b60405180910390f35b6104176004803603810190610412919061246f565b610c73565b6040516104249190612eb3565b60405180910390f35b61044760048036038101906104429190612442565b610d07565b005b600061045482610dff565b9050919050565b60606000805461046a906133f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610496906133f3565b80156104e35780601f106104b8576101008083540402835291602001916104e3565b820191906000526020600020905b8154815290600101906020018083116104c657829003601f168201915b5050505050905090565b60006104f882610e79565b610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052e90613070565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061057d82610895565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e5906130d0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661060d610ee5565b73ffffffffffffffffffffffffffffffffffffffff16148061063c575061063b81610636610ee5565b610c73565b5b61067b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067290612ff0565b60405180910390fd5b6106858383610eed565b505050565b60006106946106f2565b905060de81106106d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d090613090565b60405180910390fd5b6106ef336001836106ea91906131e4565b610fa6565b50565b6000600880549050905090565b61071061070a610ee5565b82610fc4565b61074f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610746906130f0565b60405180910390fd5b61075a8383836110a2565b505050565b600061076a83610947565b82106107ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a290612ef0565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61081f83838360405180602001604052806000815250610ba4565b505050565b600061082e6106f2565b821061086f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086690613110565b60405180910390fd5b6008828154811061088357610882613596565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590613030565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156109b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109af90613010565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a07610ee5565b73ffffffffffffffffffffffffffffffffffffffff16610a25610a87565b73ffffffffffffffffffffffffffffffffffffffff1614610a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a72906130b0565b60405180910390fd5b610a856000611309565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ac0906133f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610aec906133f3565b8015610b395780601f10610b0e57610100808354040283529160200191610b39565b820191906000526020600020905b815481529060010190602001808311610b1c57829003601f168201915b5050505050905090565b610b55610b4e610ee5565b83836113cf565b5050565b6000600183610b6891906131e4565b82604051602001610b799190612e31565b6040516020818303038152906040528051906020012060001c610b9c91906134a9565b905092915050565b610bb5610baf610ee5565b83610fc4565b610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb906130f0565b60405180910390fd5b610c008484848461153c565b50505050565b60606000610c44610c1684611598565b610c1f85611721565b604051602001610c30929190612c9f565b604051602081830303815290604052611881565b905080604051602001610c579190612d26565b604051602081830303815290604052915050919050565b60de81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d0f610ee5565b73ffffffffffffffffffffffffffffffffffffffff16610d2d610a87565b73ffffffffffffffffffffffffffffffffffffffff1614610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a906130b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea90612f30565b60405180910390fd5b610dfc81611309565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e725750610e71826119fa565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610f6083610895565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610fc0828260405180602001604052806000815250611adc565b5050565b6000610fcf82610e79565b61100e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100590612fd0565b60405180910390fd5b600061101983610895565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061108857508373ffffffffffffffffffffffffffffffffffffffff16611070846104ed565b73ffffffffffffffffffffffffffffffffffffffff16145b8061109957506110988185610c73565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166110c282610895565b73ffffffffffffffffffffffffffffffffffffffff1614611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90612f50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90612f90565b60405180910390fd5b611193838383611b37565b61119e600082610eed565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111ee91906132fc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461124591906131e4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611304838383611b47565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561143e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143590612fb0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161152f9190612eb3565b60405180910390a3505050565b6115478484846110a2565b61155384848484611b4c565b611592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158990612f10565b60405180910390fd5b50505050565b606060008214156115e0576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061171c565b600082905060005b600082146116125780806115fb90613456565b915050600a8261160b9190613271565b91506115e8565b60008167ffffffffffffffff81111561162e5761162d6135c5565b5b6040519080825280601f01601f1916602001820160405280156116605781602001600182028036833780820191505090505b50905060008290505b600086146117145760018161167e91906132fc565b90506000600a80886116909190613271565b61169a91906132a2565b876116a591906132fc565b60306116b1919061323a565b905060008160f81b9050808484815181106116cf576116ce613596565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8861170b9190613271565b97505050611669565b819450505050505b919050565b60608061174f600a61174060de60078761173b91906131e4565b610b59565b61174a91906131e4565b611598565b61177a600a61176b60de60038861176691906131e4565b610b59565b61177591906131e4565b611598565b6117a5600a61179660de60018961179191906131e4565b610b59565b6117a091906131e4565b611598565b6117d0600f6117c1604660018a6117bc91906131e4565b610b59565b6117cb91906131e4565b611598565b6117fb600f6117ec604b60028b6117e791906131e4565b610b59565b6117f691906131e4565b611598565b611826600f611817604660038c61181291906131e4565b610b59565b61182191906131e4565b611598565b611851600f611842604b60058d61183d91906131e4565b610b59565b61184c91906131e4565b611598565b6040516020016118679796959493929190612d48565b604051602081830303815290604052905080915050919050565b60606000825114156118a4576040518060200160405280600081525090506119f5565b60006040518060600160405280604081526020016140ae60409139905060006003600285516118d391906131e4565b6118dd9190613271565b60046118e991906132a2565b905060006020826118fa91906131e4565b67ffffffffffffffff811115611913576119126135c5565b5b6040519080825280601f01601f1916602001820160405280156119455781602001600182028036833780820191505090505b509050818152600183018586518101602084015b818310156119b4576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050611959565b6003895106600181146119ce57600281146119de576119e9565b613d3d60f01b60028303526119e9565b603d60f81b60018303525b50505050508093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ac557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ad55750611ad482611ce3565b5b9050919050565b611ae68383611d4d565b611af36000848484611b4c565b611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990612f10565b60405180910390fd5b505050565b611b42838383611f27565b505050565b505050565b6000611b6d8473ffffffffffffffffffffffffffffffffffffffff1661203b565b15611cd6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b96610ee5565b8786866040518563ffffffff1660e01b8152600401611bb89493929190612e67565b602060405180830381600087803b158015611bd257600080fd5b505af1925050508015611c0357506040513d601f19601f82011682018060405250810190611c009190612632565b60015b611c86573d8060008114611c33576040519150601f19603f3d011682016040523d82523d6000602084013e611c38565b606091505b50600081511415611c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7590612f10565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611cdb565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db490613050565b60405180910390fd5b611dc681610e79565b15611e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfd90612f70565b60405180910390fd5b611e1260008383611b37565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e6291906131e4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f2360008383611b47565b5050565b611f3283838361205e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f7557611f7081612063565b611fb4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fb357611fb283826120ac565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ff757611ff281612219565b612036565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120355761203482826122ea565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016120b984610947565b6120c391906132fc565b90506000600760008481526020019081526020016000205490508181146121a8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061222d91906132fc565b905060006009600084815260200190815260200160002054905060006008838154811061225d5761225c613596565b5b90600052602060002001549050806008838154811061227f5761227e613596565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806122ce576122cd613567565b5b6001900381819060005260206000200160009055905550505050565b60006122f583610947565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600061237c61237784613170565b61314b565b905082815260208101848484011115612398576123976135f9565b5b6123a38482856133b1565b509392505050565b6000813590506123ba81614051565b92915050565b6000813590506123cf81614068565b92915050565b6000813590506123e48161407f565b92915050565b6000815190506123f98161407f565b92915050565b600082601f830112612414576124136135f4565b5b8135612424848260208601612369565b91505092915050565b60008135905061243c81614096565b92915050565b60006020828403121561245857612457613603565b5b6000612466848285016123ab565b91505092915050565b6000806040838503121561248657612485613603565b5b6000612494858286016123ab565b92505060206124a5858286016123ab565b9150509250929050565b6000806000606084860312156124c8576124c7613603565b5b60006124d6868287016123ab565b93505060206124e7868287016123ab565b92505060406124f88682870161242d565b9150509250925092565b6000806000806080858703121561251c5761251b613603565b5b600061252a878288016123ab565b945050602061253b878288016123ab565b935050604061254c8782880161242d565b925050606085013567ffffffffffffffff81111561256d5761256c6135fe565b5b612579878288016123ff565b91505092959194509250565b6000806040838503121561259c5761259b613603565b5b60006125aa858286016123ab565b92505060206125bb858286016123c0565b9150509250929050565b600080604083850312156125dc576125db613603565b5b60006125ea858286016123ab565b92505060206125fb8582860161242d565b9150509250929050565b60006020828403121561261b5761261a613603565b5b6000612629848285016123d5565b91505092915050565b60006020828403121561264857612647613603565b5b6000612656848285016123ea565b91505092915050565b60006020828403121561267557612674613603565b5b60006126838482850161242d565b91505092915050565b600080604083850312156126a3576126a2613603565b5b60006126b18582860161242d565b92505060206126c28582860161242d565b9150509250929050565b6126d581613330565b82525050565b6126e481613342565b82525050565b60006126f5826131a1565b6126ff81856131b7565b935061270f8185602086016133c0565b61271881613608565b840191505092915050565b600061272e826131ac565b61273881856131c8565b93506127488185602086016133c0565b61275181613608565b840191505092915050565b6000612767826131ac565b61277181856131d9565b93506127818185602086016133c0565b80840191505092915050565b600061279a6027836131d9565b91506127a582613619565b602782019050919050565b60006127bd602b836131c8565b91506127c882613668565b604082019050919050565b60006127e06032836131c8565b91506127eb826136b7565b604082019050919050565b60006128036009836131d9565b915061280e82613706565b600982019050919050565b60006128266026836131c8565b91506128318261372f565b604082019050919050565b60006128496002836131d9565b91506128548261377e565b600282019050919050565b600061286c6025836131c8565b9150612877826137a7565b604082019050919050565b600061288f601c836131c8565b915061289a826137f6565b602082019050919050565b60006128b2600f836131d9565b91506128bd8261381f565b600f82019050919050565b60006128d56001836131d9565b91506128e082613848565b600182019050919050565b60006128f86024836131c8565b915061290382613871565b604082019050919050565b600061291b6019836131c8565b9150612926826138c0565b602082019050919050565b600061293e602b836131d9565b9150612949826138e9565b602b82019050919050565b6000612961600b836131d9565b915061296c82613938565b600b82019050919050565b6000612984602c836131c8565b915061298f82613961565b604082019050919050565b60006129a76038836131c8565b91506129b2826139b0565b604082019050919050565b60006129ca602a836131c8565b91506129d5826139ff565b604082019050919050565b60006129ed6029836131c8565b91506129f882613a4e565b604082019050919050565b6000612a106004836131d9565b9150612a1b82613a9d565b600482019050919050565b6000612a336020836131c8565b9150612a3e82613ac6565b602082019050919050565b6000612a56602c836131c8565b9150612a6182613aef565b604082019050919050565b6000612a796009836131c8565b9150612a8482613b3e565b602082019050919050565b6000612a9c6020836131c8565b9150612aa782613b67565b602082019050919050565b6000612abf6078836131d9565b9150612aca82613b90565b607882019050919050565b6000612ae2600f836131d9565b9150612aed82613c2b565b600f82019050919050565b6000612b056002836131d9565b9150612b1082613c54565b600282019050919050565b6000612b286084836131d9565b9150612b3382613c7d565b608482019050919050565b6000612b4b6021836131c8565b9150612b5682613d3e565b604082019050919050565b6000612b6e601d836131d9565b9150612b7982613d8d565b601d82019050919050565b6000612b916025836131d9565b9150612b9c82613db6565b602582019050919050565b6000612bb46006836131d9565b9150612bbf82613e05565b600682019050919050565b6000612bd76031836131c8565b9150612be282613e2e565b604082019050919050565b6000612bfa6067836131d9565b9150612c0582613e7d565b606782019050919050565b6000612c1d602c836131c8565b9150612c2882613f18565b604082019050919050565b6000612c406027836131d9565b9150612c4b82613f67565b602782019050919050565b6000612c636070836131d9565b9150612c6e82613fb6565b607082019050919050565b612c828161339a565b82525050565b612c99612c948261339a565b61349f565b82525050565b6000612caa82612954565b9150612cb6828561275c565b9150612cc18261283c565b9150612ccc826128a5565b9150612cd8828461275c565b9150612ce38261283c565b9150612cee82612ad5565b9150612cf982612c33565b9150612d048261278d565b9150612d0f82612b84565b9150612d1a82612af8565b91508190509392505050565b6000612d3182612b61565b9150612d3d828461275c565b915081905092915050565b6000612d5382612bed565b9150612d5e82612931565b9150612d6a828a61275c565b9150612d75826128c8565b9150612d81828961275c565b9150612d8c826128c8565b9150612d98828861275c565b9150612da382612a03565b9150612dae82612b1b565b9150612db9826127f6565b9150612dc5828761275c565b9150612dd082612ba7565b9150612ddc828661275c565b9150612de782612c56565b9150612df2826127f6565b9150612dfe828561275c565b9150612e0982612ba7565b9150612e15828461275c565b9150612e2082612ab2565b915081905098975050505050505050565b6000612e3d8284612c88565b60208201915081905092915050565b6000602082019050612e6160008301846126cc565b92915050565b6000608082019050612e7c60008301876126cc565b612e8960208301866126cc565b612e966040830185612c79565b8181036060830152612ea881846126ea565b905095945050505050565b6000602082019050612ec860008301846126db565b92915050565b60006020820190508181036000830152612ee88184612723565b905092915050565b60006020820190508181036000830152612f09816127b0565b9050919050565b60006020820190508181036000830152612f29816127d3565b9050919050565b60006020820190508181036000830152612f4981612819565b9050919050565b60006020820190508181036000830152612f698161285f565b9050919050565b60006020820190508181036000830152612f8981612882565b9050919050565b60006020820190508181036000830152612fa9816128eb565b9050919050565b60006020820190508181036000830152612fc98161290e565b9050919050565b60006020820190508181036000830152612fe981612977565b9050919050565b600060208201905081810360008301526130098161299a565b9050919050565b60006020820190508181036000830152613029816129bd565b9050919050565b60006020820190508181036000830152613049816129e0565b9050919050565b6000602082019050818103600083015261306981612a26565b9050919050565b6000602082019050818103600083015261308981612a49565b9050919050565b600060208201905081810360008301526130a981612a6c565b9050919050565b600060208201905081810360008301526130c981612a8f565b9050919050565b600060208201905081810360008301526130e981612b3e565b9050919050565b6000602082019050818103600083015261310981612bca565b9050919050565b6000602082019050818103600083015261312981612c10565b9050919050565b60006020820190506131456000830184612c79565b92915050565b6000613155613166565b90506131618282613425565b919050565b6000604051905090565b600067ffffffffffffffff82111561318b5761318a6135c5565b5b61319482613608565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006131ef8261339a565b91506131fa8361339a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561322f5761322e6134da565b5b828201905092915050565b6000613245826133a4565b9150613250836133a4565b92508260ff03821115613266576132656134da565b5b828201905092915050565b600061327c8261339a565b91506132878361339a565b92508261329757613296613509565b5b828204905092915050565b60006132ad8261339a565b91506132b88361339a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132f1576132f06134da565b5b828202905092915050565b60006133078261339a565b91506133128361339a565b925082821015613325576133246134da565b5b828203905092915050565b600061333b8261337a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156133de5780820151818401526020810190506133c3565b838111156133ed576000848401525b50505050565b6000600282049050600182168061340b57607f821691505b6020821081141561341f5761341e613538565b5b50919050565b61342e82613608565b810181811067ffffffffffffffff8211171561344d5761344c6135c5565b5b80604052505050565b60006134618261339a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613494576134936134da565b5b600182019050919050565b6000819050919050565b60006134b48261339a565b91506134bf8361339a565b9250826134cf576134ce613509565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f7b2274726169745f74797065223a20224d6f6e7468222c202276616c7565223a60008201527f20223222207d2c00000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f3c7465787420783d270000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f22696d6167655f64617461223a20220000000000000000000000000000000000600082015250565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f3c726563742077696474683d273130302527206865696768743d27313030252760008201527f2066696c6c3d2772676228000000000000000000000000000000000000000000602082015250565b7f7b226e616d65223a202223000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f29272f3e00000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f534f4c44204f5554210000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f25272066696c6c3d2777686974652720666f6e742d66616d696c793d2766616e60008201527f746173792720666f6e742d73697a653d2731303070782720646f6d696e616e7460208201527f2d626173656c696e653d276d6964646c652720746578742d616e63686f723d2760408201527f6d6964646c65273e32323c2f746578743e203c2f7376673e0000000000000000606082015250565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c7465787420783d273530252720793d27353025272066696c6c3d27626c616360008201527f6b2720666f6e742d66616d696c793d2766616e746173792720666f6e742d736960208201527f7a653d2732323070782720646f6d696e616e742d626173656c696e653d276d6960408201527f64646c652720746578742d616e63686f723d276d6964646c65273e32323c2f7460608201527f6578743e00000000000000000000000000000000000000000000000000000000608082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f7b2274726169745f74797065223a2022446179222c202276616c7565223a202260008201527f323222207d000000000000000000000000000000000000000000000000000000602082015250565b7f252720793d270000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f3c7376672077696474683d27333530707827206865696768743d27333530707860008201527f272076696577426f783d273020302033353020333530272066696c6c3d276e6f60208201527f6e652720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f32303060408201527f302f737667273e00000000000000000000000000000000000000000000000000606082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a202259656172222c202276616c7565223a2060008201527f22323222207d2c00000000000000000000000000000000000000000000000000602082015250565b7f25272066696c6c3d2777686974652720666f6e742d66616d696c793d2766616e60008201527f746173792720666f6e742d73697a653d2731303070782720646f6d696e616e7460208201527f2d626173656c696e653d276d6964646c652720746578742d616e63686f723d2760408201527f6d6964646c65273e323c2f746578743e00000000000000000000000000000000606082015250565b61405a81613330565b811461406557600080fd5b50565b61407181613342565b811461407c57600080fd5b50565b6140888161334e565b811461409357600080fd5b50565b61409f8161339a565b81146140aa57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212207aeb2f6823004e9c006f3bb1d5729776355536192a66e0a091fbe0348d98417a64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a9dd12251161007c578063a9dd122514610363578063b88d4fde14610393578063c87b56dd146103af578063d5abeb01146103df578063e985e9c5146103fd578063f2fde38b1461042d57610142565b806370a08231146102d1578063715018a6146103015780638da5cb5b1461030b57806395d89b4114610329578063a22cb4651461034757610142565b806318160ddd1161010a57806318160ddd146101eb57806323b872dd146102095780632f745c591461022557806342842e0e146102555780634f6ccce7146102715780636352211e146102a157610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c55780631249c58b146101e1575b600080fd5b610161600480360381019061015c9190612605565b610449565b60405161016e9190612eb3565b60405180910390f35b61017f61045b565b60405161018c9190612ece565b60405180910390f35b6101af60048036038101906101aa919061265f565b6104ed565b6040516101bc9190612e4c565b60405180910390f35b6101df60048036038101906101da91906125c5565b610572565b005b6101e961068a565b005b6101f36106f2565b6040516102009190613130565b60405180910390f35b610223600480360381019061021e91906124af565b6106ff565b005b61023f600480360381019061023a91906125c5565b61075f565b60405161024c9190613130565b60405180910390f35b61026f600480360381019061026a91906124af565b610804565b005b61028b6004803603810190610286919061265f565b610824565b6040516102989190613130565b60405180910390f35b6102bb60048036038101906102b6919061265f565b610895565b6040516102c89190612e4c565b60405180910390f35b6102eb60048036038101906102e69190612442565b610947565b6040516102f89190613130565b60405180910390f35b6103096109ff565b005b610313610a87565b6040516103209190612e4c565b60405180910390f35b610331610ab1565b60405161033e9190612ece565b60405180910390f35b610361600480360381019061035c9190612585565b610b43565b005b61037d6004803603810190610378919061268c565b610b59565b60405161038a9190613130565b60405180910390f35b6103ad60048036038101906103a89190612502565b610ba4565b005b6103c960048036038101906103c4919061265f565b610c06565b6040516103d69190612ece565b60405180910390f35b6103e7610c6e565b6040516103f49190613130565b60405180910390f35b6104176004803603810190610412919061246f565b610c73565b6040516104249190612eb3565b60405180910390f35b61044760048036038101906104429190612442565b610d07565b005b600061045482610dff565b9050919050565b60606000805461046a906133f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610496906133f3565b80156104e35780601f106104b8576101008083540402835291602001916104e3565b820191906000526020600020905b8154815290600101906020018083116104c657829003601f168201915b5050505050905090565b60006104f882610e79565b610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052e90613070565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061057d82610895565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e5906130d0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661060d610ee5565b73ffffffffffffffffffffffffffffffffffffffff16148061063c575061063b81610636610ee5565b610c73565b5b61067b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067290612ff0565b60405180910390fd5b6106858383610eed565b505050565b60006106946106f2565b905060de81106106d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d090613090565b60405180910390fd5b6106ef336001836106ea91906131e4565b610fa6565b50565b6000600880549050905090565b61071061070a610ee5565b82610fc4565b61074f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610746906130f0565b60405180910390fd5b61075a8383836110a2565b505050565b600061076a83610947565b82106107ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a290612ef0565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61081f83838360405180602001604052806000815250610ba4565b505050565b600061082e6106f2565b821061086f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086690613110565b60405180910390fd5b6008828154811061088357610882613596565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590613030565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156109b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109af90613010565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a07610ee5565b73ffffffffffffffffffffffffffffffffffffffff16610a25610a87565b73ffffffffffffffffffffffffffffffffffffffff1614610a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a72906130b0565b60405180910390fd5b610a856000611309565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ac0906133f3565b80601f0160208091040260200160405190810160405280929190818152602001828054610aec906133f3565b8015610b395780601f10610b0e57610100808354040283529160200191610b39565b820191906000526020600020905b815481529060010190602001808311610b1c57829003601f168201915b5050505050905090565b610b55610b4e610ee5565b83836113cf565b5050565b6000600183610b6891906131e4565b82604051602001610b799190612e31565b6040516020818303038152906040528051906020012060001c610b9c91906134a9565b905092915050565b610bb5610baf610ee5565b83610fc4565b610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb906130f0565b60405180910390fd5b610c008484848461153c565b50505050565b60606000610c44610c1684611598565b610c1f85611721565b604051602001610c30929190612c9f565b604051602081830303815290604052611881565b905080604051602001610c579190612d26565b604051602081830303815290604052915050919050565b60de81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d0f610ee5565b73ffffffffffffffffffffffffffffffffffffffff16610d2d610a87565b73ffffffffffffffffffffffffffffffffffffffff1614610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a906130b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea90612f30565b60405180910390fd5b610dfc81611309565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e725750610e71826119fa565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610f6083610895565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610fc0828260405180602001604052806000815250611adc565b5050565b6000610fcf82610e79565b61100e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100590612fd0565b60405180910390fd5b600061101983610895565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061108857508373ffffffffffffffffffffffffffffffffffffffff16611070846104ed565b73ffffffffffffffffffffffffffffffffffffffff16145b8061109957506110988185610c73565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166110c282610895565b73ffffffffffffffffffffffffffffffffffffffff1614611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90612f50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90612f90565b60405180910390fd5b611193838383611b37565b61119e600082610eed565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111ee91906132fc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461124591906131e4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611304838383611b47565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561143e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143590612fb0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161152f9190612eb3565b60405180910390a3505050565b6115478484846110a2565b61155384848484611b4c565b611592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158990612f10565b60405180910390fd5b50505050565b606060008214156115e0576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061171c565b600082905060005b600082146116125780806115fb90613456565b915050600a8261160b9190613271565b91506115e8565b60008167ffffffffffffffff81111561162e5761162d6135c5565b5b6040519080825280601f01601f1916602001820160405280156116605781602001600182028036833780820191505090505b50905060008290505b600086146117145760018161167e91906132fc565b90506000600a80886116909190613271565b61169a91906132a2565b876116a591906132fc565b60306116b1919061323a565b905060008160f81b9050808484815181106116cf576116ce613596565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8861170b9190613271565b97505050611669565b819450505050505b919050565b60608061174f600a61174060de60078761173b91906131e4565b610b59565b61174a91906131e4565b611598565b61177a600a61176b60de60038861176691906131e4565b610b59565b61177591906131e4565b611598565b6117a5600a61179660de60018961179191906131e4565b610b59565b6117a091906131e4565b611598565b6117d0600f6117c1604660018a6117bc91906131e4565b610b59565b6117cb91906131e4565b611598565b6117fb600f6117ec604b60028b6117e791906131e4565b610b59565b6117f691906131e4565b611598565b611826600f611817604660038c61181291906131e4565b610b59565b61182191906131e4565b611598565b611851600f611842604b60058d61183d91906131e4565b610b59565b61184c91906131e4565b611598565b6040516020016118679796959493929190612d48565b604051602081830303815290604052905080915050919050565b60606000825114156118a4576040518060200160405280600081525090506119f5565b60006040518060600160405280604081526020016140ae60409139905060006003600285516118d391906131e4565b6118dd9190613271565b60046118e991906132a2565b905060006020826118fa91906131e4565b67ffffffffffffffff811115611913576119126135c5565b5b6040519080825280601f01601f1916602001820160405280156119455781602001600182028036833780820191505090505b509050818152600183018586518101602084015b818310156119b4576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825360018201915050611959565b6003895106600181146119ce57600281146119de576119e9565b613d3d60f01b60028303526119e9565b603d60f81b60018303525b50505050508093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ac557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ad55750611ad482611ce3565b5b9050919050565b611ae68383611d4d565b611af36000848484611b4c565b611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990612f10565b60405180910390fd5b505050565b611b42838383611f27565b505050565b505050565b6000611b6d8473ffffffffffffffffffffffffffffffffffffffff1661203b565b15611cd6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b96610ee5565b8786866040518563ffffffff1660e01b8152600401611bb89493929190612e67565b602060405180830381600087803b158015611bd257600080fd5b505af1925050508015611c0357506040513d601f19601f82011682018060405250810190611c009190612632565b60015b611c86573d8060008114611c33576040519150601f19603f3d011682016040523d82523d6000602084013e611c38565b606091505b50600081511415611c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7590612f10565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611cdb565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db490613050565b60405180910390fd5b611dc681610e79565b15611e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfd90612f70565b60405180910390fd5b611e1260008383611b37565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e6291906131e4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f2360008383611b47565b5050565b611f3283838361205e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f7557611f7081612063565b611fb4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611fb357611fb283826120ac565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ff757611ff281612219565b612036565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120355761203482826122ea565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016120b984610947565b6120c391906132fc565b90506000600760008481526020019081526020016000205490508181146121a8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061222d91906132fc565b905060006009600084815260200190815260200160002054905060006008838154811061225d5761225c613596565b5b90600052602060002001549050806008838154811061227f5761227e613596565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806122ce576122cd613567565b5b6001900381819060005260206000200160009055905550505050565b60006122f583610947565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600061237c61237784613170565b61314b565b905082815260208101848484011115612398576123976135f9565b5b6123a38482856133b1565b509392505050565b6000813590506123ba81614051565b92915050565b6000813590506123cf81614068565b92915050565b6000813590506123e48161407f565b92915050565b6000815190506123f98161407f565b92915050565b600082601f830112612414576124136135f4565b5b8135612424848260208601612369565b91505092915050565b60008135905061243c81614096565b92915050565b60006020828403121561245857612457613603565b5b6000612466848285016123ab565b91505092915050565b6000806040838503121561248657612485613603565b5b6000612494858286016123ab565b92505060206124a5858286016123ab565b9150509250929050565b6000806000606084860312156124c8576124c7613603565b5b60006124d6868287016123ab565b93505060206124e7868287016123ab565b92505060406124f88682870161242d565b9150509250925092565b6000806000806080858703121561251c5761251b613603565b5b600061252a878288016123ab565b945050602061253b878288016123ab565b935050604061254c8782880161242d565b925050606085013567ffffffffffffffff81111561256d5761256c6135fe565b5b612579878288016123ff565b91505092959194509250565b6000806040838503121561259c5761259b613603565b5b60006125aa858286016123ab565b92505060206125bb858286016123c0565b9150509250929050565b600080604083850312156125dc576125db613603565b5b60006125ea858286016123ab565b92505060206125fb8582860161242d565b9150509250929050565b60006020828403121561261b5761261a613603565b5b6000612629848285016123d5565b91505092915050565b60006020828403121561264857612647613603565b5b6000612656848285016123ea565b91505092915050565b60006020828403121561267557612674613603565b5b60006126838482850161242d565b91505092915050565b600080604083850312156126a3576126a2613603565b5b60006126b18582860161242d565b92505060206126c28582860161242d565b9150509250929050565b6126d581613330565b82525050565b6126e481613342565b82525050565b60006126f5826131a1565b6126ff81856131b7565b935061270f8185602086016133c0565b61271881613608565b840191505092915050565b600061272e826131ac565b61273881856131c8565b93506127488185602086016133c0565b61275181613608565b840191505092915050565b6000612767826131ac565b61277181856131d9565b93506127818185602086016133c0565b80840191505092915050565b600061279a6027836131d9565b91506127a582613619565b602782019050919050565b60006127bd602b836131c8565b91506127c882613668565b604082019050919050565b60006127e06032836131c8565b91506127eb826136b7565b604082019050919050565b60006128036009836131d9565b915061280e82613706565b600982019050919050565b60006128266026836131c8565b91506128318261372f565b604082019050919050565b60006128496002836131d9565b91506128548261377e565b600282019050919050565b600061286c6025836131c8565b9150612877826137a7565b604082019050919050565b600061288f601c836131c8565b915061289a826137f6565b602082019050919050565b60006128b2600f836131d9565b91506128bd8261381f565b600f82019050919050565b60006128d56001836131d9565b91506128e082613848565b600182019050919050565b60006128f86024836131c8565b915061290382613871565b604082019050919050565b600061291b6019836131c8565b9150612926826138c0565b602082019050919050565b600061293e602b836131d9565b9150612949826138e9565b602b82019050919050565b6000612961600b836131d9565b915061296c82613938565b600b82019050919050565b6000612984602c836131c8565b915061298f82613961565b604082019050919050565b60006129a76038836131c8565b91506129b2826139b0565b604082019050919050565b60006129ca602a836131c8565b91506129d5826139ff565b604082019050919050565b60006129ed6029836131c8565b91506129f882613a4e565b604082019050919050565b6000612a106004836131d9565b9150612a1b82613a9d565b600482019050919050565b6000612a336020836131c8565b9150612a3e82613ac6565b602082019050919050565b6000612a56602c836131c8565b9150612a6182613aef565b604082019050919050565b6000612a796009836131c8565b9150612a8482613b3e565b602082019050919050565b6000612a9c6020836131c8565b9150612aa782613b67565b602082019050919050565b6000612abf6078836131d9565b9150612aca82613b90565b607882019050919050565b6000612ae2600f836131d9565b9150612aed82613c2b565b600f82019050919050565b6000612b056002836131d9565b9150612b1082613c54565b600282019050919050565b6000612b286084836131d9565b9150612b3382613c7d565b608482019050919050565b6000612b4b6021836131c8565b9150612b5682613d3e565b604082019050919050565b6000612b6e601d836131d9565b9150612b7982613d8d565b601d82019050919050565b6000612b916025836131d9565b9150612b9c82613db6565b602582019050919050565b6000612bb46006836131d9565b9150612bbf82613e05565b600682019050919050565b6000612bd76031836131c8565b9150612be282613e2e565b604082019050919050565b6000612bfa6067836131d9565b9150612c0582613e7d565b606782019050919050565b6000612c1d602c836131c8565b9150612c2882613f18565b604082019050919050565b6000612c406027836131d9565b9150612c4b82613f67565b602782019050919050565b6000612c636070836131d9565b9150612c6e82613fb6565b607082019050919050565b612c828161339a565b82525050565b612c99612c948261339a565b61349f565b82525050565b6000612caa82612954565b9150612cb6828561275c565b9150612cc18261283c565b9150612ccc826128a5565b9150612cd8828461275c565b9150612ce38261283c565b9150612cee82612ad5565b9150612cf982612c33565b9150612d048261278d565b9150612d0f82612b84565b9150612d1a82612af8565b91508190509392505050565b6000612d3182612b61565b9150612d3d828461275c565b915081905092915050565b6000612d5382612bed565b9150612d5e82612931565b9150612d6a828a61275c565b9150612d75826128c8565b9150612d81828961275c565b9150612d8c826128c8565b9150612d98828861275c565b9150612da382612a03565b9150612dae82612b1b565b9150612db9826127f6565b9150612dc5828761275c565b9150612dd082612ba7565b9150612ddc828661275c565b9150612de782612c56565b9150612df2826127f6565b9150612dfe828561275c565b9150612e0982612ba7565b9150612e15828461275c565b9150612e2082612ab2565b915081905098975050505050505050565b6000612e3d8284612c88565b60208201915081905092915050565b6000602082019050612e6160008301846126cc565b92915050565b6000608082019050612e7c60008301876126cc565b612e8960208301866126cc565b612e966040830185612c79565b8181036060830152612ea881846126ea565b905095945050505050565b6000602082019050612ec860008301846126db565b92915050565b60006020820190508181036000830152612ee88184612723565b905092915050565b60006020820190508181036000830152612f09816127b0565b9050919050565b60006020820190508181036000830152612f29816127d3565b9050919050565b60006020820190508181036000830152612f4981612819565b9050919050565b60006020820190508181036000830152612f698161285f565b9050919050565b60006020820190508181036000830152612f8981612882565b9050919050565b60006020820190508181036000830152612fa9816128eb565b9050919050565b60006020820190508181036000830152612fc98161290e565b9050919050565b60006020820190508181036000830152612fe981612977565b9050919050565b600060208201905081810360008301526130098161299a565b9050919050565b60006020820190508181036000830152613029816129bd565b9050919050565b60006020820190508181036000830152613049816129e0565b9050919050565b6000602082019050818103600083015261306981612a26565b9050919050565b6000602082019050818103600083015261308981612a49565b9050919050565b600060208201905081810360008301526130a981612a6c565b9050919050565b600060208201905081810360008301526130c981612a8f565b9050919050565b600060208201905081810360008301526130e981612b3e565b9050919050565b6000602082019050818103600083015261310981612bca565b9050919050565b6000602082019050818103600083015261312981612c10565b9050919050565b60006020820190506131456000830184612c79565b92915050565b6000613155613166565b90506131618282613425565b919050565b6000604051905090565b600067ffffffffffffffff82111561318b5761318a6135c5565b5b61319482613608565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006131ef8261339a565b91506131fa8361339a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561322f5761322e6134da565b5b828201905092915050565b6000613245826133a4565b9150613250836133a4565b92508260ff03821115613266576132656134da565b5b828201905092915050565b600061327c8261339a565b91506132878361339a565b92508261329757613296613509565b5b828204905092915050565b60006132ad8261339a565b91506132b88361339a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132f1576132f06134da565b5b828202905092915050565b60006133078261339a565b91506133128361339a565b925082821015613325576133246134da565b5b828203905092915050565b600061333b8261337a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156133de5780820151818401526020810190506133c3565b838111156133ed576000848401525b50505050565b6000600282049050600182168061340b57607f821691505b6020821081141561341f5761341e613538565b5b50919050565b61342e82613608565b810181811067ffffffffffffffff8211171561344d5761344c6135c5565b5b80604052505050565b60006134618261339a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613494576134936134da565b5b600182019050919050565b6000819050919050565b60006134b48261339a565b91506134bf8361339a565b9250826134cf576134ce613509565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f7b2274726169745f74797065223a20224d6f6e7468222c202276616c7565223a60008201527f20223222207d2c00000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f3c7465787420783d270000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f22696d6167655f64617461223a20220000000000000000000000000000000000600082015250565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f3c726563742077696474683d273130302527206865696768743d27313030252760008201527f2066696c6c3d2772676228000000000000000000000000000000000000000000602082015250565b7f7b226e616d65223a202223000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f29272f3e00000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f534f4c44204f5554210000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f25272066696c6c3d2777686974652720666f6e742d66616d696c793d2766616e60008201527f746173792720666f6e742d73697a653d2731303070782720646f6d696e616e7460208201527f2d626173656c696e653d276d6964646c652720746578742d616e63686f723d2760408201527f6d6964646c65273e32323c2f746578743e203c2f7376673e0000000000000000606082015250565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c7465787420783d273530252720793d27353025272066696c6c3d27626c616360008201527f6b2720666f6e742d66616d696c793d2766616e746173792720666f6e742d736960208201527f7a653d2732323070782720646f6d696e616e742d626173656c696e653d276d6960408201527f64646c652720746578742d616e63686f723d276d6964646c65273e32323c2f7460608201527f6578743e00000000000000000000000000000000000000000000000000000000608082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f7b2274726169745f74797065223a2022446179222c202276616c7565223a202260008201527f323222207d000000000000000000000000000000000000000000000000000000602082015250565b7f252720793d270000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f3c7376672077696474683d27333530707827206865696768743d27333530707860008201527f272076696577426f783d273020302033353020333530272066696c6c3d276e6f60208201527f6e652720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f32303060408201527f302f737667273e00000000000000000000000000000000000000000000000000606082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a202259656172222c202276616c7565223a2060008201527f22323222207d2c00000000000000000000000000000000000000000000000000602082015250565b7f25272066696c6c3d2777686974652720666f6e742d66616d696c793d2766616e60008201527f746173792720666f6e742d73697a653d2731303070782720646f6d696e616e7460208201527f2d626173656c696e653d276d6964646c652720746578742d616e63686f723d2760408201527f6d6964646c65273e323c2f746578743e00000000000000000000000000000000606082015250565b61405a81613330565b811461406557600080fd5b50565b61407181613342565b811461407c57600080fd5b50565b6140888161334e565b811461409357600080fd5b50565b61409f8161339a565b81146140aa57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212207aeb2f6823004e9c006f3bb1d5729776355536192a66e0a091fbe0348d98417a64736f6c63430008070033

Deployed Bytecode Sourcemap

49070:3631:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50127:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21687:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23246:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22769:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50347:167;;;:::i;:::-;;36356:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23996:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36024:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24406:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36546:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21381:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21111:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43489:103;;;:::i;:::-;;42838:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21856:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23539:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50522:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24662:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51879:815;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49131:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23765:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43747:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50127:212;50266:4;50295:36;50319:11;50295:23;:36::i;:::-;50288:43;;50127:212;;;:::o;21687:100::-;21741:13;21774:5;21767:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21687:100;:::o;23246:221::-;23322:7;23350:16;23358:7;23350;:16::i;:::-;23342:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23435:15;:24;23451:7;23435:24;;;;;;;;;;;;;;;;;;;;;23428:31;;23246:221;;;:::o;22769:411::-;22850:13;22866:23;22881:7;22866:14;:23::i;:::-;22850:39;;22914:5;22908:11;;:2;:11;;;;22900:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23008:5;22992:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23017:37;23034:5;23041:12;:10;:12::i;:::-;23017:16;:37::i;:::-;22992:62;22970:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23151:21;23160:2;23164:7;23151:8;:21::i;:::-;22839:341;22769:411;;:::o;50347:167::-;50381:14;50398:13;:11;:13::i;:::-;50381:30;;49167:3;50430:6;:18;50422:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;50473:33;50483:10;50504:1;50495:6;:10;;;;:::i;:::-;50473:9;:33::i;:::-;50370:144;50347:167::o;36356:113::-;36417:7;36444:10;:17;;;;36437:24;;36356:113;:::o;23996:339::-;24191:41;24210:12;:10;:12::i;:::-;24224:7;24191:18;:41::i;:::-;24183:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24299:28;24309:4;24315:2;24319:7;24299:9;:28::i;:::-;23996:339;;;:::o;36024:256::-;36121:7;36157:23;36174:5;36157:16;:23::i;:::-;36149:5;:31;36141:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36246:12;:19;36259:5;36246:19;;;;;;;;;;;;;;;:26;36266:5;36246:26;;;;;;;;;;;;36239:33;;36024:256;;;;:::o;24406:185::-;24544:39;24561:4;24567:2;24571:7;24544:39;;;;;;;;;;;;:16;:39::i;:::-;24406:185;;;:::o;36546:233::-;36621:7;36657:30;:28;:30::i;:::-;36649:5;:38;36641:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36754:10;36765:5;36754:17;;;;;;;;:::i;:::-;;;;;;;;;;36747:24;;36546:233;;;:::o;21381:239::-;21453:7;21473:13;21489:7;:16;21497:7;21489:16;;;;;;;;;;;;;;;;;;;;;21473:32;;21541:1;21524:19;;:5;:19;;;;21516:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21607:5;21600:12;;;21381:239;;;:::o;21111:208::-;21183:7;21228:1;21211:19;;:5;:19;;;;21203:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21295:9;:16;21305:5;21295:16;;;;;;;;;;;;;;;;21288:23;;21111:208;;;:::o;43489:103::-;43069:12;:10;:12::i;:::-;43058:23;;:7;:5;:7::i;:::-;:23;;;43050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43554:30:::1;43581:1;43554:18;:30::i;:::-;43489:103::o:0;42838:87::-;42884:7;42911:6;;;;;;;;;;;42904:13;;42838:87;:::o;21856:104::-;21912:13;21945:7;21938:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21856:104;:::o;23539:155::-;23634:52;23653:12;:10;:12::i;:::-;23667:8;23677;23634:18;:52::i;:::-;23539:155;;:::o;50522:145::-;50582:4;50657:1;50648:6;:10;;;;:::i;:::-;50637:4;50620:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;50610:33;;;;;;50605:39;;:54;;;;:::i;:::-;50598:61;;50522:145;;;;:::o;24662:328::-;24837:41;24856:12;:10;:12::i;:::-;24870:7;24837:18;:41::i;:::-;24829:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24943:39;24957:4;24963:2;24967:7;24976:5;24943:13;:39::i;:::-;24662:328;;;;:::o;51879:815::-;51952:13;51978:18;51999:606;52137:17;52146:7;52137:8;:17::i;:::-;52248:15;52255:7;52248:6;:15::i;:::-;52058:520;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51999:13;:606::i;:::-;51978:627;;52680:4;52630:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;52616:70;;;51879:815;;;:::o;49131:39::-;49167:3;49131:39;:::o;23765:164::-;23862:4;23886:18;:25;23905:5;23886:25;;;;;;;;;;;;;;;:35;23912:8;23886:35;;;;;;;;;;;;;;;;;;;;;;;;;23879:42;;23765:164;;;;:::o;43747:201::-;43069:12;:10;:12::i;:::-;43058:23;;:7;:5;:7::i;:::-;:23;;;43050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43856:1:::1;43836:22;;:8;:22;;;;43828:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43912:28;43931:8;43912:18;:28::i;:::-;43747:201:::0;:::o;35716:224::-;35818:4;35857:35;35842:50;;;:11;:50;;;;:90;;;;35896:36;35920:11;35896:23;:36::i;:::-;35842:90;35835:97;;35716:224;;;:::o;26500:127::-;26565:4;26617:1;26589:30;;:7;:16;26597:7;26589:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26582:37;;26500:127;;;:::o;16258:98::-;16311:7;16338:10;16331:17;;16258:98;:::o;30646:174::-;30748:2;30721:15;:24;30737:7;30721:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30804:7;30800:2;30766:46;;30775:23;30790:7;30775:14;:23::i;:::-;30766:46;;;;;;;;;;;;30646:174;;:::o;27484:110::-;27560:26;27570:2;27574:7;27560:26;;;;;;;;;;;;:9;:26::i;:::-;27484:110;;:::o;26794:348::-;26887:4;26912:16;26920:7;26912;:16::i;:::-;26904:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26988:13;27004:23;27019:7;27004:14;:23::i;:::-;26988:39;;27057:5;27046:16;;:7;:16;;;:51;;;;27090:7;27066:31;;:20;27078:7;27066:11;:20::i;:::-;:31;;;27046:51;:87;;;;27101:32;27118:5;27125:7;27101:16;:32::i;:::-;27046:87;27038:96;;;26794:348;;;;:::o;29903:625::-;30062:4;30035:31;;:23;30050:7;30035:14;:23::i;:::-;:31;;;30027:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30141:1;30127:16;;:2;:16;;;;30119:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30197:39;30218:4;30224:2;30228:7;30197:20;:39::i;:::-;30301:29;30318:1;30322:7;30301:8;:29::i;:::-;30362:1;30343:9;:15;30353:4;30343:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30391:1;30374:9;:13;30384:2;30374:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30422:2;30403:7;:16;30411:7;30403:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30461:7;30457:2;30442:27;;30451:4;30442:27;;;;;;;;;;;;30482:38;30502:4;30508:2;30512:7;30482:19;:38::i;:::-;29903:625;;;:::o;44108:191::-;44182:16;44201:6;;;;;;;;;;;44182:25;;44227:8;44218:6;;:17;;;;;;;;;;;;;;;;;;44282:8;44251:40;;44272:8;44251:40;;;;;;;;;;;;44171:128;44108:191;:::o;30962:315::-;31117:8;31108:17;;:5;:17;;;;31100:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31204:8;31166:18;:25;31185:5;31166:25;;;;;;;;;;;;;;;:35;31192:8;31166:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31250:8;31228:41;;31243:5;31228:41;;;31260:8;31228:41;;;;;;:::i;:::-;;;;;;;;30962:315;;;:::o;25872:::-;26029:28;26039:4;26045:2;26049:7;26029:9;:28::i;:::-;26076:48;26099:4;26105:2;26109:7;26118:5;26076:22;:48::i;:::-;26068:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25872:315;;;;:::o;49229:573::-;49279:27;49329:1;49323:2;:7;49319:50;;;49347:10;;;;;;;;;;;;;;;;;;;;;49319:50;49379:6;49388:2;49379:11;;49401:8;49420:69;49432:1;49427;:6;49420:69;;49450:5;;;;;:::i;:::-;;;;49475:2;49470:7;;;;;:::i;:::-;;;49420:69;;;49499:17;49529:3;49519:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49499:34;;49544:6;49553:3;49544:12;;49567:198;49580:1;49574:2;:7;49567:198;;49604:1;49602;:3;;;;:::i;:::-;49598:7;;49620:10;49660:2;49655;49650;:7;;;;:::i;:::-;:12;;;;:::i;:::-;49645:2;:17;;;;:::i;:::-;49634:2;:29;;;;:::i;:::-;49620:44;;49679:9;49698:4;49691:12;;49679:24;;49728:2;49718:4;49723:1;49718:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;49751:2;49745:8;;;;;:::i;:::-;;;49583:182;;49567:198;;;49789:4;49775:19;;;;;;49229:573;;;;:::o;50675:1196::-;50727:13;50753:17;51005:39;51041:2;51014:24;51021:3;51036:1;51026:7;:11;;;;:::i;:::-;51014:6;:24::i;:::-;:29;;;;:::i;:::-;51005:8;:39::i;:::-;51077;51113:2;51086:24;51093:3;51108:1;51098:7;:11;;;;:::i;:::-;51086:6;:24::i;:::-;:29;;;;:::i;:::-;51077:8;:39::i;:::-;51149;51185:2;51158:24;51165:3;51180:1;51170:7;:11;;;;:::i;:::-;51158:6;:24::i;:::-;:29;;;;:::i;:::-;51149:8;:39::i;:::-;51386:38;51421:2;51395:23;51402:2;51416:1;51406:7;:11;;;;:::i;:::-;51395:6;:23::i;:::-;:28;;;;:::i;:::-;51386:8;:38::i;:::-;51436;51471:2;51445:23;51452:2;51466:1;51456:7;:11;;;;:::i;:::-;51445:6;:23::i;:::-;:28;;;;:::i;:::-;51436:8;:38::i;:::-;51618;51653:2;51627:23;51634:2;51648:1;51638:7;:11;;;;:::i;:::-;51627:6;:23::i;:::-;:28;;;;:::i;:::-;51618:8;:38::i;:::-;51668;51703:2;51677:23;51684:2;51698:1;51688:7;:11;;;;:::i;:::-;51677:6;:23::i;:::-;:28;;;;:::i;:::-;51668:8;:38::i;:::-;50794:1047;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50781:1061;;51860:3;51853:10;;;50675:1196;;;:::o;44904:1912::-;44962:13;45007:1;44992:4;:11;:16;44988:31;;;45010:9;;;;;;;;;;;;;;;;44988:31;45071:19;45093:12;;;;;;;;;;;;;;;;;45071:34;;45157:18;45203:1;45198;45184:4;:11;:15;;;;:::i;:::-;45183:21;;;;:::i;:::-;45178:1;:27;;;;:::i;:::-;45157:48;;45288:20;45335:2;45322:10;:15;;;;:::i;:::-;45311:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45288:50;;45435:10;45427:6;45420:26;45530:1;45523:5;45519:13;45589:4;45640;45634:11;45625:7;45621:25;45736:2;45728:6;45724:15;45809:754;45828:6;45819:7;45816:19;45809:754;;;45928:1;45919:7;45915:15;45904:26;;45967:7;45961:14;46093:4;46085:5;46081:2;46077:14;46073:25;46063:8;46059:40;46053:47;46042:9;46034:67;46147:1;46136:9;46132:17;46119:30;;46226:4;46218:5;46214:2;46210:14;46206:25;46196:8;46192:40;46186:47;46175:9;46167:67;46280:1;46269:9;46265:17;46252:30;;46359:4;46351:5;46348:1;46343:14;46339:25;46329:8;46325:40;46319:47;46308:9;46300:67;46413:1;46402:9;46398:17;46385:30;;46492:4;46484:5;46472:25;46462:8;46458:40;46452:47;46441:9;46433:67;46546:1;46535:9;46531:17;46518:30;;45852:711;45809:754;;;46636:1;46629:4;46623:11;46619:19;46657:1;46652:54;;;;46725:1;46720:52;;;;46612:160;;46652:54;46696:6;46691:3;46687:16;46683:1;46672:9;46668:17;46661:43;46652:54;;46720:52;46764:4;46759:3;46755:14;46751:1;46740:9;46736:17;46729:41;46612:160;;45360:1423;;;;46802:6;46795:13;;;;;44904:1912;;;;:::o;20742:305::-;20844:4;20896:25;20881:40;;;:11;:40;;;;:105;;;;20953:33;20938:48;;;:11;:48;;;;20881:105;:158;;;;21003:36;21027:11;21003:23;:36::i;:::-;20881:158;20861:178;;20742:305;;;:::o;27821:321::-;27951:18;27957:2;27961:7;27951:5;:18::i;:::-;28002:54;28033:1;28037:2;28041:7;28050:5;28002:22;:54::i;:::-;27980:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27821:321;;;:::o;49810:204::-;49961:45;49988:4;49994:2;49998:7;49961:26;:45::i;:::-;49810:204;;;:::o;33724:125::-;;;;:::o;31842:799::-;31997:4;32018:15;:2;:13;;;:15::i;:::-;32014:620;;;32070:2;32054:36;;;32091:12;:10;:12::i;:::-;32105:4;32111:7;32120:5;32054:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32050:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32313:1;32296:6;:13;:18;32292:272;;;32339:60;;;;;;;;;;:::i;:::-;;;;;;;;32292:272;32514:6;32508:13;32499:6;32495:2;32491:15;32484:38;32050:529;32187:41;;;32177:51;;;:6;:51;;;;32170:58;;;;;32014:620;32618:4;32611:11;;31842:799;;;;;;;:::o;19276:157::-;19361:4;19400:25;19385:40;;;:11;:40;;;;19378:47;;19276:157;;;:::o;28478:439::-;28572:1;28558:16;;:2;:16;;;;28550:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28631:16;28639:7;28631;:16::i;:::-;28630:17;28622:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28693:45;28722:1;28726:2;28730:7;28693:20;:45::i;:::-;28768:1;28751:9;:13;28761:2;28751:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28799:2;28780:7;:16;28788:7;28780:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28844:7;28840:2;28819:33;;28836:1;28819:33;;;;;;;;;;;;28865:44;28893:1;28897:2;28901:7;28865:19;:44::i;:::-;28478:439;;:::o;37392:589::-;37536:45;37563:4;37569:2;37573:7;37536:26;:45::i;:::-;37614:1;37598:18;;:4;:18;;;37594:187;;;37633:40;37665:7;37633:31;:40::i;:::-;37594:187;;;37703:2;37695:10;;:4;:10;;;37691:90;;37722:47;37755:4;37761:7;37722:32;:47::i;:::-;37691:90;37594:187;37809:1;37795:16;;:2;:16;;;37791:183;;;37828:45;37865:7;37828:36;:45::i;:::-;37791:183;;;37901:4;37895:10;;:2;:10;;;37891:83;;37922:40;37950:2;37954:7;37922:27;:40::i;:::-;37891:83;37791:183;37392:589;;;:::o;8394:326::-;8454:4;8711:1;8689:7;:19;;;:23;8682:30;;8394:326;;;:::o;33213:126::-;;;;:::o;38704:164::-;38808:10;:17;;;;38781:15;:24;38797:7;38781:24;;;;;;;;;;;:44;;;;38836:10;38852:7;38836:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38704:164;:::o;39495:988::-;39761:22;39811:1;39786:22;39803:4;39786:16;:22::i;:::-;:26;;;;:::i;:::-;39761:51;;39823:18;39844:17;:26;39862:7;39844:26;;;;;;;;;;;;39823:47;;39991:14;39977:10;:28;39973:328;;40022:19;40044:12;:18;40057:4;40044:18;;;;;;;;;;;;;;;:34;40063:14;40044:34;;;;;;;;;;;;40022:56;;40128:11;40095:12;:18;40108:4;40095:18;;;;;;;;;;;;;;;:30;40114:10;40095:30;;;;;;;;;;;:44;;;;40245:10;40212:17;:30;40230:11;40212:30;;;;;;;;;;;:43;;;;40007:294;39973:328;40397:17;:26;40415:7;40397:26;;;;;;;;;;;40390:33;;;40441:12;:18;40454:4;40441:18;;;;;;;;;;;;;;;:34;40460:14;40441:34;;;;;;;;;;;40434:41;;;39576:907;;39495:988;;:::o;40778:1079::-;41031:22;41076:1;41056:10;:17;;;;:21;;;;:::i;:::-;41031:46;;41088:18;41109:15;:24;41125:7;41109:24;;;;;;;;;;;;41088:45;;41460:19;41482:10;41493:14;41482:26;;;;;;;;:::i;:::-;;;;;;;;;;41460:48;;41546:11;41521:10;41532;41521:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41657:10;41626:15;:28;41642:11;41626:28;;;;;;;;;;;:41;;;;41798:15;:24;41814:7;41798:24;;;;;;;;;;;41791:31;;;41833:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40849:1008;;;40778:1079;:::o;38282:221::-;38367:14;38384:20;38401:2;38384:16;:20::i;:::-;38367:37;;38442:7;38415:12;:16;38428:2;38415:16;;;;;;;;;;;;;;;:24;38432:6;38415:24;;;;;;;;;;;:34;;;;38489:6;38460:17;:26;38478:7;38460:26;;;;;;;;;;;:35;;;;38356:147;38282:221;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:474::-;5933:6;5941;5990:2;5978:9;5969:7;5965:23;5961:32;5958:119;;;5996:79;;:::i;:::-;5958:119;6116:1;6141:53;6186:7;6177:6;6166:9;6162:22;6141:53;:::i;:::-;6131:63;;6087:117;6243:2;6269:53;6314:7;6305:6;6294:9;6290:22;6269:53;:::i;:::-;6259:63;;6214:118;5865:474;;;;;:::o;6345:118::-;6432:24;6450:5;6432:24;:::i;:::-;6427:3;6420:37;6345:118;;:::o;6469:109::-;6550:21;6565:5;6550:21;:::i;:::-;6545:3;6538:34;6469:109;;:::o;6584:360::-;6670:3;6698:38;6730:5;6698:38;:::i;:::-;6752:70;6815:6;6810:3;6752:70;:::i;:::-;6745:77;;6831:52;6876:6;6871:3;6864:4;6857:5;6853:16;6831:52;:::i;:::-;6908:29;6930:6;6908:29;:::i;:::-;6903:3;6899:39;6892:46;;6674:270;6584:360;;;;:::o;6950:364::-;7038:3;7066:39;7099:5;7066:39;:::i;:::-;7121:71;7185:6;7180:3;7121:71;:::i;:::-;7114:78;;7201:52;7246:6;7241:3;7234:4;7227:5;7223:16;7201:52;:::i;:::-;7278:29;7300:6;7278:29;:::i;:::-;7273:3;7269:39;7262:46;;7042:272;6950:364;;;;:::o;7320:377::-;7426:3;7454:39;7487:5;7454:39;:::i;:::-;7509:89;7591:6;7586:3;7509:89;:::i;:::-;7502:96;;7607:52;7652:6;7647:3;7640:4;7633:5;7629:16;7607:52;:::i;:::-;7684:6;7679:3;7675:16;7668:23;;7430:267;7320:377;;;;:::o;7703:402::-;7863:3;7884:85;7966:2;7961:3;7884:85;:::i;:::-;7877:92;;7978:93;8067:3;7978:93;:::i;:::-;8096:2;8091:3;8087:12;8080:19;;7703:402;;;:::o;8111:366::-;8253:3;8274:67;8338:2;8333:3;8274:67;:::i;:::-;8267:74;;8350:93;8439:3;8350:93;:::i;:::-;8468:2;8463:3;8459:12;8452:19;;8111:366;;;:::o;8483:::-;8625:3;8646:67;8710:2;8705:3;8646:67;:::i;:::-;8639:74;;8722:93;8811:3;8722:93;:::i;:::-;8840:2;8835:3;8831:12;8824:19;;8483:366;;;:::o;8855:400::-;9015:3;9036:84;9118:1;9113:3;9036:84;:::i;:::-;9029:91;;9129:93;9218:3;9129:93;:::i;:::-;9247:1;9242:3;9238:11;9231:18;;8855:400;;;:::o;9261:366::-;9403:3;9424:67;9488:2;9483:3;9424:67;:::i;:::-;9417:74;;9500:93;9589:3;9500:93;:::i;:::-;9618:2;9613:3;9609:12;9602:19;;9261:366;;;:::o;9633:400::-;9793:3;9814:84;9896:1;9891:3;9814:84;:::i;:::-;9807:91;;9907:93;9996:3;9907:93;:::i;:::-;10025:1;10020:3;10016:11;10009:18;;9633:400;;;:::o;10039:366::-;10181:3;10202:67;10266:2;10261:3;10202:67;:::i;:::-;10195:74;;10278:93;10367:3;10278:93;:::i;:::-;10396:2;10391:3;10387:12;10380:19;;10039:366;;;:::o;10411:::-;10553:3;10574:67;10638:2;10633:3;10574:67;:::i;:::-;10567:74;;10650:93;10739:3;10650:93;:::i;:::-;10768:2;10763:3;10759:12;10752:19;;10411:366;;;:::o;10783:402::-;10943:3;10964:85;11046:2;11041:3;10964:85;:::i;:::-;10957:92;;11058:93;11147:3;11058:93;:::i;:::-;11176:2;11171:3;11167:12;11160:19;;10783:402;;;:::o;11191:400::-;11351:3;11372:84;11454:1;11449:3;11372:84;:::i;:::-;11365:91;;11465:93;11554:3;11465:93;:::i;:::-;11583:1;11578:3;11574:11;11567:18;;11191:400;;;:::o;11597:366::-;11739:3;11760:67;11824:2;11819:3;11760:67;:::i;:::-;11753:74;;11836:93;11925:3;11836:93;:::i;:::-;11954:2;11949:3;11945:12;11938:19;;11597:366;;;:::o;11969:::-;12111:3;12132:67;12196:2;12191:3;12132:67;:::i;:::-;12125:74;;12208:93;12297:3;12208:93;:::i;:::-;12326:2;12321:3;12317:12;12310:19;;11969:366;;;:::o;12341:402::-;12501:3;12522:85;12604:2;12599:3;12522:85;:::i;:::-;12515:92;;12616:93;12705:3;12616:93;:::i;:::-;12734:2;12729:3;12725:12;12718:19;;12341:402;;;:::o;12749:::-;12909:3;12930:85;13012:2;13007:3;12930:85;:::i;:::-;12923:92;;13024:93;13113:3;13024:93;:::i;:::-;13142:2;13137:3;13133:12;13126:19;;12749:402;;;:::o;13157:366::-;13299:3;13320:67;13384:2;13379:3;13320:67;:::i;:::-;13313:74;;13396:93;13485:3;13396:93;:::i;:::-;13514:2;13509:3;13505:12;13498:19;;13157:366;;;:::o;13529:::-;13671:3;13692:67;13756:2;13751:3;13692:67;:::i;:::-;13685:74;;13768:93;13857:3;13768:93;:::i;:::-;13886:2;13881:3;13877:12;13870:19;;13529:366;;;:::o;13901:::-;14043:3;14064:67;14128:2;14123:3;14064:67;:::i;:::-;14057:74;;14140:93;14229:3;14140:93;:::i;:::-;14258:2;14253:3;14249:12;14242:19;;13901:366;;;:::o;14273:::-;14415:3;14436:67;14500:2;14495:3;14436:67;:::i;:::-;14429:74;;14512:93;14601:3;14512:93;:::i;:::-;14630:2;14625:3;14621:12;14614:19;;14273:366;;;:::o;14645:400::-;14805:3;14826:84;14908:1;14903:3;14826:84;:::i;:::-;14819:91;;14919:93;15008:3;14919:93;:::i;:::-;15037:1;15032:3;15028:11;15021:18;;14645:400;;;:::o;15051:366::-;15193:3;15214:67;15278:2;15273:3;15214:67;:::i;:::-;15207:74;;15290:93;15379:3;15290:93;:::i;:::-;15408:2;15403:3;15399:12;15392:19;;15051:366;;;:::o;15423:::-;15565:3;15586:67;15650:2;15645:3;15586:67;:::i;:::-;15579:74;;15662:93;15751:3;15662:93;:::i;:::-;15780:2;15775:3;15771:12;15764:19;;15423:366;;;:::o;15795:365::-;15937:3;15958:66;16022:1;16017:3;15958:66;:::i;:::-;15951:73;;16033:93;16122:3;16033:93;:::i;:::-;16151:2;16146:3;16142:12;16135:19;;15795:365;;;:::o;16166:366::-;16308:3;16329:67;16393:2;16388:3;16329:67;:::i;:::-;16322:74;;16405:93;16494:3;16405:93;:::i;:::-;16523:2;16518:3;16514:12;16507:19;;16166:366;;;:::o;16538:404::-;16698:3;16719:86;16801:3;16796;16719:86;:::i;:::-;16712:93;;16814;16903:3;16814:93;:::i;:::-;16932:3;16927;16923:13;16916:20;;16538:404;;;:::o;16948:402::-;17108:3;17129:85;17211:2;17206:3;17129:85;:::i;:::-;17122:92;;17223:93;17312:3;17223:93;:::i;:::-;17341:2;17336:3;17332:12;17325:19;;16948:402;;;:::o;17356:400::-;17516:3;17537:84;17619:1;17614:3;17537:84;:::i;:::-;17530:91;;17630:93;17719:3;17630:93;:::i;:::-;17748:1;17743:3;17739:11;17732:18;;17356:400;;;:::o;17762:404::-;17922:3;17943:86;18025:3;18020;17943:86;:::i;:::-;17936:93;;18038;18127:3;18038:93;:::i;:::-;18156:3;18151;18147:13;18140:20;;17762:404;;;:::o;18172:366::-;18314:3;18335:67;18399:2;18394:3;18335:67;:::i;:::-;18328:74;;18411:93;18500:3;18411:93;:::i;:::-;18529:2;18524:3;18520:12;18513:19;;18172:366;;;:::o;18544:402::-;18704:3;18725:85;18807:2;18802:3;18725:85;:::i;:::-;18718:92;;18819:93;18908:3;18819:93;:::i;:::-;18937:2;18932:3;18928:12;18921:19;;18544:402;;;:::o;18952:::-;19112:3;19133:85;19215:2;19210:3;19133:85;:::i;:::-;19126:92;;19227:93;19316:3;19227:93;:::i;:::-;19345:2;19340:3;19336:12;19329:19;;18952:402;;;:::o;19360:400::-;19520:3;19541:84;19623:1;19618:3;19541:84;:::i;:::-;19534:91;;19634:93;19723:3;19634:93;:::i;:::-;19752:1;19747:3;19743:11;19736:18;;19360:400;;;:::o;19766:366::-;19908:3;19929:67;19993:2;19988:3;19929:67;:::i;:::-;19922:74;;20005:93;20094:3;20005:93;:::i;:::-;20123:2;20118:3;20114:12;20107:19;;19766:366;;;:::o;20138:404::-;20298:3;20319:86;20401:3;20396;20319:86;:::i;:::-;20312:93;;20414;20503:3;20414:93;:::i;:::-;20532:3;20527;20523:13;20516:20;;20138:404;;;:::o;20548:366::-;20690:3;20711:67;20775:2;20770:3;20711:67;:::i;:::-;20704:74;;20787:93;20876:3;20787:93;:::i;:::-;20905:2;20900:3;20896:12;20889:19;;20548:366;;;:::o;20920:402::-;21080:3;21101:85;21183:2;21178:3;21101:85;:::i;:::-;21094:92;;21195:93;21284:3;21195:93;:::i;:::-;21313:2;21308:3;21304:12;21297:19;;20920:402;;;:::o;21328:404::-;21488:3;21509:86;21591:3;21586;21509:86;:::i;:::-;21502:93;;21604;21693:3;21604:93;:::i;:::-;21722:3;21717;21713:13;21706:20;;21328:404;;;:::o;21738:118::-;21825:24;21843:5;21825:24;:::i;:::-;21820:3;21813:37;21738:118;;:::o;21862:157::-;21967:45;21987:24;22005:5;21987:24;:::i;:::-;21967:45;:::i;:::-;21962:3;21955:58;21862:157;;:::o;22025:2829::-;23114:3;23136:148;23280:3;23136:148;:::i;:::-;23129:155;;23301:95;23392:3;23383:6;23301:95;:::i;:::-;23294:102;;23413:148;23557:3;23413:148;:::i;:::-;23406:155;;23578:148;23722:3;23578:148;:::i;:::-;23571:155;;23743:95;23834:3;23825:6;23743:95;:::i;:::-;23736:102;;23855:148;23999:3;23855:148;:::i;:::-;23848:155;;24020:148;24164:3;24020:148;:::i;:::-;24013:155;;24185:148;24329:3;24185:148;:::i;:::-;24178:155;;24350:148;24494:3;24350:148;:::i;:::-;24343:155;;24515:148;24659:3;24515:148;:::i;:::-;24508:155;;24680:148;24824:3;24680:148;:::i;:::-;24673:155;;24845:3;24838:10;;22025:2829;;;;;:::o;24860:541::-;25093:3;25115:148;25259:3;25115:148;:::i;:::-;25108:155;;25280:95;25371:3;25362:6;25280:95;:::i;:::-;25273:102;;25392:3;25385:10;;24860:541;;;;:::o;25407:4427::-;27039:3;27061:148;27205:3;27061:148;:::i;:::-;27054:155;;27226:148;27370:3;27226:148;:::i;:::-;27219:155;;27391:95;27482:3;27473:6;27391:95;:::i;:::-;27384:102;;27503:148;27647:3;27503:148;:::i;:::-;27496:155;;27668:95;27759:3;27750:6;27668:95;:::i;:::-;27661:102;;27780:148;27924:3;27780:148;:::i;:::-;27773:155;;27945:95;28036:3;28027:6;27945:95;:::i;:::-;27938:102;;28057:148;28201:3;28057:148;:::i;:::-;28050:155;;28222:148;28366:3;28222:148;:::i;:::-;28215:155;;28387:148;28531:3;28387:148;:::i;:::-;28380:155;;28552:95;28643:3;28634:6;28552:95;:::i;:::-;28545:102;;28664:148;28808:3;28664:148;:::i;:::-;28657:155;;28829:95;28920:3;28911:6;28829:95;:::i;:::-;28822:102;;28941:148;29085:3;28941:148;:::i;:::-;28934:155;;29106:148;29250:3;29106:148;:::i;:::-;29099:155;;29271:95;29362:3;29353:6;29271:95;:::i;:::-;29264:102;;29383:148;29527:3;29383:148;:::i;:::-;29376:155;;29548:95;29639:3;29630:6;29548:95;:::i;:::-;29541:102;;29660:148;29804:3;29660:148;:::i;:::-;29653:155;;29825:3;29818:10;;25407:4427;;;;;;;;;;:::o;29840:256::-;29952:3;29967:75;30038:3;30029:6;29967:75;:::i;:::-;30067:2;30062:3;30058:12;30051:19;;30087:3;30080:10;;29840:256;;;;:::o;30102:222::-;30195:4;30233:2;30222:9;30218:18;30210:26;;30246:71;30314:1;30303:9;30299:17;30290:6;30246:71;:::i;:::-;30102:222;;;;:::o;30330:640::-;30525:4;30563:3;30552:9;30548:19;30540:27;;30577:71;30645:1;30634:9;30630:17;30621:6;30577:71;:::i;:::-;30658:72;30726:2;30715:9;30711:18;30702:6;30658:72;:::i;:::-;30740;30808:2;30797:9;30793:18;30784:6;30740:72;:::i;:::-;30859:9;30853:4;30849:20;30844:2;30833:9;30829:18;30822:48;30887:76;30958:4;30949:6;30887:76;:::i;:::-;30879:84;;30330:640;;;;;;;:::o;30976:210::-;31063:4;31101:2;31090:9;31086:18;31078:26;;31114:65;31176:1;31165:9;31161:17;31152:6;31114:65;:::i;:::-;30976:210;;;;:::o;31192:313::-;31305:4;31343:2;31332:9;31328:18;31320:26;;31392:9;31386:4;31382:20;31378:1;31367:9;31363:17;31356:47;31420:78;31493:4;31484:6;31420:78;:::i;:::-;31412:86;;31192:313;;;;:::o;31511:419::-;31677:4;31715:2;31704:9;31700:18;31692:26;;31764:9;31758:4;31754:20;31750:1;31739:9;31735:17;31728:47;31792:131;31918:4;31792:131;:::i;:::-;31784:139;;31511:419;;;:::o;31936:::-;32102:4;32140:2;32129:9;32125:18;32117:26;;32189:9;32183:4;32179:20;32175:1;32164:9;32160:17;32153:47;32217:131;32343:4;32217:131;:::i;:::-;32209:139;;31936:419;;;:::o;32361:::-;32527:4;32565:2;32554:9;32550:18;32542:26;;32614:9;32608:4;32604:20;32600:1;32589:9;32585:17;32578:47;32642:131;32768:4;32642:131;:::i;:::-;32634:139;;32361:419;;;:::o;32786:::-;32952:4;32990:2;32979:9;32975:18;32967:26;;33039:9;33033:4;33029:20;33025:1;33014:9;33010:17;33003:47;33067:131;33193:4;33067:131;:::i;:::-;33059:139;;32786:419;;;:::o;33211:::-;33377:4;33415:2;33404:9;33400:18;33392:26;;33464:9;33458:4;33454:20;33450:1;33439:9;33435:17;33428:47;33492:131;33618:4;33492:131;:::i;:::-;33484:139;;33211:419;;;:::o;33636:::-;33802:4;33840:2;33829:9;33825:18;33817:26;;33889:9;33883:4;33879:20;33875:1;33864:9;33860:17;33853:47;33917:131;34043:4;33917:131;:::i;:::-;33909:139;;33636:419;;;:::o;34061:::-;34227:4;34265:2;34254:9;34250:18;34242:26;;34314:9;34308:4;34304:20;34300:1;34289:9;34285:17;34278:47;34342:131;34468:4;34342:131;:::i;:::-;34334:139;;34061:419;;;:::o;34486:::-;34652:4;34690:2;34679:9;34675:18;34667:26;;34739:9;34733:4;34729:20;34725:1;34714:9;34710:17;34703:47;34767:131;34893:4;34767:131;:::i;:::-;34759:139;;34486:419;;;:::o;34911:::-;35077:4;35115:2;35104:9;35100:18;35092:26;;35164:9;35158:4;35154:20;35150:1;35139:9;35135:17;35128:47;35192:131;35318:4;35192:131;:::i;:::-;35184:139;;34911:419;;;:::o;35336:::-;35502:4;35540:2;35529:9;35525:18;35517:26;;35589:9;35583:4;35579:20;35575:1;35564:9;35560:17;35553:47;35617:131;35743:4;35617:131;:::i;:::-;35609:139;;35336:419;;;:::o;35761:::-;35927:4;35965:2;35954:9;35950:18;35942:26;;36014:9;36008:4;36004:20;36000:1;35989:9;35985:17;35978:47;36042:131;36168:4;36042:131;:::i;:::-;36034:139;;35761:419;;;:::o;36186:::-;36352:4;36390:2;36379:9;36375:18;36367:26;;36439:9;36433:4;36429:20;36425:1;36414:9;36410:17;36403:47;36467:131;36593:4;36467:131;:::i;:::-;36459:139;;36186:419;;;:::o;36611:::-;36777:4;36815:2;36804:9;36800:18;36792:26;;36864:9;36858:4;36854:20;36850:1;36839:9;36835:17;36828:47;36892:131;37018:4;36892:131;:::i;:::-;36884:139;;36611:419;;;:::o;37036:::-;37202:4;37240:2;37229:9;37225:18;37217:26;;37289:9;37283:4;37279:20;37275:1;37264:9;37260:17;37253:47;37317:131;37443:4;37317:131;:::i;:::-;37309:139;;37036:419;;;:::o;37461:::-;37627:4;37665:2;37654:9;37650:18;37642:26;;37714:9;37708:4;37704:20;37700:1;37689:9;37685:17;37678:47;37742:131;37868:4;37742:131;:::i;:::-;37734:139;;37461:419;;;:::o;37886:::-;38052:4;38090:2;38079:9;38075:18;38067:26;;38139:9;38133:4;38129:20;38125:1;38114:9;38110:17;38103:47;38167:131;38293:4;38167:131;:::i;:::-;38159:139;;37886:419;;;:::o;38311:::-;38477:4;38515:2;38504:9;38500:18;38492:26;;38564:9;38558:4;38554:20;38550:1;38539:9;38535:17;38528:47;38592:131;38718:4;38592:131;:::i;:::-;38584:139;;38311:419;;;:::o;38736:::-;38902:4;38940:2;38929:9;38925:18;38917:26;;38989:9;38983:4;38979:20;38975:1;38964:9;38960:17;38953:47;39017:131;39143:4;39017:131;:::i;:::-;39009:139;;38736:419;;;:::o;39161:222::-;39254:4;39292:2;39281:9;39277:18;39269:26;;39305:71;39373:1;39362:9;39358:17;39349:6;39305:71;:::i;:::-;39161:222;;;;:::o;39389:129::-;39423:6;39450:20;;:::i;:::-;39440:30;;39479:33;39507:4;39499:6;39479:33;:::i;:::-;39389:129;;;:::o;39524:75::-;39557:6;39590:2;39584:9;39574:19;;39524:75;:::o;39605:307::-;39666:4;39756:18;39748:6;39745:30;39742:56;;;39778:18;;:::i;:::-;39742:56;39816:29;39838:6;39816:29;:::i;:::-;39808:37;;39900:4;39894;39890:15;39882:23;;39605:307;;;:::o;39918:98::-;39969:6;40003:5;39997:12;39987:22;;39918:98;;;:::o;40022:99::-;40074:6;40108:5;40102:12;40092:22;;40022:99;;;:::o;40127:168::-;40210:11;40244:6;40239:3;40232:19;40284:4;40279:3;40275:14;40260:29;;40127:168;;;;:::o;40301:169::-;40385:11;40419:6;40414:3;40407:19;40459:4;40454:3;40450:14;40435:29;;40301:169;;;;:::o;40476:148::-;40578:11;40615:3;40600:18;;40476:148;;;;:::o;40630:305::-;40670:3;40689:20;40707:1;40689:20;:::i;:::-;40684:25;;40723:20;40741:1;40723:20;:::i;:::-;40718:25;;40877:1;40809:66;40805:74;40802:1;40799:81;40796:107;;;40883:18;;:::i;:::-;40796:107;40927:1;40924;40920:9;40913:16;;40630:305;;;;:::o;40941:237::-;40979:3;40998:18;41014:1;40998:18;:::i;:::-;40993:23;;41030:18;41046:1;41030:18;:::i;:::-;41025:23;;41120:1;41114:4;41110:12;41107:1;41104:19;41101:45;;;41126:18;;:::i;:::-;41101:45;41170:1;41167;41163:9;41156:16;;40941:237;;;;:::o;41184:185::-;41224:1;41241:20;41259:1;41241:20;:::i;:::-;41236:25;;41275:20;41293:1;41275:20;:::i;:::-;41270:25;;41314:1;41304:35;;41319:18;;:::i;:::-;41304:35;41361:1;41358;41354:9;41349:14;;41184:185;;;;:::o;41375:348::-;41415:7;41438:20;41456:1;41438:20;:::i;:::-;41433:25;;41472:20;41490:1;41472:20;:::i;:::-;41467:25;;41660:1;41592:66;41588:74;41585:1;41582:81;41577:1;41570:9;41563:17;41559:105;41556:131;;;41667:18;;:::i;:::-;41556:131;41715:1;41712;41708:9;41697:20;;41375:348;;;;:::o;41729:191::-;41769:4;41789:20;41807:1;41789:20;:::i;:::-;41784:25;;41823:20;41841:1;41823:20;:::i;:::-;41818:25;;41862:1;41859;41856:8;41853:34;;;41867:18;;:::i;:::-;41853:34;41912:1;41909;41905:9;41897:17;;41729:191;;;;:::o;41926:96::-;41963:7;41992:24;42010:5;41992:24;:::i;:::-;41981:35;;41926:96;;;:::o;42028:90::-;42062:7;42105:5;42098:13;42091:21;42080:32;;42028:90;;;:::o;42124:149::-;42160:7;42200:66;42193:5;42189:78;42178:89;;42124:149;;;:::o;42279:126::-;42316:7;42356:42;42349:5;42345:54;42334:65;;42279:126;;;:::o;42411:77::-;42448:7;42477:5;42466:16;;42411:77;;;:::o;42494:86::-;42529:7;42569:4;42562:5;42558:16;42547:27;;42494:86;;;:::o;42586:154::-;42670:6;42665:3;42660;42647:30;42732:1;42723:6;42718:3;42714:16;42707:27;42586:154;;;:::o;42746:307::-;42814:1;42824:113;42838:6;42835:1;42832:13;42824:113;;;42923:1;42918:3;42914:11;42908:18;42904:1;42899:3;42895:11;42888:39;42860:2;42857:1;42853:10;42848:15;;42824:113;;;42955:6;42952:1;42949:13;42946:101;;;43035:1;43026:6;43021:3;43017:16;43010:27;42946:101;42795:258;42746:307;;;:::o;43059:320::-;43103:6;43140:1;43134:4;43130:12;43120:22;;43187:1;43181:4;43177:12;43208:18;43198:81;;43264:4;43256:6;43252:17;43242:27;;43198:81;43326:2;43318:6;43315:14;43295:18;43292:38;43289:84;;;43345:18;;:::i;:::-;43289:84;43110:269;43059:320;;;:::o;43385:281::-;43468:27;43490:4;43468:27;:::i;:::-;43460:6;43456:40;43598:6;43586:10;43583:22;43562:18;43550:10;43547:34;43544:62;43541:88;;;43609:18;;:::i;:::-;43541:88;43649:10;43645:2;43638:22;43428:238;43385:281;;:::o;43672:233::-;43711:3;43734:24;43752:5;43734:24;:::i;:::-;43725:33;;43780:66;43773:5;43770:77;43767:103;;;43850:18;;:::i;:::-;43767:103;43897:1;43890:5;43886:13;43879:20;;43672:233;;;:::o;43911:79::-;43950:7;43979:5;43968:16;;43911:79;;;:::o;43996:176::-;44028:1;44045:20;44063:1;44045:20;:::i;:::-;44040:25;;44079:20;44097:1;44079:20;:::i;:::-;44074:25;;44118:1;44108:35;;44123:18;;:::i;:::-;44108:35;44164:1;44161;44157:9;44152:14;;43996:176;;;;:::o;44178:180::-;44226:77;44223:1;44216:88;44323:4;44320:1;44313:15;44347:4;44344:1;44337:15;44364:180;44412:77;44409:1;44402:88;44509:4;44506:1;44499:15;44533:4;44530:1;44523:15;44550:180;44598:77;44595:1;44588:88;44695:4;44692:1;44685:15;44719:4;44716:1;44709:15;44736:180;44784:77;44781:1;44774:88;44881:4;44878:1;44871:15;44905:4;44902:1;44895:15;44922:180;44970:77;44967:1;44960:88;45067:4;45064:1;45057:15;45091:4;45088:1;45081:15;45108:180;45156:77;45153:1;45146:88;45253:4;45250:1;45243:15;45277:4;45274:1;45267:15;45294:117;45403:1;45400;45393:12;45417:117;45526:1;45523;45516:12;45540:117;45649:1;45646;45639:12;45663:117;45772:1;45769;45762:12;45786:102;45827:6;45878:2;45874:7;45869:2;45862:5;45858:14;45854:28;45844:38;;45786:102;;;:::o;45894:315::-;46034:66;46030:1;46022:6;46018:14;46011:90;46135:66;46130:2;46122:6;46118:15;46111:91;45894:315;:::o;46215:230::-;46355:34;46351:1;46343:6;46339:14;46332:58;46424:13;46419:2;46411:6;46407:15;46400:38;46215:230;:::o;46451:237::-;46591:34;46587:1;46579:6;46575:14;46568:58;46660:20;46655:2;46647:6;46643:15;46636:45;46451:237;:::o;46694:159::-;46834:11;46830:1;46822:6;46818:14;46811:35;46694:159;:::o;46859:225::-;46999:34;46995:1;46987:6;46983:14;46976:58;47068:8;47063:2;47055:6;47051:15;47044:33;46859:225;:::o;47090:214::-;47230:66;47226:1;47218:6;47214:14;47207:90;47090:214;:::o;47310:224::-;47450:34;47446:1;47438:6;47434:14;47427:58;47519:7;47514:2;47506:6;47502:15;47495:32;47310:224;:::o;47540:178::-;47680:30;47676:1;47668:6;47664:14;47657:54;47540:178;:::o;47724:214::-;47864:66;47860:1;47852:6;47848:14;47841:90;47724:214;:::o;47944:151::-;48084:3;48080:1;48072:6;48068:14;48061:27;47944:151;:::o;48101:223::-;48241:34;48237:1;48229:6;48225:14;48218:58;48310:6;48305:2;48297:6;48293:15;48286:31;48101:223;:::o;48330:175::-;48470:27;48466:1;48458:6;48454:14;48447:51;48330:175;:::o;48511:234::-;48651:34;48647:1;48639:6;48635:14;48628:58;48720:13;48715:2;48707:6;48703:15;48696:38;48511:234;:::o;48755:222::-;48899:66;48895:1;48887:6;48883:14;48876:90;48755:222;:::o;48987:243::-;49131:34;49127:1;49119:6;49115:14;49108:58;49204:14;49199:2;49191:6;49187:15;49180:39;48987:243;:::o;49240:255::-;49384:34;49380:1;49372:6;49368:14;49361:58;49457:26;49452:2;49444:6;49440:15;49433:51;49240:255;:::o;49505:241::-;49649:34;49645:1;49637:6;49633:14;49626:58;49722:12;49717:2;49709:6;49705:15;49698:37;49505:241;:::o;49756:240::-;49900:34;49896:1;49888:6;49884:14;49877:58;49973:11;49968:2;49960:6;49956:15;49949:36;49756:240;:::o;50006:154::-;50146:6;50142:1;50134:6;50130:14;50123:30;50006:154;:::o;50166:182::-;50306:34;50302:1;50294:6;50290:14;50283:58;50166:182;:::o;50354:231::-;50494:34;50490:1;50482:6;50478:14;50471:58;50563:14;50558:2;50550:6;50546:15;50539:39;50354:231;:::o;50591:159::-;50731:11;50727:1;50719:6;50715:14;50708:35;50591:159;:::o;50756:182::-;50896:34;50892:1;50884:6;50880:14;50873:58;50756:182;:::o;50944:381::-;51084:34;51080:1;51072:6;51068:14;51061:58;51153:34;51148:2;51140:6;51136:15;51129:59;51222:34;51217:2;51209:6;51205:15;51198:59;51291:26;51286:2;51278:6;51274:15;51267:51;50944:381;:::o;51331:214::-;51471:66;51467:1;51459:6;51455:14;51448:90;51331:214;:::o;51551:144::-;51687:4;51683:1;51675:6;51671:14;51664:28;51551:144;:::o;51697:407::-;51833:34;51829:1;51821:6;51817:14;51810:58;51898:34;51893:2;51885:6;51881:15;51874:59;51963:34;51958:2;51950:6;51946:15;51939:59;52028:34;52023:2;52015:6;52011:15;52004:59;52094:6;52088:3;52080:6;52076:16;52069:32;51697:407;:::o;52106:208::-;52242:34;52238:1;52230:6;52226:14;52219:58;52307:3;52302:2;52294:6;52290:15;52283:28;52106:208;:::o;52316:171::-;52452:31;52448:1;52440:6;52436:14;52429:55;52316:171;:::o;52489:303::-;52625:66;52621:1;52613:6;52609:14;52602:90;52722:66;52717:2;52709:6;52705:15;52698:91;52489:303;:::o;52794:148::-;52930:8;52926:1;52918:6;52914:14;52907:32;52794:148;:::o;52944:224::-;53080:34;53076:1;53068:6;53064:14;53057:58;53145:19;53140:2;53132:6;53128:15;53121:44;52944:224;:::o;53170:352::-;53306:34;53302:1;53294:6;53290:14;53283:58;53371:34;53366:2;53358:6;53354:15;53347:59;53436:34;53431:2;53423:6;53419:15;53412:59;53505:9;53500:2;53492:6;53488:15;53481:34;53170:352;:::o;53528:231::-;53668:34;53664:1;53656:6;53652:14;53645:58;53737:14;53732:2;53724:6;53720:15;53713:39;53528:231;:::o;53765:315::-;53905:66;53901:1;53893:6;53889:14;53882:90;54006:66;54001:2;53993:6;53989:15;53982:91;53765:315;:::o;54086:373::-;54226:34;54222:1;54214:6;54210:14;54203:58;54295:34;54290:2;54282:6;54278:15;54271:59;54364:34;54359:2;54351:6;54347:15;54340:59;54433:18;54428:2;54420:6;54416:15;54409:43;54086:373;:::o;54465:122::-;54538:24;54556:5;54538:24;:::i;:::-;54531:5;54528:35;54518:63;;54577:1;54574;54567:12;54518:63;54465:122;:::o;54593:116::-;54663:21;54678:5;54663:21;:::i;:::-;54656:5;54653:32;54643:60;;54699:1;54696;54689:12;54643:60;54593:116;:::o;54715:120::-;54787:23;54804:5;54787:23;:::i;:::-;54780:5;54777:34;54767:62;;54825:1;54822;54815:12;54767:62;54715:120;:::o;54841:122::-;54914:24;54932:5;54914:24;:::i;:::-;54907:5;54904:35;54894:63;;54953:1;54950;54943:12;54894:63;54841:122;:::o

Swarm Source

ipfs://7aeb2f6823004e9c006f3bb1d5729776355536192a66e0a091fbe0348d98417a
Loading...
Loading
Loading...
Loading
[ 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.