ETH Price: $2,689.87 (-2.10%)

aof Avatar (AOFS)
 

Overview

TokenID

84

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AOFPass

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-11
*/

// SPDX-License-Identifier: MIT


pragma solidity >=0.7.0 <0.9.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;
    }

    function setInitValue(Counter storage counter , uint256 value) internal{
         counter._value = value;
    }
}

// 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;
    }
}

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/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);
}

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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// OpenZeppelin Contracts v4.4.1 (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: balance query for the zero address");
        return _balances[owner];
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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 of token that is not own");
        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);
    }

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol)



/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     *@dev The multiproof provided is not valid.
     */
    error MerkleProofInvalidMultiproof();

    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proofLen - 1 != totalHashes) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            if (proofPos != proofLen) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proofLen - 1 != totalHashes) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            if (proofPos != proofLen) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}



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



interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;


abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);


    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

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

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}
/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

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

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

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

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

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

        return (royalty.receiver, royaltyAmount);
    }

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

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

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

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

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

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

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

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

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

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

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

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

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

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

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

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

pragma solidity >=0.7.0 <0.9.0;


error AlreadyClaimed();
error InvalidMerkleProof();
error WithdrawTransfer();

abstract contract AOF721 is
    ERC721,
    ERC2981,
    ERC721Enumerable,
    AccessControl,
    DefaultOperatorFilterer
{
    using Counters for Counters.Counter;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");
    bytes32  public root;
    address public  USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
    uint256 public constant WlETHprice = 0.02 ether;
    uint256 public constant ETHprice = 0.025 ether;
    uint256 public  WlTokenprice = 40;
    uint256 public  Tokenprice = 50;
    uint256 public  MAX_SUPPLY = 2000;
    uint256 public  preMintCount = 1;
    bool public presaleActive;
    bool public publicsaleActive;

    mapping(address => bool) public claimed;
    mapping(address => uint256) public _alreadyMinted;

    event MintNft(address indexed _to, uint256 indexed _tokenId);
    Counters.Counter private _tokenIdCounter;

    string private _uriPrefix;
    IERC20 public token;
    address public receiver;

    constructor(
        string memory uriPrefix,
        string memory name,
        string memory symbol,
        uint256 initId_,
        address _token,
        address _receiver
    ) ERC721(name, symbol) {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(MINTER_ROLE, msg.sender);
        _uriPrefix = uriPrefix;
        _tokenIdCounter.setInitValue(initId_);
        token = IERC20(_token);
        receiver = _receiver;
        WlTokenprice = WlTokenprice * 10 ** 6;
        Tokenprice = Tokenprice * 10 ** 6;
     
    }

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

    function setURI(string memory newuri)
        external
        onlyRole(DEFAULT_ADMIN_ROLE)
    {
        _uriPrefix = newuri;
    }

    function safeMint(address to) public onlyMinter {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to,tokenId);
    }

    function safeMint(address to, uint256 tokenId) public onlyMinter {
        _safeMint(to, tokenId);
    }

    function Wlmint(bytes32[] calldata proof) public payable {
        require(presaleActive,"Sale is closed");
        require(claimed[msg.sender] == false, "Already claimed");
        require(msg.value == WlETHprice || token.transferFrom(msg.sender, receiver, WlTokenprice), "Not enough ETH or token");
        
        bytes32 leaf = getLeaf(msg.sender);
        if(!MerkleProof.verify(proof,root,leaf)) revert InvalidMerkleProof();
        claimed[msg.sender] = true;
    
        _internalMint(msg.sender,preMintCount);
    }

     function publicMint(uint256 amount) public payable {
        require(publicsaleActive,"Sale is closed");
        require((_alreadyMinted[msg.sender] + amount) <= 3 ,"You can only mint 3 tokens");
        require(msg.value == ETHprice * amount || token.transferFrom(msg.sender, receiver, Tokenprice * amount), "Not enough ETH or token");
        _alreadyMinted[msg.sender] += amount;
        _internalMint(msg.sender,amount);

    }

     function _internalMint(address to,uint256 amount) internal   {
        require(MAX_SUPPLY >= totalSupply() + amount, "Will exceed maximum supply");
        for (uint256 i = 1; i <= amount; i++) {
                _safeMint(to, _tokenIdCounter.current());
                emit MintNft(to, _tokenIdCounter.current());
                _tokenIdCounter.increment();

        }

     }

   
     function withDrawEth(address payable to)external onlyOwner{
         uint256 balance = address(this).balance;
         (bool success,) = to.call{value:balance}("");
         if(!success) revert WithdrawTransfer();
     }

    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an authorized operator.
     */
    function burn(uint256 tokenId) public {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId) ||
                hasRole(BURNER_ROLE, _msgSender()),
            "AOF: caller is not authorized to burn token"
        );
        _burn(tokenId);
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        return string(abi.encodePacked(_uriPrefix, Strings.toString(_tokenId)));
    }

    /**
     * @dev Throws if called by any account other than the owner nor the minter.
     */
    modifier onlyMinter() {
        require(
            hasRole(MINTER_ROLE, _msgSender()) ||
                hasRole(DEFAULT_ADMIN_ROLE, _msgSender()),
            "AOF: caller is not the owner nor the minter"
        );
        _;
    }

    modifier onlyOwner() {
        require(
            hasRole(DEFAULT_ADMIN_ROLE, _msgSender()),
            "AOF: caller is not admin"
        );
        _;
    }

    function togglePublicSale() external onlyOwner {
        publicsaleActive = !publicsaleActive;
    }

    function togglePresale() external onlyOwner {
        presaleActive = !presaleActive;
    }

    /**
     * @dev Returns all the token IDs owned by address
     */
    function tokensOfOwner(address _addr)
        external
        view
        returns (uint256[] memory)
    {
        uint256 balance = balanceOf(_addr);
        uint256[] memory tokens = new uint256[](balance);
        for (uint256 i = 0; i < balance; i++) {
            tokens[i] = tokenOfOwnerByIndex(_addr, i);
        }

        return tokens;
    }

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

    // The following functions are overrides required by Solidity.

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

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

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

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

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

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

    function getLeaf(address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }

    function setRoot(bytes32 _root) public onlyOwner{
        root = _root;
    }

    function setMaxSupply(uint256 _newMaxSupply) public onlyOwner{
        MAX_SUPPLY = _newMaxSupply;
    }
 }



