ETH Price: $3,258.14 (+3.29%)
Gas: 4 Gwei

Token

Rare Shoes 2.0 (RSHOE2)
 

Overview

Max Total Supply

636 RSHOE2

Holders

204

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 RSHOE2
0x38b99D8104C3CcE312436914298a86f14A3B1CaC
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:
RareShoes2

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: RareShoe2_0.sol

pragma solidity ^0.8.11;






contract RareShoes2 is ERC721URIStorage, Ownable, EIP712 {
  using ECDSA for bytes32;

  using Counters for Counters.Counter;

  string private _baseTokenURI;

  address private _systemAddress;

  mapping(string => bool) public _usedNonces;

  mapping(address => bool) public _redeemedAddresses;

  Counters.Counter private _tokenIdCounterBlue;

  Counters.Counter private _tokenIdCounterRed;

  Counters.Counter private _tokenIdCounterYellow;

  Counters.Counter private _tokenIdCounter;

  constructor(string memory baseTokenURI, address systemAddress) ERC721("Rare Shoes 2.0", "RSHOE2") EIP712("RSHOE2", "1.0.0") {
    _baseTokenURI = baseTokenURI;
    _systemAddress =  systemAddress;
  }

  function publicSale(
    uint256 amountBlue,
    uint256 amountRed,
    uint256 amountYellow,
    string memory nonce,
    bytes32 hash,
    bytes memory signature
  ) external payable {

    require(matchSigner(hash, signature), "Plz mint through website");
    require(!_usedNonces[nonce], "Hash reused");
    require(!_redeemedAddresses[msg.sender], "Already redeemed");
    require(
      hashTransaction(msg.sender, amountBlue, amountRed, amountYellow, nonce) == hash,
      "Hash failed"
    );

    _usedNonces[nonce] = true;

    for (uint256 i = 1; i <= amountBlue; i++) {
      _safeMint(msg.sender, _tokenIdCounter.current());
      _setTokenURI(_tokenIdCounter.current(), append("blue/", _tokenIdCounterBlue.current()));
      _tokenIdCounter.increment();
      _tokenIdCounterBlue.increment();
    }

    for (uint256 i = 1; i <= amountRed; i++) {
      _safeMint(msg.sender, _tokenIdCounter.current());
      _setTokenURI(_tokenIdCounter.current(), append("red/", _tokenIdCounterRed.current()));
      _tokenIdCounter.increment();
      _tokenIdCounterRed.increment();
    }

    for (uint256 i = 1; i <= amountYellow; i++) {
      _safeMint(msg.sender, _tokenIdCounter.current());
      _setTokenURI(_tokenIdCounter.current(), append("yellow/", _tokenIdCounterYellow.current()));
      _tokenIdCounter.increment();
      _tokenIdCounterYellow.increment();
    }

    _redeemedAddresses[msg.sender] = true;
  }

  function mint(address receiver, string memory tokenURI) external payable onlyOwner {
      _safeMint(receiver, _tokenIdCounter.current());
      _setTokenURI(_tokenIdCounter.current(), tokenURI);
      _tokenIdCounter.increment();
  }

  function append(string memory a, uint256 b) internal pure returns (string memory) {
    return string(abi.encodePacked(a, Strings.toString(b), ".json"));
 }

  function matchSigner(bytes32 hash, bytes memory signature) public view returns (bool) {
    return _systemAddress == hash.toEthSignedMessageHash().recover(signature);
  }

  function hashTransaction(
    address sender,
    uint256 amountBlue,
    uint256 amountRed,
    uint256 amountYellow,
    string memory nonce
  ) public view returns (bytes32) {

    bytes32 hash = keccak256(
      abi.encodePacked(sender, amountBlue, amountRed, amountYellow, nonce, address(this))
    );

    return hash;
  }

  function _baseURI() internal view override returns (string memory) {
    return _baseTokenURI;
  }

  function withdrawAll(address payable to) external onlyOwner {
    to.transfer(address(this).balance);
  }

  function totalSupply() public view returns (uint) {
    return _tokenIdCounter.current();
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"},{"internalType":"address","name":"systemAddress","type":"address"}],"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":"","type":"address"}],"name":"_redeemedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"_usedNonces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amountBlue","type":"uint256"},{"internalType":"uint256","name":"amountRed","type":"uint256"},{"internalType":"uint256","name":"amountYellow","type":"uint256"},{"internalType":"string","name":"nonce","type":"string"}],"name":"hashTransaction","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"matchSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountBlue","type":"uint256"},{"internalType":"uint256","name":"amountRed","type":"uint256"},{"internalType":"uint256","name":"amountYellow","type":"uint256"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"publicSale","outputs":[],"stateMutability":"payable","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101406040523480156200001257600080fd5b5060405162004dc738038062004dc783398181016040528101906200003891906200056f565b6040518060400160405280600681526020017f5253484f453200000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f312e302e300000000000000000000000000000000000000000000000000000008152506040518060400160405280600e81526020017f526172652053686f657320322e300000000000000000000000000000000000008152506040518060400160405280600681526020017f5253484f45320000000000000000000000000000000000000000000000000000815250816000908162000121919062000820565b50806001908162000133919062000820565b505050620001566200014a6200026360201b60201c565b6200026b60201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001bf8184846200033160201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050816008908162000219919062000820565b5080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050620009a1565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600083838346306040516020016200034e95949392919062000944565b6040516020818303038152906040528051906020012090509392505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003d6826200038b565b810181811067ffffffffffffffff82111715620003f857620003f76200039c565b5b80604052505050565b60006200040d6200036d565b90506200041b8282620003cb565b919050565b600067ffffffffffffffff8211156200043e576200043d6200039c565b5b62000449826200038b565b9050602081019050919050565b60005b838110156200047657808201518184015260208101905062000459565b8381111562000486576000848401525b50505050565b6000620004a36200049d8462000420565b62000401565b905082815260208101848484011115620004c257620004c162000386565b5b620004cf84828562000456565b509392505050565b600082601f830112620004ef57620004ee62000381565b5b8151620005018482602086016200048c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000537826200050a565b9050919050565b62000549816200052a565b81146200055557600080fd5b50565b60008151905062000569816200053e565b92915050565b6000806040838503121562000589576200058862000377565b5b600083015167ffffffffffffffff811115620005aa57620005a96200037c565b5b620005b885828601620004d7565b9250506020620005cb8582860162000558565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200062857607f821691505b6020821081036200063e576200063d620005e0565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006a87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000669565b620006b4868362000669565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000701620006fb620006f584620006cc565b620006d6565b620006cc565b9050919050565b6000819050919050565b6200071d83620006e0565b620007356200072c8262000708565b84845462000676565b825550505050565b600090565b6200074c6200073d565b6200075981848462000712565b505050565b5b8181101562000781576200077560008262000742565b6001810190506200075f565b5050565b601f821115620007d0576200079a8162000644565b620007a58462000659565b81016020851015620007b5578190505b620007cd620007c48562000659565b8301826200075e565b50505b505050565b600082821c905092915050565b6000620007f560001984600802620007d5565b1980831691505092915050565b6000620008108383620007e2565b9150826002028217905092915050565b6200082b82620005d5565b67ffffffffffffffff8111156200084757620008466200039c565b5b6200085382546200060f565b6200086082828562000785565b600060209050601f83116001811462000898576000841562000883578287015190505b6200088f858262000802565b865550620008ff565b601f198416620008a88662000644565b60005b82811015620008d257848901518255600182019150602085019450602081019050620008ab565b86831015620008f25784890151620008ee601f891682620007e2565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b6200091c8162000907565b82525050565b6200092d81620006cc565b82525050565b6200093e816200052a565b82525050565b600060a0820190506200095b600083018862000911565b6200096a602083018762000911565b62000979604083018662000911565b62000988606083018562000922565b62000997608083018462000933565b9695505050505050565b60805160a05160c05160e05161010051610120516143e8620009df6000396000505060005050600050506000505060005050600050506143e86000f3fe60806040526004361061014b5760003560e01c806395d89b41116100b6578063c88512fa1161006f578063c88512fa146104a7578063d0def521146104e4578063dd8d74d814610500578063e985e9c51461053d578063f2fde38b1461057a578063fa09e630146105a35761014b565b806395d89b4114610373578063a22cb4651461039e578063a6ba55c7146103c7578063b88d4fde14610404578063c4e618961461042d578063c87b56dd1461046a5761014b565b806342842e0e1161010857806342842e0e146102725780634719021f1461029b5780636352211e146102b757806370a08231146102f4578063715018a6146103315780638da5cb5b146103485761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e57806323b872dd14610249575b600080fd5b34801561015c57600080fd5b506101776004803603810190610172919061273c565b6105cc565b6040516101849190612784565b60405180910390f35b34801561019957600080fd5b506101a26106ae565b6040516101af9190612838565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612890565b610740565b6040516101ec91906128fe565b60405180910390f35b34801561020157600080fd5b5061021c60048036038101906102179190612945565b610786565b005b34801561022a57600080fd5b5061023361089d565b6040516102409190612994565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b91906129af565b6108ae565b005b34801561027e57600080fd5b50610299600480360381019061029491906129af565b61090e565b005b6102b560048036038101906102b09190612c0e565b61092e565b005b3480156102c357600080fd5b506102de60048036038101906102d99190612890565b610d3e565b6040516102eb91906128fe565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612cd3565b610def565b6040516103289190612994565b60405180910390f35b34801561033d57600080fd5b50610346610ea6565b005b34801561035457600080fd5b5061035d610eba565b60405161036a91906128fe565b60405180910390f35b34801561037f57600080fd5b50610388610ee4565b6040516103959190612838565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c09190612d2c565b610f76565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190612d6c565b610f8c565b6040516103fb9190612784565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190612db5565b610fc2565b005b34801561043957600080fd5b50610454600480360381019061044f9190612cd3565b611024565b6040516104619190612784565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190612890565b611044565b60405161049e9190612838565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190612e38565b611156565b6040516104db9190612ede565b60405180910390f35b6104fe60048036038101906104f99190612ef9565b611199565b005b34801561050c57600080fd5b5061052760048036038101906105229190612f55565b6111d5565b6040516105349190612784565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190612fb1565b61124a565b6040516105719190612784565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190612cd3565b6112de565b005b3480156105af57600080fd5b506105ca60048036038101906105c5919061302f565b611361565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061069757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a757506106a6826113b3565b5b9050919050565b6060600080546106bd9061308b565b80601f01602080910402602001604051908101604052809291908181526020018280546106e99061308b565b80156107365780601f1061070b57610100808354040283529160200191610736565b820191906000526020600020905b81548152906001019060200180831161071957829003601f168201915b5050505050905090565b600061074b8261141d565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079182610d3e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f89061312e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610820611468565b73ffffffffffffffffffffffffffffffffffffffff16148061084f575061084e81610849611468565b61124a565b5b61088e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610885906131c0565b60405180910390fd5b6108988383611470565b505050565b60006108a9600f611529565b905090565b6108bf6108b9611468565b82611537565b6108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f590613252565b60405180910390fd5b6109098383836115cc565b505050565b61092983838360405180602001604052806000815250610fc2565b505050565b61093882826111d5565b610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e906132be565b60405180910390fd5b600a83604051610987919061331a565b908152602001604051809103902060009054906101000a900460ff16156109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da9061337d565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a67906133e9565b60405180910390fd5b81610a7e3388888888611156565b14610abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab590613455565b60405180910390fd5b6001600a84604051610ad0919061331a565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506000600190505b868111610b9757610b1633610b11600f611529565b611832565b610b70610b23600f611529565b610b6b6040518060400160405280600581526020017f626c75652f000000000000000000000000000000000000000000000000000000815250610b66600c611529565b611850565b611884565b610b7a600f6118f1565b610b84600c6118f1565b8080610b8f906134a4565b915050610afc565b506000600190505b858111610c3a57610bb933610bb4600f611529565b611832565b610c13610bc6600f611529565b610c0e6040518060400160405280600481526020017f7265642f00000000000000000000000000000000000000000000000000000000815250610c09600d611529565b611850565b611884565b610c1d600f6118f1565b610c27600d6118f1565b8080610c32906134a4565b915050610b9f565b506000600190505b848111610cdd57610c5c33610c57600f611529565b611832565b610cb6610c69600f611529565b610cb16040518060400160405280600781526020017f79656c6c6f772f00000000000000000000000000000000000000000000000000815250610cac600e611529565b611850565b611884565b610cc0600f6118f1565b610cca600e6118f1565b8080610cd5906134a4565b915050610c42565b506001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd90613538565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e56906135ca565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610eae611907565b610eb86000611985565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ef39061308b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1f9061308b565b8015610f6c5780601f10610f4157610100808354040283529160200191610f6c565b820191906000526020600020905b815481529060010190602001808311610f4f57829003601f168201915b5050505050905090565b610f88610f81611468565b8383611a4b565b5050565b600a818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b610fd3610fcd611468565b83611537565b611012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100990613252565b60405180910390fd5b61101e84848484611bb7565b50505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b606061104f8261141d565b600060066000848152602001908152602001600020805461106f9061308b565b80601f016020809104026020016040519081016040528092919081815260200182805461109b9061308b565b80156110e85780601f106110bd576101008083540402835291602001916110e8565b820191906000526020600020905b8154815290600101906020018083116110cb57829003601f168201915b5050505050905060006110f9611c13565b9050600081510361110e578192505050611151565b60008251111561114357808260405160200161112b9291906135ea565b60405160208183030381529060405292505050611151565b61114c84611ca5565b925050505b919050565b60008086868686863060405160200161117496959493929190613677565b6040516020818303038152906040528051906020012090508091505095945050505050565b6111a1611907565b6111b4826111af600f611529565b611832565b6111c76111c1600f611529565b82611884565b6111d1600f6118f1565b5050565b60006111f2826111e485611d0d565b611d3d90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112e6611907565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90613755565b60405180910390fd5b61135e81611985565b50565b611369611907565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113af573d6000803e3d6000fd5b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61142681611d64565b611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145c90613538565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114e383610d3e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008061154383610d3e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806115855750611584818561124a565b5b806115c357508373ffffffffffffffffffffffffffffffffffffffff166115ab84610740565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115ec82610d3e565b73ffffffffffffffffffffffffffffffffffffffff1614611642576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611639906137e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a890613879565b60405180910390fd5b6116bc838383611dd0565b6116c7600082611470565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117179190613899565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461176e91906138cd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461182d838383611dd5565b505050565b61184c828260405180602001604052806000815250611dda565b5050565b60608261185c83611e35565b60405160200161186d92919061396f565b604051602081830303815290604052905092915050565b61188d82611d64565b6118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c390613a10565b60405180910390fd5b806006600084815260200190815260200160002090816118ec9190613bdc565b505050565b6001816000016000828254019250508190555050565b61190f611468565b73ffffffffffffffffffffffffffffffffffffffff1661192d610eba565b73ffffffffffffffffffffffffffffffffffffffff1614611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a90613cfa565b60405180910390fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090613d66565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611baa9190612784565b60405180910390a3505050565b611bc28484846115cc565b611bce84848484611f95565b611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0490613df8565b60405180910390fd5b50505050565b606060088054611c229061308b565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4e9061308b565b8015611c9b5780601f10611c7057610100808354040283529160200191611c9b565b820191906000526020600020905b815481529060010190602001808311611c7e57829003601f168201915b5050505050905090565b6060611cb08261141d565b6000611cba611c13565b90506000815111611cda5760405180602001604052806000815250611d05565b80611ce484611e35565b604051602001611cf59291906135ea565b6040516020818303038152906040525b915050919050565b600081604051602001611d209190613e85565b604051602081830303815290604052805190602001209050919050565b6000806000611d4c858561211c565b91509150611d598161219d565b819250505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b611de48383612369565b611df16000848484611f95565b611e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2790613df8565b60405180910390fd5b505050565b606060008203611e7c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f90565b600082905060005b60008214611eae578080611e97906134a4565b915050600a82611ea79190613eda565b9150611e84565b60008167ffffffffffffffff811115611eca57611ec9612a0c565b5b6040519080825280601f01601f191660200182016040528015611efc5781602001600182028036833780820191505090505b5090505b60008514611f8957600182611f159190613899565b9150600a85611f249190613f0b565b6030611f3091906138cd565b60f81b818381518110611f4657611f45613f3c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f829190613eda565b9450611f00565b8093505050505b919050565b6000611fb68473ffffffffffffffffffffffffffffffffffffffff16612542565b1561210f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611fdf611468565b8786866040518563ffffffff1660e01b81526004016120019493929190613fc0565b6020604051808303816000875af192505050801561203d57506040513d601f19601f8201168201806040525081019061203a9190614021565b60015b6120bf573d806000811461206d576040519150601f19603f3d011682016040523d82523d6000602084013e612072565b606091505b5060008151036120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae90613df8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612114565b600190505b949350505050565b600080604183510361215d5760008060006020860151925060408601519150606086015160001a905061215187828585612565565b94509450505050612196565b604083510361218d576000806020850151915060408501519050612182868383612671565b935093505050612196565b60006002915091505b9250929050565b600060048111156121b1576121b061404e565b5b8160048111156121c4576121c361404e565b5b031561236657600160048111156121de576121dd61404e565b5b8160048111156121f1576121f061404e565b5b03612231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612228906140c9565b60405180910390fd5b600260048111156122455761224461404e565b5b8160048111156122585761225761404e565b5b03612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228f90614135565b60405180910390fd5b600360048111156122ac576122ab61404e565b5b8160048111156122bf576122be61404e565b5b036122ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f6906141c7565b60405180910390fd5b6004808111156123125761231161404e565b5b8160048111156123255761232461404e565b5b03612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c90614259565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cf906142c5565b60405180910390fd5b6123e181611d64565b15612421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241890614331565b60405180910390fd5b61242d60008383611dd0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461247d91906138cd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461253e60008383611dd5565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156125a0576000600391509150612668565b601b8560ff16141580156125b85750601c8560ff1614155b156125ca576000600491509150612668565b6000600187878787604051600081526020016040526040516125ef949392919061436d565b6020604051602081039080840390855afa158015612611573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361265f57600060019250925050612668565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6126b491906138cd565b90506126c287828885612565565b935093505050935093915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612719816126e4565b811461272457600080fd5b50565b60008135905061273681612710565b92915050565b600060208284031215612752576127516126da565b5b600061276084828501612727565b91505092915050565b60008115159050919050565b61277e81612769565b82525050565b60006020820190506127996000830184612775565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156127d95780820151818401526020810190506127be565b838111156127e8576000848401525b50505050565b6000601f19601f8301169050919050565b600061280a8261279f565b61281481856127aa565b93506128248185602086016127bb565b61282d816127ee565b840191505092915050565b6000602082019050818103600083015261285281846127ff565b905092915050565b6000819050919050565b61286d8161285a565b811461287857600080fd5b50565b60008135905061288a81612864565b92915050565b6000602082840312156128a6576128a56126da565b5b60006128b48482850161287b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128e8826128bd565b9050919050565b6128f8816128dd565b82525050565b600060208201905061291360008301846128ef565b92915050565b612922816128dd565b811461292d57600080fd5b50565b60008135905061293f81612919565b92915050565b6000806040838503121561295c5761295b6126da565b5b600061296a85828601612930565b925050602061297b8582860161287b565b9150509250929050565b61298e8161285a565b82525050565b60006020820190506129a96000830184612985565b92915050565b6000806000606084860312156129c8576129c76126da565b5b60006129d686828701612930565b93505060206129e786828701612930565b92505060406129f88682870161287b565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a44826127ee565b810181811067ffffffffffffffff82111715612a6357612a62612a0c565b5b80604052505050565b6000612a766126d0565b9050612a828282612a3b565b919050565b600067ffffffffffffffff821115612aa257612aa1612a0c565b5b612aab826127ee565b9050602081019050919050565b82818337600083830152505050565b6000612ada612ad584612a87565b612a6c565b905082815260208101848484011115612af657612af5612a07565b5b612b01848285612ab8565b509392505050565b600082601f830112612b1e57612b1d612a02565b5b8135612b2e848260208601612ac7565b91505092915050565b6000819050919050565b612b4a81612b37565b8114612b5557600080fd5b50565b600081359050612b6781612b41565b92915050565b600067ffffffffffffffff821115612b8857612b87612a0c565b5b612b91826127ee565b9050602081019050919050565b6000612bb1612bac84612b6d565b612a6c565b905082815260208101848484011115612bcd57612bcc612a07565b5b612bd8848285612ab8565b509392505050565b600082601f830112612bf557612bf4612a02565b5b8135612c05848260208601612b9e565b91505092915050565b60008060008060008060c08789031215612c2b57612c2a6126da565b5b6000612c3989828a0161287b565b9650506020612c4a89828a0161287b565b9550506040612c5b89828a0161287b565b945050606087013567ffffffffffffffff811115612c7c57612c7b6126df565b5b612c8889828a01612b09565b9350506080612c9989828a01612b58565b92505060a087013567ffffffffffffffff811115612cba57612cb96126df565b5b612cc689828a01612be0565b9150509295509295509295565b600060208284031215612ce957612ce86126da565b5b6000612cf784828501612930565b91505092915050565b612d0981612769565b8114612d1457600080fd5b50565b600081359050612d2681612d00565b92915050565b60008060408385031215612d4357612d426126da565b5b6000612d5185828601612930565b9250506020612d6285828601612d17565b9150509250929050565b600060208284031215612d8257612d816126da565b5b600082013567ffffffffffffffff811115612da057612d9f6126df565b5b612dac84828501612b09565b91505092915050565b60008060008060808587031215612dcf57612dce6126da565b5b6000612ddd87828801612930565b9450506020612dee87828801612930565b9350506040612dff8782880161287b565b925050606085013567ffffffffffffffff811115612e2057612e1f6126df565b5b612e2c87828801612be0565b91505092959194509250565b600080600080600060a08688031215612e5457612e536126da565b5b6000612e6288828901612930565b9550506020612e738882890161287b565b9450506040612e848882890161287b565b9350506060612e958882890161287b565b925050608086013567ffffffffffffffff811115612eb657612eb56126df565b5b612ec288828901612b09565b9150509295509295909350565b612ed881612b37565b82525050565b6000602082019050612ef36000830184612ecf565b92915050565b60008060408385031215612f1057612f0f6126da565b5b6000612f1e85828601612930565b925050602083013567ffffffffffffffff811115612f3f57612f3e6126df565b5b612f4b85828601612b09565b9150509250929050565b60008060408385031215612f6c57612f6b6126da565b5b6000612f7a85828601612b58565b925050602083013567ffffffffffffffff811115612f9b57612f9a6126df565b5b612fa785828601612be0565b9150509250929050565b60008060408385031215612fc857612fc76126da565b5b6000612fd685828601612930565b9250506020612fe785828601612930565b9150509250929050565b6000612ffc826128bd565b9050919050565b61300c81612ff1565b811461301757600080fd5b50565b60008135905061302981613003565b92915050565b600060208284031215613045576130446126da565b5b60006130538482850161301a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130a357607f821691505b6020821081036130b6576130b561305c565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006131186021836127aa565b9150613123826130bc565b604082019050919050565b600060208201905081810360008301526131478161310b565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b60006131aa603e836127aa565b91506131b58261314e565b604082019050919050565b600060208201905081810360008301526131d98161319d565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b600061323c602e836127aa565b9150613247826131e0565b604082019050919050565b6000602082019050818103600083015261326b8161322f565b9050919050565b7f506c7a206d696e74207468726f75676820776562736974650000000000000000600082015250565b60006132a86018836127aa565b91506132b382613272565b602082019050919050565b600060208201905081810360008301526132d78161329b565b9050919050565b600081905092915050565b60006132f48261279f565b6132fe81856132de565b935061330e8185602086016127bb565b80840191505092915050565b600061332682846132e9565b915081905092915050565b7f4861736820726575736564000000000000000000000000000000000000000000600082015250565b6000613367600b836127aa565b915061337282613331565b602082019050919050565b600060208201905081810360008301526133968161335a565b9050919050565b7f416c72656164792072656465656d656400000000000000000000000000000000600082015250565b60006133d36010836127aa565b91506133de8261339d565b602082019050919050565b60006020820190508181036000830152613402816133c6565b9050919050565b7f48617368206661696c6564000000000000000000000000000000000000000000600082015250565b600061343f600b836127aa565b915061344a82613409565b602082019050919050565b6000602082019050818103600083015261346e81613432565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134af8261285a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134e1576134e0613475565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006135226018836127aa565b915061352d826134ec565b602082019050919050565b6000602082019050818103600083015261355181613515565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006135b46029836127aa565b91506135bf82613558565b604082019050919050565b600060208201905081810360008301526135e3816135a7565b9050919050565b60006135f682856132e9565b915061360282846132e9565b91508190509392505050565b60008160601b9050919050565b60006136268261360e565b9050919050565b60006136388261361b565b9050919050565b61365061364b826128dd565b61362d565b82525050565b6000819050919050565b61367161366c8261285a565b613656565b82525050565b6000613683828961363f565b6014820191506136938288613660565b6020820191506136a38287613660565b6020820191506136b38286613660565b6020820191506136c382856132e9565b91506136cf828461363f565b601482019150819050979650505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061373f6026836127aa565b915061374a826136e3565b604082019050919050565b6000602082019050818103600083015261376e81613732565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006137d16025836127aa565b91506137dc82613775565b604082019050919050565b60006020820190508181036000830152613800816137c4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006138636024836127aa565b915061386e82613807565b604082019050919050565b6000602082019050818103600083015261389281613856565b9050919050565b60006138a48261285a565b91506138af8361285a565b9250828210156138c2576138c1613475565b5b828203905092915050565b60006138d88261285a565b91506138e38361285a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561391857613917613475565b5b828201905092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006139596005836132de565b915061396482613923565b600582019050919050565b600061397b82856132e9565b915061398782846132e9565b91506139928261394c565b91508190509392505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006139fa602e836127aa565b9150613a058261399e565b604082019050919050565b60006020820190508181036000830152613a29816139ed565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613a927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a55565b613a9c8683613a55565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613ad9613ad4613acf8461285a565b613ab4565b61285a565b9050919050565b6000819050919050565b613af383613abe565b613b07613aff82613ae0565b848454613a62565b825550505050565b600090565b613b1c613b0f565b613b27818484613aea565b505050565b5b81811015613b4b57613b40600082613b14565b600181019050613b2d565b5050565b601f821115613b9057613b6181613a30565b613b6a84613a45565b81016020851015613b79578190505b613b8d613b8585613a45565b830182613b2c565b50505b505050565b600082821c905092915050565b6000613bb360001984600802613b95565b1980831691505092915050565b6000613bcc8383613ba2565b9150826002028217905092915050565b613be58261279f565b67ffffffffffffffff811115613bfe57613bfd612a0c565b5b613c08825461308b565b613c13828285613b4f565b600060209050601f831160018114613c465760008415613c34578287015190505b613c3e8582613bc0565b865550613ca6565b601f198416613c5486613a30565b60005b82811015613c7c57848901518255600182019150602085019450602081019050613c57565b86831015613c995784890151613c95601f891682613ba2565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ce46020836127aa565b9150613cef82613cae565b602082019050919050565b60006020820190508181036000830152613d1381613cd7565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613d506019836127aa565b9150613d5b82613d1a565b602082019050919050565b60006020820190508181036000830152613d7f81613d43565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613de26032836127aa565b9150613ded82613d86565b604082019050919050565b60006020820190508181036000830152613e1181613dd5565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613e4e601c836132de565b9150613e5982613e18565b601c82019050919050565b6000819050919050565b613e7f613e7a82612b37565b613e64565b82525050565b6000613e9082613e41565b9150613e9c8284613e6e565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ee58261285a565b9150613ef08361285a565b925082613f0057613eff613eab565b5b828204905092915050565b6000613f168261285a565b9150613f218361285a565b925082613f3157613f30613eab565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613f9282613f6b565b613f9c8185613f76565b9350613fac8185602086016127bb565b613fb5816127ee565b840191505092915050565b6000608082019050613fd560008301876128ef565b613fe260208301866128ef565b613fef6040830185612985565b81810360608301526140018184613f87565b905095945050505050565b60008151905061401b81612710565b92915050565b600060208284031215614037576140366126da565b5b60006140458482850161400c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006140b36018836127aa565b91506140be8261407d565b602082019050919050565b600060208201905081810360008301526140e2816140a6565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061411f601f836127aa565b915061412a826140e9565b602082019050919050565b6000602082019050818103600083015261414e81614112565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006141b16022836127aa565b91506141bc82614155565b604082019050919050565b600060208201905081810360008301526141e0816141a4565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006142436022836127aa565b915061424e826141e7565b604082019050919050565b6000602082019050818103600083015261427281614236565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006142af6020836127aa565b91506142ba82614279565b602082019050919050565b600060208201905081810360008301526142de816142a2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061431b601c836127aa565b9150614326826142e5565b602082019050919050565b6000602082019050818103600083015261434a8161430e565b9050919050565b600060ff82169050919050565b61436781614351565b82525050565b60006080820190506143826000830187612ecf565b61438f602083018661435e565b61439c6040830185612ecf565b6143a96060830184612ecf565b9594505050505056fea26469706673582212205613235d40f8e1419875fe1244ab0ce925f118c41443a97399750a63df161d1b64736f6c634300080f00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ff5e190e1362605a39dd7a235ba69f5f14fe14300000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569623272787163366871357369337077636d71633537617a7370746f366868643679627836626d7374667265613472756e766a6f6d2f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061014b5760003560e01c806395d89b41116100b6578063c88512fa1161006f578063c88512fa146104a7578063d0def521146104e4578063dd8d74d814610500578063e985e9c51461053d578063f2fde38b1461057a578063fa09e630146105a35761014b565b806395d89b4114610373578063a22cb4651461039e578063a6ba55c7146103c7578063b88d4fde14610404578063c4e618961461042d578063c87b56dd1461046a5761014b565b806342842e0e1161010857806342842e0e146102725780634719021f1461029b5780636352211e146102b757806370a08231146102f4578063715018a6146103315780638da5cb5b146103485761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e57806323b872dd14610249575b600080fd5b34801561015c57600080fd5b506101776004803603810190610172919061273c565b6105cc565b6040516101849190612784565b60405180910390f35b34801561019957600080fd5b506101a26106ae565b6040516101af9190612838565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612890565b610740565b6040516101ec91906128fe565b60405180910390f35b34801561020157600080fd5b5061021c60048036038101906102179190612945565b610786565b005b34801561022a57600080fd5b5061023361089d565b6040516102409190612994565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b91906129af565b6108ae565b005b34801561027e57600080fd5b50610299600480360381019061029491906129af565b61090e565b005b6102b560048036038101906102b09190612c0e565b61092e565b005b3480156102c357600080fd5b506102de60048036038101906102d99190612890565b610d3e565b6040516102eb91906128fe565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190612cd3565b610def565b6040516103289190612994565b60405180910390f35b34801561033d57600080fd5b50610346610ea6565b005b34801561035457600080fd5b5061035d610eba565b60405161036a91906128fe565b60405180910390f35b34801561037f57600080fd5b50610388610ee4565b6040516103959190612838565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c09190612d2c565b610f76565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190612d6c565b610f8c565b6040516103fb9190612784565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190612db5565b610fc2565b005b34801561043957600080fd5b50610454600480360381019061044f9190612cd3565b611024565b6040516104619190612784565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190612890565b611044565b60405161049e9190612838565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190612e38565b611156565b6040516104db9190612ede565b60405180910390f35b6104fe60048036038101906104f99190612ef9565b611199565b005b34801561050c57600080fd5b5061052760048036038101906105229190612f55565b6111d5565b6040516105349190612784565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190612fb1565b61124a565b6040516105719190612784565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190612cd3565b6112de565b005b3480156105af57600080fd5b506105ca60048036038101906105c5919061302f565b611361565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061069757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a757506106a6826113b3565b5b9050919050565b6060600080546106bd9061308b565b80601f01602080910402602001604051908101604052809291908181526020018280546106e99061308b565b80156107365780601f1061070b57610100808354040283529160200191610736565b820191906000526020600020905b81548152906001019060200180831161071957829003601f168201915b5050505050905090565b600061074b8261141d565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079182610d3e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f89061312e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610820611468565b73ffffffffffffffffffffffffffffffffffffffff16148061084f575061084e81610849611468565b61124a565b5b61088e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610885906131c0565b60405180910390fd5b6108988383611470565b505050565b60006108a9600f611529565b905090565b6108bf6108b9611468565b82611537565b6108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f590613252565b60405180910390fd5b6109098383836115cc565b505050565b61092983838360405180602001604052806000815250610fc2565b505050565b61093882826111d5565b610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e906132be565b60405180910390fd5b600a83604051610987919061331a565b908152602001604051809103902060009054906101000a900460ff16156109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da9061337d565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a67906133e9565b60405180910390fd5b81610a7e3388888888611156565b14610abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab590613455565b60405180910390fd5b6001600a84604051610ad0919061331a565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506000600190505b868111610b9757610b1633610b11600f611529565b611832565b610b70610b23600f611529565b610b6b6040518060400160405280600581526020017f626c75652f000000000000000000000000000000000000000000000000000000815250610b66600c611529565b611850565b611884565b610b7a600f6118f1565b610b84600c6118f1565b8080610b8f906134a4565b915050610afc565b506000600190505b858111610c3a57610bb933610bb4600f611529565b611832565b610c13610bc6600f611529565b610c0e6040518060400160405280600481526020017f7265642f00000000000000000000000000000000000000000000000000000000815250610c09600d611529565b611850565b611884565b610c1d600f6118f1565b610c27600d6118f1565b8080610c32906134a4565b915050610b9f565b506000600190505b848111610cdd57610c5c33610c57600f611529565b611832565b610cb6610c69600f611529565b610cb16040518060400160405280600781526020017f79656c6c6f772f00000000000000000000000000000000000000000000000000815250610cac600e611529565b611850565b611884565b610cc0600f6118f1565b610cca600e6118f1565b8080610cd5906134a4565b915050610c42565b506001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd90613538565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e56906135ca565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610eae611907565b610eb86000611985565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ef39061308b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1f9061308b565b8015610f6c5780601f10610f4157610100808354040283529160200191610f6c565b820191906000526020600020905b815481529060010190602001808311610f4f57829003601f168201915b5050505050905090565b610f88610f81611468565b8383611a4b565b5050565b600a818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b610fd3610fcd611468565b83611537565b611012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100990613252565b60405180910390fd5b61101e84848484611bb7565b50505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b606061104f8261141d565b600060066000848152602001908152602001600020805461106f9061308b565b80601f016020809104026020016040519081016040528092919081815260200182805461109b9061308b565b80156110e85780601f106110bd576101008083540402835291602001916110e8565b820191906000526020600020905b8154815290600101906020018083116110cb57829003601f168201915b5050505050905060006110f9611c13565b9050600081510361110e578192505050611151565b60008251111561114357808260405160200161112b9291906135ea565b60405160208183030381529060405292505050611151565b61114c84611ca5565b925050505b919050565b60008086868686863060405160200161117496959493929190613677565b6040516020818303038152906040528051906020012090508091505095945050505050565b6111a1611907565b6111b4826111af600f611529565b611832565b6111c76111c1600f611529565b82611884565b6111d1600f6118f1565b5050565b60006111f2826111e485611d0d565b611d3d90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112e6611907565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c90613755565b60405180910390fd5b61135e81611985565b50565b611369611907565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113af573d6000803e3d6000fd5b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61142681611d64565b611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145c90613538565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114e383610d3e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008061154383610d3e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806115855750611584818561124a565b5b806115c357508373ffffffffffffffffffffffffffffffffffffffff166115ab84610740565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115ec82610d3e565b73ffffffffffffffffffffffffffffffffffffffff1614611642576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611639906137e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a890613879565b60405180910390fd5b6116bc838383611dd0565b6116c7600082611470565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117179190613899565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461176e91906138cd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461182d838383611dd5565b505050565b61184c828260405180602001604052806000815250611dda565b5050565b60608261185c83611e35565b60405160200161186d92919061396f565b604051602081830303815290604052905092915050565b61188d82611d64565b6118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c390613a10565b60405180910390fd5b806006600084815260200190815260200160002090816118ec9190613bdc565b505050565b6001816000016000828254019250508190555050565b61190f611468565b73ffffffffffffffffffffffffffffffffffffffff1661192d610eba565b73ffffffffffffffffffffffffffffffffffffffff1614611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a90613cfa565b60405180910390fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090613d66565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611baa9190612784565b60405180910390a3505050565b611bc28484846115cc565b611bce84848484611f95565b611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0490613df8565b60405180910390fd5b50505050565b606060088054611c229061308b565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4e9061308b565b8015611c9b5780601f10611c7057610100808354040283529160200191611c9b565b820191906000526020600020905b815481529060010190602001808311611c7e57829003601f168201915b5050505050905090565b6060611cb08261141d565b6000611cba611c13565b90506000815111611cda5760405180602001604052806000815250611d05565b80611ce484611e35565b604051602001611cf59291906135ea565b6040516020818303038152906040525b915050919050565b600081604051602001611d209190613e85565b604051602081830303815290604052805190602001209050919050565b6000806000611d4c858561211c565b91509150611d598161219d565b819250505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b611de48383612369565b611df16000848484611f95565b611e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2790613df8565b60405180910390fd5b505050565b606060008203611e7c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f90565b600082905060005b60008214611eae578080611e97906134a4565b915050600a82611ea79190613eda565b9150611e84565b60008167ffffffffffffffff811115611eca57611ec9612a0c565b5b6040519080825280601f01601f191660200182016040528015611efc5781602001600182028036833780820191505090505b5090505b60008514611f8957600182611f159190613899565b9150600a85611f249190613f0b565b6030611f3091906138cd565b60f81b818381518110611f4657611f45613f3c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f829190613eda565b9450611f00565b8093505050505b919050565b6000611fb68473ffffffffffffffffffffffffffffffffffffffff16612542565b1561210f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611fdf611468565b8786866040518563ffffffff1660e01b81526004016120019493929190613fc0565b6020604051808303816000875af192505050801561203d57506040513d601f19601f8201168201806040525081019061203a9190614021565b60015b6120bf573d806000811461206d576040519150601f19603f3d011682016040523d82523d6000602084013e612072565b606091505b5060008151036120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae90613df8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612114565b600190505b949350505050565b600080604183510361215d5760008060006020860151925060408601519150606086015160001a905061215187828585612565565b94509450505050612196565b604083510361218d576000806020850151915060408501519050612182868383612671565b935093505050612196565b60006002915091505b9250929050565b600060048111156121b1576121b061404e565b5b8160048111156121c4576121c361404e565b5b031561236657600160048111156121de576121dd61404e565b5b8160048111156121f1576121f061404e565b5b03612231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612228906140c9565b60405180910390fd5b600260048111156122455761224461404e565b5b8160048111156122585761225761404e565b5b03612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228f90614135565b60405180910390fd5b600360048111156122ac576122ab61404e565b5b8160048111156122bf576122be61404e565b5b036122ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f6906141c7565b60405180910390fd5b6004808111156123125761231161404e565b5b8160048111156123255761232461404e565b5b03612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c90614259565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cf906142c5565b60405180910390fd5b6123e181611d64565b15612421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241890614331565b60405180910390fd5b61242d60008383611dd0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461247d91906138cd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461253e60008383611dd5565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156125a0576000600391509150612668565b601b8560ff16141580156125b85750601c8560ff1614155b156125ca576000600491509150612668565b6000600187878787604051600081526020016040526040516125ef949392919061436d565b6020604051602081039080840390855afa158015612611573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361265f57600060019250925050612668565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6126b491906138cd565b90506126c287828885612565565b935093505050935093915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612719816126e4565b811461272457600080fd5b50565b60008135905061273681612710565b92915050565b600060208284031215612752576127516126da565b5b600061276084828501612727565b91505092915050565b60008115159050919050565b61277e81612769565b82525050565b60006020820190506127996000830184612775565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156127d95780820151818401526020810190506127be565b838111156127e8576000848401525b50505050565b6000601f19601f8301169050919050565b600061280a8261279f565b61281481856127aa565b93506128248185602086016127bb565b61282d816127ee565b840191505092915050565b6000602082019050818103600083015261285281846127ff565b905092915050565b6000819050919050565b61286d8161285a565b811461287857600080fd5b50565b60008135905061288a81612864565b92915050565b6000602082840312156128a6576128a56126da565b5b60006128b48482850161287b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128e8826128bd565b9050919050565b6128f8816128dd565b82525050565b600060208201905061291360008301846128ef565b92915050565b612922816128dd565b811461292d57600080fd5b50565b60008135905061293f81612919565b92915050565b6000806040838503121561295c5761295b6126da565b5b600061296a85828601612930565b925050602061297b8582860161287b565b9150509250929050565b61298e8161285a565b82525050565b60006020820190506129a96000830184612985565b92915050565b6000806000606084860312156129c8576129c76126da565b5b60006129d686828701612930565b93505060206129e786828701612930565b92505060406129f88682870161287b565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a44826127ee565b810181811067ffffffffffffffff82111715612a6357612a62612a0c565b5b80604052505050565b6000612a766126d0565b9050612a828282612a3b565b919050565b600067ffffffffffffffff821115612aa257612aa1612a0c565b5b612aab826127ee565b9050602081019050919050565b82818337600083830152505050565b6000612ada612ad584612a87565b612a6c565b905082815260208101848484011115612af657612af5612a07565b5b612b01848285612ab8565b509392505050565b600082601f830112612b1e57612b1d612a02565b5b8135612b2e848260208601612ac7565b91505092915050565b6000819050919050565b612b4a81612b37565b8114612b5557600080fd5b50565b600081359050612b6781612b41565b92915050565b600067ffffffffffffffff821115612b8857612b87612a0c565b5b612b91826127ee565b9050602081019050919050565b6000612bb1612bac84612b6d565b612a6c565b905082815260208101848484011115612bcd57612bcc612a07565b5b612bd8848285612ab8565b509392505050565b600082601f830112612bf557612bf4612a02565b5b8135612c05848260208601612b9e565b91505092915050565b60008060008060008060c08789031215612c2b57612c2a6126da565b5b6000612c3989828a0161287b565b9650506020612c4a89828a0161287b565b9550506040612c5b89828a0161287b565b945050606087013567ffffffffffffffff811115612c7c57612c7b6126df565b5b612c8889828a01612b09565b9350506080612c9989828a01612b58565b92505060a087013567ffffffffffffffff811115612cba57612cb96126df565b5b612cc689828a01612be0565b9150509295509295509295565b600060208284031215612ce957612ce86126da565b5b6000612cf784828501612930565b91505092915050565b612d0981612769565b8114612d1457600080fd5b50565b600081359050612d2681612d00565b92915050565b60008060408385031215612d4357612d426126da565b5b6000612d5185828601612930565b9250506020612d6285828601612d17565b9150509250929050565b600060208284031215612d8257612d816126da565b5b600082013567ffffffffffffffff811115612da057612d9f6126df565b5b612dac84828501612b09565b91505092915050565b60008060008060808587031215612dcf57612dce6126da565b5b6000612ddd87828801612930565b9450506020612dee87828801612930565b9350506040612dff8782880161287b565b925050606085013567ffffffffffffffff811115612e2057612e1f6126df565b5b612e2c87828801612be0565b91505092959194509250565b600080600080600060a08688031215612e5457612e536126da565b5b6000612e6288828901612930565b9550506020612e738882890161287b565b9450506040612e848882890161287b565b9350506060612e958882890161287b565b925050608086013567ffffffffffffffff811115612eb657612eb56126df565b5b612ec288828901612b09565b9150509295509295909350565b612ed881612b37565b82525050565b6000602082019050612ef36000830184612ecf565b92915050565b60008060408385031215612f1057612f0f6126da565b5b6000612f1e85828601612930565b925050602083013567ffffffffffffffff811115612f3f57612f3e6126df565b5b612f4b85828601612b09565b9150509250929050565b60008060408385031215612f6c57612f6b6126da565b5b6000612f7a85828601612b58565b925050602083013567ffffffffffffffff811115612f9b57612f9a6126df565b5b612fa785828601612be0565b9150509250929050565b60008060408385031215612fc857612fc76126da565b5b6000612fd685828601612930565b9250506020612fe785828601612930565b9150509250929050565b6000612ffc826128bd565b9050919050565b61300c81612ff1565b811461301757600080fd5b50565b60008135905061302981613003565b92915050565b600060208284031215613045576130446126da565b5b60006130538482850161301a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806130a357607f821691505b6020821081036130b6576130b561305c565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006131186021836127aa565b9150613123826130bc565b604082019050919050565b600060208201905081810360008301526131478161310b565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b60006131aa603e836127aa565b91506131b58261314e565b604082019050919050565b600060208201905081810360008301526131d98161319d565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b600061323c602e836127aa565b9150613247826131e0565b604082019050919050565b6000602082019050818103600083015261326b8161322f565b9050919050565b7f506c7a206d696e74207468726f75676820776562736974650000000000000000600082015250565b60006132a86018836127aa565b91506132b382613272565b602082019050919050565b600060208201905081810360008301526132d78161329b565b9050919050565b600081905092915050565b60006132f48261279f565b6132fe81856132de565b935061330e8185602086016127bb565b80840191505092915050565b600061332682846132e9565b915081905092915050565b7f4861736820726575736564000000000000000000000000000000000000000000600082015250565b6000613367600b836127aa565b915061337282613331565b602082019050919050565b600060208201905081810360008301526133968161335a565b9050919050565b7f416c72656164792072656465656d656400000000000000000000000000000000600082015250565b60006133d36010836127aa565b91506133de8261339d565b602082019050919050565b60006020820190508181036000830152613402816133c6565b9050919050565b7f48617368206661696c6564000000000000000000000000000000000000000000600082015250565b600061343f600b836127aa565b915061344a82613409565b602082019050919050565b6000602082019050818103600083015261346e81613432565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134af8261285a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134e1576134e0613475565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006135226018836127aa565b915061352d826134ec565b602082019050919050565b6000602082019050818103600083015261355181613515565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006135b46029836127aa565b91506135bf82613558565b604082019050919050565b600060208201905081810360008301526135e3816135a7565b9050919050565b60006135f682856132e9565b915061360282846132e9565b91508190509392505050565b60008160601b9050919050565b60006136268261360e565b9050919050565b60006136388261361b565b9050919050565b61365061364b826128dd565b61362d565b82525050565b6000819050919050565b61367161366c8261285a565b613656565b82525050565b6000613683828961363f565b6014820191506136938288613660565b6020820191506136a38287613660565b6020820191506136b38286613660565b6020820191506136c382856132e9565b91506136cf828461363f565b601482019150819050979650505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061373f6026836127aa565b915061374a826136e3565b604082019050919050565b6000602082019050818103600083015261376e81613732565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006137d16025836127aa565b91506137dc82613775565b604082019050919050565b60006020820190508181036000830152613800816137c4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006138636024836127aa565b915061386e82613807565b604082019050919050565b6000602082019050818103600083015261389281613856565b9050919050565b60006138a48261285a565b91506138af8361285a565b9250828210156138c2576138c1613475565b5b828203905092915050565b60006138d88261285a565b91506138e38361285a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561391857613917613475565b5b828201905092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006139596005836132de565b915061396482613923565b600582019050919050565b600061397b82856132e9565b915061398782846132e9565b91506139928261394c565b91508190509392505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b60006139fa602e836127aa565b9150613a058261399e565b604082019050919050565b60006020820190508181036000830152613a29816139ed565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613a927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a55565b613a9c8683613a55565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613ad9613ad4613acf8461285a565b613ab4565b61285a565b9050919050565b6000819050919050565b613af383613abe565b613b07613aff82613ae0565b848454613a62565b825550505050565b600090565b613b1c613b0f565b613b27818484613aea565b505050565b5b81811015613b4b57613b40600082613b14565b600181019050613b2d565b5050565b601f821115613b9057613b6181613a30565b613b6a84613a45565b81016020851015613b79578190505b613b8d613b8585613a45565b830182613b2c565b50505b505050565b600082821c905092915050565b6000613bb360001984600802613b95565b1980831691505092915050565b6000613bcc8383613ba2565b9150826002028217905092915050565b613be58261279f565b67ffffffffffffffff811115613bfe57613bfd612a0c565b5b613c08825461308b565b613c13828285613b4f565b600060209050601f831160018114613c465760008415613c34578287015190505b613c3e8582613bc0565b865550613ca6565b601f198416613c5486613a30565b60005b82811015613c7c57848901518255600182019150602085019450602081019050613c57565b86831015613c995784890151613c95601f891682613ba2565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ce46020836127aa565b9150613cef82613cae565b602082019050919050565b60006020820190508181036000830152613d1381613cd7565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613d506019836127aa565b9150613d5b82613d1a565b602082019050919050565b60006020820190508181036000830152613d7f81613d43565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613de26032836127aa565b9150613ded82613d86565b604082019050919050565b60006020820190508181036000830152613e1181613dd5565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613e4e601c836132de565b9150613e5982613e18565b601c82019050919050565b6000819050919050565b613e7f613e7a82612b37565b613e64565b82525050565b6000613e9082613e41565b9150613e9c8284613e6e565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ee58261285a565b9150613ef08361285a565b925082613f0057613eff613eab565b5b828204905092915050565b6000613f168261285a565b9150613f218361285a565b925082613f3157613f30613eab565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613f9282613f6b565b613f9c8185613f76565b9350613fac8185602086016127bb565b613fb5816127ee565b840191505092915050565b6000608082019050613fd560008301876128ef565b613fe260208301866128ef565b613fef6040830185612985565b81810360608301526140018184613f87565b905095945050505050565b60008151905061401b81612710565b92915050565b600060208284031215614037576140366126da565b5b60006140458482850161400c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006140b36018836127aa565b91506140be8261407d565b602082019050919050565b600060208201905081810360008301526140e2816140a6565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061411f601f836127aa565b915061412a826140e9565b602082019050919050565b6000602082019050818103600083015261414e81614112565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006141b16022836127aa565b91506141bc82614155565b604082019050919050565b600060208201905081810360008301526141e0816141a4565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006142436022836127aa565b915061424e826141e7565b604082019050919050565b6000602082019050818103600083015261427281614236565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006142af6020836127aa565b91506142ba82614279565b602082019050919050565b600060208201905081810360008301526142de816142a2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061431b601c836127aa565b9150614326826142e5565b602082019050919050565b6000602082019050818103600083015261434a8161430e565b9050919050565b600060ff82169050919050565b61436781614351565b82525050565b60006080820190506143826000830187612ecf565b61438f602083018661435e565b61439c6040830185612ecf565b6143a96060830184612ecf565b9594505050505056fea26469706673582212205613235d40f8e1419875fe1244ab0ce925f118c41443a97399750a63df161d1b64736f6c634300080f0033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ff5e190e1362605a39dd7a235ba69f5f14fe14300000000000000000000000000000000000000000000000000000000000000043697066733a2f2f62616679626569623272787163366871357369337077636d71633537617a7370746f366868643679627836626d7374667265613472756e766a6f6d2f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseTokenURI (string): ipfs://bafybeib2rxqc6hq5si3pwcmqc57azspto6hhd6ybx6bmstfrea4runvjom/
Arg [1] : systemAddress (address): 0xFf5E190e1362605a39Dd7a235Ba69F5f14FE1430

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000ff5e190e1362605a39dd7a235ba69f5f14fe1430
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [3] : 697066733a2f2f62616679626569623272787163366871357369337077636d71
Arg [4] : 633537617a7370746f366868643679627836626d7374667265613472756e766a
Arg [5] : 6f6d2f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55687:3443:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22060:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22987:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24500:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24017:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59032:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25200:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25607:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56409:1465;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22698:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22429:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39082:103;;;;;;;;;;;;;:::i;:::-;;38434:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23156:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24743:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55893:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25863:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55942:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35766:624;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58466:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57880:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58288:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24969:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39340:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58919:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22060:305;22162:4;22214:25;22199:40;;;:11;:40;;;;:105;;;;22271:33;22256:48;;;:11;:48;;;;22199:105;:158;;;;22321:36;22345:11;22321:23;:36::i;:::-;22199:158;22179:178;;22060:305;;;:::o;22987:100::-;23041:13;23074:5;23067:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22987:100;:::o;24500:171::-;24576:7;24596:23;24611:7;24596:14;:23::i;:::-;24639:15;:24;24655:7;24639:24;;;;;;;;;;;;;;;;;;;;;24632:31;;24500:171;;;:::o;24017:417::-;24098:13;24114:23;24129:7;24114:14;:23::i;:::-;24098:39;;24162:5;24156:11;;:2;:11;;;24148:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24256:5;24240:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24265:37;24282:5;24289:12;:10;:12::i;:::-;24265:16;:37::i;:::-;24240:62;24218:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;24405:21;24414:2;24418:7;24405:8;:21::i;:::-;24087:347;24017:417;;:::o;59032:95::-;59076:4;59096:25;:15;:23;:25::i;:::-;59089:32;;59032:95;:::o;25200:336::-;25395:41;25414:12;:10;:12::i;:::-;25428:7;25395:18;:41::i;:::-;25387:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25500:28;25510:4;25516:2;25520:7;25500:9;:28::i;:::-;25200:336;;;:::o;25607:185::-;25745:39;25762:4;25768:2;25772:7;25745:39;;;;;;;;;;;;:16;:39::i;:::-;25607:185;;;:::o;56409:1465::-;56618:28;56630:4;56636:9;56618:11;:28::i;:::-;56610:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56691:11;56703:5;56691:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;56690:19;56682:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;56741:18;:30;56760:10;56741:30;;;;;;;;;;;;;;;;;;;;;;;;;56740:31;56732:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;56890:4;56815:71;56831:10;56843;56855:9;56866:12;56880:5;56815:15;:71::i;:::-;:79;56799:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;56953:4;56932:11;56944:5;56932:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;56971:9;56983:1;56971:13;;56966:279;56991:10;56986:1;:15;56966:279;;57017:48;57027:10;57039:25;:15;:23;:25::i;:::-;57017:9;:48::i;:::-;57074:87;57087:25;:15;:23;:25::i;:::-;57114:46;;;;;;;;;;;;;;;;;;57130:29;:19;:27;:29::i;:::-;57114:6;:46::i;:::-;57074:12;:87::i;:::-;57170:27;:15;:25;:27::i;:::-;57206:31;:19;:29;:31::i;:::-;57003:3;;;;;:::i;:::-;;;;56966:279;;;;57258:9;57270:1;57258:13;;57253:275;57278:9;57273:1;:14;57253:275;;57303:48;57313:10;57325:25;:15;:23;:25::i;:::-;57303:9;:48::i;:::-;57360:85;57373:25;:15;:23;:25::i;:::-;57400:44;;;;;;;;;;;;;;;;;;57415:28;:18;:26;:28::i;:::-;57400:6;:44::i;:::-;57360:12;:85::i;:::-;57454:27;:15;:25;:27::i;:::-;57490:30;:18;:28;:30::i;:::-;57289:3;;;;;:::i;:::-;;;;57253:275;;;;57541:9;57553:1;57541:13;;57536:287;57561:12;57556:1;:17;57536:287;;57589:48;57599:10;57611:25;:15;:23;:25::i;:::-;57589:9;:48::i;:::-;57646:91;57659:25;:15;:23;:25::i;:::-;57686:50;;;;;;;;;;;;;;;;;;57704:31;:21;:29;:31::i;:::-;57686:6;:50::i;:::-;57646:12;:91::i;:::-;57746:27;:15;:25;:27::i;:::-;57782:33;:21;:31;:33::i;:::-;57575:3;;;;;:::i;:::-;;;;57536:287;;;;57864:4;57831:18;:30;57850:10;57831:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;56409:1465;;;;;;:::o;22698:222::-;22770:7;22790:13;22806:7;:16;22814:7;22806:16;;;;;;;;;;;;;;;;;;;;;22790:32;;22858:1;22841:19;;:5;:19;;;22833:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;22907:5;22900:12;;;22698:222;;;:::o;22429:207::-;22501:7;22546:1;22529:19;;:5;:19;;;22521:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22612:9;:16;22622:5;22612:16;;;;;;;;;;;;;;;;22605:23;;22429:207;;;:::o;39082:103::-;38320:13;:11;:13::i;:::-;39147:30:::1;39174:1;39147:18;:30::i;:::-;39082:103::o:0;38434:87::-;38480:7;38507:6;;;;;;;;;;;38500:13;;38434:87;:::o;23156:104::-;23212:13;23245:7;23238:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23156:104;:::o;24743:155::-;24838:52;24857:12;:10;:12::i;:::-;24871:8;24881;24838:18;:52::i;:::-;24743:155;;:::o;55893:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25863:323::-;26037:41;26056:12;:10;:12::i;:::-;26070:7;26037:18;:41::i;:::-;26029:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;26140:38;26154:4;26160:2;26164:7;26173:4;26140:13;:38::i;:::-;25863:323;;;;:::o;55942:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;35766:624::-;35839:13;35865:23;35880:7;35865:14;:23::i;:::-;35901;35927:10;:19;35938:7;35927:19;;;;;;;;;;;35901:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35957:18;35978:10;:8;:10::i;:::-;35957:31;;36086:1;36070:4;36064:18;:23;36060:72;;36111:9;36104:16;;;;;;36060:72;36262:1;36242:9;36236:23;:27;36232:108;;;36311:4;36317:9;36294:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36280:48;;;;;;36232:108;36359:23;36374:7;36359:14;:23::i;:::-;36352:30;;;;35766:624;;;;:::o;58466:341::-;58640:7;58658:12;58708:6;58716:10;58728:9;58739:12;58753:5;58768:4;58691:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58673:108;;;;;;58658:123;;58797:4;58790:11;;;58466:341;;;;;;;:::o;57880:238::-;38320:13;:11;:13::i;:::-;57972:46:::1;57982:8;57992:25;:15;:23;:25::i;:::-;57972:9;:46::i;:::-;58027:49;58040:25;:15;:23;:25::i;:::-;58067:8;58027:12;:49::i;:::-;58085:27;:15;:25;:27::i;:::-;57880:238:::0;;:::o;58288:172::-;58368:4;58406:48;58444:9;58406:29;:4;:27;:29::i;:::-;:37;;:48;;;;:::i;:::-;58388:66;;:14;;;;;;;;;;;:66;;;58381:73;;58288:172;;;;:::o;24969:164::-;25066:4;25090:18;:25;25109:5;25090:25;;;;;;;;;;;;;;;:35;25116:8;25090:35;;;;;;;;;;;;;;;;;;;;;;;;;25083:42;;24969:164;;;;:::o;39340:201::-;38320:13;:11;:13::i;:::-;39449:1:::1;39429:22;;:8;:22;;::::0;39421:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;39505:28;39524:8;39505:18;:28::i;:::-;39340:201:::0;:::o;58919:107::-;38320:13;:11;:13::i;:::-;58986:2:::1;:11;;:34;58998:21;58986:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;58919:107:::0;:::o;20491:157::-;20576:4;20615:25;20600:40;;;:11;:40;;;;20593:47;;20491:157;;;:::o;32475:135::-;32557:16;32565:7;32557;:16::i;:::-;32549:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32475:135;:::o;16917:98::-;16970:7;16997:10;16990:17;;16917:98;:::o;31754:174::-;31856:2;31829:15;:24;31845:7;31829:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31912:7;31908:2;31874:46;;31883:23;31898:7;31883:14;:23::i;:::-;31874:46;;;;;;;;;;;;31754:174;;:::o;50399:114::-;50464:7;50491;:14;;;50484:21;;50399:114;;;:::o;27987:264::-;28080:4;28097:13;28113:23;28128:7;28113:14;:23::i;:::-;28097:39;;28166:5;28155:16;;:7;:16;;;:52;;;;28175:32;28192:5;28199:7;28175:16;:32::i;:::-;28155:52;:87;;;;28235:7;28211:31;;:20;28223:7;28211:11;:20::i;:::-;:31;;;28155:87;28147:96;;;27987:264;;;;:::o;31010:625::-;31169:4;31142:31;;:23;31157:7;31142:14;:23::i;:::-;:31;;;31134:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31248:1;31234:16;;:2;:16;;;31226:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31304:39;31325:4;31331:2;31335:7;31304:20;:39::i;:::-;31408:29;31425:1;31429:7;31408:8;:29::i;:::-;31469:1;31450:9;:15;31460:4;31450:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31498:1;31481:9;:13;31491:2;31481:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31529:2;31510:7;:16;31518:7;31510:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31568:7;31564:2;31549:27;;31558:4;31549:27;;;;;;;;;;;;31589:38;31609:4;31615:2;31619:7;31589:19;:38::i;:::-;31010:625;;;:::o;28593:110::-;28669:26;28679:2;28683:7;28669:26;;;;;;;;;;;;:9;:26::i;:::-;28593:110;;:::o;58124:158::-;58191:13;58244:1;58247:19;58264:1;58247:16;:19::i;:::-;58227:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58213:64;;58124:158;;;;:::o;36546:217::-;36646:16;36654:7;36646;:16::i;:::-;36638:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;36746:9;36724:10;:19;36735:7;36724:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;36546:217;;:::o;50521:127::-;50628:1;50610:7;:14;;;:19;;;;;;;;;;;50521:127;:::o;38599:132::-;38674:12;:10;:12::i;:::-;38663:23;;:7;:5;:7::i;:::-;:23;;;38655:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38599:132::o;39701:191::-;39775:16;39794:6;;;;;;;;;;;39775:25;;39820:8;39811:6;;:17;;;;;;;;;;;;;;;;;;39875:8;39844:40;;39865:8;39844:40;;;;;;;;;;;;39764:128;39701:191;:::o;32071:315::-;32226:8;32217:17;;:5;:17;;;32209:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32313:8;32275:18;:25;32294:5;32275:25;;;;;;;;;;;;;;;:35;32301:8;32275:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32359:8;32337:41;;32352:5;32337:41;;;32369:8;32337:41;;;;;;:::i;:::-;;;;;;;;32071:315;;;:::o;27067:313::-;27223:28;27233:4;27239:2;27243:7;27223:9;:28::i;:::-;27270:47;27293:4;27299:2;27303:7;27312:4;27270:22;:47::i;:::-;27262:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27067:313;;;;:::o;58813:100::-;58865:13;58894;58887:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58813:100;:::o;23331:281::-;23404:13;23430:23;23445:7;23430:14;:23::i;:::-;23466:21;23490:10;:8;:10::i;:::-;23466:34;;23542:1;23524:7;23518:21;:25;:86;;;;;;;;;;;;;;;;;23570:7;23579:18;:7;:16;:18::i;:::-;23553:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23518:86;23511:93;;;23331:281;;;:::o;48212:269::-;48281:7;48467:4;48414:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;48404:69;;;;;;48397:76;;48212:269;;;:::o;44410:231::-;44488:7;44509:17;44528:18;44550:27;44561:4;44567:9;44550:10;:27::i;:::-;44508:69;;;;44588:18;44600:5;44588:11;:18::i;:::-;44624:9;44617:16;;;;44410:231;;;;:::o;27693:127::-;27758:4;27810:1;27782:30;;:7;:16;27790:7;27782:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27775:37;;27693:127;;;:::o;34599:126::-;;;;:::o;35110:125::-;;;;:::o;28930:319::-;29059:18;29065:2;29069:7;29059:5;:18::i;:::-;29110:53;29141:1;29145:2;29149:7;29158:4;29110:22;:53::i;:::-;29088:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;28930:319;;;:::o;17561:723::-;17617:13;17847:1;17838:5;:10;17834:53;;17865:10;;;;;;;;;;;;;;;;;;;;;17834:53;17897:12;17912:5;17897:20;;17928:14;17953:78;17968:1;17960:4;:9;17953:78;;17986:8;;;;;:::i;:::-;;;;18017:2;18009:10;;;;;:::i;:::-;;;17953:78;;;18041:19;18073:6;18063:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18041:39;;18091:154;18107:1;18098:5;:10;18091:154;;18135:1;18125:11;;;;;:::i;:::-;;;18202:2;18194:5;:10;;;;:::i;:::-;18181:2;:24;;;;:::i;:::-;18168:39;;18151:6;18158;18151:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18231:2;18222:11;;;;;:::i;:::-;;;18091:154;;;18269:6;18255:21;;;;;17561:723;;;;:::o;33174:853::-;33328:4;33349:15;:2;:13;;;:15::i;:::-;33345:675;;;33401:2;33385:36;;;33422:12;:10;:12::i;:::-;33436:4;33442:7;33451:4;33385:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33381:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33643:1;33626:6;:13;:18;33622:328;;33669:60;;;;;;;;;;:::i;:::-;;;;;;;;33622:328;33900:6;33894:13;33885:6;33881:2;33877:15;33870:38;33381:584;33517:41;;;33507:51;;;:6;:51;;;;33500:58;;;;;33345:675;34004:4;33997:11;;33174:853;;;;;;;:::o;42204:1404::-;42285:7;42294:12;42539:2;42519:9;:16;:22;42515:1086;;42558:9;42582;42606:7;42863:4;42852:9;42848:20;42842:27;42837:32;;42913:4;42902:9;42898:20;42892:27;42887:32;;42971:4;42960:9;42956:20;42950:27;42947:1;42942:36;42937:41;;43014:25;43025:4;43031:1;43034;43037;43014:10;:25::i;:::-;43007:32;;;;;;;;;42515:1086;43081:2;43061:9;:16;:22;43057:544;;43100:9;43124:10;43384:4;43373:9;43369:20;43363:27;43358:32;;43435:4;43424:9;43420:20;43414:27;43408:33;;43477:23;43488:4;43494:1;43497:2;43477:10;:23::i;:::-;43470:30;;;;;;;;43057:544;43549:1;43553:35;43533:56;;;;42204:1404;;;;;;:::o;40475:643::-;40553:20;40544:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;40540:571;40590:7;40540:571;40651:29;40642:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;40638:473;;40697:34;;;;;;;;;;:::i;:::-;;;;;;;;40638:473;40762:35;40753:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;40749:362;;40814:41;;;;;;;;;;:::i;:::-;;;;;;;;40749:362;40886:30;40877:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;40873:238;;40933:44;;;;;;;;;;:::i;:::-;;;;;;;;40873:238;41008:30;40999:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;40995:116;;41055:44;;;;;;;;;;:::i;:::-;;;;;;;;40995:116;40475:643;;:::o;29585:439::-;29679:1;29665:16;;:2;:16;;;29657:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29738:16;29746:7;29738;:16::i;:::-;29737:17;29729:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29800:45;29829:1;29833:2;29837:7;29800:20;:45::i;:::-;29875:1;29858:9;:13;29868:2;29858:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29906:2;29887:7;:16;29895:7;29887:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29951:7;29947:2;29926:33;;29943:1;29926:33;;;;;;;;;;;;29972:44;30000:1;30004:2;30008:7;29972:19;:44::i;:::-;29585:439;;:::o;8918:326::-;8978:4;9235:1;9213:7;:19;;;:23;9206:30;;8918:326;;;:::o;45862:1632::-;45993:7;46002:12;46927:66;46922:1;46914:10;;:79;46910:163;;;47026:1;47030:30;47010:51;;;;;;46910:163;47092:2;47087:1;:7;;;;:18;;;;;47103:2;47098:1;:7;;;;47087:18;47083:102;;;47138:1;47142:30;47122:51;;;;;;47083:102;47282:14;47299:24;47309:4;47315:1;47318;47321;47299:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47282:41;;47356:1;47338:20;;:6;:20;;;47334:103;;47391:1;47395:29;47375:50;;;;;;;47334:103;47457:6;47465:20;47449:37;;;;;45862:1632;;;;;;;;:::o;44904:344::-;45018:7;45027:12;45052:9;45077:66;45069:75;;45064:2;:80;45052:92;;45155:7;45194:2;45187:3;45180:2;45172:11;;:18;;45171:25;;;;:::i;:::-;45155:42;;45215:25;45226:4;45232:1;45235;45238;45215:10;:25::i;:::-;45208:32;;;;;;44904:344;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:77::-;8058:7;8087:5;8076:16;;8021:77;;;:::o;8104:122::-;8177:24;8195:5;8177:24;:::i;:::-;8170:5;8167:35;8157:63;;8216:1;8213;8206:12;8157:63;8104:122;:::o;8232:139::-;8278:5;8316:6;8303:20;8294:29;;8332:33;8359:5;8332:33;:::i;:::-;8232:139;;;;:::o;8377:307::-;8438:4;8528:18;8520:6;8517:30;8514:56;;;8550:18;;:::i;:::-;8514:56;8588:29;8610:6;8588:29;:::i;:::-;8580:37;;8672:4;8666;8662:15;8654:23;;8377:307;;;:::o;8690:410::-;8767:5;8792:65;8808:48;8849:6;8808:48;:::i;:::-;8792:65;:::i;:::-;8783:74;;8880:6;8873:5;8866:21;8918:4;8911:5;8907:16;8956:3;8947:6;8942:3;8938:16;8935:25;8932:112;;;8963:79;;:::i;:::-;8932:112;9053:41;9087:6;9082:3;9077;9053:41;:::i;:::-;8773:327;8690:410;;;;;:::o;9119:338::-;9174:5;9223:3;9216:4;9208:6;9204:17;9200:27;9190:122;;9231:79;;:::i;:::-;9190:122;9348:6;9335:20;9373:78;9447:3;9439:6;9432:4;9424:6;9420:17;9373:78;:::i;:::-;9364:87;;9180:277;9119:338;;;;:::o;9463:1415::-;9586:6;9594;9602;9610;9618;9626;9675:3;9663:9;9654:7;9650:23;9646:33;9643:120;;;9682:79;;:::i;:::-;9643:120;9802:1;9827:53;9872:7;9863:6;9852:9;9848:22;9827:53;:::i;:::-;9817:63;;9773:117;9929:2;9955:53;10000:7;9991:6;9980:9;9976:22;9955:53;:::i;:::-;9945:63;;9900:118;10057:2;10083:53;10128:7;10119:6;10108:9;10104:22;10083:53;:::i;:::-;10073:63;;10028:118;10213:2;10202:9;10198:18;10185:32;10244:18;10236:6;10233:30;10230:117;;;10266:79;;:::i;:::-;10230:117;10371:63;10426:7;10417:6;10406:9;10402:22;10371:63;:::i;:::-;10361:73;;10156:288;10483:3;10510:53;10555:7;10546:6;10535:9;10531:22;10510:53;:::i;:::-;10500:63;;10454:119;10640:3;10629:9;10625:19;10612:33;10672:18;10664:6;10661:30;10658:117;;;10694:79;;:::i;:::-;10658:117;10799:62;10853:7;10844:6;10833:9;10829:22;10799:62;:::i;:::-;10789:72;;10583:288;9463:1415;;;;;;;;:::o;10884:329::-;10943:6;10992:2;10980:9;10971:7;10967:23;10963:32;10960:119;;;10998:79;;:::i;:::-;10960:119;11118:1;11143:53;11188:7;11179:6;11168:9;11164:22;11143:53;:::i;:::-;11133:63;;11089:117;10884:329;;;;:::o;11219:116::-;11289:21;11304:5;11289:21;:::i;:::-;11282:5;11279:32;11269:60;;11325:1;11322;11315:12;11269:60;11219:116;:::o;11341:133::-;11384:5;11422:6;11409:20;11400:29;;11438:30;11462:5;11438:30;:::i;:::-;11341:133;;;;:::o;11480:468::-;11545:6;11553;11602:2;11590:9;11581:7;11577:23;11573:32;11570:119;;;11608:79;;:::i;:::-;11570:119;11728:1;11753:53;11798:7;11789:6;11778:9;11774:22;11753:53;:::i;:::-;11743:63;;11699:117;11855:2;11881:50;11923:7;11914:6;11903:9;11899:22;11881:50;:::i;:::-;11871:60;;11826:115;11480:468;;;;;:::o;11954:509::-;12023:6;12072:2;12060:9;12051:7;12047:23;12043:32;12040:119;;;12078:79;;:::i;:::-;12040:119;12226:1;12215:9;12211:17;12198:31;12256:18;12248:6;12245:30;12242:117;;;12278:79;;:::i;:::-;12242:117;12383:63;12438:7;12429:6;12418:9;12414:22;12383:63;:::i;:::-;12373:73;;12169:287;11954:509;;;;:::o;12469:943::-;12564:6;12572;12580;12588;12637:3;12625:9;12616:7;12612:23;12608:33;12605:120;;;12644:79;;:::i;:::-;12605:120;12764:1;12789:53;12834:7;12825:6;12814:9;12810:22;12789:53;:::i;:::-;12779:63;;12735:117;12891:2;12917:53;12962:7;12953:6;12942:9;12938:22;12917:53;:::i;:::-;12907:63;;12862:118;13019:2;13045:53;13090:7;13081:6;13070:9;13066:22;13045:53;:::i;:::-;13035:63;;12990:118;13175:2;13164:9;13160:18;13147:32;13206:18;13198:6;13195:30;13192:117;;;13228:79;;:::i;:::-;13192:117;13333:62;13387:7;13378:6;13367:9;13363:22;13333:62;:::i;:::-;13323:72;;13118:287;12469:943;;;;;;;:::o;13418:1091::-;13523:6;13531;13539;13547;13555;13604:3;13592:9;13583:7;13579:23;13575:33;13572:120;;;13611:79;;:::i;:::-;13572:120;13731:1;13756:53;13801:7;13792:6;13781:9;13777:22;13756:53;:::i;:::-;13746:63;;13702:117;13858:2;13884:53;13929:7;13920:6;13909:9;13905:22;13884:53;:::i;:::-;13874:63;;13829:118;13986:2;14012:53;14057:7;14048:6;14037:9;14033:22;14012:53;:::i;:::-;14002:63;;13957:118;14114:2;14140:53;14185:7;14176:6;14165:9;14161:22;14140:53;:::i;:::-;14130:63;;14085:118;14270:3;14259:9;14255:19;14242:33;14302:18;14294:6;14291:30;14288:117;;;14324:79;;:::i;:::-;14288:117;14429:63;14484:7;14475:6;14464:9;14460:22;14429:63;:::i;:::-;14419:73;;14213:289;13418:1091;;;;;;;;:::o;14515:118::-;14602:24;14620:5;14602:24;:::i;:::-;14597:3;14590:37;14515:118;;:::o;14639:222::-;14732:4;14770:2;14759:9;14755:18;14747:26;;14783:71;14851:1;14840:9;14836:17;14827:6;14783:71;:::i;:::-;14639:222;;;;:::o;14867:654::-;14945:6;14953;15002:2;14990:9;14981:7;14977:23;14973:32;14970:119;;;15008:79;;:::i;:::-;14970:119;15128:1;15153:53;15198:7;15189:6;15178:9;15174:22;15153:53;:::i;:::-;15143:63;;15099:117;15283:2;15272:9;15268:18;15255:32;15314:18;15306:6;15303:30;15300:117;;;15336:79;;:::i;:::-;15300:117;15441:63;15496:7;15487:6;15476:9;15472:22;15441:63;:::i;:::-;15431:73;;15226:288;14867:654;;;;;:::o;15527:652::-;15604:6;15612;15661:2;15649:9;15640:7;15636:23;15632:32;15629:119;;;15667:79;;:::i;:::-;15629:119;15787:1;15812:53;15857:7;15848:6;15837:9;15833:22;15812:53;:::i;:::-;15802:63;;15758:117;15942:2;15931:9;15927:18;15914:32;15973:18;15965:6;15962:30;15959:117;;;15995:79;;:::i;:::-;15959:117;16100:62;16154:7;16145:6;16134:9;16130:22;16100:62;:::i;:::-;16090:72;;15885:287;15527:652;;;;;:::o;16185:474::-;16253:6;16261;16310:2;16298:9;16289:7;16285:23;16281:32;16278:119;;;16316:79;;:::i;:::-;16278:119;16436:1;16461:53;16506:7;16497:6;16486:9;16482:22;16461:53;:::i;:::-;16451:63;;16407:117;16563:2;16589:53;16634:7;16625:6;16614:9;16610:22;16589:53;:::i;:::-;16579:63;;16534:118;16185:474;;;;;:::o;16665:104::-;16710:7;16739:24;16757:5;16739:24;:::i;:::-;16728:35;;16665:104;;;:::o;16775:138::-;16856:32;16882:5;16856:32;:::i;:::-;16849:5;16846:43;16836:71;;16903:1;16900;16893:12;16836:71;16775:138;:::o;16919:155::-;16973:5;17011:6;16998:20;16989:29;;17027:41;17062:5;17027:41;:::i;:::-;16919:155;;;;:::o;17080:345::-;17147:6;17196:2;17184:9;17175:7;17171:23;17167:32;17164:119;;;17202:79;;:::i;:::-;17164:119;17322:1;17347:61;17400:7;17391:6;17380:9;17376:22;17347:61;:::i;:::-;17337:71;;17293:125;17080:345;;;;:::o;17431:180::-;17479:77;17476:1;17469:88;17576:4;17573:1;17566:15;17600:4;17597:1;17590:15;17617:320;17661:6;17698:1;17692:4;17688:12;17678:22;;17745:1;17739:4;17735:12;17766:18;17756:81;;17822:4;17814:6;17810:17;17800:27;;17756:81;17884:2;17876:6;17873:14;17853:18;17850:38;17847:84;;17903:18;;:::i;:::-;17847:84;17668:269;17617:320;;;:::o;17943:220::-;18083:34;18079:1;18071:6;18067:14;18060:58;18152:3;18147:2;18139:6;18135:15;18128:28;17943:220;:::o;18169:366::-;18311:3;18332:67;18396:2;18391:3;18332:67;:::i;:::-;18325:74;;18408:93;18497:3;18408:93;:::i;:::-;18526:2;18521:3;18517:12;18510:19;;18169:366;;;:::o;18541:419::-;18707:4;18745:2;18734:9;18730:18;18722:26;;18794:9;18788:4;18784:20;18780:1;18769:9;18765:17;18758:47;18822:131;18948:4;18822:131;:::i;:::-;18814:139;;18541:419;;;:::o;18966:249::-;19106:34;19102:1;19094:6;19090:14;19083:58;19175:32;19170:2;19162:6;19158:15;19151:57;18966:249;:::o;19221:366::-;19363:3;19384:67;19448:2;19443:3;19384:67;:::i;:::-;19377:74;;19460:93;19549:3;19460:93;:::i;:::-;19578:2;19573:3;19569:12;19562:19;;19221:366;;;:::o;19593:419::-;19759:4;19797:2;19786:9;19782:18;19774:26;;19846:9;19840:4;19836:20;19832:1;19821:9;19817:17;19810:47;19874:131;20000:4;19874:131;:::i;:::-;19866:139;;19593:419;;;:::o;20018:233::-;20158:34;20154:1;20146:6;20142:14;20135:58;20227:16;20222:2;20214:6;20210:15;20203:41;20018:233;:::o;20257:366::-;20399:3;20420:67;20484:2;20479:3;20420:67;:::i;:::-;20413:74;;20496:93;20585:3;20496:93;:::i;:::-;20614:2;20609:3;20605:12;20598:19;;20257:366;;;:::o;20629:419::-;20795:4;20833:2;20822:9;20818:18;20810:26;;20882:9;20876:4;20872:20;20868:1;20857:9;20853:17;20846:47;20910:131;21036:4;20910:131;:::i;:::-;20902:139;;20629:419;;;:::o;21054:174::-;21194:26;21190:1;21182:6;21178:14;21171:50;21054:174;:::o;21234:366::-;21376:3;21397:67;21461:2;21456:3;21397:67;:::i;:::-;21390:74;;21473:93;21562:3;21473:93;:::i;:::-;21591:2;21586:3;21582:12;21575:19;;21234:366;;;:::o;21606:419::-;21772:4;21810:2;21799:9;21795:18;21787:26;;21859:9;21853:4;21849:20;21845:1;21834:9;21830:17;21823:47;21887:131;22013:4;21887:131;:::i;:::-;21879:139;;21606:419;;;:::o;22031:148::-;22133:11;22170:3;22155:18;;22031:148;;;;:::o;22185:377::-;22291:3;22319:39;22352:5;22319:39;:::i;:::-;22374:89;22456:6;22451:3;22374:89;:::i;:::-;22367:96;;22472:52;22517:6;22512:3;22505:4;22498:5;22494:16;22472:52;:::i;:::-;22549:6;22544:3;22540:16;22533:23;;22295:267;22185:377;;;;:::o;22568:275::-;22700:3;22722:95;22813:3;22804:6;22722:95;:::i;:::-;22715:102;;22834:3;22827:10;;22568:275;;;;:::o;22849:161::-;22989:13;22985:1;22977:6;22973:14;22966:37;22849:161;:::o;23016:366::-;23158:3;23179:67;23243:2;23238:3;23179:67;:::i;:::-;23172:74;;23255:93;23344:3;23255:93;:::i;:::-;23373:2;23368:3;23364:12;23357:19;;23016:366;;;:::o;23388:419::-;23554:4;23592:2;23581:9;23577:18;23569:26;;23641:9;23635:4;23631:20;23627:1;23616:9;23612:17;23605:47;23669:131;23795:4;23669:131;:::i;:::-;23661:139;;23388:419;;;:::o;23813:166::-;23953:18;23949:1;23941:6;23937:14;23930:42;23813:166;:::o;23985:366::-;24127:3;24148:67;24212:2;24207:3;24148:67;:::i;:::-;24141:74;;24224:93;24313:3;24224:93;:::i;:::-;24342:2;24337:3;24333:12;24326:19;;23985:366;;;:::o;24357:419::-;24523:4;24561:2;24550:9;24546:18;24538:26;;24610:9;24604:4;24600:20;24596:1;24585:9;24581:17;24574:47;24638:131;24764:4;24638:131;:::i;:::-;24630:139;;24357:419;;;:::o;24782:161::-;24922:13;24918:1;24910:6;24906:14;24899:37;24782:161;:::o;24949:366::-;25091:3;25112:67;25176:2;25171:3;25112:67;:::i;:::-;25105:74;;25188:93;25277:3;25188:93;:::i;:::-;25306:2;25301:3;25297:12;25290:19;;24949:366;;;:::o;25321:419::-;25487:4;25525:2;25514:9;25510:18;25502:26;;25574:9;25568:4;25564:20;25560:1;25549:9;25545:17;25538:47;25602:131;25728:4;25602:131;:::i;:::-;25594:139;;25321:419;;;:::o;25746:180::-;25794:77;25791:1;25784:88;25891:4;25888:1;25881:15;25915:4;25912:1;25905:15;25932:233;25971:3;25994:24;26012:5;25994:24;:::i;:::-;25985:33;;26040:66;26033:5;26030:77;26027:103;;26110:18;;:::i;:::-;26027:103;26157:1;26150:5;26146:13;26139:20;;25932:233;;;:::o;26171:174::-;26311:26;26307:1;26299:6;26295:14;26288:50;26171:174;:::o;26351:366::-;26493:3;26514:67;26578:2;26573:3;26514:67;:::i;:::-;26507:74;;26590:93;26679:3;26590:93;:::i;:::-;26708:2;26703:3;26699:12;26692:19;;26351:366;;;:::o;26723:419::-;26889:4;26927:2;26916:9;26912:18;26904:26;;26976:9;26970:4;26966:20;26962:1;26951:9;26947:17;26940:47;27004:131;27130:4;27004:131;:::i;:::-;26996:139;;26723:419;;;:::o;27148:228::-;27288:34;27284:1;27276:6;27272:14;27265:58;27357:11;27352:2;27344:6;27340:15;27333:36;27148:228;:::o;27382:366::-;27524:3;27545:67;27609:2;27604:3;27545:67;:::i;:::-;27538:74;;27621:93;27710:3;27621:93;:::i;:::-;27739:2;27734:3;27730:12;27723:19;;27382:366;;;:::o;27754:419::-;27920:4;27958:2;27947:9;27943:18;27935:26;;28007:9;28001:4;27997:20;27993:1;27982:9;27978:17;27971:47;28035:131;28161:4;28035:131;:::i;:::-;28027:139;;27754:419;;;:::o;28179:435::-;28359:3;28381:95;28472:3;28463:6;28381:95;:::i;:::-;28374:102;;28493:95;28584:3;28575:6;28493:95;:::i;:::-;28486:102;;28605:3;28598:10;;28179:435;;;;;:::o;28620:94::-;28653:8;28701:5;28697:2;28693:14;28672:35;;28620:94;;;:::o;28720:::-;28759:7;28788:20;28802:5;28788:20;:::i;:::-;28777:31;;28720:94;;;:::o;28820:100::-;28859:7;28888:26;28908:5;28888:26;:::i;:::-;28877:37;;28820:100;;;:::o;28926:157::-;29031:45;29051:24;29069:5;29051:24;:::i;:::-;29031:45;:::i;:::-;29026:3;29019:58;28926:157;;:::o;29089:79::-;29128:7;29157:5;29146:16;;29089:79;;;:::o;29174:157::-;29279:45;29299:24;29317:5;29299:24;:::i;:::-;29279:45;:::i;:::-;29274:3;29267:58;29174:157;;:::o;29337:980::-;29609:3;29624:75;29695:3;29686:6;29624:75;:::i;:::-;29724:2;29719:3;29715:12;29708:19;;29737:75;29808:3;29799:6;29737:75;:::i;:::-;29837:2;29832:3;29828:12;29821:19;;29850:75;29921:3;29912:6;29850:75;:::i;:::-;29950:2;29945:3;29941:12;29934:19;;29963:75;30034:3;30025:6;29963:75;:::i;:::-;30063:2;30058:3;30054:12;30047:19;;30083:95;30174:3;30165:6;30083:95;:::i;:::-;30076:102;;30188:75;30259:3;30250:6;30188:75;:::i;:::-;30288:2;30283:3;30279:12;30272:19;;30308:3;30301:10;;29337:980;;;;;;;;;:::o;30323:225::-;30463:34;30459:1;30451:6;30447:14;30440:58;30532:8;30527:2;30519:6;30515:15;30508:33;30323:225;:::o;30554:366::-;30696:3;30717:67;30781:2;30776:3;30717:67;:::i;:::-;30710:74;;30793:93;30882:3;30793:93;:::i;:::-;30911:2;30906:3;30902:12;30895:19;;30554:366;;;:::o;30926:419::-;31092:4;31130:2;31119:9;31115:18;31107:26;;31179:9;31173:4;31169:20;31165:1;31154:9;31150:17;31143:47;31207:131;31333:4;31207:131;:::i;:::-;31199:139;;30926:419;;;:::o;31351:224::-;31491:34;31487:1;31479:6;31475:14;31468:58;31560:7;31555:2;31547:6;31543:15;31536:32;31351:224;:::o;31581:366::-;31723:3;31744:67;31808:2;31803:3;31744:67;:::i;:::-;31737:74;;31820:93;31909:3;31820:93;:::i;:::-;31938:2;31933:3;31929:12;31922:19;;31581:366;;;:::o;31953:419::-;32119:4;32157:2;32146:9;32142:18;32134:26;;32206:9;32200:4;32196:20;32192:1;32181:9;32177:17;32170:47;32234:131;32360:4;32234:131;:::i;:::-;32226:139;;31953:419;;;:::o;32378:223::-;32518:34;32514:1;32506:6;32502:14;32495:58;32587:6;32582:2;32574:6;32570:15;32563:31;32378:223;:::o;32607:366::-;32749:3;32770:67;32834:2;32829:3;32770:67;:::i;:::-;32763:74;;32846:93;32935:3;32846:93;:::i;:::-;32964:2;32959:3;32955:12;32948:19;;32607:366;;;:::o;32979:419::-;33145:4;33183:2;33172:9;33168:18;33160:26;;33232:9;33226:4;33222:20;33218:1;33207:9;33203:17;33196:47;33260:131;33386:4;33260:131;:::i;:::-;33252:139;;32979:419;;;:::o;33404:191::-;33444:4;33464:20;33482:1;33464:20;:::i;:::-;33459:25;;33498:20;33516:1;33498:20;:::i;:::-;33493:25;;33537:1;33534;33531:8;33528:34;;;33542:18;;:::i;:::-;33528:34;33587:1;33584;33580:9;33572:17;;33404:191;;;;:::o;33601:305::-;33641:3;33660:20;33678:1;33660:20;:::i;:::-;33655:25;;33694:20;33712:1;33694:20;:::i;:::-;33689:25;;33848:1;33780:66;33776:74;33773:1;33770:81;33767:107;;;33854:18;;:::i;:::-;33767:107;33898:1;33895;33891:9;33884:16;;33601:305;;;;:::o;33912:155::-;34052:7;34048:1;34040:6;34036:14;34029:31;33912:155;:::o;34073:400::-;34233:3;34254:84;34336:1;34331:3;34254:84;:::i;:::-;34247:91;;34347:93;34436:3;34347:93;:::i;:::-;34465:1;34460:3;34456:11;34449:18;;34073:400;;;:::o;34479:701::-;34760:3;34782:95;34873:3;34864:6;34782:95;:::i;:::-;34775:102;;34894:95;34985:3;34976:6;34894:95;:::i;:::-;34887:102;;35006:148;35150:3;35006:148;:::i;:::-;34999:155;;35171:3;35164:10;;34479:701;;;;;:::o;35186:233::-;35326:34;35322:1;35314:6;35310:14;35303:58;35395:16;35390:2;35382:6;35378:15;35371:41;35186:233;:::o;35425:366::-;35567:3;35588:67;35652:2;35647:3;35588:67;:::i;:::-;35581:74;;35664:93;35753:3;35664:93;:::i;:::-;35782:2;35777:3;35773:12;35766:19;;35425:366;;;:::o;35797:419::-;35963:4;36001:2;35990:9;35986:18;35978:26;;36050:9;36044:4;36040:20;36036:1;36025:9;36021:17;36014:47;36078:131;36204:4;36078:131;:::i;:::-;36070:139;;35797:419;;;:::o;36222:141::-;36271:4;36294:3;36286:11;;36317:3;36314:1;36307:14;36351:4;36348:1;36338:18;36330:26;;36222:141;;;:::o;36369:93::-;36406:6;36453:2;36448;36441:5;36437:14;36433:23;36423:33;;36369:93;;;:::o;36468:107::-;36512:8;36562:5;36556:4;36552:16;36531:37;;36468:107;;;;:::o;36581:393::-;36650:6;36700:1;36688:10;36684:18;36723:97;36753:66;36742:9;36723:97;:::i;:::-;36841:39;36871:8;36860:9;36841:39;:::i;:::-;36829:51;;36913:4;36909:9;36902:5;36898:21;36889:30;;36962:4;36952:8;36948:19;36941:5;36938:30;36928:40;;36657:317;;36581:393;;;;;:::o;36980:60::-;37008:3;37029:5;37022:12;;36980:60;;;:::o;37046:142::-;37096:9;37129:53;37147:34;37156:24;37174:5;37156:24;:::i;:::-;37147:34;:::i;:::-;37129:53;:::i;:::-;37116:66;;37046:142;;;:::o;37194:75::-;37237:3;37258:5;37251:12;;37194:75;;;:::o;37275:269::-;37385:39;37416:7;37385:39;:::i;:::-;37446:91;37495:41;37519:16;37495:41;:::i;:::-;37487:6;37480:4;37474:11;37446:91;:::i;:::-;37440:4;37433:105;37351:193;37275:269;;;:::o;37550:73::-;37595:3;37550:73;:::o;37629:189::-;37706:32;;:::i;:::-;37747:65;37805:6;37797;37791:4;37747:65;:::i;:::-;37682:136;37629:189;;:::o;37824:186::-;37884:120;37901:3;37894:5;37891:14;37884:120;;;37955:39;37992:1;37985:5;37955:39;:::i;:::-;37928:1;37921:5;37917:13;37908:22;;37884:120;;;37824:186;;:::o;38016:543::-;38117:2;38112:3;38109:11;38106:446;;;38151:38;38183:5;38151:38;:::i;:::-;38235:29;38253:10;38235:29;:::i;:::-;38225:8;38221:44;38418:2;38406:10;38403:18;38400:49;;;38439:8;38424:23;;38400:49;38462:80;38518:22;38536:3;38518:22;:::i;:::-;38508:8;38504:37;38491:11;38462:80;:::i;:::-;38121:431;;38106:446;38016:543;;;:::o;38565:117::-;38619:8;38669:5;38663:4;38659:16;38638:37;;38565:117;;;;:::o;38688:169::-;38732:6;38765:51;38813:1;38809:6;38801:5;38798:1;38794:13;38765:51;:::i;:::-;38761:56;38846:4;38840;38836:15;38826:25;;38739:118;38688:169;;;;:::o;38862:295::-;38938:4;39084:29;39109:3;39103:4;39084:29;:::i;:::-;39076:37;;39146:3;39143:1;39139:11;39133:4;39130:21;39122:29;;38862:295;;;;:::o;39162:1395::-;39279:37;39312:3;39279:37;:::i;:::-;39381:18;39373:6;39370:30;39367:56;;;39403:18;;:::i;:::-;39367:56;39447:38;39479:4;39473:11;39447:38;:::i;:::-;39532:67;39592:6;39584;39578:4;39532:67;:::i;:::-;39626:1;39650:4;39637:17;;39682:2;39674:6;39671:14;39699:1;39694:618;;;;40356:1;40373:6;40370:77;;;40422:9;40417:3;40413:19;40407:26;40398:35;;40370:77;40473:67;40533:6;40526:5;40473:67;:::i;:::-;40467:4;40460:81;40329:222;39664:887;;39694:618;39746:4;39742:9;39734:6;39730:22;39780:37;39812:4;39780:37;:::i;:::-;39839:1;39853:208;39867:7;39864:1;39861:14;39853:208;;;39946:9;39941:3;39937:19;39931:26;39923:6;39916:42;39997:1;39989:6;39985:14;39975:24;;40044:2;40033:9;40029:18;40016:31;;39890:4;39887:1;39883:12;39878:17;;39853:208;;;40089:6;40080:7;40077:19;40074:179;;;40147:9;40142:3;40138:19;40132:26;40190:48;40232:4;40224:6;40220:17;40209:9;40190:48;:::i;:::-;40182:6;40175:64;40097:156;40074:179;40299:1;40295;40287:6;40283:14;40279:22;40273:4;40266:36;39701:611;;;39664:887;;39254:1303;;;39162:1395;;:::o;40563:182::-;40703:34;40699:1;40691:6;40687:14;40680:58;40563:182;:::o;40751:366::-;40893:3;40914:67;40978:2;40973:3;40914:67;:::i;:::-;40907:74;;40990:93;41079:3;40990:93;:::i;:::-;41108:2;41103:3;41099:12;41092:19;;40751:366;;;:::o;41123:419::-;41289:4;41327:2;41316:9;41312:18;41304:26;;41376:9;41370:4;41366:20;41362:1;41351:9;41347:17;41340:47;41404:131;41530:4;41404:131;:::i;:::-;41396:139;;41123:419;;;:::o;41548:175::-;41688:27;41684:1;41676:6;41672:14;41665:51;41548:175;:::o;41729:366::-;41871:3;41892:67;41956:2;41951:3;41892:67;:::i;:::-;41885:74;;41968:93;42057:3;41968:93;:::i;:::-;42086:2;42081:3;42077:12;42070:19;;41729:366;;;:::o;42101:419::-;42267:4;42305:2;42294:9;42290:18;42282:26;;42354:9;42348:4;42344:20;42340:1;42329:9;42325:17;42318:47;42382:131;42508:4;42382:131;:::i;:::-;42374:139;;42101:419;;;:::o;42526:237::-;42666:34;42662:1;42654:6;42650:14;42643:58;42735:20;42730:2;42722:6;42718:15;42711:45;42526:237;:::o;42769:366::-;42911:3;42932:67;42996:2;42991:3;42932:67;:::i;:::-;42925:74;;43008:93;43097:3;43008:93;:::i;:::-;43126:2;43121:3;43117:12;43110:19;;42769:366;;;:::o;43141:419::-;43307:4;43345:2;43334:9;43330:18;43322:26;;43394:9;43388:4;43384:20;43380:1;43369:9;43365:17;43358:47;43422:131;43548:4;43422:131;:::i;:::-;43414:139;;43141:419;;;:::o;43566:214::-;43706:66;43702:1;43694:6;43690:14;43683:90;43566:214;:::o;43786:402::-;43946:3;43967:85;44049:2;44044:3;43967:85;:::i;:::-;43960:92;;44061:93;44150:3;44061:93;:::i;:::-;44179:2;44174:3;44170:12;44163:19;;43786:402;;;:::o;44194:79::-;44233:7;44262:5;44251:16;;44194:79;;;:::o;44279:157::-;44384:45;44404:24;44422:5;44404:24;:::i;:::-;44384:45;:::i;:::-;44379:3;44372:58;44279:157;;:::o;44442:522::-;44655:3;44677:148;44821:3;44677:148;:::i;:::-;44670:155;;44835:75;44906:3;44897:6;44835:75;:::i;:::-;44935:2;44930:3;44926:12;44919:19;;44955:3;44948:10;;44442:522;;;;:::o;44970:180::-;45018:77;45015:1;45008:88;45115:4;45112:1;45105:15;45139:4;45136:1;45129:15;45156:185;45196:1;45213:20;45231:1;45213:20;:::i;:::-;45208:25;;45247:20;45265:1;45247:20;:::i;:::-;45242:25;;45286:1;45276:35;;45291:18;;:::i;:::-;45276:35;45333:1;45330;45326:9;45321:14;;45156:185;;;;:::o;45347:176::-;45379:1;45396:20;45414:1;45396:20;:::i;:::-;45391:25;;45430:20;45448:1;45430:20;:::i;:::-;45425:25;;45469:1;45459:35;;45474:18;;:::i;:::-;45459:35;45515:1;45512;45508:9;45503:14;;45347:176;;;;:::o;45529:180::-;45577:77;45574:1;45567:88;45674:4;45671:1;45664:15;45698:4;45695:1;45688:15;45715:98;45766:6;45800:5;45794:12;45784:22;;45715:98;;;:::o;45819:168::-;45902:11;45936:6;45931:3;45924:19;45976:4;45971:3;45967:14;45952:29;;45819:168;;;;:::o;45993:360::-;46079:3;46107:38;46139:5;46107:38;:::i;:::-;46161:70;46224:6;46219:3;46161:70;:::i;:::-;46154:77;;46240:52;46285:6;46280:3;46273:4;46266:5;46262:16;46240:52;:::i;:::-;46317:29;46339:6;46317:29;:::i;:::-;46312:3;46308:39;46301:46;;46083:270;45993:360;;;;:::o;46359:640::-;46554:4;46592:3;46581:9;46577:19;46569:27;;46606:71;46674:1;46663:9;46659:17;46650:6;46606:71;:::i;:::-;46687:72;46755:2;46744:9;46740:18;46731:6;46687:72;:::i;:::-;46769;46837:2;46826:9;46822:18;46813:6;46769:72;:::i;:::-;46888:9;46882:4;46878:20;46873:2;46862:9;46858:18;46851:48;46916:76;46987:4;46978:6;46916:76;:::i;:::-;46908:84;;46359:640;;;;;;;:::o;47005:141::-;47061:5;47092:6;47086:13;47077:22;;47108:32;47134:5;47108:32;:::i;:::-;47005:141;;;;:::o;47152:349::-;47221:6;47270:2;47258:9;47249:7;47245:23;47241:32;47238:119;;;47276:79;;:::i;:::-;47238:119;47396:1;47421:63;47476:7;47467:6;47456:9;47452:22;47421:63;:::i;:::-;47411:73;;47367:127;47152:349;;;;:::o;47507:180::-;47555:77;47552:1;47545:88;47652:4;47649:1;47642:15;47676:4;47673:1;47666:15;47693:174;47833:26;47829:1;47821:6;47817:14;47810:50;47693:174;:::o;47873:366::-;48015:3;48036:67;48100:2;48095:3;48036:67;:::i;:::-;48029:74;;48112:93;48201:3;48112:93;:::i;:::-;48230:2;48225:3;48221:12;48214:19;;47873:366;;;:::o;48245:419::-;48411:4;48449:2;48438:9;48434:18;48426:26;;48498:9;48492:4;48488:20;48484:1;48473:9;48469:17;48462:47;48526:131;48652:4;48526:131;:::i;:::-;48518:139;;48245:419;;;:::o;48670:181::-;48810:33;48806:1;48798:6;48794:14;48787:57;48670:181;:::o;48857:366::-;48999:3;49020:67;49084:2;49079:3;49020:67;:::i;:::-;49013:74;;49096:93;49185:3;49096:93;:::i;:::-;49214:2;49209:3;49205:12;49198:19;;48857:366;;;:::o;49229:419::-;49395:4;49433:2;49422:9;49418:18;49410:26;;49482:9;49476:4;49472:20;49468:1;49457:9;49453:17;49446:47;49510:131;49636:4;49510:131;:::i;:::-;49502:139;;49229:419;;;:::o;49654:221::-;49794:34;49790:1;49782:6;49778:14;49771:58;49863:4;49858:2;49850:6;49846:15;49839:29;49654:221;:::o;49881:366::-;50023:3;50044:67;50108:2;50103:3;50044:67;:::i;:::-;50037:74;;50120:93;50209:3;50120:93;:::i;:::-;50238:2;50233:3;50229:12;50222:19;;49881:366;;;:::o;50253:419::-;50419:4;50457:2;50446:9;50442:18;50434:26;;50506:9;50500:4;50496:20;50492:1;50481:9;50477:17;50470:47;50534:131;50660:4;50534:131;:::i;:::-;50526:139;;50253:419;;;:::o;50678:221::-;50818:34;50814:1;50806:6;50802:14;50795:58;50887:4;50882:2;50874:6;50870:15;50863:29;50678:221;:::o;50905:366::-;51047:3;51068:67;51132:2;51127:3;51068:67;:::i;:::-;51061:74;;51144:93;51233:3;51144:93;:::i;:::-;51262:2;51257:3;51253:12;51246:19;;50905:366;;;:::o;51277:419::-;51443:4;51481:2;51470:9;51466:18;51458:26;;51530:9;51524:4;51520:20;51516:1;51505:9;51501:17;51494:47;51558:131;51684:4;51558:131;:::i;:::-;51550:139;;51277:419;;;:::o;51702:182::-;51842:34;51838:1;51830:6;51826:14;51819:58;51702:182;:::o;51890:366::-;52032:3;52053:67;52117:2;52112:3;52053:67;:::i;:::-;52046:74;;52129:93;52218:3;52129:93;:::i;:::-;52247:2;52242:3;52238:12;52231:19;;51890:366;;;:::o;52262:419::-;52428:4;52466:2;52455:9;52451:18;52443:26;;52515:9;52509:4;52505:20;52501:1;52490:9;52486:17;52479:47;52543:131;52669:4;52543:131;:::i;:::-;52535:139;;52262:419;;;:::o;52687:178::-;52827:30;52823:1;52815:6;52811:14;52804:54;52687:178;:::o;52871:366::-;53013:3;53034:67;53098:2;53093:3;53034:67;:::i;:::-;53027:74;;53110:93;53199:3;53110:93;:::i;:::-;53228:2;53223:3;53219:12;53212:19;;52871:366;;;:::o;53243:419::-;53409:4;53447:2;53436:9;53432:18;53424:26;;53496:9;53490:4;53486:20;53482:1;53471:9;53467:17;53460:47;53524:131;53650:4;53524:131;:::i;:::-;53516:139;;53243:419;;;:::o;53668:86::-;53703:7;53743:4;53736:5;53732:16;53721:27;;53668:86;;;:::o;53760:112::-;53843:22;53859:5;53843:22;:::i;:::-;53838:3;53831:35;53760:112;;:::o;53878:545::-;54051:4;54089:3;54078:9;54074:19;54066:27;;54103:71;54171:1;54160:9;54156:17;54147:6;54103:71;:::i;:::-;54184:68;54248:2;54237:9;54233:18;54224:6;54184:68;:::i;:::-;54262:72;54330:2;54319:9;54315:18;54306:6;54262:72;:::i;:::-;54344;54412:2;54401:9;54397:18;54388:6;54344:72;:::i;:::-;53878:545;;;;;;;:::o

Swarm Source

ipfs://5613235d40f8e1419875fe1244ab0ce925f118c41443a97399750a63df161d1b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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