ETH Price: $2,384.40 (+1.59%)

Token

BTC BOT (BTC_BOT)
 

Overview

Max Total Supply

3,646 BTC_BOT

Holders

247

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 BTC_BOT
0xe1031a765778ec990c040bae8d698360a32851c5
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:
BTC_BOT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (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);

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: 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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

    /**
     * @dev 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 override {
        super._burn(tokenId);

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

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


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

// File: contracts/BTC_BOT.sol


pragma solidity ^0.8.4;






contract BTC_BOT is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable {
    string private fooo;
    using ECDSA for bytes32;
    address private _systemAddress;
    mapping(string => bool) public _usedNonces;

    
    constructor() ERC721("BTC BOT", "BTC_BOT") { }

    function safeMint(uint256 tokenId, string memory uri, string memory nonce, bytes32 hash, bytes memory signature) public payable {
        require(matchSigner(hash, signature), "Please mint through website");
        require(!_usedNonces[nonce], "Hash reused");
        require( hashTransaction(msg.sender, tokenId, nonce) == hash, "Hash failed");
        _usedNonces[nonce] = true;
        
        _safeMint(msg.sender, tokenId);
        _setTokenURI(tokenId, uri);
    }

    function multiMint(uint[] memory ids, string[] memory uris, string memory nonce, bytes32 hash, bytes memory signature) public payable {
        require(matchSigner(hash, signature), "Please mint through website");
        require(!_usedNonces[nonce], "Hash reused");
        require(hashTransaction(msg.sender, ids[0], nonce) == hash, "Hash failed");
        _usedNonces[nonce] = true;

        for (uint256 i = 0; i < ids.length; i++) {
            _safeMint(msg.sender, ids[i]);
            _setTokenURI(ids[i], uris[i]);
        }
    }

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

    function hashTransaction(
        address sender,
        uint256 tokenId,
        string memory nonce
    ) public view returns (bytes32) {
        bytes32 hash = keccak256( abi.encodePacked(sender, tokenId, nonce, address(this)) );
        return hash;
    }

    function setSystemAddress() public onlyOwner {
        _systemAddress = msg.sender;
    }

    function updateTokenURI(uint256 tokenId, string memory urii) public onlyOwner {
        _setTokenURI(tokenId, urii);
    }

    // The following functions are overrides required by Solidity.
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
        return super.tokenURI(tokenId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"_usedNonces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"nonce","type":"string"}],"name":"hashTransaction","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"matchSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"string[]","name":"uris","type":"string[]"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"multiMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"payable","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":[],"name":"setSystemAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"urii","type":"string"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600781526020017f42544320424f54000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4254435f424f5400000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000256565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b600060028204905060018216806200026f57607f821691505b602082108114156200028657620002856200028c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614f3880620002cb6000396000f3fe6080604052600436106101815760003560e01c8063715018a6116100d1578063b88d4fde1161008a578063e91a67e811610064578063e91a67e8146105bd578063e985e9c5146105d4578063ef844d1314610611578063f2fde38b1461062d57610181565b8063b88d4fde1461051a578063c87b56dd14610543578063dd8d74d81461058057610181565b8063715018a61461042b5780638da5cb5b1461044257806395d89b411461046d578063a22cb46514610498578063a6ba55c7146104c1578063b0c95cc3146104fe57610181565b806323b872dd1161013e5780634f6ccce7116101185780634f6ccce7146103375780636352211e1461037457806367717e2a146103b157806370a08231146103ee57610181565b806323b872dd146102a85780632f745c59146102d157806342842e0e1461030e57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806318e97fd11461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906136ce565b610656565b6040516101ba9190613eb6565b60405180910390f35b3480156101cf57600080fd5b506101d8610668565b6040516101e59190613f31565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190613761565b6106fa565b6040516102229190613e4f565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190613500565b61077f565b005b34801561026057600080fd5b50610269610897565b60405161027691906142b3565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a1919061378a565b6108a4565b005b3480156102b457600080fd5b506102cf60048036038101906102ca91906133fa565b61092e565b005b3480156102dd57600080fd5b506102f860048036038101906102f39190613500565b61098e565b60405161030591906142b3565b60405180910390f35b34801561031a57600080fd5b50610335600480360381019061033091906133fa565b610a33565b005b34801561034357600080fd5b5061035e60048036038101906103599190613761565b610a53565b60405161036b91906142b3565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190613761565b610aea565b6040516103a89190613e4f565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d3919061353c565b610b9c565b6040516103e59190613ed1565b60405180910390f35b3480156103fa57600080fd5b5061041560048036038101906104109190613395565b610bd9565b60405161042291906142b3565b60405180910390f35b34801561043757600080fd5b50610440610c91565b005b34801561044e57600080fd5b50610457610d19565b6040516104649190613e4f565b60405180910390f35b34801561047957600080fd5b50610482610d43565b60405161048f9190613f31565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba91906134c4565b610dd5565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190613720565b610deb565b6040516104f59190613eb6565b60405180910390f35b610518600480360381019061051391906137de565b610e21565b005b34801561052657600080fd5b50610541600480360381019061053c9190613449565b610f74565b005b34801561054f57600080fd5b5061056a60048036038101906105659190613761565b610fd6565b6040516105779190613f31565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a2919061367a565b610fe8565b6040516105b49190613eb6565b60405180910390f35b3480156105c957600080fd5b506105d261105d565b005b3480156105e057600080fd5b506105fb60048036038101906105f691906133be565b61111c565b6040516106089190613eb6565b60405180910390f35b61062b600480360381019061062691906135a3565b6111b0565b005b34801561063957600080fd5b50610654600480360381019061064f9190613395565b611424565b005b60006106618261151c565b9050919050565b60606000805461067790614578565b80601f01602080910402602001604051908101604052809291908181526020018280546106a390614578565b80156106f05780601f106106c5576101008083540402835291602001916106f0565b820191906000526020600020905b8154815290600101906020018083116106d357829003601f168201915b5050505050905090565b600061070582611596565b610744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073b906141b3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078a82610aea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f290614213565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661081a611602565b73ffffffffffffffffffffffffffffffffffffffff161480610849575061084881610843611602565b61111c565b5b610888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087f906140d3565b60405180910390fd5b610892838361160a565b505050565b6000600880549050905090565b6108ac611602565b73ffffffffffffffffffffffffffffffffffffffff166108ca610d19565b73ffffffffffffffffffffffffffffffffffffffff1614610920576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610917906141d3565b60405180910390fd5b61092a82826116c3565b5050565b61093f610939611602565b82611737565b61097e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097590614253565b60405180910390fd5b610989838383611815565b505050565b600061099983610bd9565b82106109da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d190613f93565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a4e83838360405180602001604052806000815250610f74565b505050565b6000610a5d610897565b8210610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9590614293565b60405180910390fd5b60088281548110610ad8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90614113565b60405180910390fd5b80915050919050565b60008084848430604051602001610bb69493929190613da4565b604051602081830303815290604052805190602001209050809150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c41906140f3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c99611602565b73ffffffffffffffffffffffffffffffffffffffff16610cb7610d19565b73ffffffffffffffffffffffffffffffffffffffff1614610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d04906141d3565b60405180910390fd5b610d176000611a7c565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610d5290614578565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7e90614578565b8015610dcb5780601f10610da057610100808354040283529160200191610dcb565b820191906000526020600020905b815481529060010190602001808311610dae57829003601f168201915b5050505050905090565b610de7610de0611602565b8383611b42565b5050565b600e818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b610e2b8282610fe8565b610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6190614273565b60405180910390fd5b600e83604051610e7a9190613dee565b908152602001604051809103902060009054906101000a900460ff1615610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90613fd3565b60405180910390fd5b81610ee2338786610b9c565b14610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1990614233565b60405180910390fd5b6001600e84604051610f349190613dee565b908152602001604051809103902060006101000a81548160ff021916908315150217905550610f633386611caf565b610f6d85856116c3565b5050505050565b610f85610f7f611602565b83611737565b610fc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbb90614253565b60405180910390fd5b610fd084848484611ccd565b50505050565b6060610fe182611d29565b9050919050565b600061100582610ff785611e7b565b611eab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b611065611602565b73ffffffffffffffffffffffffffffffffffffffff16611083610d19565b73ffffffffffffffffffffffffffffffffffffffff16146110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d0906141d3565b60405180910390fd5b33600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111ba8282610fe8565b6111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f090614273565b60405180910390fd5b600e836040516112099190613dee565b908152602001604051809103902060009054906101000a900460ff1615611265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125c90613fd3565b60405180910390fd5b816112b233876000815181106112a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015186610b9c565b146112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990614233565b60405180910390fd5b6001600e846040516113049190613dee565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060005b855181101561141c5761137f33878381518110611372577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611caf565b6114098682815181106113bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518683815181106113fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516116c3565b8080611414906145db565b91505061132c565b505050505050565b61142c611602565b73ffffffffffffffffffffffffffffffffffffffff1661144a610d19565b73ffffffffffffffffffffffffffffffffffffffff16146114a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611497906141d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150790613ff3565b60405180910390fd5b61151981611a7c565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061158f575061158e82611ed2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661167d83610aea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6116cc82611596565b61170b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170290614133565b60405180910390fd5b80600a6000848152602001908152602001600020908051906020019061173292919061305e565b505050565b600061174282611596565b611781576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611778906140b3565b60405180910390fd5b600061178c83610aea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117ce57506117cd818561111c565b5b8061180c57508373ffffffffffffffffffffffffffffffffffffffff166117f4846106fa565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661183582610aea565b73ffffffffffffffffffffffffffffffffffffffff161461188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188290614013565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290614053565b60405180910390fd5b611906838383611fb4565b61191160008261160a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119619190614477565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119b891906143f0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a77838383611fc4565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba890614073565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ca29190613eb6565b60405180910390a3505050565b611cc9828260405180602001604052806000815250611fc9565b5050565b611cd8848484611815565b611ce484848484612024565b611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a90613fb3565b60405180910390fd5b50505050565b6060611d3482611596565b611d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6a90614193565b60405180910390fd5b6000600a60008481526020019081526020016000208054611d9390614578565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbf90614578565b8015611e0c5780601f10611de157610100808354040283529160200191611e0c565b820191906000526020600020905b815481529060010190602001808311611def57829003601f168201915b505050505090506000611e1d6121bb565b9050600081511415611e33578192505050611e76565b600082511115611e68578082604051602001611e50929190613e05565b60405160208183030381529060405292505050611e76565b611e71846121d2565b925050505b919050565b600081604051602001611e8e9190613e29565b604051602081830303815290604052805190602001209050919050565b6000806000611eba8585612279565b91509150611ec7816122fc565b819250505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fad5750611fac8261264d565b5b9050919050565b611fbf8383836126b7565b505050565b505050565b611fd383836127cb565b611fe06000848484612024565b61201f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201690613fb3565b60405180910390fd5b505050565b60006120458473ffffffffffffffffffffffffffffffffffffffff166129a5565b156121ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261206e611602565b8786866040518563ffffffff1660e01b81526004016120909493929190613e6a565b602060405180830381600087803b1580156120aa57600080fd5b505af19250505080156120db57506040513d601f19601f820116820180604052508101906120d891906136f7565b60015b61215e573d806000811461210b576040519150601f19603f3d011682016040523d82523d6000602084013e612110565b606091505b50600081511415612156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d90613fb3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121b3565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606121dd82611596565b61221c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612213906141f3565b60405180910390fd5b60006122266121bb565b905060008151116122465760405180602001604052806000815250612271565b80612250846129c8565b604051602001612261929190613e05565b6040516020818303038152906040525b915050919050565b6000806041835114156122bb5760008060006020860151925060408601519150606086015160001a90506122af87828585612b75565b945094505050506122f5565b6040835114156122ec5760008060208501519150604085015190506122e1868383612c82565b9350935050506122f5565b60006002915091505b9250929050565b60006004811115612336577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561236f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561237a5761264a565b600160048111156123b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156123ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561242e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242590613f53565b60405180910390fd5b60026004811115612468577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156124a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d990613f73565b60405180910390fd5b6003600481111561251c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612555577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258d90614093565b60405180910390fd5b6004808111156125cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612608577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264090614153565b60405180910390fd5b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126c2838383612ce1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127055761270081612ce6565b612744565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612743576127428382612d2f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127875761278281612e9c565b6127c6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146127c5576127c48282612fdf565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561283b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283290614173565b60405180910390fd5b61284481611596565b15612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287b90614033565b60405180910390fd5b61289060008383611fb4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e091906143f0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129a160008383611fc4565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612a10576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b70565b600082905060005b60008214612a42578080612a2b906145db565b915050600a82612a3b9190614446565b9150612a18565b60008167ffffffffffffffff811115612a84577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ab65781602001600182028036833780820191505090505b5090505b60008514612b6957600182612acf9190614477565b9150600a85612ade919061465c565b6030612aea91906143f0565b60f81b818381518110612b26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b629190614446565b9450612aba565b8093505050505b919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612bb0576000600391509150612c79565b601b8560ff1614158015612bc85750601c8560ff1614155b15612bda576000600491509150612c79565b600060018787878760405160008152602001604052604051612bff9493929190613eec565b6020604051602081039080840390855afa158015612c21573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c7057600060019250925050612c79565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c612cc591906143f0565b9050612cd387828885612b75565b935093505050935093915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d3c84610bd9565b612d469190614477565b9050600060076000848152602001908152602001600020549050818114612e2b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612eb09190614477565b9050600060096000848152602001908152602001600020549050600060088381548110612f06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612f4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612fc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612fea83610bd9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461306a90614578565b90600052602060002090601f01602090048101928261308c57600085556130d3565b82601f106130a557805160ff19168380011785556130d3565b828001600101855582156130d3579182015b828111156130d25782518255916020019190600101906130b7565b5b5090506130e091906130e4565b5090565b5b808211156130fd5760008160009055506001016130e5565b5090565b600061311461310f846142f3565b6142ce565b9050808382526020820190508285602086028201111561313357600080fd5b60005b8581101561317d57813567ffffffffffffffff81111561315557600080fd5b8086016131628982613356565b85526020850194506020840193505050600181019050613136565b5050509392505050565b600061319a6131958461431f565b6142ce565b905080838252602082019050828560208602820111156131b957600080fd5b60005b858110156131e957816131cf8882613380565b8452602084019350602083019250506001810190506131bc565b5050509392505050565b60006132066132018461434b565b6142ce565b90508281526020810184848401111561321e57600080fd5b613229848285614536565b509392505050565b600061324461323f8461437c565b6142ce565b90508281526020810184848401111561325c57600080fd5b613267848285614536565b509392505050565b60008135905061327e81614e8f565b92915050565b600082601f83011261329557600080fd5b81356132a5848260208601613101565b91505092915050565b600082601f8301126132bf57600080fd5b81356132cf848260208601613187565b91505092915050565b6000813590506132e781614ea6565b92915050565b6000813590506132fc81614ebd565b92915050565b60008135905061331181614ed4565b92915050565b60008151905061332681614ed4565b92915050565b600082601f83011261333d57600080fd5b813561334d8482602086016131f3565b91505092915050565b600082601f83011261336757600080fd5b8135613377848260208601613231565b91505092915050565b60008135905061338f81614eeb565b92915050565b6000602082840312156133a757600080fd5b60006133b58482850161326f565b91505092915050565b600080604083850312156133d157600080fd5b60006133df8582860161326f565b92505060206133f08582860161326f565b9150509250929050565b60008060006060848603121561340f57600080fd5b600061341d8682870161326f565b935050602061342e8682870161326f565b925050604061343f86828701613380565b9150509250925092565b6000806000806080858703121561345f57600080fd5b600061346d8782880161326f565b945050602061347e8782880161326f565b935050604061348f87828801613380565b925050606085013567ffffffffffffffff8111156134ac57600080fd5b6134b88782880161332c565b91505092959194509250565b600080604083850312156134d757600080fd5b60006134e58582860161326f565b92505060206134f6858286016132d8565b9150509250929050565b6000806040838503121561351357600080fd5b60006135218582860161326f565b925050602061353285828601613380565b9150509250929050565b60008060006060848603121561355157600080fd5b600061355f8682870161326f565b935050602061357086828701613380565b925050604084013567ffffffffffffffff81111561358d57600080fd5b61359986828701613356565b9150509250925092565b600080600080600060a086880312156135bb57600080fd5b600086013567ffffffffffffffff8111156135d557600080fd5b6135e1888289016132ae565b955050602086013567ffffffffffffffff8111156135fe57600080fd5b61360a88828901613284565b945050604086013567ffffffffffffffff81111561362757600080fd5b61363388828901613356565b9350506060613644888289016132ed565b925050608086013567ffffffffffffffff81111561366157600080fd5b61366d8882890161332c565b9150509295509295909350565b6000806040838503121561368d57600080fd5b600061369b858286016132ed565b925050602083013567ffffffffffffffff8111156136b857600080fd5b6136c48582860161332c565b9150509250929050565b6000602082840312156136e057600080fd5b60006136ee84828501613302565b91505092915050565b60006020828403121561370957600080fd5b600061371784828501613317565b91505092915050565b60006020828403121561373257600080fd5b600082013567ffffffffffffffff81111561374c57600080fd5b61375884828501613356565b91505092915050565b60006020828403121561377357600080fd5b600061378184828501613380565b91505092915050565b6000806040838503121561379d57600080fd5b60006137ab85828601613380565b925050602083013567ffffffffffffffff8111156137c857600080fd5b6137d485828601613356565b9150509250929050565b600080600080600060a086880312156137f657600080fd5b600061380488828901613380565b955050602086013567ffffffffffffffff81111561382157600080fd5b61382d88828901613356565b945050604086013567ffffffffffffffff81111561384a57600080fd5b61385688828901613356565b9350506060613867888289016132ed565b925050608086013567ffffffffffffffff81111561388457600080fd5b6138908882890161332c565b9150509295509295909350565b6138a6816144ab565b82525050565b6138bd6138b8826144ab565b614624565b82525050565b6138cc816144bd565b82525050565b6138db816144c9565b82525050565b6138f26138ed826144c9565b614636565b82525050565b6000613903826143ad565b61390d81856143c3565b935061391d818560208601614545565b61392681614749565b840191505092915050565b600061393c826143b8565b61394681856143d4565b9350613956818560208601614545565b61395f81614749565b840191505092915050565b6000613975826143b8565b61397f81856143e5565b935061398f818560208601614545565b80840191505092915050565b60006139a86018836143d4565b91506139b382614767565b602082019050919050565b60006139cb601f836143d4565b91506139d682614790565b602082019050919050565b60006139ee601c836143e5565b91506139f9826147b9565b601c82019050919050565b6000613a11602b836143d4565b9150613a1c826147e2565b604082019050919050565b6000613a346032836143d4565b9150613a3f82614831565b604082019050919050565b6000613a57600b836143d4565b9150613a6282614880565b602082019050919050565b6000613a7a6026836143d4565b9150613a85826148a9565b604082019050919050565b6000613a9d6025836143d4565b9150613aa8826148f8565b604082019050919050565b6000613ac0601c836143d4565b9150613acb82614947565b602082019050919050565b6000613ae36024836143d4565b9150613aee82614970565b604082019050919050565b6000613b066019836143d4565b9150613b11826149bf565b602082019050919050565b6000613b296022836143d4565b9150613b34826149e8565b604082019050919050565b6000613b4c602c836143d4565b9150613b5782614a37565b604082019050919050565b6000613b6f6038836143d4565b9150613b7a82614a86565b604082019050919050565b6000613b92602a836143d4565b9150613b9d82614ad5565b604082019050919050565b6000613bb56029836143d4565b9150613bc082614b24565b604082019050919050565b6000613bd8602e836143d4565b9150613be382614b73565b604082019050919050565b6000613bfb6022836143d4565b9150613c0682614bc2565b604082019050919050565b6000613c1e6020836143d4565b9150613c2982614c11565b602082019050919050565b6000613c416031836143d4565b9150613c4c82614c3a565b604082019050919050565b6000613c64602c836143d4565b9150613c6f82614c89565b604082019050919050565b6000613c876020836143d4565b9150613c9282614cd8565b602082019050919050565b6000613caa602f836143d4565b9150613cb582614d01565b604082019050919050565b6000613ccd6021836143d4565b9150613cd882614d50565b604082019050919050565b6000613cf0600b836143d4565b9150613cfb82614d9f565b602082019050919050565b6000613d136031836143d4565b9150613d1e82614dc8565b604082019050919050565b6000613d36601b836143d4565b9150613d4182614e17565b602082019050919050565b6000613d59602c836143d4565b9150613d6482614e40565b604082019050919050565b613d788161451f565b82525050565b613d8f613d8a8261451f565b614652565b82525050565b613d9e81614529565b82525050565b6000613db082876138ac565b601482019150613dc08286613d7e565b602082019150613dd0828561396a565b9150613ddc82846138ac565b60148201915081905095945050505050565b6000613dfa828461396a565b915081905092915050565b6000613e11828561396a565b9150613e1d828461396a565b91508190509392505050565b6000613e34826139e1565b9150613e4082846138e1565b60208201915081905092915050565b6000602082019050613e64600083018461389d565b92915050565b6000608082019050613e7f600083018761389d565b613e8c602083018661389d565b613e996040830185613d6f565b8181036060830152613eab81846138f8565b905095945050505050565b6000602082019050613ecb60008301846138c3565b92915050565b6000602082019050613ee660008301846138d2565b92915050565b6000608082019050613f0160008301876138d2565b613f0e6020830186613d95565b613f1b60408301856138d2565b613f2860608301846138d2565b95945050505050565b60006020820190508181036000830152613f4b8184613931565b905092915050565b60006020820190508181036000830152613f6c8161399b565b9050919050565b60006020820190508181036000830152613f8c816139be565b9050919050565b60006020820190508181036000830152613fac81613a04565b9050919050565b60006020820190508181036000830152613fcc81613a27565b9050919050565b60006020820190508181036000830152613fec81613a4a565b9050919050565b6000602082019050818103600083015261400c81613a6d565b9050919050565b6000602082019050818103600083015261402c81613a90565b9050919050565b6000602082019050818103600083015261404c81613ab3565b9050919050565b6000602082019050818103600083015261406c81613ad6565b9050919050565b6000602082019050818103600083015261408c81613af9565b9050919050565b600060208201905081810360008301526140ac81613b1c565b9050919050565b600060208201905081810360008301526140cc81613b3f565b9050919050565b600060208201905081810360008301526140ec81613b62565b9050919050565b6000602082019050818103600083015261410c81613b85565b9050919050565b6000602082019050818103600083015261412c81613ba8565b9050919050565b6000602082019050818103600083015261414c81613bcb565b9050919050565b6000602082019050818103600083015261416c81613bee565b9050919050565b6000602082019050818103600083015261418c81613c11565b9050919050565b600060208201905081810360008301526141ac81613c34565b9050919050565b600060208201905081810360008301526141cc81613c57565b9050919050565b600060208201905081810360008301526141ec81613c7a565b9050919050565b6000602082019050818103600083015261420c81613c9d565b9050919050565b6000602082019050818103600083015261422c81613cc0565b9050919050565b6000602082019050818103600083015261424c81613ce3565b9050919050565b6000602082019050818103600083015261426c81613d06565b9050919050565b6000602082019050818103600083015261428c81613d29565b9050919050565b600060208201905081810360008301526142ac81613d4c565b9050919050565b60006020820190506142c86000830184613d6f565b92915050565b60006142d86142e9565b90506142e482826145aa565b919050565b6000604051905090565b600067ffffffffffffffff82111561430e5761430d61471a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561433a5761433961471a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156143665761436561471a565b5b61436f82614749565b9050602081019050919050565b600067ffffffffffffffff8211156143975761439661471a565b5b6143a082614749565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143fb8261451f565b91506144068361451f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561443b5761443a61468d565b5b828201905092915050565b60006144518261451f565b915061445c8361451f565b92508261446c5761446b6146bc565b5b828204905092915050565b60006144828261451f565b915061448d8361451f565b9250828210156144a05761449f61468d565b5b828203905092915050565b60006144b6826144ff565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614563578082015181840152602081019050614548565b83811115614572576000848401525b50505050565b6000600282049050600182168061459057607f821691505b602082108114156145a4576145a36146eb565b5b50919050565b6145b382614749565b810181811067ffffffffffffffff821117156145d2576145d161471a565b5b80604052505050565b60006145e68261451f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146195761461861468d565b5b600182019050919050565b600061462f82614640565b9050919050565b6000819050919050565b600061464b8261475a565b9050919050565b6000819050919050565b60006146678261451f565b91506146728361451f565b925082614682576146816146bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4861736820726575736564000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f48617368206661696c6564000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f506c65617365206d696e74207468726f75676820776562736974650000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b614e98816144ab565b8114614ea357600080fd5b50565b614eaf816144bd565b8114614eba57600080fd5b50565b614ec6816144c9565b8114614ed157600080fd5b50565b614edd816144d3565b8114614ee857600080fd5b50565b614ef48161451f565b8114614eff57600080fd5b5056fea2646970667358221220cd8dcb9e5f9353f16c61b34b4bccb0798d92e8859fbe369b2b4bfab0d49d57c364736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101815760003560e01c8063715018a6116100d1578063b88d4fde1161008a578063e91a67e811610064578063e91a67e8146105bd578063e985e9c5146105d4578063ef844d1314610611578063f2fde38b1461062d57610181565b8063b88d4fde1461051a578063c87b56dd14610543578063dd8d74d81461058057610181565b8063715018a61461042b5780638da5cb5b1461044257806395d89b411461046d578063a22cb46514610498578063a6ba55c7146104c1578063b0c95cc3146104fe57610181565b806323b872dd1161013e5780634f6ccce7116101185780634f6ccce7146103375780636352211e1461037457806367717e2a146103b157806370a08231146103ee57610181565b806323b872dd146102a85780632f745c59146102d157806342842e0e1461030e57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806318e97fd11461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a891906136ce565b610656565b6040516101ba9190613eb6565b60405180910390f35b3480156101cf57600080fd5b506101d8610668565b6040516101e59190613f31565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190613761565b6106fa565b6040516102229190613e4f565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190613500565b61077f565b005b34801561026057600080fd5b50610269610897565b60405161027691906142b3565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a1919061378a565b6108a4565b005b3480156102b457600080fd5b506102cf60048036038101906102ca91906133fa565b61092e565b005b3480156102dd57600080fd5b506102f860048036038101906102f39190613500565b61098e565b60405161030591906142b3565b60405180910390f35b34801561031a57600080fd5b50610335600480360381019061033091906133fa565b610a33565b005b34801561034357600080fd5b5061035e60048036038101906103599190613761565b610a53565b60405161036b91906142b3565b60405180910390f35b34801561038057600080fd5b5061039b60048036038101906103969190613761565b610aea565b6040516103a89190613e4f565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d3919061353c565b610b9c565b6040516103e59190613ed1565b60405180910390f35b3480156103fa57600080fd5b5061041560048036038101906104109190613395565b610bd9565b60405161042291906142b3565b60405180910390f35b34801561043757600080fd5b50610440610c91565b005b34801561044e57600080fd5b50610457610d19565b6040516104649190613e4f565b60405180910390f35b34801561047957600080fd5b50610482610d43565b60405161048f9190613f31565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba91906134c4565b610dd5565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190613720565b610deb565b6040516104f59190613eb6565b60405180910390f35b610518600480360381019061051391906137de565b610e21565b005b34801561052657600080fd5b50610541600480360381019061053c9190613449565b610f74565b005b34801561054f57600080fd5b5061056a60048036038101906105659190613761565b610fd6565b6040516105779190613f31565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a2919061367a565b610fe8565b6040516105b49190613eb6565b60405180910390f35b3480156105c957600080fd5b506105d261105d565b005b3480156105e057600080fd5b506105fb60048036038101906105f691906133be565b61111c565b6040516106089190613eb6565b60405180910390f35b61062b600480360381019061062691906135a3565b6111b0565b005b34801561063957600080fd5b50610654600480360381019061064f9190613395565b611424565b005b60006106618261151c565b9050919050565b60606000805461067790614578565b80601f01602080910402602001604051908101604052809291908181526020018280546106a390614578565b80156106f05780601f106106c5576101008083540402835291602001916106f0565b820191906000526020600020905b8154815290600101906020018083116106d357829003601f168201915b5050505050905090565b600061070582611596565b610744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073b906141b3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078a82610aea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f290614213565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661081a611602565b73ffffffffffffffffffffffffffffffffffffffff161480610849575061084881610843611602565b61111c565b5b610888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087f906140d3565b60405180910390fd5b610892838361160a565b505050565b6000600880549050905090565b6108ac611602565b73ffffffffffffffffffffffffffffffffffffffff166108ca610d19565b73ffffffffffffffffffffffffffffffffffffffff1614610920576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610917906141d3565b60405180910390fd5b61092a82826116c3565b5050565b61093f610939611602565b82611737565b61097e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097590614253565b60405180910390fd5b610989838383611815565b505050565b600061099983610bd9565b82106109da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d190613f93565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a4e83838360405180602001604052806000815250610f74565b505050565b6000610a5d610897565b8210610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9590614293565b60405180910390fd5b60088281548110610ad8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90614113565b60405180910390fd5b80915050919050565b60008084848430604051602001610bb69493929190613da4565b604051602081830303815290604052805190602001209050809150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c41906140f3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c99611602565b73ffffffffffffffffffffffffffffffffffffffff16610cb7610d19565b73ffffffffffffffffffffffffffffffffffffffff1614610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d04906141d3565b60405180910390fd5b610d176000611a7c565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610d5290614578565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7e90614578565b8015610dcb5780601f10610da057610100808354040283529160200191610dcb565b820191906000526020600020905b815481529060010190602001808311610dae57829003601f168201915b5050505050905090565b610de7610de0611602565b8383611b42565b5050565b600e818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b610e2b8282610fe8565b610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6190614273565b60405180910390fd5b600e83604051610e7a9190613dee565b908152602001604051809103902060009054906101000a900460ff1615610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90613fd3565b60405180910390fd5b81610ee2338786610b9c565b14610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1990614233565b60405180910390fd5b6001600e84604051610f349190613dee565b908152602001604051809103902060006101000a81548160ff021916908315150217905550610f633386611caf565b610f6d85856116c3565b5050505050565b610f85610f7f611602565b83611737565b610fc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbb90614253565b60405180910390fd5b610fd084848484611ccd565b50505050565b6060610fe182611d29565b9050919050565b600061100582610ff785611e7b565b611eab90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b611065611602565b73ffffffffffffffffffffffffffffffffffffffff16611083610d19565b73ffffffffffffffffffffffffffffffffffffffff16146110d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d0906141d3565b60405180910390fd5b33600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111ba8282610fe8565b6111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f090614273565b60405180910390fd5b600e836040516112099190613dee565b908152602001604051809103902060009054906101000a900460ff1615611265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125c90613fd3565b60405180910390fd5b816112b233876000815181106112a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015186610b9c565b146112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990614233565b60405180910390fd5b6001600e846040516113049190613dee565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060005b855181101561141c5761137f33878381518110611372577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611caf565b6114098682815181106113bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518683815181106113fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516116c3565b8080611414906145db565b91505061132c565b505050505050565b61142c611602565b73ffffffffffffffffffffffffffffffffffffffff1661144a610d19565b73ffffffffffffffffffffffffffffffffffffffff16146114a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611497906141d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150790613ff3565b60405180910390fd5b61151981611a7c565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061158f575061158e82611ed2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661167d83610aea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6116cc82611596565b61170b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170290614133565b60405180910390fd5b80600a6000848152602001908152602001600020908051906020019061173292919061305e565b505050565b600061174282611596565b611781576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611778906140b3565b60405180910390fd5b600061178c83610aea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117ce57506117cd818561111c565b5b8061180c57508373ffffffffffffffffffffffffffffffffffffffff166117f4846106fa565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661183582610aea565b73ffffffffffffffffffffffffffffffffffffffff161461188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188290614013565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290614053565b60405180910390fd5b611906838383611fb4565b61191160008261160a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119619190614477565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119b891906143f0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a77838383611fc4565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba890614073565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ca29190613eb6565b60405180910390a3505050565b611cc9828260405180602001604052806000815250611fc9565b5050565b611cd8848484611815565b611ce484848484612024565b611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a90613fb3565b60405180910390fd5b50505050565b6060611d3482611596565b611d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6a90614193565b60405180910390fd5b6000600a60008481526020019081526020016000208054611d9390614578565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbf90614578565b8015611e0c5780601f10611de157610100808354040283529160200191611e0c565b820191906000526020600020905b815481529060010190602001808311611def57829003601f168201915b505050505090506000611e1d6121bb565b9050600081511415611e33578192505050611e76565b600082511115611e68578082604051602001611e50929190613e05565b60405160208183030381529060405292505050611e76565b611e71846121d2565b925050505b919050565b600081604051602001611e8e9190613e29565b604051602081830303815290604052805190602001209050919050565b6000806000611eba8585612279565b91509150611ec7816122fc565b819250505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fad5750611fac8261264d565b5b9050919050565b611fbf8383836126b7565b505050565b505050565b611fd383836127cb565b611fe06000848484612024565b61201f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201690613fb3565b60405180910390fd5b505050565b60006120458473ffffffffffffffffffffffffffffffffffffffff166129a5565b156121ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261206e611602565b8786866040518563ffffffff1660e01b81526004016120909493929190613e6a565b602060405180830381600087803b1580156120aa57600080fd5b505af19250505080156120db57506040513d601f19601f820116820180604052508101906120d891906136f7565b60015b61215e573d806000811461210b576040519150601f19603f3d011682016040523d82523d6000602084013e612110565b606091505b50600081511415612156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214d90613fb3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121b3565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606121dd82611596565b61221c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612213906141f3565b60405180910390fd5b60006122266121bb565b905060008151116122465760405180602001604052806000815250612271565b80612250846129c8565b604051602001612261929190613e05565b6040516020818303038152906040525b915050919050565b6000806041835114156122bb5760008060006020860151925060408601519150606086015160001a90506122af87828585612b75565b945094505050506122f5565b6040835114156122ec5760008060208501519150604085015190506122e1868383612c82565b9350935050506122f5565b60006002915091505b9250929050565b60006004811115612336577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561236f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561237a5761264a565b600160048111156123b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156123ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561242e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242590613f53565b60405180910390fd5b60026004811115612468577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156124a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d990613f73565b60405180910390fd5b6003600481111561251c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612555577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258d90614093565b60405180910390fd5b6004808111156125cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612608577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264090614153565b60405180910390fd5b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126c2838383612ce1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127055761270081612ce6565b612744565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612743576127428382612d2f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127875761278281612e9c565b6127c6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146127c5576127c48282612fdf565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561283b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283290614173565b60405180910390fd5b61284481611596565b15612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287b90614033565b60405180910390fd5b61289060008383611fb4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e091906143f0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129a160008383611fc4565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612a10576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b70565b600082905060005b60008214612a42578080612a2b906145db565b915050600a82612a3b9190614446565b9150612a18565b60008167ffffffffffffffff811115612a84577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ab65781602001600182028036833780820191505090505b5090505b60008514612b6957600182612acf9190614477565b9150600a85612ade919061465c565b6030612aea91906143f0565b60f81b818381518110612b26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b629190614446565b9450612aba565b8093505050505b919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612bb0576000600391509150612c79565b601b8560ff1614158015612bc85750601c8560ff1614155b15612bda576000600491509150612c79565b600060018787878760405160008152602001604052604051612bff9493929190613eec565b6020604051602081039080840390855afa158015612c21573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c7057600060019250925050612c79565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c612cc591906143f0565b9050612cd387828885612b75565b935093505050935093915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d3c84610bd9565b612d469190614477565b9050600060076000848152602001908152602001600020549050818114612e2b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612eb09190614477565b9050600060096000848152602001908152602001600020549050600060088381548110612f06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612f4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612fc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612fea83610bd9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461306a90614578565b90600052602060002090601f01602090048101928261308c57600085556130d3565b82601f106130a557805160ff19168380011785556130d3565b828001600101855582156130d3579182015b828111156130d25782518255916020019190600101906130b7565b5b5090506130e091906130e4565b5090565b5b808211156130fd5760008160009055506001016130e5565b5090565b600061311461310f846142f3565b6142ce565b9050808382526020820190508285602086028201111561313357600080fd5b60005b8581101561317d57813567ffffffffffffffff81111561315557600080fd5b8086016131628982613356565b85526020850194506020840193505050600181019050613136565b5050509392505050565b600061319a6131958461431f565b6142ce565b905080838252602082019050828560208602820111156131b957600080fd5b60005b858110156131e957816131cf8882613380565b8452602084019350602083019250506001810190506131bc565b5050509392505050565b60006132066132018461434b565b6142ce565b90508281526020810184848401111561321e57600080fd5b613229848285614536565b509392505050565b600061324461323f8461437c565b6142ce565b90508281526020810184848401111561325c57600080fd5b613267848285614536565b509392505050565b60008135905061327e81614e8f565b92915050565b600082601f83011261329557600080fd5b81356132a5848260208601613101565b91505092915050565b600082601f8301126132bf57600080fd5b81356132cf848260208601613187565b91505092915050565b6000813590506132e781614ea6565b92915050565b6000813590506132fc81614ebd565b92915050565b60008135905061331181614ed4565b92915050565b60008151905061332681614ed4565b92915050565b600082601f83011261333d57600080fd5b813561334d8482602086016131f3565b91505092915050565b600082601f83011261336757600080fd5b8135613377848260208601613231565b91505092915050565b60008135905061338f81614eeb565b92915050565b6000602082840312156133a757600080fd5b60006133b58482850161326f565b91505092915050565b600080604083850312156133d157600080fd5b60006133df8582860161326f565b92505060206133f08582860161326f565b9150509250929050565b60008060006060848603121561340f57600080fd5b600061341d8682870161326f565b935050602061342e8682870161326f565b925050604061343f86828701613380565b9150509250925092565b6000806000806080858703121561345f57600080fd5b600061346d8782880161326f565b945050602061347e8782880161326f565b935050604061348f87828801613380565b925050606085013567ffffffffffffffff8111156134ac57600080fd5b6134b88782880161332c565b91505092959194509250565b600080604083850312156134d757600080fd5b60006134e58582860161326f565b92505060206134f6858286016132d8565b9150509250929050565b6000806040838503121561351357600080fd5b60006135218582860161326f565b925050602061353285828601613380565b9150509250929050565b60008060006060848603121561355157600080fd5b600061355f8682870161326f565b935050602061357086828701613380565b925050604084013567ffffffffffffffff81111561358d57600080fd5b61359986828701613356565b9150509250925092565b600080600080600060a086880312156135bb57600080fd5b600086013567ffffffffffffffff8111156135d557600080fd5b6135e1888289016132ae565b955050602086013567ffffffffffffffff8111156135fe57600080fd5b61360a88828901613284565b945050604086013567ffffffffffffffff81111561362757600080fd5b61363388828901613356565b9350506060613644888289016132ed565b925050608086013567ffffffffffffffff81111561366157600080fd5b61366d8882890161332c565b9150509295509295909350565b6000806040838503121561368d57600080fd5b600061369b858286016132ed565b925050602083013567ffffffffffffffff8111156136b857600080fd5b6136c48582860161332c565b9150509250929050565b6000602082840312156136e057600080fd5b60006136ee84828501613302565b91505092915050565b60006020828403121561370957600080fd5b600061371784828501613317565b91505092915050565b60006020828403121561373257600080fd5b600082013567ffffffffffffffff81111561374c57600080fd5b61375884828501613356565b91505092915050565b60006020828403121561377357600080fd5b600061378184828501613380565b91505092915050565b6000806040838503121561379d57600080fd5b60006137ab85828601613380565b925050602083013567ffffffffffffffff8111156137c857600080fd5b6137d485828601613356565b9150509250929050565b600080600080600060a086880312156137f657600080fd5b600061380488828901613380565b955050602086013567ffffffffffffffff81111561382157600080fd5b61382d88828901613356565b945050604086013567ffffffffffffffff81111561384a57600080fd5b61385688828901613356565b9350506060613867888289016132ed565b925050608086013567ffffffffffffffff81111561388457600080fd5b6138908882890161332c565b9150509295509295909350565b6138a6816144ab565b82525050565b6138bd6138b8826144ab565b614624565b82525050565b6138cc816144bd565b82525050565b6138db816144c9565b82525050565b6138f26138ed826144c9565b614636565b82525050565b6000613903826143ad565b61390d81856143c3565b935061391d818560208601614545565b61392681614749565b840191505092915050565b600061393c826143b8565b61394681856143d4565b9350613956818560208601614545565b61395f81614749565b840191505092915050565b6000613975826143b8565b61397f81856143e5565b935061398f818560208601614545565b80840191505092915050565b60006139a86018836143d4565b91506139b382614767565b602082019050919050565b60006139cb601f836143d4565b91506139d682614790565b602082019050919050565b60006139ee601c836143e5565b91506139f9826147b9565b601c82019050919050565b6000613a11602b836143d4565b9150613a1c826147e2565b604082019050919050565b6000613a346032836143d4565b9150613a3f82614831565b604082019050919050565b6000613a57600b836143d4565b9150613a6282614880565b602082019050919050565b6000613a7a6026836143d4565b9150613a85826148a9565b604082019050919050565b6000613a9d6025836143d4565b9150613aa8826148f8565b604082019050919050565b6000613ac0601c836143d4565b9150613acb82614947565b602082019050919050565b6000613ae36024836143d4565b9150613aee82614970565b604082019050919050565b6000613b066019836143d4565b9150613b11826149bf565b602082019050919050565b6000613b296022836143d4565b9150613b34826149e8565b604082019050919050565b6000613b4c602c836143d4565b9150613b5782614a37565b604082019050919050565b6000613b6f6038836143d4565b9150613b7a82614a86565b604082019050919050565b6000613b92602a836143d4565b9150613b9d82614ad5565b604082019050919050565b6000613bb56029836143d4565b9150613bc082614b24565b604082019050919050565b6000613bd8602e836143d4565b9150613be382614b73565b604082019050919050565b6000613bfb6022836143d4565b9150613c0682614bc2565b604082019050919050565b6000613c1e6020836143d4565b9150613c2982614c11565b602082019050919050565b6000613c416031836143d4565b9150613c4c82614c3a565b604082019050919050565b6000613c64602c836143d4565b9150613c6f82614c89565b604082019050919050565b6000613c876020836143d4565b9150613c9282614cd8565b602082019050919050565b6000613caa602f836143d4565b9150613cb582614d01565b604082019050919050565b6000613ccd6021836143d4565b9150613cd882614d50565b604082019050919050565b6000613cf0600b836143d4565b9150613cfb82614d9f565b602082019050919050565b6000613d136031836143d4565b9150613d1e82614dc8565b604082019050919050565b6000613d36601b836143d4565b9150613d4182614e17565b602082019050919050565b6000613d59602c836143d4565b9150613d6482614e40565b604082019050919050565b613d788161451f565b82525050565b613d8f613d8a8261451f565b614652565b82525050565b613d9e81614529565b82525050565b6000613db082876138ac565b601482019150613dc08286613d7e565b602082019150613dd0828561396a565b9150613ddc82846138ac565b60148201915081905095945050505050565b6000613dfa828461396a565b915081905092915050565b6000613e11828561396a565b9150613e1d828461396a565b91508190509392505050565b6000613e34826139e1565b9150613e4082846138e1565b60208201915081905092915050565b6000602082019050613e64600083018461389d565b92915050565b6000608082019050613e7f600083018761389d565b613e8c602083018661389d565b613e996040830185613d6f565b8181036060830152613eab81846138f8565b905095945050505050565b6000602082019050613ecb60008301846138c3565b92915050565b6000602082019050613ee660008301846138d2565b92915050565b6000608082019050613f0160008301876138d2565b613f0e6020830186613d95565b613f1b60408301856138d2565b613f2860608301846138d2565b95945050505050565b60006020820190508181036000830152613f4b8184613931565b905092915050565b60006020820190508181036000830152613f6c8161399b565b9050919050565b60006020820190508181036000830152613f8c816139be565b9050919050565b60006020820190508181036000830152613fac81613a04565b9050919050565b60006020820190508181036000830152613fcc81613a27565b9050919050565b60006020820190508181036000830152613fec81613a4a565b9050919050565b6000602082019050818103600083015261400c81613a6d565b9050919050565b6000602082019050818103600083015261402c81613a90565b9050919050565b6000602082019050818103600083015261404c81613ab3565b9050919050565b6000602082019050818103600083015261406c81613ad6565b9050919050565b6000602082019050818103600083015261408c81613af9565b9050919050565b600060208201905081810360008301526140ac81613b1c565b9050919050565b600060208201905081810360008301526140cc81613b3f565b9050919050565b600060208201905081810360008301526140ec81613b62565b9050919050565b6000602082019050818103600083015261410c81613b85565b9050919050565b6000602082019050818103600083015261412c81613ba8565b9050919050565b6000602082019050818103600083015261414c81613bcb565b9050919050565b6000602082019050818103600083015261416c81613bee565b9050919050565b6000602082019050818103600083015261418c81613c11565b9050919050565b600060208201905081810360008301526141ac81613c34565b9050919050565b600060208201905081810360008301526141cc81613c57565b9050919050565b600060208201905081810360008301526141ec81613c7a565b9050919050565b6000602082019050818103600083015261420c81613c9d565b9050919050565b6000602082019050818103600083015261422c81613cc0565b9050919050565b6000602082019050818103600083015261424c81613ce3565b9050919050565b6000602082019050818103600083015261426c81613d06565b9050919050565b6000602082019050818103600083015261428c81613d29565b9050919050565b600060208201905081810360008301526142ac81613d4c565b9050919050565b60006020820190506142c86000830184613d6f565b92915050565b60006142d86142e9565b90506142e482826145aa565b919050565b6000604051905090565b600067ffffffffffffffff82111561430e5761430d61471a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561433a5761433961471a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156143665761436561471a565b5b61436f82614749565b9050602081019050919050565b600067ffffffffffffffff8211156143975761439661471a565b5b6143a082614749565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143fb8261451f565b91506144068361451f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561443b5761443a61468d565b5b828201905092915050565b60006144518261451f565b915061445c8361451f565b92508261446c5761446b6146bc565b5b828204905092915050565b60006144828261451f565b915061448d8361451f565b9250828210156144a05761449f61468d565b5b828203905092915050565b60006144b6826144ff565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614563578082015181840152602081019050614548565b83811115614572576000848401525b50505050565b6000600282049050600182168061459057607f821691505b602082108114156145a4576145a36146eb565b5b50919050565b6145b382614749565b810181811067ffffffffffffffff821117156145d2576145d161471a565b5b80604052505050565b60006145e68261451f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146195761461861468d565b5b600182019050919050565b600061462f82614640565b9050919050565b6000819050919050565b600061464b8261475a565b9050919050565b6000819050919050565b60006146678261451f565b91506146728361451f565b925082614682576146816146bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4861736820726575736564000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f48617368206661696c6564000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f506c65617365206d696e74207468726f75676820776562736974650000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b614e98816144ab565b8114614ea357600080fd5b50565b614eaf816144bd565b8114614eba57600080fd5b50565b614ec6816144c9565b8114614ed157600080fd5b50565b614edd816144d3565b8114614ee857600080fd5b50565b614ef48161451f565b8114614eff57600080fd5b5056fea2646970667358221220cd8dcb9e5f9353f16c61b34b4bccb0798d92e8859fbe369b2b4bfab0d49d57c364736f6c63430008040033

Deployed Bytecode Sourcemap

57209:2737:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59772:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35802:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37362:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36885:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51628:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59097:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38112:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51296:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38522:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51818:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35496:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58723:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35226:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14360:103;;;;;;;;;;;;;:::i;:::-;;13709:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35971:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37655:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57381:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57492:480;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38778:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59609:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58537:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58998:91;;;;;;;;;;;;;:::i;:::-;;37881:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57980:549;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14618:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59772:171;59875:4;59899:36;59923:11;59899:23;:36::i;:::-;59892:43;;59772:171;;;:::o;35802:100::-;35856:13;35889:5;35882:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35802:100;:::o;37362:221::-;37438:7;37466:16;37474:7;37466;:16::i;:::-;37458:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37551:15;:24;37567:7;37551:24;;;;;;;;;;;;;;;;;;;;;37544:31;;37362:221;;;:::o;36885:411::-;36966:13;36982:23;36997:7;36982:14;:23::i;:::-;36966:39;;37030:5;37024:11;;:2;:11;;;;37016:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;37124:5;37108:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;37133:37;37150:5;37157:12;:10;:12::i;:::-;37133:16;:37::i;:::-;37108:62;37086:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;37267:21;37276:2;37280:7;37267:8;:21::i;:::-;36885:411;;;:::o;51628:113::-;51689:7;51716:10;:17;;;;51709:24;;51628:113;:::o;59097:124::-;13940:12;:10;:12::i;:::-;13929:23;;:7;:5;:7::i;:::-;:23;;;13921:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59186:27:::1;59199:7;59208:4;59186:12;:27::i;:::-;59097:124:::0;;:::o;38112:339::-;38307:41;38326:12;:10;:12::i;:::-;38340:7;38307:18;:41::i;:::-;38299:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38415:28;38425:4;38431:2;38435:7;38415:9;:28::i;:::-;38112:339;;;:::o;51296:256::-;51393:7;51429:23;51446:5;51429:16;:23::i;:::-;51421:5;:31;51413:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;51518:12;:19;51531:5;51518:19;;;;;;;;;;;;;;;:26;51538:5;51518:26;;;;;;;;;;;;51511:33;;51296:256;;;;:::o;38522:185::-;38660:39;38677:4;38683:2;38687:7;38660:39;;;;;;;;;;;;:16;:39::i;:::-;38522:185;;;:::o;51818:233::-;51893:7;51929:30;:28;:30::i;:::-;51921:5;:38;51913:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;52026:10;52037:5;52026:17;;;;;;;;;;;;;;;;;;;;;;;;52019:24;;51818:233;;;:::o;35496:239::-;35568:7;35588:13;35604:7;:16;35612:7;35604:16;;;;;;;;;;;;;;;;;;;;;35588:32;;35656:1;35639:19;;:5;:19;;;;35631:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35722:5;35715:12;;;35496:239;;;:::o;58723:267::-;58857:7;58877:12;58920:6;58928:7;58937:5;58952:4;58903:55;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58892:68;;;;;;58877:83;;58978:4;58971:11;;;58723:267;;;;;:::o;35226:208::-;35298:7;35343:1;35326:19;;:5;:19;;;;35318:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;35410:9;:16;35420:5;35410:16;;;;;;;;;;;;;;;;35403:23;;35226:208;;;:::o;14360:103::-;13940:12;:10;:12::i;:::-;13929:23;;:7;:5;:7::i;:::-;:23;;;13921:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14425:30:::1;14452:1;14425:18;:30::i;:::-;14360:103::o:0;13709:87::-;13755:7;13782:6;;;;;;;;;;;13775:13;;13709:87;:::o;35971:104::-;36027:13;36060:7;36053:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35971:104;:::o;37655:155::-;37750:52;37769:12;:10;:12::i;:::-;37783:8;37793;37750:18;:52::i;:::-;37655:155;;:::o;57381:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57492:480::-;57639:28;57651:4;57657:9;57639:11;:28::i;:::-;57631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57719:11;57731:5;57719:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;57718:19;57710:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;57820:4;57773:43;57789:10;57801:7;57810:5;57773:15;:43::i;:::-;:51;57764:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57872:4;57851:11;57863:5;57851:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;57897:30;57907:10;57919:7;57897:9;:30::i;:::-;57938:26;57951:7;57960:3;57938:12;:26::i;:::-;57492:480;;;;;:::o;38778:328::-;38953:41;38972:12;:10;:12::i;:::-;38986:7;38953:18;:41::i;:::-;38945:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39059:39;39073:4;39079:2;39083:7;39092:5;39059:13;:39::i;:::-;38778:328;;;;:::o;59609:155::-;59700:13;59733:23;59748:7;59733:14;:23::i;:::-;59726:30;;59609:155;;;:::o;58537:178::-;58617:4;58659:48;58697:9;58659:29;:4;:27;:29::i;:::-;:37;;:48;;;;:::i;:::-;58641:66;;:14;;;;;;;;;;;:66;;;58634:73;;58537:178;;;;:::o;58998:91::-;13940:12;:10;:12::i;:::-;13929:23;;:7;:5;:7::i;:::-;:23;;;13921:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59071:10:::1;59054:14;;:27;;;;;;;;;;;;;;;;;;58998:91::o:0;37881:164::-;37978:4;38002:18;:25;38021:5;38002:25;;;;;;;;;;;;;;;:35;38028:8;38002:35;;;;;;;;;;;;;;;;;;;;;;;;;37995:42;;37881:164;;;;:::o;57980:549::-;58133:28;58145:4;58151:9;58133:11;:28::i;:::-;58125:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58213:11;58225:5;58213:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;58212:19;58204:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;58312:4;58266:42;58282:10;58294:3;58298:1;58294:6;;;;;;;;;;;;;;;;;;;;;;58302:5;58266:15;:42::i;:::-;:50;58258:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;58364:4;58343:11;58355:5;58343:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;58386:9;58381:141;58405:3;:10;58401:1;:14;58381:141;;;58437:29;58447:10;58459:3;58463:1;58459:6;;;;;;;;;;;;;;;;;;;;;;58437:9;:29::i;:::-;58481;58494:3;58498:1;58494:6;;;;;;;;;;;;;;;;;;;;;;58502:4;58507:1;58502:7;;;;;;;;;;;;;;;;;;;;;;58481:12;:29::i;:::-;58417:3;;;;;:::i;:::-;;;;58381:141;;;;57980:549;;;;;:::o;14618:201::-;13940:12;:10;:12::i;:::-;13929:23;;:7;:5;:7::i;:::-;:23;;;13921:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14727:1:::1;14707:22;;:8;:22;;;;14699:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14783:28;14802:8;14783:18;:28::i;:::-;14618:201:::0;:::o;50988:224::-;51090:4;51129:35;51114:50;;;:11;:50;;;;:90;;;;51168:36;51192:11;51168:23;:36::i;:::-;51114:90;51107:97;;50988:224;;;:::o;40616:127::-;40681:4;40733:1;40705:30;;:7;:16;40713:7;40705:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40698:37;;40616:127;;;:::o;12433:98::-;12486:7;12513:10;12506:17;;12433:98;:::o;44762:174::-;44864:2;44837:15;:24;44853:7;44837:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44920:7;44916:2;44882:46;;44891:23;44906:7;44891:14;:23::i;:::-;44882:46;;;;;;;;;;;;44762:174;;:::o;49318:217::-;49418:16;49426:7;49418;:16::i;:::-;49410:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;49518:9;49496:10;:19;49507:7;49496:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;49318:217;;:::o;40910:348::-;41003:4;41028:16;41036:7;41028;:16::i;:::-;41020:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41104:13;41120:23;41135:7;41120:14;:23::i;:::-;41104:39;;41173:5;41162:16;;:7;:16;;;:52;;;;41182:32;41199:5;41206:7;41182:16;:32::i;:::-;41162:52;:87;;;;41242:7;41218:31;;:20;41230:7;41218:11;:20::i;:::-;:31;;;41162:87;41154:96;;;40910:348;;;;:::o;44019:625::-;44178:4;44151:31;;:23;44166:7;44151:14;:23::i;:::-;:31;;;44143:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;44257:1;44243:16;;:2;:16;;;;44235:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44313:39;44334:4;44340:2;44344:7;44313:20;:39::i;:::-;44417:29;44434:1;44438:7;44417:8;:29::i;:::-;44478:1;44459:9;:15;44469:4;44459:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;44507:1;44490:9;:13;44500:2;44490:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44538:2;44519:7;:16;44527:7;44519:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44577:7;44573:2;44558:27;;44567:4;44558:27;;;;;;;;;;;;44598:38;44618:4;44624:2;44628:7;44598:19;:38::i;:::-;44019:625;;;:::o;14979:191::-;15053:16;15072:6;;;;;;;;;;;15053:25;;15098:8;15089:6;;:17;;;;;;;;;;;;;;;;;;15153:8;15122:40;;15143:8;15122:40;;;;;;;;;;;;14979:191;;:::o;45078:315::-;45233:8;45224:17;;:5;:17;;;;45216:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45320:8;45282:18;:25;45301:5;45282:25;;;;;;;;;;;;;;;:35;45308:8;45282:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45366:8;45344:41;;45359:5;45344:41;;;45376:8;45344:41;;;;;;:::i;:::-;;;;;;;;45078:315;;;:::o;41600:110::-;41676:26;41686:2;41690:7;41676:26;;;;;;;;;;;;:9;:26::i;:::-;41600:110;;:::o;39988:315::-;40145:28;40155:4;40161:2;40165:7;40145:9;:28::i;:::-;40192:48;40215:4;40221:2;40225:7;40234:5;40192:22;:48::i;:::-;40184:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39988:315;;;;:::o;48483:679::-;48556:13;48590:16;48598:7;48590;:16::i;:::-;48582:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;48673:23;48699:10;:19;48710:7;48699:19;;;;;;;;;;;48673:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48729:18;48750:10;:8;:10::i;:::-;48729:31;;48858:1;48842:4;48836:18;:23;48832:72;;;48883:9;48876:16;;;;;;48832:72;49034:1;49014:9;49008:23;:27;49004:108;;;49083:4;49089:9;49066:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49052:48;;;;;;49004:108;49131:23;49146:7;49131:14;:23::i;:::-;49124:30;;;;48483:679;;;;:::o;10439:269::-;10508:7;10694:4;10641:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;10631:69;;;;;;10624:76;;10439:269;;;:::o;6637:231::-;6715:7;6736:17;6755:18;6777:27;6788:4;6794:9;6777:10;:27::i;:::-;6735:69;;;;6815:18;6827:5;6815:11;:18::i;:::-;6851:9;6844:16;;;;6637:231;;;;:::o;34857:305::-;34959:4;35011:25;34996:40;;;:11;:40;;;;:105;;;;35068:33;35053:48;;;:11;:48;;;;34996:105;:158;;;;35118:36;35142:11;35118:23;:36::i;:::-;34996:158;34976:178;;34857:305;;;:::o;59297:181::-;59425:45;59452:4;59458:2;59462:7;59425:26;:45::i;:::-;59297:181;;;:::o;47840:125::-;;;;:::o;41937:321::-;42067:18;42073:2;42077:7;42067:5;:18::i;:::-;42118:54;42149:1;42153:2;42157:7;42166:5;42118:22;:54::i;:::-;42096:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41937:321;;;:::o;45958:799::-;46113:4;46134:15;:2;:13;;;:15::i;:::-;46130:620;;;46186:2;46170:36;;;46207:12;:10;:12::i;:::-;46221:4;46227:7;46236:5;46170:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46166:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46429:1;46412:6;:13;:18;46408:272;;;46455:60;;;;;;;;;;:::i;:::-;;;;;;;;46408:272;46630:6;46624:13;46615:6;46611:2;46607:15;46600:38;46166:529;46303:41;;;46293:51;;;:6;:51;;;;46286:58;;;;;46130:620;46734:4;46727:11;;45958:799;;;;;;;:::o;36729:94::-;36780:13;36806:9;;;;;;;;;;;;;;36729:94;:::o;36146:334::-;36219:13;36253:16;36261:7;36253;:16::i;:::-;36245:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;36334:21;36358:10;:8;:10::i;:::-;36334:34;;36410:1;36392:7;36386:21;:25;:86;;;;;;;;;;;;;;;;;36438:7;36447:18;:7;:16;:18::i;:::-;36421:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36386:86;36379:93;;;36146:334;;;:::o;4431:1404::-;4512:7;4521:12;4766:2;4746:9;:16;:22;4742:1086;;;4785:9;4809;4833:7;5090:4;5079:9;5075:20;5069:27;5064:32;;5140:4;5129:9;5125:20;5119:27;5114:32;;5198:4;5187:9;5183:20;5177:27;5174:1;5169:36;5164:41;;5241:25;5252:4;5258:1;5261;5264;5241:10;:25::i;:::-;5234:32;;;;;;;;;4742:1086;5308:2;5288:9;:16;:22;5284:544;;;5327:9;5351:10;5611:4;5600:9;5596:20;5590:27;5585:32;;5662:4;5651:9;5647:20;5641:27;5635:33;;5704:23;5715:4;5721:1;5724:2;5704:10;:23::i;:::-;5697:30;;;;;;;;5284:544;5776:1;5780:35;5760:56;;;;4431:1404;;;;;;:::o;2702:643::-;2780:20;2771:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;2767:571;;;2817:7;;2767:571;2878:29;2869:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;2865:473;;;2924:34;;;;;;;;;;:::i;:::-;;;;;;;;2865:473;2989:35;2980:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;2976:362;;;3041:41;;;;;;;;;;:::i;:::-;;;;;;;;2976:362;3113:30;3104:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;3100:238;;;3160:44;;;;;;;;;;:::i;:::-;;;;;;;;3100:238;3235:30;3226:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;3222:116;;;3282:44;;;;;;;;;;:::i;:::-;;;;;;;;3222:116;2702:643;;:::o;26516:157::-;26601:4;26640:25;26625:40;;;:11;:40;;;;26618:47;;26516:157;;;:::o;52664:589::-;52808:45;52835:4;52841:2;52845:7;52808:26;:45::i;:::-;52886:1;52870:18;;:4;:18;;;52866:187;;;52905:40;52937:7;52905:31;:40::i;:::-;52866:187;;;52975:2;52967:10;;:4;:10;;;52963:90;;52994:47;53027:4;53033:7;52994:32;:47::i;:::-;52963:90;52866:187;53081:1;53067:16;;:2;:16;;;53063:183;;;53100:45;53137:7;53100:36;:45::i;:::-;53063:183;;;53173:4;53167:10;;:2;:10;;;53163:83;;53194:40;53222:2;53226:7;53194:27;:40::i;:::-;53163:83;53063:183;52664:589;;;:::o;42594:439::-;42688:1;42674:16;;:2;:16;;;;42666:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42747:16;42755:7;42747;:16::i;:::-;42746:17;42738:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42809:45;42838:1;42842:2;42846:7;42809:20;:45::i;:::-;42884:1;42867:9;:13;42877:2;42867:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42915:2;42896:7;:16;42904:7;42896:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42960:7;42956:2;42935:33;;42952:1;42935:33;;;;;;;;;;;;42981:44;43009:1;43013:2;43017:7;42981:19;:44::i;:::-;42594:439;;:::o;16410:326::-;16470:4;16727:1;16705:7;:19;;;:23;16698:30;;16410:326;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;8089:1632::-;8220:7;8229:12;9154:66;9149:1;9141:10;;:79;9137:163;;;9253:1;9257:30;9237:51;;;;;;9137:163;9319:2;9314:1;:7;;;;:18;;;;;9330:2;9325:1;:7;;;;9314:18;9310:102;;;9365:1;9369:30;9349:51;;;;;;9310:102;9509:14;9526:24;9536:4;9542:1;9545;9548;9526:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9509:41;;9583:1;9565:20;;:6;:20;;;9561:103;;;9618:1;9622:29;9602:50;;;;;;;9561:103;9684:6;9692:20;9676:37;;;;;8089:1632;;;;;;;;:::o;7131:344::-;7245:7;7254:12;7279:9;7304:66;7296:75;;7291:2;:80;7279:92;;7382:7;7421:2;7414:3;7407:2;7399:11;;:18;;7398:25;;;;:::i;:::-;7382:42;;7442:25;7453:4;7459:1;7462;7465;7442:10;:25::i;:::-;7435:32;;;;;;7131:344;;;;;;:::o;47329:126::-;;;;:::o;53976:164::-;54080:10;:17;;;;54053:15;:24;54069:7;54053:24;;;;;;;;;;;:44;;;;54108:10;54124:7;54108:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53976:164;:::o;54767:988::-;55033:22;55083:1;55058:22;55075:4;55058:16;:22::i;:::-;:26;;;;:::i;:::-;55033:51;;55095:18;55116:17;:26;55134:7;55116:26;;;;;;;;;;;;55095:47;;55263:14;55249:10;:28;55245:328;;55294:19;55316:12;:18;55329:4;55316:18;;;;;;;;;;;;;;;:34;55335:14;55316:34;;;;;;;;;;;;55294:56;;55400:11;55367:12;:18;55380:4;55367:18;;;;;;;;;;;;;;;:30;55386:10;55367:30;;;;;;;;;;;:44;;;;55517:10;55484:17;:30;55502:11;55484:30;;;;;;;;;;;:43;;;;55245:328;;55669:17;:26;55687:7;55669:26;;;;;;;;;;;55662:33;;;55713:12;:18;55726:4;55713:18;;;;;;;;;;;;;;;:34;55732:14;55713:34;;;;;;;;;;;55706:41;;;54767:988;;;;:::o;56050:1079::-;56303:22;56348:1;56328:10;:17;;;;:21;;;;:::i;:::-;56303:46;;56360:18;56381:15;:24;56397:7;56381:24;;;;;;;;;;;;56360:45;;56732:19;56754:10;56765:14;56754:26;;;;;;;;;;;;;;;;;;;;;;;;56732:48;;56818:11;56793:10;56804;56793:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;56929:10;56898:15;:28;56914:11;56898:28;;;;;;;;;;;:41;;;;57070:15;:24;57086:7;57070:24;;;;;;;;;;;57063:31;;;57105:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56050:1079;;;;:::o;53554:221::-;53639:14;53656:20;53673:2;53656:16;:20::i;:::-;53639:37;;53714:7;53687:12;:16;53700:2;53687:16;;;;;;;;;;;;;;;:24;53704:6;53687:24;;;;;;;;;;;:34;;;;53761:6;53732:17;:26;53750:7;53732:26;;;;;;;;;;;:35;;;;53554:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;23:823:1:-;129:5;154:91;170:74;237:6;170:74;:::i;:::-;154:91;:::i;:::-;145:100;;265:5;294:6;287:5;280:21;328:4;321:5;317:16;310:23;;354:6;404:3;396:4;388:6;384:17;379:3;375:27;372:36;369:2;;;433:1;430;423:12;369:2;469:1;454:386;479:6;476:1;473:13;454:386;;;561:3;548:17;597:18;584:11;581:35;578:2;;;629:1;626;619:12;578:2;676:11;668:6;664:24;714:47;757:3;745:10;714:47;:::i;:::-;709:3;702:60;791:4;786:3;782:14;775:21;;825:4;820:3;816:14;809:21;;514:326;;501:1;498;494:9;489:14;;454:386;;;458:14;135:711;;;;;;;:::o;869:655::-;965:5;990:81;1006:64;1063:6;1006:64;:::i;:::-;990:81;:::i;:::-;981:90;;1091:5;1120:6;1113:5;1106:21;1154:4;1147:5;1143:16;1136:23;;1180:6;1230:3;1222:4;1214:6;1210:17;1205:3;1201:27;1198:36;1195:2;;;1259:1;1256;1249:12;1195:2;1295:1;1280:238;1305:6;1302:1;1299:13;1280:238;;;1373:3;1402:37;1435:3;1423:10;1402:37;:::i;:::-;1397:3;1390:50;1469:4;1464:3;1460:14;1453:21;;1503:4;1498:3;1494:14;1487:21;;1340:178;1327:1;1324;1320:9;1315:14;;1280:238;;;1284:14;971:553;;;;;;;:::o;1530:343::-;1607:5;1632:65;1648:48;1689:6;1648:48;:::i;:::-;1632:65;:::i;:::-;1623:74;;1720:6;1713:5;1706:21;1758:4;1751:5;1747:16;1796:3;1787:6;1782:3;1778:16;1775:25;1772:2;;;1813:1;1810;1803:12;1772:2;1826:41;1860:6;1855:3;1850;1826:41;:::i;:::-;1613:260;;;;;;:::o;1879:345::-;1957:5;1982:66;1998:49;2040:6;1998:49;:::i;:::-;1982:66;:::i;:::-;1973:75;;2071:6;2064:5;2057:21;2109:4;2102:5;2098:16;2147:3;2138:6;2133:3;2129:16;2126:25;2123:2;;;2164:1;2161;2154:12;2123:2;2177:41;2211:6;2206:3;2201;2177:41;:::i;:::-;1963:261;;;;;;:::o;2230:139::-;2276:5;2314:6;2301:20;2292:29;;2330:33;2357:5;2330:33;:::i;:::-;2282:87;;;;:::o;2391:323::-;2472:5;2521:3;2514:4;2506:6;2502:17;2498:27;2488:2;;2539:1;2536;2529:12;2488:2;2579:6;2566:20;2604:104;2704:3;2696:6;2689:4;2681:6;2677:17;2604:104;:::i;:::-;2595:113;;2478:236;;;;;:::o;2737:303::-;2808:5;2857:3;2850:4;2842:6;2838:17;2834:27;2824:2;;2875:1;2872;2865:12;2824:2;2915:6;2902:20;2940:94;3030:3;3022:6;3015:4;3007:6;3003:17;2940:94;:::i;:::-;2931:103;;2814:226;;;;;:::o;3046:133::-;3089:5;3127:6;3114:20;3105:29;;3143:30;3167:5;3143:30;:::i;:::-;3095:84;;;;:::o;3185:139::-;3231:5;3269:6;3256:20;3247:29;;3285:33;3312:5;3285:33;:::i;:::-;3237:87;;;;:::o;3330:137::-;3375:5;3413:6;3400:20;3391:29;;3429:32;3455:5;3429:32;:::i;:::-;3381:86;;;;:::o;3473:141::-;3529:5;3560:6;3554:13;3545:22;;3576:32;3602:5;3576:32;:::i;:::-;3535:79;;;;:::o;3633:271::-;3688:5;3737:3;3730:4;3722:6;3718:17;3714:27;3704:2;;3755:1;3752;3745:12;3704:2;3795:6;3782:20;3820:78;3894:3;3886:6;3879:4;3871:6;3867:17;3820:78;:::i;:::-;3811:87;;3694:210;;;;;:::o;3924:273::-;3980:5;4029:3;4022:4;4014:6;4010:17;4006:27;3996:2;;4047:1;4044;4037:12;3996:2;4087:6;4074:20;4112:79;4187:3;4179:6;4172:4;4164:6;4160:17;4112:79;:::i;:::-;4103:88;;3986:211;;;;;:::o;4203:139::-;4249:5;4287:6;4274:20;4265:29;;4303:33;4330:5;4303:33;:::i;:::-;4255:87;;;;:::o;4348:262::-;4407:6;4456:2;4444:9;4435:7;4431:23;4427:32;4424:2;;;4472:1;4469;4462:12;4424:2;4515:1;4540:53;4585:7;4576:6;4565:9;4561:22;4540:53;:::i;:::-;4530:63;;4486:117;4414:196;;;;:::o;4616:407::-;4684:6;4692;4741:2;4729:9;4720:7;4716:23;4712:32;4709:2;;;4757:1;4754;4747:12;4709:2;4800:1;4825:53;4870:7;4861:6;4850:9;4846:22;4825:53;:::i;:::-;4815:63;;4771:117;4927:2;4953:53;4998:7;4989:6;4978:9;4974:22;4953:53;:::i;:::-;4943:63;;4898:118;4699:324;;;;;:::o;5029:552::-;5106:6;5114;5122;5171:2;5159:9;5150:7;5146:23;5142:32;5139:2;;;5187:1;5184;5177:12;5139:2;5230:1;5255:53;5300:7;5291:6;5280:9;5276:22;5255:53;:::i;:::-;5245:63;;5201:117;5357:2;5383:53;5428:7;5419:6;5408:9;5404:22;5383:53;:::i;:::-;5373:63;;5328:118;5485:2;5511:53;5556:7;5547:6;5536:9;5532:22;5511:53;:::i;:::-;5501:63;;5456:118;5129:452;;;;;:::o;5587:809::-;5682:6;5690;5698;5706;5755:3;5743:9;5734:7;5730:23;5726:33;5723:2;;;5772:1;5769;5762:12;5723:2;5815:1;5840:53;5885:7;5876:6;5865:9;5861:22;5840:53;:::i;:::-;5830:63;;5786:117;5942:2;5968:53;6013:7;6004:6;5993:9;5989:22;5968:53;:::i;:::-;5958:63;;5913:118;6070:2;6096:53;6141:7;6132:6;6121:9;6117:22;6096:53;:::i;:::-;6086:63;;6041:118;6226:2;6215:9;6211:18;6198:32;6257:18;6249:6;6246:30;6243:2;;;6289:1;6286;6279:12;6243:2;6317:62;6371:7;6362:6;6351:9;6347:22;6317:62;:::i;:::-;6307:72;;6169:220;5713:683;;;;;;;:::o;6402:401::-;6467:6;6475;6524:2;6512:9;6503:7;6499:23;6495:32;6492:2;;;6540:1;6537;6530:12;6492:2;6583:1;6608:53;6653:7;6644:6;6633:9;6629:22;6608:53;:::i;:::-;6598:63;;6554:117;6710:2;6736:50;6778:7;6769:6;6758:9;6754:22;6736:50;:::i;:::-;6726:60;;6681:115;6482:321;;;;;:::o;6809:407::-;6877:6;6885;6934:2;6922:9;6913:7;6909:23;6905:32;6902:2;;;6950:1;6947;6940:12;6902:2;6993:1;7018:53;7063:7;7054:6;7043:9;7039:22;7018:53;:::i;:::-;7008:63;;6964:117;7120:2;7146:53;7191:7;7182:6;7171:9;7167:22;7146:53;:::i;:::-;7136:63;;7091:118;6892:324;;;;;:::o;7222:665::-;7309:6;7317;7325;7374:2;7362:9;7353:7;7349:23;7345:32;7342:2;;;7390:1;7387;7380:12;7342:2;7433:1;7458:53;7503:7;7494:6;7483:9;7479:22;7458:53;:::i;:::-;7448:63;;7404:117;7560:2;7586:53;7631:7;7622:6;7611:9;7607:22;7586:53;:::i;:::-;7576:63;;7531:118;7716:2;7705:9;7701:18;7688:32;7747:18;7739:6;7736:30;7733:2;;;7779:1;7776;7769:12;7733:2;7807:63;7862:7;7853:6;7842:9;7838:22;7807:63;:::i;:::-;7797:73;;7659:221;7332:555;;;;;:::o;7893:1374::-;8067:6;8075;8083;8091;8099;8148:3;8136:9;8127:7;8123:23;8119:33;8116:2;;;8165:1;8162;8155:12;8116:2;8236:1;8225:9;8221:17;8208:31;8266:18;8258:6;8255:30;8252:2;;;8298:1;8295;8288:12;8252:2;8326:78;8396:7;8387:6;8376:9;8372:22;8326:78;:::i;:::-;8316:88;;8179:235;8481:2;8470:9;8466:18;8453:32;8512:18;8504:6;8501:30;8498:2;;;8544:1;8541;8534:12;8498:2;8572:88;8652:7;8643:6;8632:9;8628:22;8572:88;:::i;:::-;8562:98;;8424:246;8737:2;8726:9;8722:18;8709:32;8768:18;8760:6;8757:30;8754:2;;;8800:1;8797;8790:12;8754:2;8828:63;8883:7;8874:6;8863:9;8859:22;8828:63;:::i;:::-;8818:73;;8680:221;8940:2;8966:53;9011:7;9002:6;8991:9;8987:22;8966:53;:::i;:::-;8956:63;;8911:118;9096:3;9085:9;9081:19;9068:33;9128:18;9120:6;9117:30;9114:2;;;9160:1;9157;9150:12;9114:2;9188:62;9242:7;9233:6;9222:9;9218:22;9188:62;:::i;:::-;9178:72;;9039:221;8106:1161;;;;;;;;:::o;9273:518::-;9350:6;9358;9407:2;9395:9;9386:7;9382:23;9378:32;9375:2;;;9423:1;9420;9413:12;9375:2;9466:1;9491:53;9536:7;9527:6;9516:9;9512:22;9491:53;:::i;:::-;9481:63;;9437:117;9621:2;9610:9;9606:18;9593:32;9652:18;9644:6;9641:30;9638:2;;;9684:1;9681;9674:12;9638:2;9712:62;9766:7;9757:6;9746:9;9742:22;9712:62;:::i;:::-;9702:72;;9564:220;9365:426;;;;;:::o;9797:260::-;9855:6;9904:2;9892:9;9883:7;9879:23;9875:32;9872:2;;;9920:1;9917;9910:12;9872:2;9963:1;9988:52;10032:7;10023:6;10012:9;10008:22;9988:52;:::i;:::-;9978:62;;9934:116;9862:195;;;;:::o;10063:282::-;10132:6;10181:2;10169:9;10160:7;10156:23;10152:32;10149:2;;;10197:1;10194;10187:12;10149:2;10240:1;10265:63;10320:7;10311:6;10300:9;10296:22;10265:63;:::i;:::-;10255:73;;10211:127;10139:206;;;;:::o;10351:375::-;10420:6;10469:2;10457:9;10448:7;10444:23;10440:32;10437:2;;;10485:1;10482;10475:12;10437:2;10556:1;10545:9;10541:17;10528:31;10586:18;10578:6;10575:30;10572:2;;;10618:1;10615;10608:12;10572:2;10646:63;10701:7;10692:6;10681:9;10677:22;10646:63;:::i;:::-;10636:73;;10499:220;10427:299;;;;:::o;10732:262::-;10791:6;10840:2;10828:9;10819:7;10815:23;10811:32;10808:2;;;10856:1;10853;10846:12;10808:2;10899:1;10924:53;10969:7;10960:6;10949:9;10945:22;10924:53;:::i;:::-;10914:63;;10870:117;10798:196;;;;:::o;11000:520::-;11078:6;11086;11135:2;11123:9;11114:7;11110:23;11106:32;11103:2;;;11151:1;11148;11141:12;11103:2;11194:1;11219:53;11264:7;11255:6;11244:9;11240:22;11219:53;:::i;:::-;11209:63;;11165:117;11349:2;11338:9;11334:18;11321:32;11380:18;11372:6;11369:30;11366:2;;;11412:1;11409;11402:12;11366:2;11440:63;11495:7;11486:6;11475:9;11471:22;11440:63;:::i;:::-;11430:73;;11292:221;11093:427;;;;;:::o;11526:1181::-;11650:6;11658;11666;11674;11682;11731:3;11719:9;11710:7;11706:23;11702:33;11699:2;;;11748:1;11745;11738:12;11699:2;11791:1;11816:53;11861:7;11852:6;11841:9;11837:22;11816:53;:::i;:::-;11806:63;;11762:117;11946:2;11935:9;11931:18;11918:32;11977:18;11969:6;11966:30;11963:2;;;12009:1;12006;11999:12;11963:2;12037:63;12092:7;12083:6;12072:9;12068:22;12037:63;:::i;:::-;12027:73;;11889:221;12177:2;12166:9;12162:18;12149:32;12208:18;12200:6;12197:30;12194:2;;;12240:1;12237;12230:12;12194:2;12268:63;12323:7;12314:6;12303:9;12299:22;12268:63;:::i;:::-;12258:73;;12120:221;12380:2;12406:53;12451:7;12442:6;12431:9;12427:22;12406:53;:::i;:::-;12396:63;;12351:118;12536:3;12525:9;12521:19;12508:33;12568:18;12560:6;12557:30;12554:2;;;12600:1;12597;12590:12;12554:2;12628:62;12682:7;12673:6;12662:9;12658:22;12628:62;:::i;:::-;12618:72;;12479:221;11689:1018;;;;;;;;:::o;12713:118::-;12800:24;12818:5;12800:24;:::i;:::-;12795:3;12788:37;12778:53;;:::o;12837:157::-;12942:45;12962:24;12980:5;12962:24;:::i;:::-;12942:45;:::i;:::-;12937:3;12930:58;12920:74;;:::o;13000:109::-;13081:21;13096:5;13081:21;:::i;:::-;13076:3;13069:34;13059:50;;:::o;13115:118::-;13202:24;13220:5;13202:24;:::i;:::-;13197:3;13190:37;13180:53;;:::o;13239:157::-;13344:45;13364:24;13382:5;13364:24;:::i;:::-;13344:45;:::i;:::-;13339:3;13332:58;13322:74;;:::o;13402:360::-;13488:3;13516:38;13548:5;13516:38;:::i;:::-;13570:70;13633:6;13628:3;13570:70;:::i;:::-;13563:77;;13649:52;13694:6;13689:3;13682:4;13675:5;13671:16;13649:52;:::i;:::-;13726:29;13748:6;13726:29;:::i;:::-;13721:3;13717:39;13710:46;;13492:270;;;;;:::o;13768:364::-;13856:3;13884:39;13917:5;13884:39;:::i;:::-;13939:71;14003:6;13998:3;13939:71;:::i;:::-;13932:78;;14019:52;14064:6;14059:3;14052:4;14045:5;14041:16;14019:52;:::i;:::-;14096:29;14118:6;14096:29;:::i;:::-;14091:3;14087:39;14080:46;;13860:272;;;;;:::o;14138:377::-;14244:3;14272:39;14305:5;14272:39;:::i;:::-;14327:89;14409:6;14404:3;14327:89;:::i;:::-;14320:96;;14425:52;14470:6;14465:3;14458:4;14451:5;14447:16;14425:52;:::i;:::-;14502:6;14497:3;14493:16;14486:23;;14248:267;;;;;:::o;14521:366::-;14663:3;14684:67;14748:2;14743:3;14684:67;:::i;:::-;14677:74;;14760:93;14849:3;14760:93;:::i;:::-;14878:2;14873:3;14869:12;14862:19;;14667:220;;;:::o;14893:366::-;15035:3;15056:67;15120:2;15115:3;15056:67;:::i;:::-;15049:74;;15132:93;15221:3;15132:93;:::i;:::-;15250:2;15245:3;15241:12;15234:19;;15039:220;;;:::o;15265:402::-;15425:3;15446:85;15528:2;15523:3;15446:85;:::i;:::-;15439:92;;15540:93;15629:3;15540:93;:::i;:::-;15658:2;15653:3;15649:12;15642:19;;15429:238;;;:::o;15673:366::-;15815:3;15836:67;15900:2;15895:3;15836:67;:::i;:::-;15829:74;;15912:93;16001:3;15912:93;:::i;:::-;16030:2;16025:3;16021:12;16014:19;;15819:220;;;:::o;16045:366::-;16187:3;16208:67;16272:2;16267:3;16208:67;:::i;:::-;16201:74;;16284:93;16373:3;16284:93;:::i;:::-;16402:2;16397:3;16393:12;16386:19;;16191:220;;;:::o;16417:366::-;16559:3;16580:67;16644:2;16639:3;16580:67;:::i;:::-;16573:74;;16656:93;16745:3;16656:93;:::i;:::-;16774:2;16769:3;16765:12;16758:19;;16563:220;;;:::o;16789:366::-;16931:3;16952:67;17016:2;17011:3;16952:67;:::i;:::-;16945:74;;17028:93;17117:3;17028:93;:::i;:::-;17146:2;17141:3;17137:12;17130:19;;16935:220;;;:::o;17161:366::-;17303:3;17324:67;17388:2;17383:3;17324:67;:::i;:::-;17317:74;;17400:93;17489:3;17400:93;:::i;:::-;17518:2;17513:3;17509:12;17502:19;;17307:220;;;:::o;17533:366::-;17675:3;17696:67;17760:2;17755:3;17696:67;:::i;:::-;17689:74;;17772:93;17861:3;17772:93;:::i;:::-;17890:2;17885:3;17881:12;17874:19;;17679:220;;;:::o;17905:366::-;18047:3;18068:67;18132:2;18127:3;18068:67;:::i;:::-;18061:74;;18144:93;18233:3;18144:93;:::i;:::-;18262:2;18257:3;18253:12;18246:19;;18051:220;;;:::o;18277:366::-;18419:3;18440:67;18504:2;18499:3;18440:67;:::i;:::-;18433:74;;18516:93;18605:3;18516:93;:::i;:::-;18634:2;18629:3;18625:12;18618:19;;18423:220;;;:::o;18649:366::-;18791:3;18812:67;18876:2;18871:3;18812:67;:::i;:::-;18805:74;;18888:93;18977:3;18888:93;:::i;:::-;19006:2;19001:3;18997:12;18990:19;;18795:220;;;:::o;19021:366::-;19163:3;19184:67;19248:2;19243:3;19184:67;:::i;:::-;19177:74;;19260:93;19349:3;19260:93;:::i;:::-;19378:2;19373:3;19369:12;19362:19;;19167:220;;;:::o;19393:366::-;19535:3;19556:67;19620:2;19615:3;19556:67;:::i;:::-;19549:74;;19632:93;19721:3;19632:93;:::i;:::-;19750:2;19745:3;19741:12;19734:19;;19539:220;;;:::o;19765:366::-;19907:3;19928:67;19992:2;19987:3;19928:67;:::i;:::-;19921:74;;20004:93;20093:3;20004:93;:::i;:::-;20122:2;20117:3;20113:12;20106:19;;19911:220;;;:::o;20137:366::-;20279:3;20300:67;20364:2;20359:3;20300:67;:::i;:::-;20293:74;;20376:93;20465:3;20376:93;:::i;:::-;20494:2;20489:3;20485:12;20478:19;;20283:220;;;:::o;20509:366::-;20651:3;20672:67;20736:2;20731:3;20672:67;:::i;:::-;20665:74;;20748:93;20837:3;20748:93;:::i;:::-;20866:2;20861:3;20857:12;20850:19;;20655:220;;;:::o;20881:366::-;21023:3;21044:67;21108:2;21103:3;21044:67;:::i;:::-;21037:74;;21120:93;21209:3;21120:93;:::i;:::-;21238:2;21233:3;21229:12;21222:19;;21027:220;;;:::o;21253:366::-;21395:3;21416:67;21480:2;21475:3;21416:67;:::i;:::-;21409:74;;21492:93;21581:3;21492:93;:::i;:::-;21610:2;21605:3;21601:12;21594:19;;21399:220;;;:::o;21625:366::-;21767:3;21788:67;21852:2;21847:3;21788:67;:::i;:::-;21781:74;;21864:93;21953:3;21864:93;:::i;:::-;21982:2;21977:3;21973:12;21966:19;;21771:220;;;:::o;21997:366::-;22139:3;22160:67;22224:2;22219:3;22160:67;:::i;:::-;22153:74;;22236:93;22325:3;22236:93;:::i;:::-;22354:2;22349:3;22345:12;22338:19;;22143:220;;;:::o;22369:366::-;22511:3;22532:67;22596:2;22591:3;22532:67;:::i;:::-;22525:74;;22608:93;22697:3;22608:93;:::i;:::-;22726:2;22721:3;22717:12;22710:19;;22515:220;;;:::o;22741:366::-;22883:3;22904:67;22968:2;22963:3;22904:67;:::i;:::-;22897:74;;22980:93;23069:3;22980:93;:::i;:::-;23098:2;23093:3;23089:12;23082:19;;22887:220;;;:::o;23113:366::-;23255:3;23276:67;23340:2;23335:3;23276:67;:::i;:::-;23269:74;;23352:93;23441:3;23352:93;:::i;:::-;23470:2;23465:3;23461:12;23454:19;;23259:220;;;:::o;23485:366::-;23627:3;23648:67;23712:2;23707:3;23648:67;:::i;:::-;23641:74;;23724:93;23813:3;23724:93;:::i;:::-;23842:2;23837:3;23833:12;23826:19;;23631:220;;;:::o;23857:366::-;23999:3;24020:67;24084:2;24079:3;24020:67;:::i;:::-;24013:74;;24096:93;24185:3;24096:93;:::i;:::-;24214:2;24209:3;24205:12;24198:19;;24003:220;;;:::o;24229:366::-;24371:3;24392:67;24456:2;24451:3;24392:67;:::i;:::-;24385:74;;24468:93;24557:3;24468:93;:::i;:::-;24586:2;24581:3;24577:12;24570:19;;24375:220;;;:::o;24601:366::-;24743:3;24764:67;24828:2;24823:3;24764:67;:::i;:::-;24757:74;;24840:93;24929:3;24840:93;:::i;:::-;24958:2;24953:3;24949:12;24942:19;;24747:220;;;:::o;24973:118::-;25060:24;25078:5;25060:24;:::i;:::-;25055:3;25048:37;25038:53;;:::o;25097:157::-;25202:45;25222:24;25240:5;25222:24;:::i;:::-;25202:45;:::i;:::-;25197:3;25190:58;25180:74;;:::o;25260:112::-;25343:22;25359:5;25343:22;:::i;:::-;25338:3;25331:35;25321:51;;:::o;25378:698::-;25594:3;25609:75;25680:3;25671:6;25609:75;:::i;:::-;25709:2;25704:3;25700:12;25693:19;;25722:75;25793:3;25784:6;25722:75;:::i;:::-;25822:2;25817:3;25813:12;25806:19;;25842:95;25933:3;25924:6;25842:95;:::i;:::-;25835:102;;25947:75;26018:3;26009:6;25947:75;:::i;:::-;26047:2;26042:3;26038:12;26031:19;;26067:3;26060:10;;25598:478;;;;;;;:::o;26082:275::-;26214:3;26236:95;26327:3;26318:6;26236:95;:::i;:::-;26229:102;;26348:3;26341:10;;26218:139;;;;:::o;26363:435::-;26543:3;26565:95;26656:3;26647:6;26565:95;:::i;:::-;26558:102;;26677:95;26768:3;26759:6;26677:95;:::i;:::-;26670:102;;26789:3;26782:10;;26547:251;;;;;:::o;26804:522::-;27017:3;27039:148;27183:3;27039:148;:::i;:::-;27032:155;;27197:75;27268:3;27259:6;27197:75;:::i;:::-;27297:2;27292:3;27288:12;27281:19;;27317:3;27310:10;;27021:305;;;;:::o;27332:222::-;27425:4;27463:2;27452:9;27448:18;27440:26;;27476:71;27544:1;27533:9;27529:17;27520:6;27476:71;:::i;:::-;27430:124;;;;:::o;27560:640::-;27755:4;27793:3;27782:9;27778:19;27770:27;;27807:71;27875:1;27864:9;27860:17;27851:6;27807:71;:::i;:::-;27888:72;27956:2;27945:9;27941:18;27932:6;27888:72;:::i;:::-;27970;28038:2;28027:9;28023:18;28014:6;27970:72;:::i;:::-;28089:9;28083:4;28079:20;28074:2;28063:9;28059:18;28052:48;28117:76;28188:4;28179:6;28117:76;:::i;:::-;28109:84;;27760:440;;;;;;;:::o;28206:210::-;28293:4;28331:2;28320:9;28316:18;28308:26;;28344:65;28406:1;28395:9;28391:17;28382:6;28344:65;:::i;:::-;28298:118;;;;:::o;28422:222::-;28515:4;28553:2;28542:9;28538:18;28530:26;;28566:71;28634:1;28623:9;28619:17;28610:6;28566:71;:::i;:::-;28520:124;;;;:::o;28650:545::-;28823:4;28861:3;28850:9;28846:19;28838:27;;28875:71;28943:1;28932:9;28928:17;28919:6;28875:71;:::i;:::-;28956:68;29020:2;29009:9;29005:18;28996:6;28956:68;:::i;:::-;29034:72;29102:2;29091:9;29087:18;29078:6;29034:72;:::i;:::-;29116;29184:2;29173:9;29169:18;29160:6;29116:72;:::i;:::-;28828:367;;;;;;;:::o;29201:313::-;29314:4;29352:2;29341:9;29337:18;29329:26;;29401:9;29395:4;29391:20;29387:1;29376:9;29372:17;29365:47;29429:78;29502:4;29493:6;29429:78;:::i;:::-;29421:86;;29319:195;;;;:::o;29520:419::-;29686:4;29724:2;29713:9;29709:18;29701:26;;29773:9;29767:4;29763:20;29759:1;29748:9;29744:17;29737:47;29801:131;29927:4;29801:131;:::i;:::-;29793:139;;29691:248;;;:::o;29945:419::-;30111:4;30149:2;30138:9;30134:18;30126:26;;30198:9;30192:4;30188:20;30184:1;30173:9;30169:17;30162:47;30226:131;30352:4;30226:131;:::i;:::-;30218:139;;30116:248;;;:::o;30370:419::-;30536:4;30574:2;30563:9;30559:18;30551:26;;30623:9;30617:4;30613:20;30609:1;30598:9;30594:17;30587:47;30651:131;30777:4;30651:131;:::i;:::-;30643:139;;30541:248;;;:::o;30795:419::-;30961:4;30999:2;30988:9;30984:18;30976:26;;31048:9;31042:4;31038:20;31034:1;31023:9;31019:17;31012:47;31076:131;31202:4;31076:131;:::i;:::-;31068:139;;30966:248;;;:::o;31220:419::-;31386:4;31424:2;31413:9;31409:18;31401:26;;31473:9;31467:4;31463:20;31459:1;31448:9;31444:17;31437:47;31501:131;31627:4;31501:131;:::i;:::-;31493:139;;31391:248;;;:::o;31645:419::-;31811:4;31849:2;31838:9;31834:18;31826:26;;31898:9;31892:4;31888:20;31884:1;31873:9;31869:17;31862:47;31926:131;32052:4;31926:131;:::i;:::-;31918:139;;31816:248;;;:::o;32070:419::-;32236:4;32274:2;32263:9;32259:18;32251:26;;32323:9;32317:4;32313:20;32309:1;32298:9;32294:17;32287:47;32351:131;32477:4;32351:131;:::i;:::-;32343:139;;32241:248;;;:::o;32495:419::-;32661:4;32699:2;32688:9;32684:18;32676:26;;32748:9;32742:4;32738:20;32734:1;32723:9;32719:17;32712:47;32776:131;32902:4;32776:131;:::i;:::-;32768:139;;32666:248;;;:::o;32920:419::-;33086:4;33124:2;33113:9;33109:18;33101:26;;33173:9;33167:4;33163:20;33159:1;33148:9;33144:17;33137:47;33201:131;33327:4;33201:131;:::i;:::-;33193:139;;33091:248;;;:::o;33345:419::-;33511:4;33549:2;33538:9;33534:18;33526:26;;33598:9;33592:4;33588:20;33584:1;33573:9;33569:17;33562:47;33626:131;33752:4;33626:131;:::i;:::-;33618:139;;33516:248;;;:::o;33770:419::-;33936:4;33974:2;33963:9;33959:18;33951:26;;34023:9;34017:4;34013:20;34009:1;33998:9;33994:17;33987:47;34051:131;34177:4;34051:131;:::i;:::-;34043:139;;33941:248;;;:::o;34195:419::-;34361:4;34399:2;34388:9;34384:18;34376:26;;34448:9;34442:4;34438:20;34434:1;34423:9;34419:17;34412:47;34476:131;34602:4;34476:131;:::i;:::-;34468:139;;34366:248;;;:::o;34620:419::-;34786:4;34824:2;34813:9;34809:18;34801:26;;34873:9;34867:4;34863:20;34859:1;34848:9;34844:17;34837:47;34901:131;35027:4;34901:131;:::i;:::-;34893:139;;34791:248;;;:::o;35045:419::-;35211:4;35249:2;35238:9;35234:18;35226:26;;35298:9;35292:4;35288:20;35284:1;35273:9;35269:17;35262:47;35326:131;35452:4;35326:131;:::i;:::-;35318:139;;35216:248;;;:::o;35470:419::-;35636:4;35674:2;35663:9;35659:18;35651:26;;35723:9;35717:4;35713:20;35709:1;35698:9;35694:17;35687:47;35751:131;35877:4;35751:131;:::i;:::-;35743:139;;35641:248;;;:::o;35895:419::-;36061:4;36099:2;36088:9;36084:18;36076:26;;36148:9;36142:4;36138:20;36134:1;36123:9;36119:17;36112:47;36176:131;36302:4;36176:131;:::i;:::-;36168:139;;36066:248;;;:::o;36320:419::-;36486:4;36524:2;36513:9;36509:18;36501:26;;36573:9;36567:4;36563:20;36559:1;36548:9;36544:17;36537:47;36601:131;36727:4;36601:131;:::i;:::-;36593:139;;36491:248;;;:::o;36745:419::-;36911:4;36949:2;36938:9;36934:18;36926:26;;36998:9;36992:4;36988:20;36984:1;36973:9;36969:17;36962:47;37026:131;37152:4;37026:131;:::i;:::-;37018:139;;36916:248;;;:::o;37170:419::-;37336:4;37374:2;37363:9;37359:18;37351:26;;37423:9;37417:4;37413:20;37409:1;37398:9;37394:17;37387:47;37451:131;37577:4;37451:131;:::i;:::-;37443:139;;37341:248;;;:::o;37595:419::-;37761:4;37799:2;37788:9;37784:18;37776:26;;37848:9;37842:4;37838:20;37834:1;37823:9;37819:17;37812:47;37876:131;38002:4;37876:131;:::i;:::-;37868:139;;37766:248;;;:::o;38020:419::-;38186:4;38224:2;38213:9;38209:18;38201:26;;38273:9;38267:4;38263:20;38259:1;38248:9;38244:17;38237:47;38301:131;38427:4;38301:131;:::i;:::-;38293:139;;38191:248;;;:::o;38445:419::-;38611:4;38649:2;38638:9;38634:18;38626:26;;38698:9;38692:4;38688:20;38684:1;38673:9;38669:17;38662:47;38726:131;38852:4;38726:131;:::i;:::-;38718:139;;38616:248;;;:::o;38870:419::-;39036:4;39074:2;39063:9;39059:18;39051:26;;39123:9;39117:4;39113:20;39109:1;39098:9;39094:17;39087:47;39151:131;39277:4;39151:131;:::i;:::-;39143:139;;39041:248;;;:::o;39295:419::-;39461:4;39499:2;39488:9;39484:18;39476:26;;39548:9;39542:4;39538:20;39534:1;39523:9;39519:17;39512:47;39576:131;39702:4;39576:131;:::i;:::-;39568:139;;39466:248;;;:::o;39720:419::-;39886:4;39924:2;39913:9;39909:18;39901:26;;39973:9;39967:4;39963:20;39959:1;39948:9;39944:17;39937:47;40001:131;40127:4;40001:131;:::i;:::-;39993:139;;39891:248;;;:::o;40145:419::-;40311:4;40349:2;40338:9;40334:18;40326:26;;40398:9;40392:4;40388:20;40384:1;40373:9;40369:17;40362:47;40426:131;40552:4;40426:131;:::i;:::-;40418:139;;40316:248;;;:::o;40570:419::-;40736:4;40774:2;40763:9;40759:18;40751:26;;40823:9;40817:4;40813:20;40809:1;40798:9;40794:17;40787:47;40851:131;40977:4;40851:131;:::i;:::-;40843:139;;40741:248;;;:::o;40995:222::-;41088:4;41126:2;41115:9;41111:18;41103:26;;41139:71;41207:1;41196:9;41192:17;41183:6;41139:71;:::i;:::-;41093:124;;;;:::o;41223:129::-;41257:6;41284:20;;:::i;:::-;41274:30;;41313:33;41341:4;41333:6;41313:33;:::i;:::-;41264:88;;;:::o;41358:75::-;41391:6;41424:2;41418:9;41408:19;;41398:35;:::o;41439:321::-;41526:4;41616:18;41608:6;41605:30;41602:2;;;41638:18;;:::i;:::-;41602:2;41688:4;41680:6;41676:17;41668:25;;41748:4;41742;41738:15;41730:23;;41531:229;;;:::o;41766:311::-;41843:4;41933:18;41925:6;41922:30;41919:2;;;41955:18;;:::i;:::-;41919:2;42005:4;41997:6;41993:17;41985:25;;42065:4;42059;42055:15;42047:23;;41848:229;;;:::o;42083:307::-;42144:4;42234:18;42226:6;42223:30;42220:2;;;42256:18;;:::i;:::-;42220:2;42294:29;42316:6;42294:29;:::i;:::-;42286:37;;42378:4;42372;42368:15;42360:23;;42149:241;;;:::o;42396:308::-;42458:4;42548:18;42540:6;42537:30;42534:2;;;42570:18;;:::i;:::-;42534:2;42608:29;42630:6;42608:29;:::i;:::-;42600:37;;42692:4;42686;42682:15;42674:23;;42463:241;;;:::o;42710:98::-;42761:6;42795:5;42789:12;42779:22;;42768:40;;;:::o;42814:99::-;42866:6;42900:5;42894:12;42884:22;;42873:40;;;:::o;42919:168::-;43002:11;43036:6;43031:3;43024:19;43076:4;43071:3;43067:14;43052:29;;43014:73;;;;:::o;43093:169::-;43177:11;43211:6;43206:3;43199:19;43251:4;43246:3;43242:14;43227:29;;43189:73;;;;:::o;43268:148::-;43370:11;43407:3;43392:18;;43382:34;;;;:::o;43422:305::-;43462:3;43481:20;43499:1;43481:20;:::i;:::-;43476:25;;43515:20;43533:1;43515:20;:::i;:::-;43510:25;;43669:1;43601:66;43597:74;43594:1;43591:81;43588:2;;;43675:18;;:::i;:::-;43588:2;43719:1;43716;43712:9;43705:16;;43466:261;;;;:::o;43733:185::-;43773:1;43790:20;43808:1;43790:20;:::i;:::-;43785:25;;43824:20;43842:1;43824:20;:::i;:::-;43819:25;;43863:1;43853:2;;43868:18;;:::i;:::-;43853:2;43910:1;43907;43903:9;43898:14;;43775:143;;;;:::o;43924:191::-;43964:4;43984:20;44002:1;43984:20;:::i;:::-;43979:25;;44018:20;44036:1;44018:20;:::i;:::-;44013:25;;44057:1;44054;44051:8;44048:2;;;44062:18;;:::i;:::-;44048:2;44107:1;44104;44100:9;44092:17;;43969:146;;;;:::o;44121:96::-;44158:7;44187:24;44205:5;44187:24;:::i;:::-;44176:35;;44166:51;;;:::o;44223:90::-;44257:7;44300:5;44293:13;44286:21;44275:32;;44265:48;;;:::o;44319:77::-;44356:7;44385:5;44374:16;;44364:32;;;:::o;44402:149::-;44438:7;44478:66;44471:5;44467:78;44456:89;;44446:105;;;:::o;44557:126::-;44594:7;44634:42;44627:5;44623:54;44612:65;;44602:81;;;:::o;44689:77::-;44726:7;44755:5;44744:16;;44734:32;;;:::o;44772:86::-;44807:7;44847:4;44840:5;44836:16;44825:27;;44815:43;;;:::o;44864:154::-;44948:6;44943:3;44938;44925:30;45010:1;45001:6;44996:3;44992:16;44985:27;44915:103;;;:::o;45024:307::-;45092:1;45102:113;45116:6;45113:1;45110:13;45102:113;;;45201:1;45196:3;45192:11;45186:18;45182:1;45177:3;45173:11;45166:39;45138:2;45135:1;45131:10;45126:15;;45102:113;;;45233:6;45230:1;45227:13;45224:2;;;45313:1;45304:6;45299:3;45295:16;45288:27;45224:2;45073:258;;;;:::o;45337:320::-;45381:6;45418:1;45412:4;45408:12;45398:22;;45465:1;45459:4;45455:12;45486:18;45476:2;;45542:4;45534:6;45530:17;45520:27;;45476:2;45604;45596:6;45593:14;45573:18;45570:38;45567:2;;;45623:18;;:::i;:::-;45567:2;45388:269;;;;:::o;45663:281::-;45746:27;45768:4;45746:27;:::i;:::-;45738:6;45734:40;45876:6;45864:10;45861:22;45840:18;45828:10;45825:34;45822:62;45819:2;;;45887:18;;:::i;:::-;45819:2;45927:10;45923:2;45916:22;45706:238;;;:::o;45950:233::-;45989:3;46012:24;46030:5;46012:24;:::i;:::-;46003:33;;46058:66;46051:5;46048:77;46045:2;;;46128:18;;:::i;:::-;46045:2;46175:1;46168:5;46164:13;46157:20;;45993:190;;;:::o;46189:100::-;46228:7;46257:26;46277:5;46257:26;:::i;:::-;46246:37;;46236:53;;;:::o;46295:79::-;46334:7;46363:5;46352:16;;46342:32;;;:::o;46380:94::-;46419:7;46448:20;46462:5;46448:20;:::i;:::-;46437:31;;46427:47;;;:::o;46480:79::-;46519:7;46548:5;46537:16;;46527:32;;;:::o;46565:176::-;46597:1;46614:20;46632:1;46614:20;:::i;:::-;46609:25;;46648:20;46666:1;46648:20;:::i;:::-;46643:25;;46687:1;46677:2;;46692:18;;:::i;:::-;46677:2;46733:1;46730;46726:9;46721:14;;46599:142;;;;:::o;46747:180::-;46795:77;46792:1;46785:88;46892:4;46889:1;46882:15;46916:4;46913:1;46906:15;46933:180;46981:77;46978:1;46971:88;47078:4;47075:1;47068:15;47102:4;47099:1;47092:15;47119:180;47167:77;47164:1;47157:88;47264:4;47261:1;47254:15;47288:4;47285:1;47278:15;47305:180;47353:77;47350:1;47343:88;47450:4;47447:1;47440:15;47474:4;47471:1;47464:15;47491:102;47532:6;47583:2;47579:7;47574:2;47567:5;47563:14;47559:28;47549:38;;47539:54;;;:::o;47599:94::-;47632:8;47680:5;47676:2;47672:14;47651:35;;47641:52;;;:::o;47699:174::-;47839:26;47835:1;47827:6;47823:14;47816:50;47805:68;:::o;47879:181::-;48019:33;48015:1;48007:6;48003:14;47996:57;47985:75;:::o;48066:214::-;48206:66;48202:1;48194:6;48190:14;48183:90;48172:108;:::o;48286:230::-;48426:34;48422:1;48414:6;48410:14;48403:58;48495:13;48490:2;48482:6;48478:15;48471:38;48392:124;:::o;48522:237::-;48662:34;48658:1;48650:6;48646:14;48639:58;48731:20;48726:2;48718:6;48714:15;48707:45;48628:131;:::o;48765:161::-;48905:13;48901:1;48893:6;48889:14;48882:37;48871:55;:::o;48932:225::-;49072:34;49068:1;49060:6;49056:14;49049:58;49141:8;49136:2;49128:6;49124:15;49117:33;49038:119;:::o;49163:224::-;49303:34;49299:1;49291:6;49287:14;49280:58;49372:7;49367:2;49359:6;49355:15;49348:32;49269:118;:::o;49393:178::-;49533:30;49529:1;49521:6;49517:14;49510:54;49499:72;:::o;49577:223::-;49717:34;49713:1;49705:6;49701:14;49694:58;49786:6;49781:2;49773:6;49769:15;49762:31;49683:117;:::o;49806:175::-;49946:27;49942:1;49934:6;49930:14;49923:51;49912:69;:::o;49987:221::-;50127:34;50123:1;50115:6;50111:14;50104:58;50196:4;50191:2;50183:6;50179:15;50172:29;50093:115;:::o;50214:231::-;50354:34;50350:1;50342:6;50338:14;50331:58;50423:14;50418:2;50410:6;50406:15;50399:39;50320:125;:::o;50451:243::-;50591:34;50587:1;50579:6;50575:14;50568:58;50660:26;50655:2;50647:6;50643:15;50636:51;50557:137;:::o;50700:229::-;50840:34;50836:1;50828:6;50824:14;50817:58;50909:12;50904:2;50896:6;50892:15;50885:37;50806:123;:::o;50935:228::-;51075:34;51071:1;51063:6;51059:14;51052:58;51144:11;51139:2;51131:6;51127:15;51120:36;51041:122;:::o;51169:233::-;51309:34;51305:1;51297:6;51293:14;51286:58;51378:16;51373:2;51365:6;51361:15;51354:41;51275:127;:::o;51408:221::-;51548:34;51544:1;51536:6;51532:14;51525:58;51617:4;51612:2;51604:6;51600:15;51593:29;51514:115;:::o;51635:182::-;51775:34;51771:1;51763:6;51759:14;51752:58;51741:76;:::o;51823:236::-;51963:34;51959:1;51951:6;51947:14;51940:58;52032:19;52027:2;52019:6;52015:15;52008:44;51929:130;:::o;52065:231::-;52205:34;52201:1;52193:6;52189:14;52182:58;52274:14;52269:2;52261:6;52257:15;52250:39;52171:125;:::o;52302:182::-;52442:34;52438:1;52430:6;52426:14;52419:58;52408:76;:::o;52490:234::-;52630:34;52626:1;52618:6;52614:14;52607:58;52699:17;52694:2;52686:6;52682:15;52675:42;52596:128;:::o;52730:220::-;52870:34;52866:1;52858:6;52854:14;52847:58;52939:3;52934:2;52926:6;52922:15;52915:28;52836:114;:::o;52956:161::-;53096:13;53092:1;53084:6;53080:14;53073:37;53062:55;:::o;53123:236::-;53263:34;53259:1;53251:6;53247:14;53240:58;53332:19;53327:2;53319:6;53315:15;53308:44;53229:130;:::o;53365:177::-;53505:29;53501:1;53493:6;53489:14;53482:53;53471:71;:::o;53548:231::-;53688:34;53684:1;53676:6;53672:14;53665:58;53757:14;53752:2;53744:6;53740:15;53733:39;53654:125;:::o;53785:122::-;53858:24;53876:5;53858:24;:::i;:::-;53851:5;53848:35;53838:2;;53897:1;53894;53887:12;53838:2;53828:79;:::o;53913:116::-;53983:21;53998:5;53983:21;:::i;:::-;53976:5;53973:32;53963:2;;54019:1;54016;54009:12;53963:2;53953:76;:::o;54035:122::-;54108:24;54126:5;54108:24;:::i;:::-;54101:5;54098:35;54088:2;;54147:1;54144;54137:12;54088:2;54078:79;:::o;54163:120::-;54235:23;54252:5;54235:23;:::i;:::-;54228:5;54225:34;54215:2;;54273:1;54270;54263:12;54215:2;54205:78;:::o;54289:122::-;54362:24;54380:5;54362:24;:::i;:::-;54355:5;54352:35;54342:2;;54401:1;54398;54391:12;54342:2;54332:79;:::o

Swarm Source

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

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