contract AOFPass is AOF721 {
    constructor(uint256 initId_,address _token, address _receiver)
        AOF721(
            "https://api.aof.games/aof721/",
            "aof Avatar",
            "AOFS",
            initId_,
            _token,
            _receiver
        )
    {}


}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"initId_","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidMerkleProof","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"WithdrawTransfer","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MintNft","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETHprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Tokenprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WlETHprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WlTokenprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"Wlmint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_alreadyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicsaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeMint","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":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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 payable","name":"to","type":"address"}],"name":"withDrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273dac17f958d2ee523a2206206994597c13d831ec7600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506028600f5560326010556107d060115560016012553480156200007b57600080fd5b5060405162006af738038062006af78339818101604052810190620000a19190620006db565b6040518060400160405280601d81526020017f68747470733a2f2f6170692e616f662e67616d65732f616f663732312f0000008152506040518060400160405280600a81526020017f616f6620417661746172000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f414f465300000000000000000000000000000000000000000000000000000000815250858585733cc6cdda760b79bafa08df41ecfa224f810dceb6600186868160009081620001709190620009a7565b508060019081620001829190620009a7565b50505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200037a57801562000240576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200020692919062000a9f565b600060405180830381600087803b1580156200022157600080fd5b505af115801562000236573d6000803e3d6000fd5b5050505062000379565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002fa576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002c092919062000a9f565b600060405180830381600087803b158015620002db57600080fd5b505af1158015620002f0573d6000803e3d6000fd5b5050505062000378565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000343919062000acc565b600060405180830381600087803b1580156200035e57600080fd5b505af115801562000373573d6000803e3d6000fd5b505050505b5b5b5050620003916000801b33620004ae60201b60201c565b620003c37f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620004ae60201b60201c565b8560179081620003d49190620009a7565b50620003eb836016620004c460201b90919060201c565b81601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620f4240600f5462000480919062000b18565b600f81905550620f424060105462000499919062000b18565b60108190555050505050505050505062000b63565b620004c08282620004d160201b60201c565b5050565b8082600001819055505050565b620004e38282620005c360201b60201c565b620005bf576001600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005646200062e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600080fd5b6000819050919050565b62000650816200063b565b81146200065c57600080fd5b50565b600081519050620006708162000645565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006a38262000676565b9050919050565b620006b58162000696565b8114620006c157600080fd5b50565b600081519050620006d581620006aa565b92915050565b600080600060608486031215620006f757620006f662000636565b5b600062000707868287016200065f565b93505060206200071a86828701620006c4565b92505060406200072d86828701620006c4565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007b957607f821691505b602082108103620007cf57620007ce62000771565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008397fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007fa565b620008458683620007fa565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000888620008826200087c846200063b565b6200085d565b6200063b565b9050919050565b6000819050919050565b620008a48362000867565b620008bc620008b3826200088f565b84845462000807565b825550505050565b600090565b620008d3620008c4565b620008e081848462000899565b505050565b5b818110156200090857620008fc600082620008c9565b600181019050620008e6565b5050565b601f82111562000957576200092181620007d5565b6200092c84620007ea565b810160208510156200093c578190505b620009546200094b85620007ea565b830182620008e5565b50505b505050565b600082821c905092915050565b60006200097c600019846008026200095c565b1980831691505092915050565b600062000997838362000969565b9150826002028217905092915050565b620009b28262000737565b67ffffffffffffffff811115620009ce57620009cd62000742565b5b620009da8254620007a0565b620009e78282856200090c565b600060209050601f83116001811462000a1f576000841562000a0a578287015190505b62000a16858262000989565b86555062000a86565b601f19841662000a2f86620007d5565b60005b8281101562000a595784890151825560018201915060208501945060208101905062000a32565b8683101562000a79578489015162000a75601f89168262000969565b8355505b6001600288020188555050505b505050505050565b62000a998162000696565b82525050565b600060408201905062000ab6600083018562000a8e565b62000ac5602083018462000a8e565b9392505050565b600060208201905062000ae3600083018462000a8e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b25826200063b565b915062000b32836200063b565b925082820262000b42816200063b565b9150828204841483151762000b5c5762000b5b62000ae9565b5b5092915050565b615f848062000b736000396000f3fe6080604052600436106102ff5760003560e01c80636352211e11610190578063c54e44eb116100dc578063e222c7f911610095578063ebf0c7171161006f578063ebf0c71714610bad578063f7260d3e14610bd8578063fc0c546a14610c03578063febef22614610c2e576102ff565b8063e222c7f914610b1c578063e554de0f14610b33578063e985e9c514610b70576102ff565b8063c54e44eb146109fa578063c87b56dd14610a25578063c884ef8314610a62578063d539139314610a9f578063d547741f14610aca578063dab5f34014610af3576102ff565b806395d89b4111610149578063a217fddf11610123578063a217fddf14610952578063a22cb4651461097d578063b88d4fde146109a6578063bd645b62146109cf576102ff565b806395d89b41146108d35780639a32f517146108fe578063a144819414610929576102ff565b80636352211e1461078b5780636f8b44b0146107c857806370a08231146107f15780637be70f781461082e5780638462151c1461085957806391d1485414610896576102ff565b80632db115441161024f57806336568abe1161020857806342842e0e116101e257806342842e0e146106d157806342966c68146106fa5780634f6ccce71461072357806353135ca014610760576102ff565b806336568abe1461065457806340d097c31461067d57806341f43434146106a6576102ff565b80632db11544146105655780632f2ff15d146105815780632f745c59146105aa57806332cb6b0c146105e75780633432123d14610612578063343937431461063d576102ff565b806319b6865d116102bc578063248a9ca311610296578063248a9ca3146104965780632542ae30146104d3578063282c51f3146104fc5780632a55205a14610527576102ff565b806319b6865d146104265780631a4365861461045157806323b872dd1461046d576102ff565b806301ffc9a71461030457806302fe53051461034157806306fdde031461036a578063081812fc14610395578063095ea7b3146103d257806318160ddd146103fb575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613f7c565b610c59565b6040516103389190613fc4565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190614125565b610c7b565b005b34801561037657600080fd5b5061037f610c9c565b60405161038c91906141ed565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190614245565b610d2e565b6040516103c991906142b3565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f491906142fa565b610db3565b005b34801561040757600080fd5b50610410610dcc565b60405161041d9190614349565b60405180910390f35b34801561043257600080fd5b5061043b610dd9565b6040516104489190614349565b60405180910390f35b61046b600480360381019061046691906143c4565b610ddf565b005b34801561047957600080fd5b50610494600480360381019061048f9190614411565b6110d1565b005b3480156104a257600080fd5b506104bd60048036038101906104b8919061449a565b611120565b6040516104ca91906144d6565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f5919061452f565b611140565b005b34801561050857600080fd5b50610511611240565b60405161051e91906144d6565b60405180910390f35b34801561053357600080fd5b5061054e6004803603810190610549919061455c565b611264565b60405161055c92919061459c565b60405180910390f35b61057f600480360381019061057a9190614245565b61144e565b005b34801561058d57600080fd5b506105a860048036038101906105a391906145c5565b6116ba565b005b3480156105b657600080fd5b506105d160048036038101906105cc91906142fa565b6116db565b6040516105de9190614349565b60405180910390f35b3480156105f357600080fd5b506105fc611780565b6040516106099190614349565b60405180910390f35b34801561061e57600080fd5b50610627611786565b6040516106349190613fc4565b60405180910390f35b34801561064957600080fd5b50610652611799565b005b34801561066057600080fd5b5061067b600480360381019061067691906145c5565b611818565b005b34801561068957600080fd5b506106a4600480360381019061069f9190614605565b61189b565b005b3480156106b257600080fd5b506106bb61194c565b6040516106c89190614691565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190614411565b61195e565b005b34801561070657600080fd5b50610721600480360381019061071c9190614245565b6119ad565b005b34801561072f57600080fd5b5061074a60048036038101906107459190614245565b611a41565b6040516107579190614349565b60405180910390f35b34801561076c57600080fd5b50610775611ab2565b6040516107829190613fc4565b60405180910390f35b34801561079757600080fd5b506107b260048036038101906107ad9190614245565b611ac5565b6040516107bf91906142b3565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea9190614245565b611b76565b005b3480156107fd57600080fd5b5061081860048036038101906108139190614605565b611bd3565b6040516108259190614349565b60405180910390f35b34801561083a57600080fd5b50610843611c8a565b6040516108509190614349565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b9190614605565b611c95565b60405161088d919061476a565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b891906145c5565b611d43565b6040516108ca9190613fc4565b60405180910390f35b3480156108df57600080fd5b506108e8611dae565b6040516108f591906141ed565b60405180910390f35b34801561090a57600080fd5b50610913611e40565b6040516109209190614349565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b91906142fa565b611e46565b005b34801561095e57600080fd5b50610967611edf565b60405161097491906144d6565b60405180910390f35b34801561098957600080fd5b506109a4600480360381019061099f91906147b8565b611ee6565b005b3480156109b257600080fd5b506109cd60048036038101906109c89190614899565b611eff565b005b3480156109db57600080fd5b506109e4611f50565b6040516109f19190614349565b60405180910390f35b348015610a0657600080fd5b50610a0f611f5b565b604051610a1c91906142b3565b60405180910390f35b348015610a3157600080fd5b50610a4c6004803603810190610a479190614245565b611f81565b604051610a5991906141ed565b60405180910390f35b348015610a6e57600080fd5b50610a896004803603810190610a849190614605565b611fb5565b604051610a969190613fc4565b60405180910390f35b348015610aab57600080fd5b50610ab4611fd5565b604051610ac191906144d6565b60405180910390f35b348015610ad657600080fd5b50610af16004803603810190610aec91906145c5565b611ff9565b005b348015610aff57600080fd5b50610b1a6004803603810190610b15919061449a565b61201a565b005b348015610b2857600080fd5b50610b31612077565b005b348015610b3f57600080fd5b50610b5a6004803603810190610b559190614605565b6120f6565b604051610b679190614349565b60405180910390f35b348015610b7c57600080fd5b50610b976004803603810190610b92919061491c565b61210e565b604051610ba49190613fc4565b60405180910390f35b348015610bb957600080fd5b50610bc26121a2565b604051610bcf91906144d6565b60405180910390f35b348015610be457600080fd5b50610bed6121a8565b604051610bfa91906142b3565b60405180910390f35b348015610c0f57600080fd5b50610c186121ce565b604051610c25919061497d565b60405180910390f35b348015610c3a57600080fd5b50610c436121f4565b604051610c509190614349565b60405180910390f35b6000610c64826121fa565b80610c745750610c7382612274565b5b9050919050565b6000801b610c88816122ee565b8160179081610c979190614b9a565b505050565b606060008054610cab906149c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd7906149c7565b8015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050905090565b6000610d3982612302565b610d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6f90614cde565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610dbd8161236e565b610dc7838361246b565b505050565b6000600a80549050905090565b60105481565b601360009054906101000a900460ff16610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590614d4a565b60405180910390fd5b60001515601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb890614db6565b60405180910390fd5b66470de4df820000341480610f985750601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f546040518463ffffffff1660e01b8152600401610f5493929190614dd6565b6020604051808303816000875af1158015610f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f979190614e22565b5b610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90614e9b565b60405180910390fd5b6000610fe233612582565b9050611032838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54836125b2565b611068576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506110cc336012546125c9565b505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461110f5761110e3361236e565b5b61111a8484846126b0565b50505050565b6000600c6000838152602001908152602001600020600101549050919050565b6111546000801b61114f612710565b611d43565b611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90614f07565b60405180910390fd5b600047905060008273ffffffffffffffffffffffffffffffffffffffff16826040516111be90614f58565b60006040518083038185875af1925050503d80600081146111fb576040519150601f19603f3d011682016040523d82523d6000602084013e611200565b606091505b505090508061123b576040517fd23a9e8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b6000806000600760008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036113f95760066040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611403612718565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661142f9190614f9c565b611439919061500d565b90508160000151819350935050509250929050565b601360019054906101000a900460ff1661149d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149490614d4a565b60405180910390fd5b600381601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114ea919061503e565b111561152b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611522906150be565b60405180910390fd5b806658d15e1762800061153e9190614f9c565b3414806116185750601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846010546115b69190614f9c565b6040518463ffffffff1660e01b81526004016115d493929190614dd6565b6020604051808303816000875af11580156115f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116179190614e22565b5b611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164e90614e9b565b60405180910390fd5b80601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116a6919061503e565b925050819055506116b733826125c9565b50565b6116c382611120565b6116cc816122ee565b6116d68383612722565b505050565b60006116e683611bd3565b8210611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90615150565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60115481565b601360019054906101000a900460ff1681565b6117ad6000801b6117a8612710565b611d43565b6117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e390614f07565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b611820612710565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461188d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611884906151e2565b60405180910390fd5b6118978282612803565b5050565b6118cc7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66118c7612710565b611d43565b806118e757506118e66000801b6118e1612710565b611d43565b5b611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90615274565b60405180910390fd5b600061193260166128e5565b905061193e60166128f3565b6119488282612909565b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461199c5761199b3361236e565b5b6119a7848484612927565b50505050565b6119be6119b8612710565b82612947565b806119f657506119f57f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8486119f0612710565b611d43565b5b611a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2c90615306565b60405180910390fd5b611a3e81612a25565b50565b6000611a4b610dcc565b8210611a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8390615398565b60405180910390fd5b600a8281548110611aa057611a9f6153b8565b5b90600052602060002001549050919050565b601360009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490615459565b60405180910390fd5b80915050919050565b611b8a6000801b611b85612710565b611d43565b611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090614f07565b60405180910390fd5b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a906154eb565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6658d15e1762800081565b60606000611ca283611bd3565b905060008167ffffffffffffffff811115611cc057611cbf613ffa565b5b604051908082528060200260200182016040528015611cee5781602001602082028036833780820191505090505b50905060005b82811015611d3857611d0685826116db565b828281518110611d1957611d186153b8565b5b6020026020010181815250508080611d309061550b565b915050611cf4565b508092505050919050565b6000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054611dbd906149c7565b80601f0160208091040260200160405190810160405280929190818152602001828054611de9906149c7565b8015611e365780601f10611e0b57610100808354040283529160200191611e36565b820191906000526020600020905b815481529060010190602001808311611e1957829003601f168201915b5050505050905090565b600f5481565b611e777f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611e72612710565b611d43565b80611e925750611e916000801b611e8c612710565b611d43565b5b611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890615274565b60405180910390fd5b611edb8282612909565b5050565b6000801b81565b81611ef08161236e565b611efa8383612b36565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f3d57611f3c3361236e565b5b611f4985858585612b4c565b5050505050565b66470de4df82000081565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606017611f8e83612bae565b604051602001611f9f929190615612565b6040516020818303038152906040529050919050565b60146020528060005260406000206000915054906101000a900460ff1681565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61200282611120565b61200b816122ee565b6120158383612803565b505050565b61202e6000801b612029612710565b611d43565b61206d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206490614f07565b60405180910390fd5b80600d8190555050565b61208b6000801b612086612710565b611d43565b6120ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c190614f07565b60405180910390fd5b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b60156020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d5481565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061226d575061226c82612d0e565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122e757506122e682612d88565b5b9050919050565b6122ff816122fa612710565b612e6a565b50565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612468576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016123e5929190615636565b602060405180830381865afa158015612402573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124269190614e22565b61246757806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161245e91906142b3565b60405180910390fd5b5b50565b600061247682611ac5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd906156d1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612505612710565b73ffffffffffffffffffffffffffffffffffffffff16148061253457506125338161252e612710565b61210e565b5b612573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256a90615763565b60405180910390fd5b61257d8383612f07565b505050565b60008160405160200161259591906157cb565b604051602081830303815290604052805190602001209050919050565b6000826125bf8584612fc0565b1490509392505050565b806125d2610dcc565b6125dc919061503e565b6011541015612620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261790615832565b60405180910390fd5b6000600190505b8181116126ab576126418361263c60166128e5565b612909565b61264b60166128e5565b8373ffffffffffffffffffffffffffffffffffffffff167f2fdf319518046f7b4ebc04a5ca363b42da5e87f5e8150935b3e4ef1ee4509e1a60405160405180910390a361269860166128f3565b80806126a39061550b565b915050612627565b505050565b6126c16126bb612710565b82612947565b612700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f7906158c4565b60405180910390fd5b61270b838383613016565b505050565b600033905090565b6000612710905090565b61272c8282611d43565b6127ff576001600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506127a4612710565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61280d8282611d43565b156128e1576000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612886612710565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612923828260405180602001604052806000815250613271565b5050565b61294283838360405180602001604052806000815250611eff565b505050565b600061295282612302565b612991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298890615956565b60405180910390fd5b600061299c83611ac5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a0b57508373ffffffffffffffffffffffffffffffffffffffff166129f384610d2e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a1c5750612a1b818561210e565b5b91505092915050565b6000612a3082611ac5565b9050612a3e816000846132cc565b612a49600083612f07565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a999190615976565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612b48612b41612710565b83836132dc565b5050565b612b5d612b57612710565b83612947565b612b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b93906158c4565b60405180910390fd5b612ba884848484613448565b50505050565b606060008203612bf5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d09565b600082905060005b60008214612c27578080612c109061550b565b915050600a82612c20919061500d565b9150612bfd565b60008167ffffffffffffffff811115612c4357612c42613ffa565b5b6040519080825280601f01601f191660200182016040528015612c755781602001600182028036833780820191505090505b5090505b60008514612d0257600182612c8e9190615976565b9150600a85612c9d91906159aa565b6030612ca9919061503e565b60f81b818381518110612cbf57612cbe6153b8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cfb919061500d565b9450612c79565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d815750612d8082612274565b5b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e5357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612e635750612e62826134a4565b5b9050919050565b612e748282611d43565b612f0357612e998173ffffffffffffffffffffffffffffffffffffffff16601461350e565b612ea78360001c602061350e565b604051602001612eb8929190615a73565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efa91906141ed565b60405180910390fd5b5050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612f7a83611ac5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008082905060005b845181101561300b57612ff682868381518110612fe957612fe86153b8565b5b602002602001015161374a565b915080806130039061550b565b915050612fc9565b508091505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661303682611ac5565b73ffffffffffffffffffffffffffffffffffffffff161461308c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308390615b1f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f290615bb1565b60405180910390fd5b6131068383836132cc565b613111600082612f07565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131619190615976565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131b8919061503e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61327b8383613775565b6132886000848484613942565b6132c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132be90615c43565b60405180910390fd5b505050565b6132d7838383613ac9565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361334a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334190615caf565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161343b9190613fc4565b60405180910390a3505050565b613453848484613016565b61345f84848484613942565b61349e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349590615c43565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600060028360026135219190614f9c565b61352b919061503e565b67ffffffffffffffff81111561354457613543613ffa565b5b6040519080825280601f01601f1916602001820160405280156135765781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106135ae576135ad6153b8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613612576136116153b8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026136529190614f9c565b61365c919061503e565b90505b60018111156136fc577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061369e5761369d6153b8565b5b1a60f81b8282815181106136b5576136b46153b8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806136f590615ccf565b905061365f565b5060008414613740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373790615d44565b60405180910390fd5b8091505092915050565b60008183106137625761375d8284613bdb565b61376d565b61376c8383613bdb565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036137e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137db90615db0565b60405180910390fd5b6137ed81612302565b1561382d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382490615e1c565b60405180910390fd5b613839600083836132cc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613889919061503e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006139638473ffffffffffffffffffffffffffffffffffffffff16613bf2565b15613abc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261398c612710565b8786866040518563ffffffff1660e01b81526004016139ae9493929190615e91565b6020604051808303816000875af19250505080156139ea57506040513d601f19601f820116820180604052508101906139e79190615ef2565b60015b613a6c573d8060008114613a1a576040519150601f19603f3d011682016040523d82523d6000602084013e613a1f565b606091505b506000815103613a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a5b90615c43565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ac1565b600190505b949350505050565b613ad4838383613c05565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613b1657613b1181613c0a565b613b55565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b5457613b538382613c53565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b9757613b9281613dc0565b613bd6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613bd557613bd48282613e91565b5b5b505050565b600082600052816020526040600020905092915050565b600080823b905060008111915050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c6084611bd3565b613c6a9190615976565b9050600060096000848152602001908152602001600020549050818114613d4f576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050613dd49190615976565b90506000600b60008481526020019081526020016000205490506000600a8381548110613e0457613e036153b8565b5b9060005260206000200154905080600a8381548110613e2657613e256153b8565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613e7557613e74615f1f565b5b6001900381819060005260206000200160009055905550505050565b6000613e9c83611bd3565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f5981613f24565b8114613f6457600080fd5b50565b600081359050613f7681613f50565b92915050565b600060208284031215613f9257613f91613f1a565b5b6000613fa084828501613f67565b91505092915050565b60008115159050919050565b613fbe81613fa9565b82525050565b6000602082019050613fd96000830184613fb5565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61403282613fe9565b810181811067ffffffffffffffff8211171561405157614050613ffa565b5b80604052505050565b6000614064613f10565b90506140708282614029565b919050565b600067ffffffffffffffff8211156140905761408f613ffa565b5b61409982613fe9565b9050602081019050919050565b82818337600083830152505050565b60006140c86140c384614075565b61405a565b9050828152602081018484840111156140e4576140e3613fe4565b5b6140ef8482856140a6565b509392505050565b600082601f83011261410c5761410b613fdf565b5b813561411c8482602086016140b5565b91505092915050565b60006020828403121561413b5761413a613f1a565b5b600082013567ffffffffffffffff81111561415957614158613f1f565b5b614165848285016140f7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156141a857808201518184015260208101905061418d565b60008484015250505050565b60006141bf8261416e565b6141c98185614179565b93506141d981856020860161418a565b6141e281613fe9565b840191505092915050565b6000602082019050818103600083015261420781846141b4565b905092915050565b6000819050919050565b6142228161420f565b811461422d57600080fd5b50565b60008135905061423f81614219565b92915050565b60006020828403121561425b5761425a613f1a565b5b600061426984828501614230565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061429d82614272565b9050919050565b6142ad81614292565b82525050565b60006020820190506142c860008301846142a4565b92915050565b6142d781614292565b81146142e257600080fd5b50565b6000813590506142f4816142ce565b92915050565b6000806040838503121561431157614310613f1a565b5b600061431f858286016142e5565b925050602061433085828601614230565b9150509250929050565b6143438161420f565b82525050565b600060208201905061435e600083018461433a565b92915050565b600080fd5b600080fd5b60008083601f84011261438457614383613fdf565b5b8235905067ffffffffffffffff8111156143a1576143a0614364565b5b6020830191508360208202830111156143bd576143bc614369565b5b9250929050565b600080602083850312156143db576143da613f1a565b5b600083013567ffffffffffffffff8111156143f9576143f8613f1f565b5b6144058582860161436e565b92509250509250929050565b60008060006060848603121561442a57614429613f1a565b5b6000614438868287016142e5565b9350506020614449868287016142e5565b925050604061445a86828701614230565b9150509250925092565b6000819050919050565b61447781614464565b811461448257600080fd5b50565b6000813590506144948161446e565b92915050565b6000602082840312156144b0576144af613f1a565b5b60006144be84828501614485565b91505092915050565b6144d081614464565b82525050565b60006020820190506144eb60008301846144c7565b92915050565b60006144fc82614272565b9050919050565b61450c816144f1565b811461451757600080fd5b50565b60008135905061452981614503565b92915050565b60006020828403121561454557614544613f1a565b5b60006145538482850161451a565b91505092915050565b6000806040838503121561457357614572613f1a565b5b600061458185828601614230565b925050602061459285828601614230565b9150509250929050565b60006040820190506145b160008301856142a4565b6145be602083018461433a565b9392505050565b600080604083850312156145dc576145db613f1a565b5b60006145ea85828601614485565b92505060206145fb858286016142e5565b9150509250929050565b60006020828403121561461b5761461a613f1a565b5b6000614629848285016142e5565b91505092915050565b6000819050919050565b600061465761465261464d84614272565b614632565b614272565b9050919050565b60006146698261463c565b9050919050565b600061467b8261465e565b9050919050565b61468b81614670565b82525050565b60006020820190506146a66000830184614682565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6146e18161420f565b82525050565b60006146f383836146d8565b60208301905092915050565b6000602082019050919050565b6000614717826146ac565b61472181856146b7565b935061472c836146c8565b8060005b8381101561475d57815161474488826146e7565b975061474f836146ff565b925050600181019050614730565b5085935050505092915050565b60006020820190508181036000830152614784818461470c565b905092915050565b61479581613fa9565b81146147a057600080fd5b50565b6000813590506147b28161478c565b92915050565b600080604083850312156147cf576147ce613f1a565b5b60006147dd858286016142e5565b92505060206147ee858286016147a3565b9150509250929050565b600067ffffffffffffffff82111561481357614812613ffa565b5b61481c82613fe9565b9050602081019050919050565b600061483c614837846147f8565b61405a565b90508281526020810184848401111561485857614857613fe4565b5b6148638482856140a6565b509392505050565b600082601f8301126148805761487f613fdf565b5b8135614890848260208601614829565b91505092915050565b600080600080608085870312156148b3576148b2613f1a565b5b60006148c1878288016142e5565b94505060206148d2878288016142e5565b93505060406148e387828801614230565b925050606085013567ffffffffffffffff81111561490457614903613f1f565b5b6149108782880161486b565b91505092959194509250565b6000806040838503121561493357614932613f1a565b5b6000614941858286016142e5565b9250506020614952858286016142e5565b9150509250929050565b60006149678261465e565b9050919050565b6149778161495c565b82525050565b6000602082019050614992600083018461496e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806149df57607f821691505b6020821081036149f2576149f1614998565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614a5a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a1d565b614a648683614a1d565b95508019841693508086168417925050509392505050565b6000614a97614a92614a8d8461420f565b614632565b61420f565b9050919050565b6000819050919050565b614ab183614a7c565b614ac5614abd82614a9e565b848454614a2a565b825550505050565b600090565b614ada614acd565b614ae5818484614aa8565b505050565b5b81811015614b0957614afe600082614ad2565b600181019050614aeb565b5050565b601f821115614b4e57614b1f816149f8565b614b2884614a0d565b81016020851015614b37578190505b614b4b614b4385614a0d565b830182614aea565b50505b505050565b600082821c905092915050565b6000614b7160001984600802614b53565b1980831691505092915050565b6000614b8a8383614b60565b9150826002028217905092915050565b614ba38261416e565b67ffffffffffffffff811115614bbc57614bbb613ffa565b5b614bc682546149c7565b614bd1828285614b0d565b600060209050601f831160018114614c045760008415614bf2578287015190505b614bfc8582614b7e565b865550614c64565b601f198416614c12866149f8565b60005b82811015614c3a57848901518255600182019150602085019450602081019050614c15565b86831015614c575784890151614c53601f891682614b60565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614cc8602c83614179565b9150614cd382614c6c565b604082019050919050565b60006020820190508181036000830152614cf781614cbb565b9050919050565b7f53616c6520697320636c6f736564000000000000000000000000000000000000600082015250565b6000614d34600e83614179565b9150614d3f82614cfe565b602082019050919050565b60006020820190508181036000830152614d6381614d27565b9050919050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000614da0600f83614179565b9150614dab82614d6a565b602082019050919050565b60006020820190508181036000830152614dcf81614d93565b9050919050565b6000606082019050614deb60008301866142a4565b614df860208301856142a4565b614e05604083018461433a565b949350505050565b600081519050614e1c8161478c565b92915050565b600060208284031215614e3857614e37613f1a565b5b6000614e4684828501614e0d565b91505092915050565b7f4e6f7420656e6f75676820455448206f7220746f6b656e000000000000000000600082015250565b6000614e85601783614179565b9150614e9082614e4f565b602082019050919050565b60006020820190508181036000830152614eb481614e78565b9050919050565b7f414f463a2063616c6c6572206973206e6f742061646d696e0000000000000000600082015250565b6000614ef1601883614179565b9150614efc82614ebb565b602082019050919050565b60006020820190508181036000830152614f2081614ee4565b9050919050565b600081905092915050565b50565b6000614f42600083614f27565b9150614f4d82614f32565b600082019050919050565b6000614f6382614f35565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614fa78261420f565b9150614fb28361420f565b9250828202614fc08161420f565b91508282048414831517614fd757614fd6614f6d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006150188261420f565b91506150238361420f565b92508261503357615032614fde565b5b828204905092915050565b60006150498261420f565b91506150548361420f565b925082820190508082111561506c5761506b614f6d565b5b92915050565b7f596f752063616e206f6e6c79206d696e74203320746f6b656e73000000000000600082015250565b60006150a8601a83614179565b91506150b382615072565b602082019050919050565b600060208201905081810360008301526150d78161509b565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061513a602b83614179565b9150615145826150de565b604082019050919050565b600060208201905081810360008301526151698161512d565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006151cc602f83614179565b91506151d782615170565b604082019050919050565b600060208201905081810360008301526151fb816151bf565b9050919050565b7f414f463a2063616c6c6572206973206e6f7420746865206f776e6572206e6f7260008201527f20746865206d696e746572000000000000000000000000000000000000000000602082015250565b600061525e602b83614179565b915061526982615202565b604082019050919050565b6000602082019050818103600083015261528d81615251565b9050919050565b7f414f463a2063616c6c6572206973206e6f7420617574686f72697a656420746f60008201527f206275726e20746f6b656e000000000000000000000000000000000000000000602082015250565b60006152f0602b83614179565b91506152fb82615294565b604082019050919050565b6000602082019050818103600083015261531f816152e3565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000615382602c83614179565b915061538d82615326565b604082019050919050565b600060208201905081810360008301526153b181615375565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000615443602983614179565b915061544e826153e7565b604082019050919050565b6000602082019050818103600083015261547281615436565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006154d5602a83614179565b91506154e082615479565b604082019050919050565b60006020820190508181036000830152615504816154c8565b9050919050565b60006155168261420f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361554857615547614f6d565b5b600182019050919050565b600081905092915050565b6000815461556b816149c7565b6155758186615553565b9450600182166000811461559057600181146155a5576155d8565b60ff19831686528115158202860193506155d8565b6155ae856149f8565b60005b838110156155d0578154818901526001820191506020810190506155b1565b838801955050505b50505092915050565b60006155ec8261416e565b6155f68185615553565b935061560681856020860161418a565b80840191505092915050565b600061561e828561555e565b915061562a82846155e1565b91508190509392505050565b600060408201905061564b60008301856142a4565b61565860208301846142a4565b9392505050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006156bb602183614179565b91506156c68261565f565b604082019050919050565b600060208201905081810360008301526156ea816156ae565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061574d603883614179565b9150615758826156f1565b604082019050919050565b6000602082019050818103600083015261577c81615740565b9050919050565b60008160601b9050919050565b600061579b82615783565b9050919050565b60006157ad82615790565b9050919050565b6157c56157c082614292565b6157a2565b82525050565b60006157d782846157b4565b60148201915081905092915050565b7f57696c6c20657863656564206d6178696d756d20737570706c79000000000000600082015250565b600061581c601a83614179565b9150615827826157e6565b602082019050919050565b6000602082019050818103600083015261584b8161580f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006158ae603183614179565b91506158b982615852565b604082019050919050565b600060208201905081810360008301526158dd816158a1565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615940602c83614179565b915061594b826158e4565b604082019050919050565b6000602082019050818103600083015261596f81615933565b9050919050565b60006159818261420f565b915061598c8361420f565b92508282039050818111156159a4576159a3614f6d565b5b92915050565b60006159b58261420f565b91506159c08361420f565b9250826159d0576159cf614fde565b5b828206905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615a11601783615553565b9150615a1c826159db565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615a5d601183615553565b9150615a6882615a27565b601182019050919050565b6000615a7e82615a04565b9150615a8a82856155e1565b9150615a9582615a50565b9150615aa182846155e1565b91508190509392505050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000615b09602983614179565b9150615b1482615aad565b604082019050919050565b60006020820190508181036000830152615b3881615afc565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615b9b602483614179565b9150615ba682615b3f565b604082019050919050565b60006020820190508181036000830152615bca81615b8e565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615c2d603283614179565b9150615c3882615bd1565b604082019050919050565b60006020820190508181036000830152615c5c81615c20565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615c99601983614179565b9150615ca482615c63565b602082019050919050565b60006020820190508181036000830152615cc881615c8c565b9050919050565b6000615cda8261420f565b915060008203615ced57615cec614f6d565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615d2e602083614179565b9150615d3982615cf8565b602082019050919050565b60006020820190508181036000830152615d5d81615d21565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615d9a602083614179565b9150615da582615d64565b602082019050919050565b60006020820190508181036000830152615dc981615d8d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615e06601c83614179565b9150615e1182615dd0565b602082019050919050565b60006020820190508181036000830152615e3581615df9565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615e6382615e3c565b615e6d8185615e47565b9350615e7d81856020860161418a565b615e8681613fe9565b840191505092915050565b6000608082019050615ea660008301876142a4565b615eb360208301866142a4565b615ec0604083018561433a565b8181036060830152615ed28184615e58565b905095945050505050565b600081519050615eec81613f50565b92915050565b600060208284031215615f0857615f07613f1a565b5b6000615f1684828501615edd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220f9549a098dc9a863fa74d1383741a29f344287d123721da020d315f3623b2d1e64736f6c634300081300330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000756e0f78e93f05ca784ac018ebb552d17954f300

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c80636352211e11610190578063c54e44eb116100dc578063e222c7f911610095578063ebf0c7171161006f578063ebf0c71714610bad578063f7260d3e14610bd8578063fc0c546a14610c03578063febef22614610c2e576102ff565b8063e222c7f914610b1c578063e554de0f14610b33578063e985e9c514610b70576102ff565b8063c54e44eb146109fa578063c87b56dd14610a25578063c884ef8314610a62578063d539139314610a9f578063d547741f14610aca578063dab5f34014610af3576102ff565b806395d89b4111610149578063a217fddf11610123578063a217fddf14610952578063a22cb4651461097d578063b88d4fde146109a6578063bd645b62146109cf576102ff565b806395d89b41146108d35780639a32f517146108fe578063a144819414610929576102ff565b80636352211e1461078b5780636f8b44b0146107c857806370a08231146107f15780637be70f781461082e5780638462151c1461085957806391d1485414610896576102ff565b80632db115441161024f57806336568abe1161020857806342842e0e116101e257806342842e0e146106d157806342966c68146106fa5780634f6ccce71461072357806353135ca014610760576102ff565b806336568abe1461065457806340d097c31461067d57806341f43434146106a6576102ff565b80632db11544146105655780632f2ff15d146105815780632f745c59146105aa57806332cb6b0c146105e75780633432123d14610612578063343937431461063d576102ff565b806319b6865d116102bc578063248a9ca311610296578063248a9ca3146104965780632542ae30146104d3578063282c51f3146104fc5780632a55205a14610527576102ff565b806319b6865d146104265780631a4365861461045157806323b872dd1461046d576102ff565b806301ffc9a71461030457806302fe53051461034157806306fdde031461036a578063081812fc14610395578063095ea7b3146103d257806318160ddd146103fb575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613f7c565b610c59565b6040516103389190613fc4565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190614125565b610c7b565b005b34801561037657600080fd5b5061037f610c9c565b60405161038c91906141ed565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190614245565b610d2e565b6040516103c991906142b3565b60405180910390f35b3480156103de57600080fd5b506103f960048036038101906103f491906142fa565b610db3565b005b34801561040757600080fd5b50610410610dcc565b60405161041d9190614349565b60405180910390f35b34801561043257600080fd5b5061043b610dd9565b6040516104489190614349565b60405180910390f35b61046b600480360381019061046691906143c4565b610ddf565b005b34801561047957600080fd5b50610494600480360381019061048f9190614411565b6110d1565b005b3480156104a257600080fd5b506104bd60048036038101906104b8919061449a565b611120565b6040516104ca91906144d6565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f5919061452f565b611140565b005b34801561050857600080fd5b50610511611240565b60405161051e91906144d6565b60405180910390f35b34801561053357600080fd5b5061054e6004803603810190610549919061455c565b611264565b60405161055c92919061459c565b60405180910390f35b61057f600480360381019061057a9190614245565b61144e565b005b34801561058d57600080fd5b506105a860048036038101906105a391906145c5565b6116ba565b005b3480156105b657600080fd5b506105d160048036038101906105cc91906142fa565b6116db565b6040516105de9190614349565b60405180910390f35b3480156105f357600080fd5b506105fc611780565b6040516106099190614349565b60405180910390f35b34801561061e57600080fd5b50610627611786565b6040516106349190613fc4565b60405180910390f35b34801561064957600080fd5b50610652611799565b005b34801561066057600080fd5b5061067b600480360381019061067691906145c5565b611818565b005b34801561068957600080fd5b506106a4600480360381019061069f9190614605565b61189b565b005b3480156106b257600080fd5b506106bb61194c565b6040516106c89190614691565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190614411565b61195e565b005b34801561070657600080fd5b50610721600480360381019061071c9190614245565b6119ad565b005b34801561072f57600080fd5b5061074a60048036038101906107459190614245565b611a41565b6040516107579190614349565b60405180910390f35b34801561076c57600080fd5b50610775611ab2565b6040516107829190613fc4565b60405180910390f35b34801561079757600080fd5b506107b260048036038101906107ad9190614245565b611ac5565b6040516107bf91906142b3565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea9190614245565b611b76565b005b3480156107fd57600080fd5b5061081860048036038101906108139190614605565b611bd3565b6040516108259190614349565b60405180910390f35b34801561083a57600080fd5b50610843611c8a565b6040516108509190614349565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b9190614605565b611c95565b60405161088d919061476a565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b891906145c5565b611d43565b6040516108ca9190613fc4565b60405180910390f35b3480156108df57600080fd5b506108e8611dae565b6040516108f591906141ed565b60405180910390f35b34801561090a57600080fd5b50610913611e40565b6040516109209190614349565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b91906142fa565b611e46565b005b34801561095e57600080fd5b50610967611edf565b60405161097491906144d6565b60405180910390f35b34801561098957600080fd5b506109a4600480360381019061099f91906147b8565b611ee6565b005b3480156109b257600080fd5b506109cd60048036038101906109c89190614899565b611eff565b005b3480156109db57600080fd5b506109e4611f50565b6040516109f19190614349565b60405180910390f35b348015610a0657600080fd5b50610a0f611f5b565b604051610a1c91906142b3565b60405180910390f35b348015610a3157600080fd5b50610a4c6004803603810190610a479190614245565b611f81565b604051610a5991906141ed565b60405180910390f35b348015610a6e57600080fd5b50610a896004803603810190610a849190614605565b611fb5565b604051610a969190613fc4565b60405180910390f35b348015610aab57600080fd5b50610ab4611fd5565b604051610ac191906144d6565b60405180910390f35b348015610ad657600080fd5b50610af16004803603810190610aec91906145c5565b611ff9565b005b348015610aff57600080fd5b50610b1a6004803603810190610b15919061449a565b61201a565b005b348015610b2857600080fd5b50610b31612077565b005b348015610b3f57600080fd5b50610b5a6004803603810190610b559190614605565b6120f6565b604051610b679190614349565b60405180910390f35b348015610b7c57600080fd5b50610b976004803603810190610b92919061491c565b61210e565b604051610ba49190613fc4565b60405180910390f35b348015610bb957600080fd5b50610bc26121a2565b604051610bcf91906144d6565b60405180910390f35b348015610be457600080fd5b50610bed6121a8565b604051610bfa91906142b3565b60405180910390f35b348015610c0f57600080fd5b50610c186121ce565b604051610c25919061497d565b60405180910390f35b348015610c3a57600080fd5b50610c436121f4565b604051610c509190614349565b60405180910390f35b6000610c64826121fa565b80610c745750610c7382612274565b5b9050919050565b6000801b610c88816122ee565b8160179081610c979190614b9a565b505050565b606060008054610cab906149c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd7906149c7565b8015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050905090565b6000610d3982612302565b610d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6f90614cde565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610dbd8161236e565b610dc7838361246b565b505050565b6000600a80549050905090565b60105481565b601360009054906101000a900460ff16610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590614d4a565b60405180910390fd5b60001515601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb890614db6565b60405180910390fd5b66470de4df820000341480610f985750601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f546040518463ffffffff1660e01b8152600401610f5493929190614dd6565b6020604051808303816000875af1158015610f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f979190614e22565b5b610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90614e9b565b60405180910390fd5b6000610fe233612582565b9050611032838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54836125b2565b611068576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506110cc336012546125c9565b505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461110f5761110e3361236e565b5b61111a8484846126b0565b50505050565b6000600c6000838152602001908152602001600020600101549050919050565b6111546000801b61114f612710565b611d43565b611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90614f07565b60405180910390fd5b600047905060008273ffffffffffffffffffffffffffffffffffffffff16826040516111be90614f58565b60006040518083038185875af1925050503d80600081146111fb576040519150601f19603f3d011682016040523d82523d6000602084013e611200565b606091505b505090508061123b576040517fd23a9e8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b6000806000600760008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036113f95760066040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611403612718565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661142f9190614f9c565b611439919061500d565b90508160000151819350935050509250929050565b601360019054906101000a900460ff1661149d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149490614d4a565b60405180910390fd5b600381601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114ea919061503e565b111561152b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611522906150be565b60405180910390fd5b806658d15e1762800061153e9190614f9c565b3414806116185750601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846010546115b69190614f9c565b6040518463ffffffff1660e01b81526004016115d493929190614dd6565b6020604051808303816000875af11580156115f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116179190614e22565b5b611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164e90614e9b565b60405180910390fd5b80601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116a6919061503e565b925050819055506116b733826125c9565b50565b6116c382611120565b6116cc816122ee565b6116d68383612722565b505050565b60006116e683611bd3565b8210611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90615150565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60115481565b601360019054906101000a900460ff1681565b6117ad6000801b6117a8612710565b611d43565b6117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e390614f07565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b611820612710565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461188d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611884906151e2565b60405180910390fd5b6118978282612803565b5050565b6118cc7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66118c7612710565b611d43565b806118e757506118e66000801b6118e1612710565b611d43565b5b611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90615274565b60405180910390fd5b600061193260166128e5565b905061193e60166128f3565b6119488282612909565b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461199c5761199b3361236e565b5b6119a7848484612927565b50505050565b6119be6119b8612710565b82612947565b806119f657506119f57f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8486119f0612710565b611d43565b5b611a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2c90615306565b60405180910390fd5b611a3e81612a25565b50565b6000611a4b610dcc565b8210611a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8390615398565b60405180910390fd5b600a8281548110611aa057611a9f6153b8565b5b90600052602060002001549050919050565b601360009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490615459565b60405180910390fd5b80915050919050565b611b8a6000801b611b85612710565b611d43565b611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc090614f07565b60405180910390fd5b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a906154eb565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6658d15e1762800081565b60606000611ca283611bd3565b905060008167ffffffffffffffff811115611cc057611cbf613ffa565b5b604051908082528060200260200182016040528015611cee5781602001602082028036833780820191505090505b50905060005b82811015611d3857611d0685826116db565b828281518110611d1957611d186153b8565b5b6020026020010181815250508080611d309061550b565b915050611cf4565b508092505050919050565b6000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054611dbd906149c7565b80601f0160208091040260200160405190810160405280929190818152602001828054611de9906149c7565b8015611e365780601f10611e0b57610100808354040283529160200191611e36565b820191906000526020600020905b815481529060010190602001808311611e1957829003601f168201915b5050505050905090565b600f5481565b611e777f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611e72612710565b611d43565b80611e925750611e916000801b611e8c612710565b611d43565b5b611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890615274565b60405180910390fd5b611edb8282612909565b5050565b6000801b81565b81611ef08161236e565b611efa8383612b36565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f3d57611f3c3361236e565b5b611f4985858585612b4c565b5050505050565b66470de4df82000081565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606017611f8e83612bae565b604051602001611f9f929190615612565b6040516020818303038152906040529050919050565b60146020528060005260406000206000915054906101000a900460ff1681565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61200282611120565b61200b816122ee565b6120158383612803565b505050565b61202e6000801b612029612710565b611d43565b61206d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206490614f07565b60405180910390fd5b80600d8190555050565b61208b6000801b612086612710565b611d43565b6120ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c190614f07565b60405180910390fd5b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b60156020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d5481565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061226d575061226c82612d0e565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122e757506122e682612d88565b5b9050919050565b6122ff816122fa612710565b612e6a565b50565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612468576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016123e5929190615636565b602060405180830381865afa158015612402573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124269190614e22565b61246757806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161245e91906142b3565b60405180910390fd5b5b50565b600061247682611ac5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd906156d1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612505612710565b73ffffffffffffffffffffffffffffffffffffffff16148061253457506125338161252e612710565b61210e565b5b612573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256a90615763565b60405180910390fd5b61257d8383612f07565b505050565b60008160405160200161259591906157cb565b604051602081830303815290604052805190602001209050919050565b6000826125bf8584612fc0565b1490509392505050565b806125d2610dcc565b6125dc919061503e565b6011541015612620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261790615832565b60405180910390fd5b6000600190505b8181116126ab576126418361263c60166128e5565b612909565b61264b60166128e5565b8373ffffffffffffffffffffffffffffffffffffffff167f2fdf319518046f7b4ebc04a5ca363b42da5e87f5e8150935b3e4ef1ee4509e1a60405160405180910390a361269860166128f3565b80806126a39061550b565b915050612627565b505050565b6126c16126bb612710565b82612947565b612700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f7906158c4565b60405180910390fd5b61270b838383613016565b505050565b600033905090565b6000612710905090565b61272c8282611d43565b6127ff576001600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506127a4612710565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61280d8282611d43565b156128e1576000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612886612710565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612923828260405180602001604052806000815250613271565b5050565b61294283838360405180602001604052806000815250611eff565b505050565b600061295282612302565b612991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298890615956565b60405180910390fd5b600061299c83611ac5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a0b57508373ffffffffffffffffffffffffffffffffffffffff166129f384610d2e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a1c5750612a1b818561210e565b5b91505092915050565b6000612a3082611ac5565b9050612a3e816000846132cc565b612a49600083612f07565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a999190615976565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612b48612b41612710565b83836132dc565b5050565b612b5d612b57612710565b83612947565b612b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b93906158c4565b60405180910390fd5b612ba884848484613448565b50505050565b606060008203612bf5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d09565b600082905060005b60008214612c27578080612c109061550b565b915050600a82612c20919061500d565b9150612bfd565b60008167ffffffffffffffff811115612c4357612c42613ffa565b5b6040519080825280601f01601f191660200182016040528015612c755781602001600182028036833780820191505090505b5090505b60008514612d0257600182612c8e9190615976565b9150600a85612c9d91906159aa565b6030612ca9919061503e565b60f81b818381518110612cbf57612cbe6153b8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cfb919061500d565b9450612c79565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d815750612d8082612274565b5b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e5357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612e635750612e62826134a4565b5b9050919050565b612e748282611d43565b612f0357612e998173ffffffffffffffffffffffffffffffffffffffff16601461350e565b612ea78360001c602061350e565b604051602001612eb8929190615a73565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efa91906141ed565b60405180910390fd5b5050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612f7a83611ac5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008082905060005b845181101561300b57612ff682868381518110612fe957612fe86153b8565b5b602002602001015161374a565b915080806130039061550b565b915050612fc9565b508091505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661303682611ac5565b73ffffffffffffffffffffffffffffffffffffffff161461308c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308390615b1f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f290615bb1565b60405180910390fd5b6131068383836132cc565b613111600082612f07565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131619190615976565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131b8919061503e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61327b8383613775565b6132886000848484613942565b6132c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132be90615c43565b60405180910390fd5b505050565b6132d7838383613ac9565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361334a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334190615caf565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161343b9190613fc4565b60405180910390a3505050565b613453848484613016565b61345f84848484613942565b61349e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349590615c43565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600060028360026135219190614f9c565b61352b919061503e565b67ffffffffffffffff81111561354457613543613ffa565b5b6040519080825280601f01601f1916602001820160405280156135765781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106135ae576135ad6153b8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110613612576136116153b8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026136529190614f9c565b61365c919061503e565b90505b60018111156136fc577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061369e5761369d6153b8565b5b1a60f81b8282815181106136b5576136b46153b8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806136f590615ccf565b905061365f565b5060008414613740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373790615d44565b60405180910390fd5b8091505092915050565b60008183106137625761375d8284613bdb565b61376d565b61376c8383613bdb565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036137e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137db90615db0565b60405180910390fd5b6137ed81612302565b1561382d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382490615e1c565b60405180910390fd5b613839600083836132cc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613889919061503e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006139638473ffffffffffffffffffffffffffffffffffffffff16613bf2565b15613abc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261398c612710565b8786866040518563ffffffff1660e01b81526004016139ae9493929190615e91565b6020604051808303816000875af19250505080156139ea57506040513d601f19601f820116820180604052508101906139e79190615ef2565b60015b613a6c573d8060008114613a1a576040519150601f19603f3d011682016040523d82523d6000602084013e613a1f565b606091505b506000815103613a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a5b90615c43565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ac1565b600190505b949350505050565b613ad4838383613c05565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613b1657613b1181613c0a565b613b55565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b5457613b538382613c53565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b9757613b9281613dc0565b613bd6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613bd557613bd48282613e91565b5b5b505050565b600082600052816020526040600020905092915050565b600080823b905060008111915050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c6084611bd3565b613c6a9190615976565b9050600060096000848152602001908152602001600020549050818114613d4f576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050613dd49190615976565b90506000600b60008481526020019081526020016000205490506000600a8381548110613e0457613e036153b8565b5b9060005260206000200154905080600a8381548110613e2657613e256153b8565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613e7557613e74615f1f565b5b6001900381819060005260206000200160009055905550505050565b6000613e9c83611bd3565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f5981613f24565b8114613f6457600080fd5b50565b600081359050613f7681613f50565b92915050565b600060208284031215613f9257613f91613f1a565b5b6000613fa084828501613f67565b91505092915050565b60008115159050919050565b613fbe81613fa9565b82525050565b6000602082019050613fd96000830184613fb5565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61403282613fe9565b810181811067ffffffffffffffff8211171561405157614050613ffa565b5b80604052505050565b6000614064613f10565b90506140708282614029565b919050565b600067ffffffffffffffff8211156140905761408f613ffa565b5b61409982613fe9565b9050602081019050919050565b82818337600083830152505050565b60006140c86140c384614075565b61405a565b9050828152602081018484840111156140e4576140e3613fe4565b5b6140ef8482856140a6565b509392505050565b600082601f83011261410c5761410b613fdf565b5b813561411c8482602086016140b5565b91505092915050565b60006020828403121561413b5761413a613f1a565b5b600082013567ffffffffffffffff81111561415957614158613f1f565b5b614165848285016140f7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156141a857808201518184015260208101905061418d565b60008484015250505050565b60006141bf8261416e565b6141c98185614179565b93506141d981856020860161418a565b6141e281613fe9565b840191505092915050565b6000602082019050818103600083015261420781846141b4565b905092915050565b6000819050919050565b6142228161420f565b811461422d57600080fd5b50565b60008135905061423f81614219565b92915050565b60006020828403121561425b5761425a613f1a565b5b600061426984828501614230565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061429d82614272565b9050919050565b6142ad81614292565b82525050565b60006020820190506142c860008301846142a4565b92915050565b6142d781614292565b81146142e257600080fd5b50565b6000813590506142f4816142ce565b92915050565b6000806040838503121561431157614310613f1a565b5b600061431f858286016142e5565b925050602061433085828601614230565b9150509250929050565b6143438161420f565b82525050565b600060208201905061435e600083018461433a565b92915050565b600080fd5b600080fd5b60008083601f84011261438457614383613fdf565b5b8235905067ffffffffffffffff8111156143a1576143a0614364565b5b6020830191508360208202830111156143bd576143bc614369565b5b9250929050565b600080602083850312156143db576143da613f1a565b5b600083013567ffffffffffffffff8111156143f9576143f8613f1f565b5b6144058582860161436e565b92509250509250929050565b60008060006060848603121561442a57614429613f1a565b5b6000614438868287016142e5565b9350506020614449868287016142e5565b925050604061445a86828701614230565b9150509250925092565b6000819050919050565b61447781614464565b811461448257600080fd5b50565b6000813590506144948161446e565b92915050565b6000602082840312156144b0576144af613f1a565b5b60006144be84828501614485565b91505092915050565b6144d081614464565b82525050565b60006020820190506144eb60008301846144c7565b92915050565b60006144fc82614272565b9050919050565b61450c816144f1565b811461451757600080fd5b50565b60008135905061452981614503565b92915050565b60006020828403121561454557614544613f1a565b5b60006145538482850161451a565b91505092915050565b6000806040838503121561457357614572613f1a565b5b600061458185828601614230565b925050602061459285828601614230565b9150509250929050565b60006040820190506145b160008301856142a4565b6145be602083018461433a565b9392505050565b600080604083850312156145dc576145db613f1a565b5b60006145ea85828601614485565b92505060206145fb858286016142e5565b9150509250929050565b60006020828403121561461b5761461a613f1a565b5b6000614629848285016142e5565b91505092915050565b6000819050919050565b600061465761465261464d84614272565b614632565b614272565b9050919050565b60006146698261463c565b9050919050565b600061467b8261465e565b9050919050565b61468b81614670565b82525050565b60006020820190506146a66000830184614682565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6146e18161420f565b82525050565b60006146f383836146d8565b60208301905092915050565b6000602082019050919050565b6000614717826146ac565b61472181856146b7565b935061472c836146c8565b8060005b8381101561475d57815161474488826146e7565b975061474f836146ff565b925050600181019050614730565b5085935050505092915050565b60006020820190508181036000830152614784818461470c565b905092915050565b61479581613fa9565b81146147a057600080fd5b50565b6000813590506147b28161478c565b92915050565b600080604083850312156147cf576147ce613f1a565b5b60006147dd858286016142e5565b92505060206147ee858286016147a3565b9150509250929050565b600067ffffffffffffffff82111561481357614812613ffa565b5b61481c82613fe9565b9050602081019050919050565b600061483c614837846147f8565b61405a565b90508281526020810184848401111561485857614857613fe4565b5b6148638482856140a6565b509392505050565b600082601f8301126148805761487f613fdf565b5b8135614890848260208601614829565b91505092915050565b600080600080608085870312156148b3576148b2613f1a565b5b60006148c1878288016142e5565b94505060206148d2878288016142e5565b93505060406148e387828801614230565b925050606085013567ffffffffffffffff81111561490457614903613f1f565b5b6149108782880161486b565b91505092959194509250565b6000806040838503121561493357614932613f1a565b5b6000614941858286016142e5565b9250506020614952858286016142e5565b9150509250929050565b60006149678261465e565b9050919050565b6149778161495c565b82525050565b6000602082019050614992600083018461496e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806149df57607f821691505b6020821081036149f2576149f1614998565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614a5a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a1d565b614a648683614a1d565b95508019841693508086168417925050509392505050565b6000614a97614a92614a8d8461420f565b614632565b61420f565b9050919050565b6000819050919050565b614ab183614a7c565b614ac5614abd82614a9e565b848454614a2a565b825550505050565b600090565b614ada614acd565b614ae5818484614aa8565b505050565b5b81811015614b0957614afe600082614ad2565b600181019050614aeb565b5050565b601f821115614b4e57614b1f816149f8565b614b2884614a0d565b81016020851015614b37578190505b614b4b614b4385614a0d565b830182614aea565b50505b505050565b600082821c905092915050565b6000614b7160001984600802614b53565b1980831691505092915050565b6000614b8a8383614b60565b9150826002028217905092915050565b614ba38261416e565b67ffffffffffffffff811115614bbc57614bbb613ffa565b5b614bc682546149c7565b614bd1828285614b0d565b600060209050601f831160018114614c045760008415614bf2578287015190505b614bfc8582614b7e565b865550614c64565b601f198416614c12866149f8565b60005b82811015614c3a57848901518255600182019150602085019450602081019050614c15565b86831015614c575784890151614c53601f891682614b60565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614cc8602c83614179565b9150614cd382614c6c565b604082019050919050565b60006020820190508181036000830152614cf781614cbb565b9050919050565b7f53616c6520697320636c6f736564000000000000000000000000000000000000600082015250565b6000614d34600e83614179565b9150614d3f82614cfe565b602082019050919050565b60006020820190508181036000830152614d6381614d27565b9050919050565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b6000614da0600f83614179565b9150614dab82614d6a565b602082019050919050565b60006020820190508181036000830152614dcf81614d93565b9050919050565b6000606082019050614deb60008301866142a4565b614df860208301856142a4565b614e05604083018461433a565b949350505050565b600081519050614e1c8161478c565b92915050565b600060208284031215614e3857614e37613f1a565b5b6000614e4684828501614e0d565b91505092915050565b7f4e6f7420656e6f75676820455448206f7220746f6b656e000000000000000000600082015250565b6000614e85601783614179565b9150614e9082614e4f565b602082019050919050565b60006020820190508181036000830152614eb481614e78565b9050919050565b7f414f463a2063616c6c6572206973206e6f742061646d696e0000000000000000600082015250565b6000614ef1601883614179565b9150614efc82614ebb565b602082019050919050565b60006020820190508181036000830152614f2081614ee4565b9050919050565b600081905092915050565b50565b6000614f42600083614f27565b9150614f4d82614f32565b600082019050919050565b6000614f6382614f35565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614fa78261420f565b9150614fb28361420f565b9250828202614fc08161420f565b91508282048414831517614fd757614fd6614f6d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006150188261420f565b91506150238361420f565b92508261503357615032614fde565b5b828204905092915050565b60006150498261420f565b91506150548361420f565b925082820190508082111561506c5761506b614f6d565b5b92915050565b7f596f752063616e206f6e6c79206d696e74203320746f6b656e73000000000000600082015250565b60006150a8601a83614179565b91506150b382615072565b602082019050919050565b600060208201905081810360008301526150d78161509b565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061513a602b83614179565b9150615145826150de565b604082019050919050565b600060208201905081810360008301526151698161512d565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006151cc602f83614179565b91506151d782615170565b604082019050919050565b600060208201905081810360008301526151fb816151bf565b9050919050565b7f414f463a2063616c6c6572206973206e6f7420746865206f776e6572206e6f7260008201527f20746865206d696e746572000000000000000000000000000000000000000000602082015250565b600061525e602b83614179565b915061526982615202565b604082019050919050565b6000602082019050818103600083015261528d81615251565b9050919050565b7f414f463a2063616c6c6572206973206e6f7420617574686f72697a656420746f60008201527f206275726e20746f6b656e000000000000000000000000000000000000000000602082015250565b60006152f0602b83614179565b91506152fb82615294565b604082019050919050565b6000602082019050818103600083015261531f816152e3565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000615382602c83614179565b915061538d82615326565b604082019050919050565b600060208201905081810360008301526153b181615375565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000615443602983614179565b915061544e826153e7565b604082019050919050565b6000602082019050818103600083015261547281615436565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006154d5602a83614179565b91506154e082615479565b604082019050919050565b60006020820190508181036000830152615504816154c8565b9050919050565b60006155168261420f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361554857615547614f6d565b5b600182019050919050565b600081905092915050565b6000815461556b816149c7565b6155758186615553565b9450600182166000811461559057600181146155a5576155d8565b60ff19831686528115158202860193506155d8565b6155ae856149f8565b60005b838110156155d0578154818901526001820191506020810190506155b1565b838801955050505b50505092915050565b60006155ec8261416e565b6155f68185615553565b935061560681856020860161418a565b80840191505092915050565b600061561e828561555e565b915061562a82846155e1565b91508190509392505050565b600060408201905061564b60008301856142a4565b61565860208301846142a4565b9392505050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006156bb602183614179565b91506156c68261565f565b604082019050919050565b600060208201905081810360008301526156ea816156ae565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061574d603883614179565b9150615758826156f1565b604082019050919050565b6000602082019050818103600083015261577c81615740565b9050919050565b60008160601b9050919050565b600061579b82615783565b9050919050565b60006157ad82615790565b9050919050565b6157c56157c082614292565b6157a2565b82525050565b60006157d782846157b4565b60148201915081905092915050565b7f57696c6c20657863656564206d6178696d756d20737570706c79000000000000600082015250565b600061581c601a83614179565b9150615827826157e6565b602082019050919050565b6000602082019050818103600083015261584b8161580f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006158ae603183614179565b91506158b982615852565b604082019050919050565b600060208201905081810360008301526158dd816158a1565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615940602c83614179565b915061594b826158e4565b604082019050919050565b6000602082019050818103600083015261596f81615933565b9050919050565b60006159818261420f565b915061598c8361420f565b92508282039050818111156159a4576159a3614f6d565b5b92915050565b60006159b58261420f565b91506159c08361420f565b9250826159d0576159cf614fde565b5b828206905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000615a11601783615553565b9150615a1c826159db565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000615a5d601183615553565b9150615a6882615a27565b601182019050919050565b6000615a7e82615a04565b9150615a8a82856155e1565b9150615a9582615a50565b9150615aa182846155e1565b91508190509392505050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000615b09602983614179565b9150615b1482615aad565b604082019050919050565b60006020820190508181036000830152615b3881615afc565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615b9b602483614179565b9150615ba682615b3f565b604082019050919050565b60006020820190508181036000830152615bca81615b8e565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615c2d603283614179565b9150615c3882615bd1565b604082019050919050565b60006020820190508181036000830152615c5c81615c20565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615c99601983614179565b9150615ca482615c63565b602082019050919050565b60006020820190508181036000830152615cc881615c8c565b9050919050565b6000615cda8261420f565b915060008203615ced57615cec614f6d565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615d2e602083614179565b9150615d3982615cf8565b602082019050919050565b60006020820190508181036000830152615d5d81615d21565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615d9a602083614179565b9150615da582615d64565b602082019050919050565b60006020820190508181036000830152615dc981615d8d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615e06601c83614179565b9150615e1182615dd0565b602082019050919050565b60006020820190508181036000830152615e3581615df9565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615e6382615e3c565b615e6d8185615e47565b9350615e7d81856020860161418a565b615e8681613fe9565b840191505092915050565b6000608082019050615ea660008301876142a4565b615eb360208301866142a4565b615ec0604083018561433a565b8181036060830152615ed28184615e58565b905095945050505050565b600081519050615eec81613f50565b92915050565b600060208284031215615f0857615f07613f1a565b5b6000615f1684828501615edd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220f9549a098dc9a863fa74d1383741a29f344287d123721da020d315f3623b2d1e64736f6c63430008130033

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

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000756e0f78e93f05ca784ac018ebb552d17954f300

-----Decoded View---------------
Arg [0] : initId_ (uint256): 0
Arg [1] : _token (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [2] : _receiver (address): 0x756E0F78E93F05ca784aC018ebB552d17954f300

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [2] : 000000000000000000000000756e0f78e93f05ca784ac018ebb552d17954f300


Deployed Bytecode Sourcemap

88243:299:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86598:276;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82321:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23069:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24628:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87084:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37117:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81142:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82768:536;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87266:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49948:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84161:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80827:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74977:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;83313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50389:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36785:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81180:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81291:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85756:93;;;;;;;;;;;;;:::i;:::-;;51533:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82466:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70916:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87454:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84569:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37307:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81259:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22763:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88125:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22493:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81049:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85931:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48408:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23238:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81102:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82654:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47513:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86883:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87650:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80995:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80923:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84901:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81328:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80758:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50829:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88038:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85646:102;;;;;;;;;;;;;:::i;:::-;;81374:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25147:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80896:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81606:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81580:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81220:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86598:276;86760:4;86789:36;86813:11;86789:23;:36::i;:::-;:77;;;;86828:38;86854:11;86828:25;:38::i;:::-;86789:77;86782:84;;86598:276;;;:::o;82321:137::-;47558:4;82395:18;;48004:16;48015:4;48004:10;:16::i;:::-;82444:6:::1;82431:10;:19;;;;;;:::i;:::-;;82321:137:::0;;:::o;23069:100::-;23123:13;23156:5;23149:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23069:100;:::o;24628:221::-;24704:7;24732:16;24740:7;24732;:16::i;:::-;24724:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24817:15;:24;24833:7;24817:24;;;;;;;;;;;;;;;;;;;;;24810:31;;24628:221;;;:::o;87084:174::-;87197:8;72698:30;72719:8;72698:20;:30::i;:::-;87218:32:::1;87232:8;87242:7;87218:13;:32::i;:::-;87084:174:::0;;;:::o;37117:113::-;37178:7;37205:10;:17;;;;37198:24;;37117:113;:::o;81142:31::-;;;;:::o;82768:536::-;82844:13;;;;;;;;;;;82836:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;82917:5;82894:28;;:7;:19;82902:10;82894:19;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;82886:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;81032:10;82961:9;:23;:81;;;;82988:5;;;;;;;;;;;:18;;;83007:10;83019:8;;;;;;;;;;;83029:12;;82988:54;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82961:81;82953:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;83091:12;83106:19;83114:10;83106:7;:19::i;:::-;83091:34;;83140:35;83159:5;;83140:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83165:4;;83170;83140:18;:35::i;:::-;83136:68;;83184:20;;;;;;;;;;;;;;83136:68;83237:4;83215:7;:19;83223:10;83215:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;83258:38;83272:10;83283:12;;83258:13;:38::i;:::-;82825:479;82768:536;;:::o;87266:180::-;87384:4;72432:10;72424:18;;:4;:18;;;72420:83;;72459:32;72480:10;72459:20;:32::i;:::-;72420:83;87401:37:::1;87420:4;87426:2;87430:7;87401:18;:37::i;:::-;87266:180:::0;;;;:::o;49948:131::-;50022:7;50049:6;:12;50056:4;50049:12;;;;;;;;;;;:22;;;50042:29;;49948:131;;;:::o;84161:224::-;85525:41;47558:4;85533:18;;85553:12;:10;:12::i;:::-;85525:7;:41::i;:::-;85503:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;84231:15:::1;84249:21;84231:39;;84283:12;84300:2;:7;;84314;84300:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84282:44;;;84342:7;84338:38;;84358:18;;;;;;;;;;;;;;84338:38;84219:166;;84161:224:::0;:::o;80827:62::-;80865:24;80827:62;:::o;74977:438::-;75072:7;75081;75101:26;75130:17;:26;75148:7;75130:26;;;;;;;;;;;75101:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75201:1;75173:30;;:7;:16;;;:30;;;75169:92;;75230:19;75220:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75169:92;75273:21;75337:17;:15;:17::i;:::-;75297:57;;75310:7;:23;;;75298:35;;:9;:35;;;;:::i;:::-;75297:57;;;;:::i;:::-;75273:81;;75375:7;:16;;;75393:13;75367:40;;;;;;74977:438;;;;;:::o;83313:::-;83383:16;;;;;;;;;;;83375:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;83477:1;83466:6;83437:14;:26;83452:10;83437:26;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;83436:42;;83428:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;83552:6;81084:11;83541:17;;;;:::i;:::-;83528:9;:30;:95;;;;83562:5;;;;;;;;;;;:18;;;83581:10;83593:8;;;;;;;;;;;83616:6;83603:10;;:19;;;;:::i;:::-;83562:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;83528:95;83520:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;83692:6;83662:14;:26;83677:10;83662:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;83709:32;83723:10;83734:6;83709:13;:32::i;:::-;83313:438;:::o;50389:147::-;50472:18;50485:4;50472:12;:18::i;:::-;48004:16;48015:4;48004:10;:16::i;:::-;50503:25:::1;50514:4;50520:7;50503:10;:25::i;:::-;50389:147:::0;;;:::o;36785:256::-;36882:7;36918:23;36935:5;36918:16;:23::i;:::-;36910:5;:31;36902:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37007:12;:19;37020:5;37007:19;;;;;;;;;;;;;;;:26;37027:5;37007:26;;;;;;;;;;;;37000:33;;36785:256;;;;:::o;81180:33::-;;;;:::o;81291:28::-;;;;;;;;;;;;;:::o;85756:93::-;85525:41;47558:4;85533:18;;85553:12;:10;:12::i;:::-;85525:7;:41::i;:::-;85503:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;85828:13:::1;;;;;;;;;;;85827:14;85811:13;;:30;;;;;;;;;;;;;;;;;;85756:93::o:0;51533:218::-;51640:12;:10;:12::i;:::-;51629:23;;:7;:23;;;51621:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;51717:26;51729:4;51735:7;51717:11;:26::i;:::-;51533:218;;:::o;82466:180::-;85276:34;80796:24;85297:12;:10;:12::i;:::-;85276:7;:34::i;:::-;:96;;;;85331:41;47558:4;85339:18;;85359:12;:10;:12::i;:::-;85331:7;:41::i;:::-;85276:96;85254:189;;;;;;;;;;;;:::i;:::-;;;;;;;;;82525:15:::1;82543:25;:15;:23;:25::i;:::-;82525:43;;82579:27;:15;:25;:27::i;:::-;82617:21;82627:2;82630:7;82617:9;:21::i;:::-;82514:132;82466:180:::0;:::o;70916:143::-;70625:42;70916:143;:::o;87454:188::-;87576:4;72432:10;72424:18;;:4;:18;;;72420:83;;72459:32;72480:10;72459:20;:32::i;:::-;72420:83;87593:41:::1;87616:4;87622:2;87626:7;87593:22;:41::i;:::-;87454:188:::0;;;;:::o;84569:324::-;84693:41;84712:12;:10;:12::i;:::-;84726:7;84693:18;:41::i;:::-;:96;;;;84755:34;80865:24;84776:12;:10;:12::i;:::-;84755:7;:34::i;:::-;84693:96;84671:189;;;;;;;;;;;;:::i;:::-;;;;;;;;;84871:14;84877:7;84871:5;:14::i;:::-;84569:324;:::o;37307:233::-;37382:7;37418:30;:28;:30::i;:::-;37410:5;:38;37402:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37515:10;37526:5;37515:17;;;;;;;;:::i;:::-;;;;;;;;;;37508:24;;37307:233;;;:::o;81259:25::-;;;;;;;;;;;;;:::o;22763:239::-;22835:7;22855:13;22871:7;:16;22879:7;22871:16;;;;;;;;;;;;;;;;;;;;;22855:32;;22923:1;22906:19;;:5;:19;;;22898:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22989:5;22982:12;;;22763:239;;;:::o;88125:106::-;85525:41;47558:4;85533:18;;85553:12;:10;:12::i;:::-;85525:7;:41::i;:::-;85503:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;88210:13:::1;88197:10;:26;;;;88125:106:::0;:::o;22493:208::-;22565:7;22610:1;22593:19;;:5;:19;;;22585:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22677:9;:16;22687:5;22677:16;;;;;;;;;;;;;;;;22670:23;;22493:208;;;:::o;81049:46::-;81084:11;81049:46;:::o;85931:365::-;86019:16;86053:15;86071:16;86081:5;86071:9;:16::i;:::-;86053:34;;86098:23;86138:7;86124:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86098:48;;86162:9;86157:106;86181:7;86177:1;:11;86157:106;;;86222:29;86242:5;86249:1;86222:19;:29::i;:::-;86210:6;86217:1;86210:9;;;;;;;;:::i;:::-;;;;;;;:41;;;;;86190:3;;;;;:::i;:::-;;;;86157:106;;;;86282:6;86275:13;;;;85931:365;;;:::o;48408:147::-;48494:4;48518:6;:12;48525:4;48518:12;;;;;;;;;;;:20;;:29;48539:7;48518:29;;;;;;;;;;;;;;;;;;;;;;;;;48511:36;;48408:147;;;;:::o;23238:104::-;23294:13;23327:7;23320:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23238:104;:::o;81102:33::-;;;;:::o;82654:106::-;85276:34;80796:24;85297:12;:10;:12::i;:::-;85276:7;:34::i;:::-;:96;;;;85331:41;47558:4;85339:18;;85359:12;:10;:12::i;:::-;85331:7;:41::i;:::-;85276:96;85254:189;;;;;;;;;;;;:::i;:::-;;;;;;;;;82730:22:::1;82740:2;82744:7;82730:9;:22::i;:::-;82654:106:::0;;:::o;47513:49::-;47558:4;47513:49;;;:::o;86883:193::-;87004:8;72698:30;72719:8;72698:20;:30::i;:::-;87025:43:::1;87049:8;87059;87025:23;:43::i;:::-;86883:193:::0;;;:::o;87650:244::-;87817:4;72432:10;72424:18;;:4;:18;;;72420:83;;72459:32;72480:10;72459:20;:32::i;:::-;72420:83;87839:47:::1;87862:4;87868:2;87872:7;87881:4;87839:22;:47::i;:::-;87650:244:::0;;;;;:::o;80995:47::-;81032:10;80995:47;:::o;80923:65::-;;;;;;;;;;;;;:::o;84901:212::-;85003:13;85065:10;85077:26;85094:8;85077:16;:26::i;:::-;85048:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85034:71;;84901:212;;;:::o;81328:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;80758:62::-;80796:24;80758:62;:::o;50829:149::-;50913:18;50926:4;50913:12;:18::i;:::-;48004:16;48015:4;48004:10;:16::i;:::-;50944:26:::1;50956:4;50962:7;50944:11;:26::i;:::-;50829:149:::0;;;:::o;88038:79::-;85525:41;47558:4;85533:18;;85553:12;:10;:12::i;:::-;85525:7;:41::i;:::-;85503:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;88104:5:::1;88097:4;:12;;;;88038:79:::0;:::o;85646:102::-;85525:41;47558:4;85533:18;;85553:12;:10;:12::i;:::-;85525:7;:41::i;:::-;85503:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;85724:16:::1;;;;;;;;;;;85723:17;85704:16;;:36;;;;;;;;;;;;;;;;;;85646:102::o:0;81374:49::-;;;;;;;;;;;;;;;;;:::o;25147:164::-;25244:4;25268:18;:25;25287:5;25268:25;;;;;;;;;;;;;;;:35;25294:8;25268:35;;;;;;;;;;;;;;;;;;;;;;;;;25261:42;;25147:164;;;;:::o;80896:20::-;;;;:::o;81606:23::-;;;;;;;;;;;;;:::o;81580:19::-;;;;;;;;;;;;;:::o;81220:32::-;;;;:::o;48112:204::-;48197:4;48236:32;48221:47;;;:11;:47;;;;:87;;;;48272:36;48296:11;48272:23;:36::i;:::-;48221:87;48214:94;;48112:204;;;:::o;74707:215::-;74809:4;74848:26;74833:41;;;:11;:41;;;;:81;;;;74878:36;74902:11;74878:23;:36::i;:::-;74833:81;74826:88;;74707:215;;;:::o;48859:105::-;48926:30;48937:4;48943:12;:10;:12::i;:::-;48926:10;:30::i;:::-;48859:105;:::o;27882:127::-;27947:4;27999:1;27971:30;;:7;:16;27979:7;27971:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27964:37;;27882:127;;;:::o;72841:647::-;73080:1;70625:42;73032:45;;;:49;73028:453;;;70625:42;73331;;;73382:4;73389:8;73331:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73326:144;;73445:8;73426:28;;;;;;;;;;;:::i;:::-;;;;;;;;73326:144;73028:453;72841:647;:::o;24151:411::-;24232:13;24248:23;24263:7;24248:14;:23::i;:::-;24232:39;;24296:5;24290:11;;:2;:11;;;24282:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24390:5;24374:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24399:37;24416:5;24423:12;:10;:12::i;:::-;24399:16;:37::i;:::-;24374:62;24352:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24533:21;24542:2;24546:7;24533:8;:21::i;:::-;24221:341;24151:411;;:::o;87902:128::-;87959:7;88013;87996:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;87986:36;;;;;;87979:43;;87902:128;;;:::o;55035:156::-;55126:4;55179;55150:25;55163:5;55170:4;55150:12;:25::i;:::-;:33;55143:40;;55035:156;;;;;:::o;83760:387::-;83870:6;83854:13;:11;:13::i;:::-;:22;;;;:::i;:::-;83840:10;;:36;;83832:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;83923:9;83935:1;83923:13;;83918:219;83943:6;83938:1;:11;83918:219;;83975:40;83985:2;83989:25;:15;:23;:25::i;:::-;83975:9;:40::i;:::-;84051:25;:15;:23;:25::i;:::-;84047:2;84039:38;;;;;;;;;;;;84096:27;:15;:25;:27::i;:::-;83951:3;;;;;:::i;:::-;;;;83918:219;;;;83760:387;;:::o;25378:339::-;25573:41;25592:12;:10;:12::i;:::-;25606:7;25573:18;:41::i;:::-;25565:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25681:28;25691:4;25697:2;25701:7;25681:9;:28::i;:::-;25378:339;;;:::o;2140:98::-;2193:7;2220:10;2213:17;;2140:98;:::o;75697:97::-;75755:6;75781:5;75774:12;;75697:97;:::o;53130:238::-;53214:22;53222:4;53228:7;53214;:22::i;:::-;53209:152;;53285:4;53253:6;:12;53260:4;53253:12;;;;;;;;;;;:20;;:29;53274:7;53253:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;53336:12;:10;:12::i;:::-;53309:40;;53327:7;53309:40;;53321:4;53309:40;;;;;;;;;;53209:152;53130:238;;:::o;53548:239::-;53632:22;53640:4;53646:7;53632;:22::i;:::-;53628:152;;;53703:5;53671:6;:12;53678:4;53671:12;;;;;;;;;;;:20;;:29;53692:7;53671:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;53755:12;:10;:12::i;:::-;53728:40;;53746:7;53728:40;;53740:4;53728:40;;;;;;;;;;53628:152;53548:239;;:::o;803:114::-;868:7;895;:14;;;888:21;;803:114;;;:::o;925:127::-;1032:1;1014:7;:14;;;:19;;;;;;;;;;;925:127;:::o;28866:110::-;28942:26;28952:2;28956:7;28942:26;;;;;;;;;;;;:9;:26::i;:::-;28866:110;;:::o;25788:185::-;25926:39;25943:4;25949:2;25953:7;25926:39;;;;;;;;;;;;:16;:39::i;:::-;25788:185;;;:::o;28176:348::-;28269:4;28294:16;28302:7;28294;:16::i;:::-;28286:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28370:13;28386:23;28401:7;28386:14;:23::i;:::-;28370:39;;28439:5;28428:16;;:7;:16;;;:51;;;;28472:7;28448:31;;:20;28460:7;28448:11;:20::i;:::-;:31;;;28428:51;:87;;;;28483:32;28500:5;28507:7;28483:16;:32::i;:::-;28428:87;28420:96;;;28176:348;;;;:::o;30471:360::-;30531:13;30547:23;30562:7;30547:14;:23::i;:::-;30531:39;;30583:48;30604:5;30619:1;30623:7;30583:20;:48::i;:::-;30672:29;30689:1;30693:7;30672:8;:29::i;:::-;30734:1;30714:9;:16;30724:5;30714:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;30753:7;:16;30761:7;30753:16;;;;;;;;;;;;30746:23;;;;;;;;;;;30815:7;30811:1;30787:36;;30796:5;30787:36;;;;;;;;;;;;30520:311;30471:360;:::o;24921:155::-;25016:52;25035:12;:10;:12::i;:::-;25049:8;25059;25016:18;:52::i;:::-;24921:155;;:::o;26044:328::-;26219:41;26238:12;:10;:12::i;:::-;26252:7;26219:18;:41::i;:::-;26211:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26325:39;26339:4;26345:2;26349:7;26358:5;26325:13;:39::i;:::-;26044:328;;;;:::o;18089:723::-;18145:13;18375:1;18366:5;:10;18362:53;;18393:10;;;;;;;;;;;;;;;;;;;;;18362:53;18425:12;18440:5;18425:20;;18456:14;18481:78;18496:1;18488:4;:9;18481:78;;18514:8;;;;;:::i;:::-;;;;18545:2;18537:10;;;;;:::i;:::-;;;18481:78;;;18569:19;18601:6;18591:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18569:39;;18619:154;18635:1;18626:5;:10;18619:154;;18663:1;18653:11;;;;;:::i;:::-;;;18730:2;18722:5;:10;;;;:::i;:::-;18709:2;:24;;;;:::i;:::-;18696:39;;18679:6;18686;18679:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18759:2;18750:11;;;;;:::i;:::-;;;18619:154;;;18797:6;18783:21;;;;;18089:723;;;;:::o;36477:224::-;36579:4;36618:35;36603:50;;;:11;:50;;;;:90;;;;36657:36;36681:11;36657:23;:36::i;:::-;36603:90;36596:97;;36477:224;;;:::o;22124:305::-;22226:4;22278:25;22263:40;;;:11;:40;;;;:105;;;;22335:33;22320:48;;;:11;:48;;;;22263:105;:158;;;;22385:36;22409:11;22385:23;:36::i;:::-;22263:158;22243:178;;22124:305;;;:::o;49254:505::-;49343:22;49351:4;49357:7;49343;:22::i;:::-;49338:414;;49531:41;49559:7;49531:41;;49569:2;49531:19;:41::i;:::-;49645:38;49673:4;49665:13;;49680:2;49645:19;:38::i;:::-;49436:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49382:358;;;;;;;;;;;:::i;:::-;;;;;;;;49338:414;49254:505;;:::o;31864:174::-;31966:2;31939:15;:24;31955:7;31939:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32022:7;32018:2;31984:46;;31993:23;32008:7;31993:14;:23::i;:::-;31984:46;;;;;;;;;;;;31864:174;;:::o;55754:296::-;55837:7;55857:20;55880:4;55857:27;;55900:9;55895:118;55919:5;:12;55915:1;:16;55895:118;;;55968:33;55978:12;55992:5;55998:1;55992:8;;;;;;;;:::i;:::-;;;;;;;;55968:9;:33::i;:::-;55953:48;;55933:3;;;;;:::i;:::-;;;;55895:118;;;;56030:12;56023:19;;;55754:296;;;;:::o;31168:578::-;31327:4;31300:31;;:23;31315:7;31300:14;:23::i;:::-;:31;;;31292:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31410:1;31396:16;;:2;:16;;;31388:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31466:39;31487:4;31493:2;31497:7;31466:20;:39::i;:::-;31570:29;31587:1;31591:7;31570:8;:29::i;:::-;31631:1;31612:9;:15;31622:4;31612:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31660:1;31643:9;:13;31653:2;31643:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31691:2;31672:7;:16;31680:7;31672:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31730:7;31726:2;31711:27;;31720:4;31711:27;;;;;;;;;;;;31168:578;;;:::o;29203:321::-;29333:18;29339:2;29343:7;29333:5;:18::i;:::-;29384:54;29415:1;29419:2;29423:7;29432:5;29384:22;:54::i;:::-;29362:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29203:321;;;:::o;86304:216::-;86467:45;86494:4;86500:2;86504:7;86467:26;:45::i;:::-;86304:216;;;:::o;32180:315::-;32335:8;32326:17;;:5;:17;;;32318:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32422:8;32384:18;:25;32403:5;32384:25;;;;;;;;;;;;;;;:35;32410:8;32384:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32468:8;32446:41;;32461:5;32446:41;;;32478:8;32446:41;;;;;;:::i;:::-;;;;;;;;32180:315;;;:::o;27254:::-;27411:28;27421:4;27427:2;27431:7;27411:9;:28::i;:::-;27458:48;27481:4;27487:2;27491:7;27500:5;27458:22;:48::i;:::-;27450:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27254:315;;;;:::o;3997:157::-;4082:4;4121:25;4106:40;;;:11;:40;;;;4099:47;;3997:157;;;:::o;19390:451::-;19465:13;19491:19;19536:1;19527:6;19523:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19513:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19491:47;;19549:15;:6;19556:1;19549:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19575;:6;19582:1;19575:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19606:9;19631:1;19622:6;19618:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19606:26;;19601:135;19638:1;19634;:5;19601:135;;;19673:12;19694:3;19686:5;:11;19673:25;;;;;;;:::i;:::-;;;;;19661:6;19668:1;19661:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;19723:1;19713:11;;;;;19641:3;;;;:::i;:::-;;;19601:135;;;;19763:1;19754:5;:10;19746:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;19826:6;19812:21;;;19390:451;;;;:::o;63108:149::-;63171:7;63202:1;63198;:5;:51;;63229:20;63244:1;63247;63229:14;:20::i;:::-;63198:51;;;63206:20;63221:1;63224;63206:14;:20::i;:::-;63198:51;63191:58;;63108:149;;;;:::o;29860:382::-;29954:1;29940:16;;:2;:16;;;29932:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30013:16;30021:7;30013;:16::i;:::-;30012:17;30004:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30075:45;30104:1;30108:2;30112:7;30075:20;:45::i;:::-;30150:1;30133:9;:13;30143:2;30133:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30181:2;30162:7;:16;30170:7;30162:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30226:7;30222:2;30201:33;;30218:1;30201:33;;;;;;;;;;;;29860:382;;:::o;33060:799::-;33215:4;33236:15;:2;:13;;;:15::i;:::-;33232:620;;;33288:2;33272:36;;;33309:12;:10;:12::i;:::-;33323:4;33329:7;33338:5;33272:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33268:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33531:1;33514:6;:13;:18;33510:272;;33557:60;;;;;;;;;;:::i;:::-;;;;;;;;33510:272;33732:6;33726:13;33717:6;33713:2;33709:15;33702:38;33268:529;33405:41;;;33395:51;;;:6;:51;;;;33388:58;;;;;33232:620;33836:4;33829:11;;33060:799;;;;;;;:::o;38153:589::-;38297:45;38324:4;38330:2;38334:7;38297:26;:45::i;:::-;38375:1;38359:18;;:4;:18;;;38355:187;;38394:40;38426:7;38394:31;:40::i;:::-;38355:187;;;38464:2;38456:10;;:4;:10;;;38452:90;;38483:47;38516:4;38522:7;38483:32;:47::i;:::-;38452:90;38355:187;38570:1;38556:16;;:2;:16;;;38552:183;;38589:45;38626:7;38589:36;:45::i;:::-;38552:183;;;38662:4;38656:10;;:2;:10;;;38652:83;;38683:40;38711:2;38715:7;38683:27;:40::i;:::-;38652:83;38552:183;38153:589;;;:::o;63265:268::-;63333:13;63440:1;63434:4;63427:15;63469:1;63463:4;63456:15;63510:4;63504;63494:21;63485:30;;63265:268;;;;:::o;10449:387::-;10509:4;10717:12;10784:7;10772:20;10764:28;;10827:1;10820:4;:8;10813:15;;;10449:387;;;:::o;34431:126::-;;;;:::o;39465:164::-;39569:10;:17;;;;39542:15;:24;39558:7;39542:24;;;;;;;;;;;:44;;;;39597:10;39613:7;39597:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39465:164;:::o;40256:988::-;40522:22;40572:1;40547:22;40564:4;40547:16;:22::i;:::-;:26;;;;:::i;:::-;40522:51;;40584:18;40605:17;:26;40623:7;40605:26;;;;;;;;;;;;40584:47;;40752:14;40738:10;:28;40734:328;;40783:19;40805:12;:18;40818:4;40805:18;;;;;;;;;;;;;;;:34;40824:14;40805:34;;;;;;;;;;;;40783:56;;40889:11;40856:12;:18;40869:4;40856:18;;;;;;;;;;;;;;;:30;40875:10;40856:30;;;;;;;;;;;:44;;;;41006:10;40973:17;:30;40991:11;40973:30;;;;;;;;;;;:43;;;;40768:294;40734:328;41158:17;:26;41176:7;41158:26;;;;;;;;;;;41151:33;;;41202:12;:18;41215:4;41202:18;;;;;;;;;;;;;;;:34;41221:14;41202:34;;;;;;;;;;;41195:41;;;40337:907;;40256:988;;:::o;41539:1079::-;41792:22;41837:1;41817:10;:17;;;;:21;;;;:::i;:::-;41792:46;;41849:18;41870:15;:24;41886:7;41870:24;;;;;;;;;;;;41849:45;;42221:19;42243:10;42254:14;42243:26;;;;;;;;:::i;:::-;;;;;;;;;;42221:48;;42307:11;42282:10;42293;42282:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42418:10;42387:15;:28;42403:11;42387:28;;;;;;;;;;;:41;;;;42559:15;:24;42575:7;42559:24;;;;;;;;;;;42552:31;;;42594:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41610:1008;;;41539:1079;:::o;39043:221::-;39128:14;39145:20;39162:2;39145:16;:20::i;:::-;39128:37;;39203:7;39176:12;:16;39189:2;39176:16;;;;;;;;;;;;;;;:24;39193:6;39176:24;;;;;;;;;;;:34;;;;39250:6;39221:17;:26;39239:7;39221:26;;;;;;;;;;;:35;;;;39117:147;39043:221;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:146::-;2891:6;2886:3;2881;2868:30;2932:1;2923:6;2918:3;2914:16;2907:27;2794:146;;;:::o;2946:425::-;3024:5;3049:66;3065:49;3107:6;3065:49;:::i;:::-;3049:66;:::i;:::-;3040:75;;3138:6;3131:5;3124:21;3176:4;3169:5;3165:16;3214:3;3205:6;3200:3;3196:16;3193:25;3190:112;;;3221:79;;:::i;:::-;3190:112;3311:54;3358:6;3353:3;3348;3311:54;:::i;:::-;3030:341;2946:425;;;;;:::o;3391:340::-;3447:5;3496:3;3489:4;3481:6;3477:17;3473:27;3463:122;;3504:79;;:::i;:::-;3463:122;3621:6;3608:20;3646:79;3721:3;3713:6;3706:4;3698:6;3694:17;3646:79;:::i;:::-;3637:88;;3453:278;3391:340;;;;:::o;3737:509::-;3806:6;3855:2;3843:9;3834:7;3830:23;3826:32;3823:119;;;3861:79;;:::i;:::-;3823:119;4009:1;3998:9;3994:17;3981:31;4039:18;4031:6;4028:30;4025:117;;;4061:79;;:::i;:::-;4025:117;4166:63;4221:7;4212:6;4201:9;4197:22;4166:63;:::i;:::-;4156:73;;3952:287;3737:509;;;;:::o;4252:99::-;4304:6;4338:5;4332:12;4322:22;;4252:99;;;:::o;4357:169::-;4441:11;4475:6;4470:3;4463:19;4515:4;4510:3;4506:14;4491:29;;4357:169;;;;:::o;4532:246::-;4613:1;4623:113;4637:6;4634:1;4631:13;4623:113;;;4722:1;4717:3;4713:11;4707:18;4703:1;4698:3;4694:11;4687:39;4659:2;4656:1;4652:10;4647:15;;4623:113;;;4770:1;4761:6;4756:3;4752:16;4745:27;4594:184;4532:246;;;:::o;4784:377::-;4872:3;4900:39;4933:5;4900:39;:::i;:::-;4955:71;5019:6;5014:3;4955:71;:::i;:::-;4948:78;;5035:65;5093:6;5088:3;5081:4;5074:5;5070:16;5035:65;:::i;:::-;5125:29;5147:6;5125:29;:::i;:::-;5120:3;5116:39;5109:46;;4876:285;4784:377;;;;:::o;5167:313::-;5280:4;5318:2;5307:9;5303:18;5295:26;;5367:9;5361:4;5357:20;5353:1;5342:9;5338:17;5331:47;5395:78;5468:4;5459:6;5395:78;:::i;:::-;5387:86;;5167:313;;;;:::o;5486:77::-;5523:7;5552:5;5541:16;;5486:77;;;:::o;5569:122::-;5642:24;5660:5;5642:24;:::i;:::-;5635:5;5632:35;5622:63;;5681:1;5678;5671:12;5622:63;5569:122;:::o;5697:139::-;5743:5;5781:6;5768:20;5759:29;;5797:33;5824:5;5797:33;:::i;:::-;5697:139;;;;:::o;5842:329::-;5901:6;5950:2;5938:9;5929:7;5925:23;5921:32;5918:119;;;5956:79;;:::i;:::-;5918:119;6076:1;6101:53;6146:7;6137:6;6126:9;6122:22;6101:53;:::i;:::-;6091:63;;6047:117;5842:329;;;;:::o;6177:126::-;6214:7;6254:42;6247:5;6243:54;6232:65;;6177:126;;;:::o;6309:96::-;6346:7;6375:24;6393:5;6375:24;:::i;:::-;6364:35;;6309:96;;;:::o;6411:118::-;6498:24;6516:5;6498:24;:::i;:::-;6493:3;6486:37;6411:118;;:::o;6535:222::-;6628:4;6666:2;6655:9;6651:18;6643:26;;6679:71;6747:1;6736:9;6732:17;6723:6;6679:71;:::i;:::-;6535:222;;;;:::o;6763:122::-;6836:24;6854:5;6836:24;:::i;:::-;6829:5;6826:35;6816:63;;6875:1;6872;6865:12;6816:63;6763:122;:::o;6891:139::-;6937:5;6975:6;6962:20;6953:29;;6991:33;7018:5;6991:33;:::i;:::-;6891:139;;;;:::o;7036:474::-;7104:6;7112;7161:2;7149:9;7140:7;7136:23;7132:32;7129:119;;;7167:79;;:::i;:::-;7129:119;7287:1;7312:53;7357:7;7348:6;7337:9;7333:22;7312:53;:::i;:::-;7302:63;;7258:117;7414:2;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7385:118;7036:474;;;;;:::o;7516:118::-;7603:24;7621:5;7603:24;:::i;:::-;7598:3;7591:37;7516:118;;:::o;7640:222::-;7733:4;7771:2;7760:9;7756:18;7748:26;;7784:71;7852:1;7841:9;7837:17;7828:6;7784:71;:::i;:::-;7640:222;;;;:::o;7868:117::-;7977:1;7974;7967:12;7991:117;8100:1;8097;8090:12;8131:568;8204:8;8214:6;8264:3;8257:4;8249:6;8245:17;8241:27;8231:122;;8272:79;;:::i;:::-;8231:122;8385:6;8372:20;8362:30;;8415:18;8407:6;8404:30;8401:117;;;8437:79;;:::i;:::-;8401:117;8551:4;8543:6;8539:17;8527:29;;8605:3;8597:4;8589:6;8585:17;8575:8;8571:32;8568:41;8565:128;;;8612:79;;:::i;:::-;8565:128;8131:568;;;;;:::o;8705:559::-;8791:6;8799;8848:2;8836:9;8827:7;8823:23;8819:32;8816:119;;;8854:79;;:::i;:::-;8816:119;9002:1;8991:9;8987:17;8974:31;9032:18;9024:6;9021:30;9018:117;;;9054:79;;:::i;:::-;9018:117;9167:80;9239:7;9230:6;9219:9;9215:22;9167:80;:::i;:::-;9149:98;;;;8945:312;8705:559;;;;;:::o;9270:619::-;9347:6;9355;9363;9412:2;9400:9;9391:7;9387:23;9383:32;9380:119;;;9418:79;;:::i;:::-;9380:119;9538:1;9563:53;9608:7;9599:6;9588:9;9584:22;9563:53;:::i;:::-;9553:63;;9509:117;9665:2;9691:53;9736:7;9727:6;9716:9;9712:22;9691:53;:::i;:::-;9681:63;;9636:118;9793:2;9819:53;9864:7;9855:6;9844:9;9840:22;9819:53;:::i;:::-;9809:63;;9764:118;9270:619;;;;;:::o;9895:77::-;9932:7;9961:5;9950:16;;9895:77;;;:::o;9978:122::-;10051:24;10069:5;10051:24;:::i;:::-;10044:5;10041:35;10031:63;;10090:1;10087;10080:12;10031:63;9978:122;:::o;10106:139::-;10152:5;10190:6;10177:20;10168:29;;10206:33;10233:5;10206:33;:::i;:::-;10106:139;;;;:::o;10251:329::-;10310:6;10359:2;10347:9;10338:7;10334:23;10330:32;10327:119;;;10365:79;;:::i;:::-;10327:119;10485:1;10510:53;10555:7;10546:6;10535:9;10531:22;10510:53;:::i;:::-;10500:63;;10456:117;10251:329;;;;:::o;10586:118::-;10673:24;10691:5;10673:24;:::i;:::-;10668:3;10661:37;10586:118;;:::o;10710:222::-;10803:4;10841:2;10830:9;10826:18;10818:26;;10854:71;10922:1;10911:9;10907:17;10898:6;10854:71;:::i;:::-;10710:222;;;;:::o;10938:104::-;10983:7;11012:24;11030:5;11012:24;:::i;:::-;11001:35;;10938:104;;;:::o;11048:138::-;11129:32;11155:5;11129:32;:::i;:::-;11122:5;11119:43;11109:71;;11176:1;11173;11166:12;11109:71;11048:138;:::o;11192:155::-;11246:5;11284:6;11271:20;11262:29;;11300:41;11335:5;11300:41;:::i;:::-;11192:155;;;;:::o;11353:345::-;11420:6;11469:2;11457:9;11448:7;11444:23;11440:32;11437:119;;;11475:79;;:::i;:::-;11437:119;11595:1;11620:61;11673:7;11664:6;11653:9;11649:22;11620:61;:::i;:::-;11610:71;;11566:125;11353:345;;;;:::o;11704:474::-;11772:6;11780;11829:2;11817:9;11808:7;11804:23;11800:32;11797:119;;;11835:79;;:::i;:::-;11797:119;11955:1;11980:53;12025:7;12016:6;12005:9;12001:22;11980:53;:::i;:::-;11970:63;;11926:117;12082:2;12108:53;12153:7;12144:6;12133:9;12129:22;12108:53;:::i;:::-;12098:63;;12053:118;11704:474;;;;;:::o;12184:332::-;12305:4;12343:2;12332:9;12328:18;12320:26;;12356:71;12424:1;12413:9;12409:17;12400:6;12356:71;:::i;:::-;12437:72;12505:2;12494:9;12490:18;12481:6;12437:72;:::i;:::-;12184:332;;;;;:::o;12522:474::-;12590:6;12598;12647:2;12635:9;12626:7;12622:23;12618:32;12615:119;;;12653:79;;:::i;:::-;12615:119;12773:1;12798:53;12843:7;12834:6;12823:9;12819:22;12798:53;:::i;:::-;12788:63;;12744:117;12900:2;12926:53;12971:7;12962:6;12951:9;12947:22;12926:53;:::i;:::-;12916:63;;12871:118;12522:474;;;;;:::o;13002:329::-;13061:6;13110:2;13098:9;13089:7;13085:23;13081:32;13078:119;;;13116:79;;:::i;:::-;13078:119;13236:1;13261:53;13306:7;13297:6;13286:9;13282:22;13261:53;:::i;:::-;13251:63;;13207:117;13002:329;;;;:::o;13337:60::-;13365:3;13386:5;13379:12;;13337:60;;;:::o;13403:142::-;13453:9;13486:53;13504:34;13513:24;13531:5;13513:24;:::i;:::-;13504:34;:::i;:::-;13486:53;:::i;:::-;13473:66;;13403:142;;;:::o;13551:126::-;13601:9;13634:37;13665:5;13634:37;:::i;:::-;13621:50;;13551:126;;;:::o;13683:158::-;13765:9;13798:37;13829:5;13798:37;:::i;:::-;13785:50;;13683:158;;;:::o;13847:195::-;13966:69;14029:5;13966:69;:::i;:::-;13961:3;13954:82;13847:195;;:::o;14048:286::-;14173:4;14211:2;14200:9;14196:18;14188:26;;14224:103;14324:1;14313:9;14309:17;14300:6;14224:103;:::i;:::-;14048:286;;;;:::o;14340:114::-;14407:6;14441:5;14435:12;14425:22;;14340:114;;;:::o;14460:184::-;14559:11;14593:6;14588:3;14581:19;14633:4;14628:3;14624:14;14609:29;;14460:184;;;;:::o;14650:132::-;14717:4;14740:3;14732:11;;14770:4;14765:3;14761:14;14753:22;;14650:132;;;:::o;14788:108::-;14865:24;14883:5;14865:24;:::i;:::-;14860:3;14853:37;14788:108;;:::o;14902:179::-;14971:10;14992:46;15034:3;15026:6;14992:46;:::i;:::-;15070:4;15065:3;15061:14;15047:28;;14902:179;;;;:::o;15087:113::-;15157:4;15189;15184:3;15180:14;15172:22;;15087:113;;;:::o;15236:732::-;15355:3;15384:54;15432:5;15384:54;:::i;:::-;15454:86;15533:6;15528:3;15454:86;:::i;:::-;15447:93;;15564:56;15614:5;15564:56;:::i;:::-;15643:7;15674:1;15659:284;15684:6;15681:1;15678:13;15659:284;;;15760:6;15754:13;15787:63;15846:3;15831:13;15787:63;:::i;:::-;15780:70;;15873:60;15926:6;15873:60;:::i;:::-;15863:70;;15719:224;15706:1;15703;15699:9;15694:14;;15659:284;;;15663:14;15959:3;15952:10;;15360:608;;;15236:732;;;;:::o;15974:373::-;16117:4;16155:2;16144:9;16140:18;16132:26;;16204:9;16198:4;16194:20;16190:1;16179:9;16175:17;16168:47;16232:108;16335:4;16326:6;16232:108;:::i;:::-;16224:116;;15974:373;;;;:::o;16353:116::-;16423:21;16438:5;16423:21;:::i;:::-;16416:5;16413:32;16403:60;;16459:1;16456;16449:12;16403:60;16353:116;:::o;16475:133::-;16518:5;16556:6;16543:20;16534:29;;16572:30;16596:5;16572:30;:::i;:::-;16475:133;;;;:::o;16614:468::-;16679:6;16687;16736:2;16724:9;16715:7;16711:23;16707:32;16704:119;;;16742:79;;:::i;:::-;16704:119;16862:1;16887:53;16932:7;16923:6;16912:9;16908:22;16887:53;:::i;:::-;16877:63;;16833:117;16989:2;17015:50;17057:7;17048:6;17037:9;17033:22;17015:50;:::i;:::-;17005:60;;16960:115;16614:468;;;;;:::o;17088:307::-;17149:4;17239:18;17231:6;17228:30;17225:56;;;17261:18;;:::i;:::-;17225:56;17299:29;17321:6;17299:29;:::i;:::-;17291:37;;17383:4;17377;17373:15;17365:23;;17088:307;;;:::o;17401:423::-;17478:5;17503:65;17519:48;17560:6;17519:48;:::i;:::-;17503:65;:::i;:::-;17494:74;;17591:6;17584:5;17577:21;17629:4;17622:5;17618:16;17667:3;17658:6;17653:3;17649:16;17646:25;17643:112;;;17674:79;;:::i;:::-;17643:112;17764:54;17811:6;17806:3;17801;17764:54;:::i;:::-;17484:340;17401:423;;;;;:::o;17843:338::-;17898:5;17947:3;17940:4;17932:6;17928:17;17924:27;17914:122;;17955:79;;:::i;:::-;17914:122;18072:6;18059:20;18097:78;18171:3;18163:6;18156:4;18148:6;18144:17;18097:78;:::i;:::-;18088:87;;17904:277;17843:338;;;;:::o;18187:943::-;18282:6;18290;18298;18306;18355:3;18343:9;18334:7;18330:23;18326:33;18323:120;;;18362:79;;:::i;:::-;18323:120;18482:1;18507:53;18552:7;18543:6;18532:9;18528:22;18507:53;:::i;:::-;18497:63;;18453:117;18609:2;18635:53;18680:7;18671:6;18660:9;18656:22;18635:53;:::i;:::-;18625:63;;18580:118;18737:2;18763:53;18808:7;18799:6;18788:9;18784:22;18763:53;:::i;:::-;18753:63;;18708:118;18893:2;18882:9;18878:18;18865:32;18924:18;18916:6;18913:30;18910:117;;;18946:79;;:::i;:::-;18910:117;19051:62;19105:7;19096:6;19085:9;19081:22;19051:62;:::i;:::-;19041:72;;18836:287;18187:943;;;;;;;:::o;19136:474::-;19204:6;19212;19261:2;19249:9;19240:7;19236:23;19232:32;19229:119;;;19267:79;;:::i;:::-;19229:119;19387:1;19412:53;19457:7;19448:6;19437:9;19433:22;19412:53;:::i;:::-;19402:63;;19358:117;19514:2;19540:53;19585:7;19576:6;19565:9;19561:22;19540:53;:::i;:::-;19530:63;;19485:118;19136:474;;;;;:::o;19616:141::-;19681:9;19714:37;19745:5;19714:37;:::i;:::-;19701:50;;19616:141;;;:::o;19763:161::-;19865:52;19911:5;19865:52;:::i;:::-;19860:3;19853:65;19763:161;;:::o;19930:252::-;20038:4;20076:2;20065:9;20061:18;20053:26;;20089:86;20172:1;20161:9;20157:17;20148:6;20089:86;:::i;:::-;19930:252;;;;:::o;20188:180::-;20236:77;20233:1;20226:88;20333:4;20330:1;20323:15;20357:4;20354:1;20347:15;20374:320;20418:6;20455:1;20449:4;20445:12;20435:22;;20502:1;20496:4;20492:12;20523:18;20513:81;;20579:4;20571:6;20567:17;20557:27;;20513:81;20641:2;20633:6;20630:14;20610:18;20607:38;20604:84;;20660:18;;:::i;:::-;20604:84;20425:269;20374:320;;;:::o;20700:141::-;20749:4;20772:3;20764:11;;20795:3;20792:1;20785:14;20829:4;20826:1;20816:18;20808:26;;20700:141;;;:::o;20847:93::-;20884:6;20931:2;20926;20919:5;20915:14;20911:23;20901:33;;20847:93;;;:::o;20946:107::-;20990:8;21040:5;21034:4;21030:16;21009:37;;20946:107;;;;:::o;21059:393::-;21128:6;21178:1;21166:10;21162:18;21201:97;21231:66;21220:9;21201:97;:::i;:::-;21319:39;21349:8;21338:9;21319:39;:::i;:::-;21307:51;;21391:4;21387:9;21380:5;21376:21;21367:30;;21440:4;21430:8;21426:19;21419:5;21416:30;21406:40;;21135:317;;21059:393;;;;;:::o;21458:142::-;21508:9;21541:53;21559:34;21568:24;21586:5;21568:24;:::i;:::-;21559:34;:::i;:::-;21541:53;:::i;:::-;21528:66;;21458:142;;;:::o;21606:75::-;21649:3;21670:5;21663:12;;21606:75;;;:::o;21687:269::-;21797:39;21828:7;21797:39;:::i;:::-;21858:91;21907:41;21931:16;21907:41;:::i;:::-;21899:6;21892:4;21886:11;21858:91;:::i;:::-;21852:4;21845:105;21763:193;21687:269;;;:::o;21962:73::-;22007:3;21962:73;:::o;22041:189::-;22118:32;;:::i;:::-;22159:65;22217:6;22209;22203:4;22159:65;:::i;:::-;22094:136;22041:189;;:::o;22236:186::-;22296:120;22313:3;22306:5;22303:14;22296:120;;;22367:39;22404:1;22397:5;22367:39;:::i;:::-;22340:1;22333:5;22329:13;22320:22;;22296:120;;;22236:186;;:::o;22428:543::-;22529:2;22524:3;22521:11;22518:446;;;22563:38;22595:5;22563:38;:::i;:::-;22647:29;22665:10;22647:29;:::i;:::-;22637:8;22633:44;22830:2;22818:10;22815:18;22812:49;;;22851:8;22836:23;;22812:49;22874:80;22930:22;22948:3;22930:22;:::i;:::-;22920:8;22916:37;22903:11;22874:80;:::i;:::-;22533:431;;22518:446;22428:543;;;:::o;22977:117::-;23031:8;23081:5;23075:4;23071:16;23050:37;;22977:117;;;;:::o;23100:169::-;23144:6;23177:51;23225:1;23221:6;23213:5;23210:1;23206:13;23177:51;:::i;:::-;23173:56;23258:4;23252;23248:15;23238:25;;23151:118;23100:169;;;;:::o;23274:295::-;23350:4;23496:29;23521:3;23515:4;23496:29;:::i;:::-;23488:37;;23558:3;23555:1;23551:11;23545:4;23542:21;23534:29;;23274:295;;;;:::o;23574:1395::-;23691:37;23724:3;23691:37;:::i;:::-;23793:18;23785:6;23782:30;23779:56;;;23815:18;;:::i;:::-;23779:56;23859:38;23891:4;23885:11;23859:38;:::i;:::-;23944:67;24004:6;23996;23990:4;23944:67;:::i;:::-;24038:1;24062:4;24049:17;;24094:2;24086:6;24083:14;24111:1;24106:618;;;;24768:1;24785:6;24782:77;;;24834:9;24829:3;24825:19;24819:26;24810:35;;24782:77;24885:67;24945:6;24938:5;24885:67;:::i;:::-;24879:4;24872:81;24741:222;24076:887;;24106:618;24158:4;24154:9;24146:6;24142:22;24192:37;24224:4;24192:37;:::i;:::-;24251:1;24265:208;24279:7;24276:1;24273:14;24265:208;;;24358:9;24353:3;24349:19;24343:26;24335:6;24328:42;24409:1;24401:6;24397:14;24387:24;;24456:2;24445:9;24441:18;24428:31;;24302:4;24299:1;24295:12;24290:17;;24265:208;;;24501:6;24492:7;24489:19;24486:179;;;24559:9;24554:3;24550:19;24544:26;24602:48;24644:4;24636:6;24632:17;24621:9;24602:48;:::i;:::-;24594:6;24587:64;24509:156;24486:179;24711:1;24707;24699:6;24695:14;24691:22;24685:4;24678:36;24113:611;;;24076:887;;23666:1303;;;23574:1395;;:::o;24975:231::-;25115:34;25111:1;25103:6;25099:14;25092:58;25184:14;25179:2;25171:6;25167:15;25160:39;24975:231;:::o;25212:366::-;25354:3;25375:67;25439:2;25434:3;25375:67;:::i;:::-;25368:74;;25451:93;25540:3;25451:93;:::i;:::-;25569:2;25564:3;25560:12;25553:19;;25212:366;;;:::o;25584:419::-;25750:4;25788:2;25777:9;25773:18;25765:26;;25837:9;25831:4;25827:20;25823:1;25812:9;25808:17;25801:47;25865:131;25991:4;25865:131;:::i;:::-;25857:139;;25584:419;;;:::o;26009:164::-;26149:16;26145:1;26137:6;26133:14;26126:40;26009:164;:::o;26179:366::-;26321:3;26342:67;26406:2;26401:3;26342:67;:::i;:::-;26335:74;;26418:93;26507:3;26418:93;:::i;:::-;26536:2;26531:3;26527:12;26520:19;;26179:366;;;:::o;26551:419::-;26717:4;26755:2;26744:9;26740:18;26732:26;;26804:9;26798:4;26794:20;26790:1;26779:9;26775:17;26768:47;26832:131;26958:4;26832:131;:::i;:::-;26824:139;;26551:419;;;:::o;26976:165::-;27116:17;27112:1;27104:6;27100:14;27093:41;26976:165;:::o;27147:366::-;27289:3;27310:67;27374:2;27369:3;27310:67;:::i;:::-;27303:74;;27386:93;27475:3;27386:93;:::i;:::-;27504:2;27499:3;27495:12;27488:19;;27147:366;;;:::o;27519:419::-;27685:4;27723:2;27712:9;27708:18;27700:26;;27772:9;27766:4;27762:20;27758:1;27747:9;27743:17;27736:47;27800:131;27926:4;27800:131;:::i;:::-;27792:139;;27519:419;;;:::o;27944:442::-;28093:4;28131:2;28120:9;28116:18;28108:26;;28144:71;28212:1;28201:9;28197:17;28188:6;28144:71;:::i;:::-;28225:72;28293:2;28282:9;28278:18;28269:6;28225:72;:::i;:::-;28307;28375:2;28364:9;28360:18;28351:6;28307:72;:::i;:::-;27944:442;;;;;;:::o;28392:137::-;28446:5;28477:6;28471:13;28462:22;;28493:30;28517:5;28493:30;:::i;:::-;28392:137;;;;:::o;28535:345::-;28602:6;28651:2;28639:9;28630:7;28626:23;28622:32;28619:119;;;28657:79;;:::i;:::-;28619:119;28777:1;28802:61;28855:7;28846:6;28835:9;28831:22;28802:61;:::i;:::-;28792:71;;28748:125;28535:345;;;;:::o;28886:173::-;29026:25;29022:1;29014:6;29010:14;29003:49;28886:173;:::o;29065:366::-;29207:3;29228:67;29292:2;29287:3;29228:67;:::i;:::-;29221:74;;29304:93;29393:3;29304:93;:::i;:::-;29422:2;29417:3;29413:12;29406:19;;29065:366;;;:::o;29437:419::-;29603:4;29641:2;29630:9;29626:18;29618:26;;29690:9;29684:4;29680:20;29676:1;29665:9;29661:17;29654:47;29718:131;29844:4;29718:131;:::i;:::-;29710:139;;29437:419;;;:::o;29862:174::-;30002:26;29998:1;29990:6;29986:14;29979:50;29862:174;:::o;30042:366::-;30184:3;30205:67;30269:2;30264:3;30205:67;:::i;:::-;30198:74;;30281:93;30370:3;30281:93;:::i;:::-;30399:2;30394:3;30390:12;30383:19;;30042:366;;;:::o;30414:419::-;30580:4;30618:2;30607:9;30603:18;30595:26;;30667:9;30661:4;30657:20;30653:1;30642:9;30638:17;30631:47;30695:131;30821:4;30695:131;:::i;:::-;30687:139;;30414:419;;;:::o;30839:147::-;30940:11;30977:3;30962:18;;30839:147;;;;:::o;30992:114::-;;:::o;31112:398::-;31271:3;31292:83;31373:1;31368:3;31292:83;:::i;:::-;31285:90;;31384:93;31473:3;31384:93;:::i;:::-;31502:1;31497:3;31493:11;31486:18;;31112:398;;;:::o;31516:379::-;31700:3;31722:147;31865:3;31722:147;:::i;:::-;31715:154;;31886:3;31879:10;;31516:379;;;:::o;31901:180::-;31949:77;31946:1;31939:88;32046:4;32043:1;32036:15;32070:4;32067:1;32060:15;32087:410;32127:7;32150:20;32168:1;32150:20;:::i;:::-;32145:25;;32184:20;32202:1;32184:20;:::i;:::-;32179:25;;32239:1;32236;32232:9;32261:30;32279:11;32261:30;:::i;:::-;32250:41;;32440:1;32431:7;32427:15;32424:1;32421:22;32401:1;32394:9;32374:83;32351:139;;32470:18;;:::i;:::-;32351:139;32135:362;32087:410;;;;:::o;32503:180::-;32551:77;32548:1;32541:88;32648:4;32645:1;32638:15;32672:4;32669:1;32662:15;32689:185;32729:1;32746:20;32764:1;32746:20;:::i;:::-;32741:25;;32780:20;32798:1;32780:20;:::i;:::-;32775:25;;32819:1;32809:35;;32824:18;;:::i;:::-;32809:35;32866:1;32863;32859:9;32854:14;;32689:185;;;;:::o;32880:191::-;32920:3;32939:20;32957:1;32939:20;:::i;:::-;32934:25;;32973:20;32991:1;32973:20;:::i;:::-;32968:25;;33016:1;33013;33009:9;33002:16;;33037:3;33034:1;33031:10;33028:36;;;33044:18;;:::i;:::-;33028:36;32880:191;;;;:::o;33077:176::-;33217:28;33213:1;33205:6;33201:14;33194:52;33077:176;:::o;33259:366::-;33401:3;33422:67;33486:2;33481:3;33422:67;:::i;:::-;33415:74;;33498:93;33587:3;33498:93;:::i;:::-;33616:2;33611:3;33607:12;33600:19;;33259:366;;;:::o;33631:419::-;33797:4;33835:2;33824:9;33820:18;33812:26;;33884:9;33878:4;33874:20;33870:1;33859:9;33855:17;33848:47;33912:131;34038:4;33912:131;:::i;:::-;33904:139;;33631:419;;;:::o;34056:230::-;34196:34;34192:1;34184:6;34180:14;34173:58;34265:13;34260:2;34252:6;34248:15;34241:38;34056:230;:::o;34292:366::-;34434:3;34455:67;34519:2;34514:3;34455:67;:::i;:::-;34448:74;;34531:93;34620:3;34531:93;:::i;:::-;34649:2;34644:3;34640:12;34633:19;;34292:366;;;:::o;34664:419::-;34830:4;34868:2;34857:9;34853:18;34845:26;;34917:9;34911:4;34907:20;34903:1;34892:9;34888:17;34881:47;34945:131;35071:4;34945:131;:::i;:::-;34937:139;;34664:419;;;:::o;35089:234::-;35229:34;35225:1;35217:6;35213:14;35206:58;35298:17;35293:2;35285:6;35281:15;35274:42;35089:234;:::o;35329:366::-;35471:3;35492:67;35556:2;35551:3;35492:67;:::i;:::-;35485:74;;35568:93;35657:3;35568:93;:::i;:::-;35686:2;35681:3;35677:12;35670:19;;35329:366;;;:::o;35701:419::-;35867:4;35905:2;35894:9;35890:18;35882:26;;35954:9;35948:4;35944:20;35940:1;35929:9;35925:17;35918:47;35982:131;36108:4;35982:131;:::i;:::-;35974:139;;35701:419;;;:::o;36126:230::-;36266:34;36262:1;36254:6;36250:14;36243:58;36335:13;36330:2;36322:6;36318:15;36311:38;36126:230;:::o;36362:366::-;36504:3;36525:67;36589:2;36584:3;36525:67;:::i;:::-;36518:74;;36601:93;36690:3;36601:93;:::i;:::-;36719:2;36714:3;36710:12;36703:19;;36362:366;;;:::o;36734:419::-;36900:4;36938:2;36927:9;36923:18;36915:26;;36987:9;36981:4;36977:20;36973:1;36962:9;36958:17;36951:47;37015:131;37141:4;37015:131;:::i;:::-;37007:139;;36734:419;;;:::o;37159:230::-;37299:34;37295:1;37287:6;37283:14;37276:58;37368:13;37363:2;37355:6;37351:15;37344:38;37159:230;:::o;37395:366::-;37537:3;37558:67;37622:2;37617:3;37558:67;:::i;:::-;37551:74;;37634:93;37723:3;37634:93;:::i;:::-;37752:2;37747:3;37743:12;37736:19;;37395:366;;;:::o;37767:419::-;37933:4;37971:2;37960:9;37956:18;37948:26;;38020:9;38014:4;38010:20;38006:1;37995:9;37991:17;37984:47;38048:131;38174:4;38048:131;:::i;:::-;38040:139;;37767:419;;;:::o;38192:231::-;38332:34;38328:1;38320:6;38316:14;38309:58;38401:14;38396:2;38388:6;38384:15;38377:39;38192:231;:::o;38429:366::-;38571:3;38592:67;38656:2;38651:3;38592:67;:::i;:::-;38585:74;;38668:93;38757:3;38668:93;:::i;:::-;38786:2;38781:3;38777:12;38770:19;;38429:366;;;:::o;38801:419::-;38967:4;39005:2;38994:9;38990:18;38982:26;;39054:9;39048:4;39044:20;39040:1;39029:9;39025:17;39018:47;39082:131;39208:4;39082:131;:::i;:::-;39074:139;;38801:419;;;:::o;39226:180::-;39274:77;39271:1;39264:88;39371:4;39368:1;39361:15;39395:4;39392:1;39385:15;39412:228;39552:34;39548:1;39540:6;39536:14;39529:58;39621:11;39616:2;39608:6;39604:15;39597:36;39412:228;:::o;39646:366::-;39788:3;39809:67;39873:2;39868:3;39809:67;:::i;:::-;39802:74;;39885:93;39974:3;39885:93;:::i;:::-;40003:2;39998:3;39994:12;39987:19;;39646:366;;;:::o;40018:419::-;40184:4;40222:2;40211:9;40207:18;40199:26;;40271:9;40265:4;40261:20;40257:1;40246:9;40242:17;40235:47;40299:131;40425:4;40299:131;:::i;:::-;40291:139;;40018:419;;;:::o;40443:229::-;40583:34;40579:1;40571:6;40567:14;40560:58;40652:12;40647:2;40639:6;40635:15;40628:37;40443:229;:::o;40678:366::-;40820:3;40841:67;40905:2;40900:3;40841:67;:::i;:::-;40834:74;;40917:93;41006:3;40917:93;:::i;:::-;41035:2;41030:3;41026:12;41019:19;;40678:366;;;:::o;41050:419::-;41216:4;41254:2;41243:9;41239:18;41231:26;;41303:9;41297:4;41293:20;41289:1;41278:9;41274:17;41267:47;41331:131;41457:4;41331:131;:::i;:::-;41323:139;;41050:419;;;:::o;41475:233::-;41514:3;41537:24;41555:5;41537:24;:::i;:::-;41528:33;;41583:66;41576:5;41573:77;41570:103;;41653:18;;:::i;:::-;41570:103;41700:1;41693:5;41689:13;41682:20;;41475:233;;;:::o;41714:148::-;41816:11;41853:3;41838:18;;41714:148;;;;:::o;41892:874::-;41995:3;42032:5;42026:12;42061:36;42087:9;42061:36;:::i;:::-;42113:89;42195:6;42190:3;42113:89;:::i;:::-;42106:96;;42233:1;42222:9;42218:17;42249:1;42244:166;;;;42424:1;42419:341;;;;42211:549;;42244:166;42328:4;42324:9;42313;42309:25;42304:3;42297:38;42390:6;42383:14;42376:22;42368:6;42364:35;42359:3;42355:45;42348:52;;42244:166;;42419:341;42486:38;42518:5;42486:38;:::i;:::-;42546:1;42560:154;42574:6;42571:1;42568:13;42560:154;;;42648:7;42642:14;42638:1;42633:3;42629:11;42622:35;42698:1;42689:7;42685:15;42674:26;;42596:4;42593:1;42589:12;42584:17;;42560:154;;;42743:6;42738:3;42734:16;42727:23;;42426:334;;42211:549;;41999:767;;41892:874;;;;:::o;42772:390::-;42878:3;42906:39;42939:5;42906:39;:::i;:::-;42961:89;43043:6;43038:3;42961:89;:::i;:::-;42954:96;;43059:65;43117:6;43112:3;43105:4;43098:5;43094:16;43059:65;:::i;:::-;43149:6;43144:3;43140:16;43133:23;;42882:280;42772:390;;;;:::o;43168:429::-;43345:3;43367:92;43455:3;43446:6;43367:92;:::i;:::-;43360:99;;43476:95;43567:3;43558:6;43476:95;:::i;:::-;43469:102;;43588:3;43581:10;;43168:429;;;;;:::o;43603:332::-;43724:4;43762:2;43751:9;43747:18;43739:26;;43775:71;43843:1;43832:9;43828:17;43819:6;43775:71;:::i;:::-;43856:72;43924:2;43913:9;43909:18;43900:6;43856:72;:::i;:::-;43603:332;;;;;:::o;43941:220::-;44081:34;44077:1;44069:6;44065:14;44058:58;44150:3;44145:2;44137:6;44133:15;44126:28;43941:220;:::o;44167:366::-;44309:3;44330:67;44394:2;44389:3;44330:67;:::i;:::-;44323:74;;44406:93;44495:3;44406:93;:::i;:::-;44524:2;44519:3;44515:12;44508:19;;44167:366;;;:::o;44539:419::-;44705:4;44743:2;44732:9;44728:18;44720:26;;44792:9;44786:4;44782:20;44778:1;44767:9;44763:17;44756:47;44820:131;44946:4;44820:131;:::i;:::-;44812:139;;44539:419;;;:::o;44964:243::-;45104:34;45100:1;45092:6;45088:14;45081:58;45173:26;45168:2;45160:6;45156:15;45149:51;44964:243;:::o;45213:366::-;45355:3;45376:67;45440:2;45435:3;45376:67;:::i;:::-;45369:74;;45452:93;45541:3;45452:93;:::i;:::-;45570:2;45565:3;45561:12;45554:19;;45213:366;;;:::o;45585:419::-;45751:4;45789:2;45778:9;45774:18;45766:26;;45838:9;45832:4;45828:20;45824:1;45813:9;45809:17;45802:47;45866:131;45992:4;45866:131;:::i;:::-;45858:139;;45585:419;;;:::o;46010:94::-;46043:8;46091:5;46087:2;46083:14;46062:35;;46010:94;;;:::o;46110:::-;46149:7;46178:20;46192:5;46178:20;:::i;:::-;46167:31;;46110:94;;;:::o;46210:100::-;46249:7;46278:26;46298:5;46278:26;:::i;:::-;46267:37;;46210:100;;;:::o;46316:157::-;46421:45;46441:24;46459:5;46441:24;:::i;:::-;46421:45;:::i;:::-;46416:3;46409:58;46316:157;;:::o;46479:256::-;46591:3;46606:75;46677:3;46668:6;46606:75;:::i;:::-;46706:2;46701:3;46697:12;46690:19;;46726:3;46719:10;;46479:256;;;;:::o;46741:176::-;46881:28;46877:1;46869:6;46865:14;46858:52;46741:176;:::o;46923:366::-;47065:3;47086:67;47150:2;47145:3;47086:67;:::i;:::-;47079:74;;47162:93;47251:3;47162:93;:::i;:::-;47280:2;47275:3;47271:12;47264:19;;46923:366;;;:::o;47295:419::-;47461:4;47499:2;47488:9;47484:18;47476:26;;47548:9;47542:4;47538:20;47534:1;47523:9;47519:17;47512:47;47576:131;47702:4;47576:131;:::i;:::-;47568:139;;47295:419;;;:::o;47720:236::-;47860:34;47856:1;47848:6;47844:14;47837:58;47929:19;47924:2;47916:6;47912:15;47905:44;47720:236;:::o;47962:366::-;48104:3;48125:67;48189:2;48184:3;48125:67;:::i;:::-;48118:74;;48201:93;48290:3;48201:93;:::i;:::-;48319:2;48314:3;48310:12;48303:19;;47962:366;;;:::o;48334:419::-;48500:4;48538:2;48527:9;48523:18;48515:26;;48587:9;48581:4;48577:20;48573:1;48562:9;48558:17;48551:47;48615:131;48741:4;48615:131;:::i;:::-;48607:139;;48334:419;;;:::o;48759:231::-;48899:34;48895:1;48887:6;48883:14;48876:58;48968:14;48963:2;48955:6;48951:15;48944:39;48759:231;:::o;48996:366::-;49138:3;49159:67;49223:2;49218:3;49159:67;:::i;:::-;49152:74;;49235:93;49324:3;49235:93;:::i;:::-;49353:2;49348:3;49344:12;49337:19;;48996:366;;;:::o;49368:419::-;49534:4;49572:2;49561:9;49557:18;49549:26;;49621:9;49615:4;49611:20;49607:1;49596:9;49592:17;49585:47;49649:131;49775:4;49649:131;:::i;:::-;49641:139;;49368:419;;;:::o;49793:194::-;49833:4;49853:20;49871:1;49853:20;:::i;:::-;49848:25;;49887:20;49905:1;49887:20;:::i;:::-;49882:25;;49931:1;49928;49924:9;49916:17;;49955:1;49949:4;49946:11;49943:37;;;49960:18;;:::i;:::-;49943:37;49793:194;;;;:::o;49993:176::-;50025:1;50042:20;50060:1;50042:20;:::i;:::-;50037:25;;50076:20;50094:1;50076:20;:::i;:::-;50071:25;;50115:1;50105:35;;50120:18;;:::i;:::-;50105:35;50161:1;50158;50154:9;50149:14;;49993:176;;;;:::o;50175:173::-;50315:25;50311:1;50303:6;50299:14;50292:49;50175:173;:::o;50354:402::-;50514:3;50535:85;50617:2;50612:3;50535:85;:::i;:::-;50528:92;;50629:93;50718:3;50629:93;:::i;:::-;50747:2;50742:3;50738:12;50731:19;;50354:402;;;:::o;50762:167::-;50902:19;50898:1;50890:6;50886:14;50879:43;50762:167;:::o;50935:402::-;51095:3;51116:85;51198:2;51193:3;51116:85;:::i;:::-;51109:92;;51210:93;51299:3;51210:93;:::i;:::-;51328:2;51323:3;51319:12;51312:19;;50935:402;;;:::o;51343:967::-;51725:3;51747:148;51891:3;51747:148;:::i;:::-;51740:155;;51912:95;52003:3;51994:6;51912:95;:::i;:::-;51905:102;;52024:148;52168:3;52024:148;:::i;:::-;52017:155;;52189:95;52280:3;52271:6;52189:95;:::i;:::-;52182:102;;52301:3;52294:10;;51343:967;;;;;:::o;52316:228::-;52456:34;52452:1;52444:6;52440:14;52433:58;52525:11;52520:2;52512:6;52508:15;52501:36;52316:228;:::o;52550:366::-;52692:3;52713:67;52777:2;52772:3;52713:67;:::i;:::-;52706:74;;52789:93;52878:3;52789:93;:::i;:::-;52907:2;52902:3;52898:12;52891:19;;52550:366;;;:::o;52922:419::-;53088:4;53126:2;53115:9;53111:18;53103:26;;53175:9;53169:4;53165:20;53161:1;53150:9;53146:17;53139:47;53203:131;53329:4;53203:131;:::i;:::-;53195:139;;52922:419;;;:::o;53347:223::-;53487:34;53483:1;53475:6;53471:14;53464:58;53556:6;53551:2;53543:6;53539:15;53532:31;53347:223;:::o;53576:366::-;53718:3;53739:67;53803:2;53798:3;53739:67;:::i;:::-;53732:74;;53815:93;53904:3;53815:93;:::i;:::-;53933:2;53928:3;53924:12;53917:19;;53576:366;;;:::o;53948:419::-;54114:4;54152:2;54141:9;54137:18;54129:26;;54201:9;54195:4;54191:20;54187:1;54176:9;54172:17;54165:47;54229:131;54355:4;54229:131;:::i;:::-;54221:139;;53948:419;;;:::o;54373:237::-;54513:34;54509:1;54501:6;54497:14;54490:58;54582:20;54577:2;54569:6;54565:15;54558:45;54373:237;:::o;54616:366::-;54758:3;54779:67;54843:2;54838:3;54779:67;:::i;:::-;54772:74;;54855:93;54944:3;54855:93;:::i;:::-;54973:2;54968:3;54964:12;54957:19;;54616:366;;;:::o;54988:419::-;55154:4;55192:2;55181:9;55177:18;55169:26;;55241:9;55235:4;55231:20;55227:1;55216:9;55212:17;55205:47;55269:131;55395:4;55269:131;:::i;:::-;55261:139;;54988:419;;;:::o;55413:175::-;55553:27;55549:1;55541:6;55537:14;55530:51;55413:175;:::o;55594:366::-;55736:3;55757:67;55821:2;55816:3;55757:67;:::i;:::-;55750:74;;55833:93;55922:3;55833:93;:::i;:::-;55951:2;55946:3;55942:12;55935:19;;55594:366;;;:::o;55966:419::-;56132:4;56170:2;56159:9;56155:18;56147:26;;56219:9;56213:4;56209:20;56205:1;56194:9;56190:17;56183:47;56247:131;56373:4;56247:131;:::i;:::-;56239:139;;55966:419;;;:::o;56391:171::-;56430:3;56453:24;56471:5;56453:24;:::i;:::-;56444:33;;56499:4;56492:5;56489:15;56486:41;;56507:18;;:::i;:::-;56486:41;56554:1;56547:5;56543:13;56536:20;;56391:171;;;:::o;56568:182::-;56708:34;56704:1;56696:6;56692:14;56685:58;56568:182;:::o;56756:366::-;56898:3;56919:67;56983:2;56978:3;56919:67;:::i;:::-;56912:74;;56995:93;57084:3;56995:93;:::i;:::-;57113:2;57108:3;57104:12;57097:19;;56756:366;;;:::o;57128:419::-;57294:4;57332:2;57321:9;57317:18;57309:26;;57381:9;57375:4;57371:20;57367:1;57356:9;57352:17;57345:47;57409:131;57535:4;57409:131;:::i;:::-;57401:139;;57128:419;;;:::o;57553:182::-;57693:34;57689:1;57681:6;57677:14;57670:58;57553:182;:::o;57741:366::-;57883:3;57904:67;57968:2;57963:3;57904:67;:::i;:::-;57897:74;;57980:93;58069:3;57980:93;:::i;:::-;58098:2;58093:3;58089:12;58082:19;;57741:366;;;:::o;58113:419::-;58279:4;58317:2;58306:9;58302:18;58294:26;;58366:9;58360:4;58356:20;58352:1;58341:9;58337:17;58330:47;58394:131;58520:4;58394:131;:::i;:::-;58386:139;;58113:419;;;:::o;58538:178::-;58678:30;58674:1;58666:6;58662:14;58655:54;58538:178;:::o;58722:366::-;58864:3;58885:67;58949:2;58944:3;58885:67;:::i;:::-;58878:74;;58961:93;59050:3;58961:93;:::i;:::-;59079:2;59074:3;59070:12;59063:19;;58722:366;;;:::o;59094:419::-;59260:4;59298:2;59287:9;59283:18;59275:26;;59347:9;59341:4;59337:20;59333:1;59322:9;59318:17;59311:47;59375:131;59501:4;59375:131;:::i;:::-;59367:139;;59094:419;;;:::o;59519:98::-;59570:6;59604:5;59598:12;59588:22;;59519:98;;;:::o;59623:168::-;59706:11;59740:6;59735:3;59728:19;59780:4;59775:3;59771:14;59756:29;;59623:168;;;;:::o;59797:373::-;59883:3;59911:38;59943:5;59911:38;:::i;:::-;59965:70;60028:6;60023:3;59965:70;:::i;:::-;59958:77;;60044:65;60102:6;60097:3;60090:4;60083:5;60079:16;60044:65;:::i;:::-;60134:29;60156:6;60134:29;:::i;:::-;60129:3;60125:39;60118:46;;59887:283;59797:373;;;;:::o;60176:640::-;60371:4;60409:3;60398:9;60394:19;60386:27;;60423:71;60491:1;60480:9;60476:17;60467:6;60423:71;:::i;:::-;60504:72;60572:2;60561:9;60557:18;60548:6;60504:72;:::i;:::-;60586;60654:2;60643:9;60639:18;60630:6;60586:72;:::i;:::-;60705:9;60699:4;60695:20;60690:2;60679:9;60675:18;60668:48;60733:76;60804:4;60795:6;60733:76;:::i;:::-;60725:84;;60176:640;;;;;;;:::o;60822:141::-;60878:5;60909:6;60903:13;60894:22;;60925:32;60951:5;60925:32;:::i;:::-;60822:141;;;;:::o;60969:349::-;61038:6;61087:2;61075:9;61066:7;61062:23;61058:32;61055:119;;;61093:79;;:::i;:::-;61055:119;61213:1;61238:63;61293:7;61284:6;61273:9;61269:22;61238:63;:::i;:::-;61228:73;;61184:127;60969:349;;;;:::o;61324:180::-;61372:77;61369:1;61362:88;61469:4;61466:1;61459:15;61493:4;61490:1;61483:15

Swarm Source

ipfs://f9549a098dc9a863fa74d1383741a29f344287d123721da020d315f3623b2d1e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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