ERC-721
Overview
Max Total Supply
1,000 SPERM
Holders
367
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 SPERMLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SpermNFTOfficial
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-08 */ // File: @openzeppelin/contracts/utils/math/SafeMath.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // 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.5.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. 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. 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 v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // 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/interfaces/IERC165.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // 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/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // 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.5.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 overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Royalty.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/ERC721Royalty.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC721Royalty is ERC2981, ERC721 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); _resetTokenRoyalty(tokenId); } } // File: @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/SpermNFTOfficial.sol pragma solidity >=0.7.0 <0.9.0; contract SpermNFTOfficial is ERC721Enumerable, Ownable, ERC721Royalty { using Strings for uint256; using SafeMath for uint256; using ECDSA for bytes32; string public baseURI; string private _baseExtension = ".json"; string private _contractURI; uint256 public cost = 0 ether; //price for 1 nft uint256 public maxSupply = 1000; // number of nft in the collection bool public paused = false; mapping(address => uint256) public addressMintedBalance; constructor() ERC721("SpermNFTOfficial", "SPERM") { setBaseURI("ipfs://QmarbdFkwSUFpCzr1XhFadgwtp2ZF4vgz1Bv239JdxQDjk/"); _setDefaultRoyalty(owner(), 1000); setContractURI("ipfs://QmYJoPnAZ3Bk78TA3GqbB8uxfDKd2Tbs6wqJ2HPMNNt4JF"); } function contractURI() public view returns (string memory) { return _contractURI; } function setContractURI(string memory _URI) public onlyOwner { _contractURI = _URI; } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, ERC721Royalty) returns (bool) { return super.supportsInterface(interfaceId); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721Royalty) { super._burn(tokenId); _resetTokenRoyalty(tokenId); } function setMaxSupply(uint256 _amount) public onlyOwner { maxSupply = _amount; } function mint(uint256 _mintAmount, uint256 pass) public payable { require(pass == 123, "pass error"); require(!paused, "the contract is paused"); uint256 supply = totalSupply(); require(_mintAmount > 0, "need to mint at least 1 NFT"); require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded"); for (uint256 i = 1; i <= _mintAmount; i++) { addressMintedBalance[msg.sender]++; _safeMint(msg.sender, supply + i); } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), _baseExtension ) ) : ""; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { _baseExtension = _newBaseExtension; } function pause(bool _state) public onlyOwner { paused = _state; } function withdraw() external onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function getBalance() public view onlyOwner returns (uint256) { return address(this).balance; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"uint256","name":"pass","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxSupply","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":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e908051906020019062000051929190620005be565b5060006010556103e86011556000601260006101000a81548160ff0219169083151502179055503480156200008557600080fd5b506040518060400160405280601081526020017f537065726d4e46544f6666696369616c000000000000000000000000000000008152506040518060400160405280600581526020017f535045524d00000000000000000000000000000000000000000000000000000081525081600290805190602001906200010a929190620005be565b50806003908051906020019062000123929190620005be565b505050620001466200013a620001c360201b60201c565b620001cb60201b60201c565b62000170604051806060016040528060368152602001620051a1603691396200029160201b60201c565b62000193620001846200033c60201b60201c565b6103e86200036660201b60201c565b620001bd604051806060016040528060358152602001620051d7603591396200050960201b60201c565b62000860565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a1620001c360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c76200033c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000320576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200031790620006e3565b60405180910390fd5b80600d908051906020019062000338929190620005be565b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000376620005b460201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620003d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ce9062000705565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200044a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004419062000727565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b62000519620001c360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200053f6200033c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000598576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200058f90620006e3565b60405180910390fd5b80600f9080519060200190620005b0929190620005be565b5050565b6000612710905090565b828054620005cc906200075a565b90600052602060002090601f016020900481019282620005f057600085556200063c565b82601f106200060b57805160ff19168380011785556200063c565b828001600101855582156200063c579182015b828111156200063b5782518255916020019190600101906200061e565b5b5090506200064b91906200064f565b5090565b5b808211156200066a57600081600090555060010162000650565b5090565b60006200067d60208362000749565b91506200068a82620007bf565b602082019050919050565b6000620006a4602a8362000749565b9150620006b182620007e8565b604082019050919050565b6000620006cb60198362000749565b9150620006d88262000837565b602082019050919050565b60006020820190508181036000830152620006fe816200066e565b9050919050565b60006020820190508181036000830152620007208162000695565b9050919050565b600060208201905081810360008301526200074281620006bc565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200077357607f821691505b602082108114156200078a576200078962000790565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b61493180620008706000396000f3fe60806040526004361061020f5760003560e01c806355f804b31161011857806395d89b41116100a0578063d5abeb011161006f578063d5abeb01146107b3578063da3ef23f146107de578063e8a3d48514610807578063e985e9c514610832578063f2fde38b1461086f5761020f565b806395d89b41146106f9578063a22cb46514610724578063b88d4fde1461074d578063c87b56dd146107765761020f565b80636f8b44b0116100e75780636f8b44b01461062857806370a0823114610651578063715018a61461068e5780638da5cb5b146106a5578063938e3d7b146106d05761020f565b806355f804b31461056c5780635c975abb146105955780636352211e146105c05780636c0360eb146105fd5761020f565b80631b2ef1ca1161019b5780633ccfd60b1161016a5780633ccfd60b1461048957806342842e0e146104a0578063438b6300146104c957806344a0d68a146105065780634f6ccce71461052f5761020f565b80631b2ef1ca146103c957806323b872dd146103e55780632a55205a1461040e5780632f745c591461044c5761020f565b8063095ea7b3116101e2578063095ea7b3146102e257806312065fe01461030b57806313faede61461033657806318160ddd1461036157806318cae2691461038c5761020f565b806301ffc9a71461021457806302329a291461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906133df565b610898565b6040516102489190613ae0565b60405180910390f35b34801561025d57600080fd5b50610278600480360381019061027391906133b2565b6108aa565b005b34801561028657600080fd5b5061028f610943565b60405161029c9190613afb565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190613482565b6109d5565b6040516102d99190613a2e565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190613372565b610a5a565b005b34801561031757600080fd5b50610320610b72565b60405161032d9190613ddd565b60405180910390f35b34801561034257600080fd5b5061034b610bf6565b6040516103589190613ddd565b60405180910390f35b34801561036d57600080fd5b50610376610bfc565b6040516103839190613ddd565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae91906131ef565b610c09565b6040516103c09190613ddd565b60405180910390f35b6103e360048036038101906103de91906134af565b610c21565b005b3480156103f157600080fd5b5061040c6004803603810190610407919061325c565b610de4565b005b34801561041a57600080fd5b50610435600480360381019061043091906134af565b610e44565b604051610443929190613a95565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190613372565b61102f565b6040516104809190613ddd565b60405180910390f35b34801561049557600080fd5b5061049e6110d4565b005b3480156104ac57600080fd5b506104c760048036038101906104c2919061325c565b6111d0565b005b3480156104d557600080fd5b506104f060048036038101906104eb91906131ef565b6111f0565b6040516104fd9190613abe565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190613482565b61129e565b005b34801561053b57600080fd5b5061055660048036038101906105519190613482565b611324565b6040516105639190613ddd565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e9190613439565b611395565b005b3480156105a157600080fd5b506105aa61142b565b6040516105b79190613ae0565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e29190613482565b61143e565b6040516105f49190613a2e565b60405180910390f35b34801561060957600080fd5b506106126114f0565b60405161061f9190613afb565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a9190613482565b61157e565b005b34801561065d57600080fd5b50610678600480360381019061067391906131ef565b611604565b6040516106859190613ddd565b60405180910390f35b34801561069a57600080fd5b506106a36116bc565b005b3480156106b157600080fd5b506106ba611744565b6040516106c79190613a2e565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f29190613439565b61176e565b005b34801561070557600080fd5b5061070e611804565b60405161071b9190613afb565b60405180910390f35b34801561073057600080fd5b5061074b60048036038101906107469190613332565b611896565b005b34801561075957600080fd5b50610774600480360381019061076f91906132af565b6118ac565b005b34801561078257600080fd5b5061079d60048036038101906107989190613482565b61190e565b6040516107aa9190613afb565b60405180910390f35b3480156107bf57600080fd5b506107c86119b8565b6040516107d59190613ddd565b60405180910390f35b3480156107ea57600080fd5b5061080560048036038101906108009190613439565b6119be565b005b34801561081357600080fd5b5061081c611a54565b6040516108299190613afb565b60405180910390f35b34801561083e57600080fd5b506108596004803603810190610854919061321c565b611ae6565b6040516108669190613ae0565b60405180910390f35b34801561087b57600080fd5b50610896600480360381019061089191906131ef565b611b7a565b005b60006108a382611c72565b9050919050565b6108b2611c84565b73ffffffffffffffffffffffffffffffffffffffff166108d0611744565b73ffffffffffffffffffffffffffffffffffffffff1614610926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091d90613cfd565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b606060028054610952906140e6565b80601f016020809104026020016040519081016040528092919081815260200182805461097e906140e6565b80156109cb5780601f106109a0576101008083540402835291602001916109cb565b820191906000526020600020905b8154815290600101906020018083116109ae57829003601f168201915b5050505050905090565b60006109e082611c8c565b610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1690613cdd565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a658261143e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90613d5d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af5611c84565b73ffffffffffffffffffffffffffffffffffffffff161480610b245750610b2381610b1e611c84565b611ae6565b5b610b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5a90613c1d565b60405180910390fd5b610b6d8383611cf8565b505050565b6000610b7c611c84565b73ffffffffffffffffffffffffffffffffffffffff16610b9a611744565b73ffffffffffffffffffffffffffffffffffffffff1614610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be790613cfd565b60405180910390fd5b47905090565b60105481565b6000600a80549050905090565b60136020528060005260406000206000915090505481565b607b8114610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90613c3d565b60405180910390fd5b601260009054906101000a900460ff1615610cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cab90613d1d565b60405180910390fd5b6000610cbe610bfc565b905060008311610d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfa90613dbd565b60405180910390fd5b6011548382610d129190613f1b565b1115610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90613c9d565b60405180910390fd5b6000600190505b838111610dde57601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610db190614149565b9190505550610dcb338284610dc69190613f1b565b611db1565b8080610dd690614149565b915050610d5a565b50505050565b610df5610def611c84565b82611dcf565b610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90613d7d565b60405180910390fd5b610e3f838383611ead565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610fda5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610fe4612114565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866110109190613fa2565b61101a9190613f71565b90508160000151819350935050509250929050565b600061103a83611604565b821061107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107290613b1d565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110dc611c84565b73ffffffffffffffffffffffffffffffffffffffff166110fa611744565b73ffffffffffffffffffffffffffffffffffffffff1614611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114790613cfd565b60405180910390fd5b600061115a611744565b73ffffffffffffffffffffffffffffffffffffffff164760405161117d90613a19565b60006040518083038185875af1925050503d80600081146111ba576040519150601f19603f3d011682016040523d82523d6000602084013e6111bf565b606091505b50509050806111cd57600080fd5b50565b6111eb838383604051806020016040528060008152506118ac565b505050565b606060006111fd83611604565b905060008167ffffffffffffffff81111561121b5761121a6142ae565b5b6040519080825280602002602001820160405280156112495781602001602082028036833780820191505090505b50905060005b8281101561129357611261858261102f565b8282815181106112745761127361427f565b5b602002602001018181525050808061128b90614149565b91505061124f565b508092505050919050565b6112a6611c84565b73ffffffffffffffffffffffffffffffffffffffff166112c4611744565b73ffffffffffffffffffffffffffffffffffffffff161461131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190613cfd565b60405180910390fd5b8060108190555050565b600061132e610bfc565b821061136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690613d9d565b60405180910390fd5b600a82815481106113835761138261427f565b5b90600052602060002001549050919050565b61139d611c84565b73ffffffffffffffffffffffffffffffffffffffff166113bb611744565b73ffffffffffffffffffffffffffffffffffffffff1614611411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140890613cfd565b60405180910390fd5b80600d9080519060200190611427929190613003565b5050565b601260009054906101000a900460ff1681565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90613c7d565b60405180910390fd5b80915050919050565b600d80546114fd906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611529906140e6565b80156115765780601f1061154b57610100808354040283529160200191611576565b820191906000526020600020905b81548152906001019060200180831161155957829003601f168201915b505050505081565b611586611c84565b73ffffffffffffffffffffffffffffffffffffffff166115a4611744565b73ffffffffffffffffffffffffffffffffffffffff16146115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f190613cfd565b60405180910390fd5b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166c90613c5d565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116c4611c84565b73ffffffffffffffffffffffffffffffffffffffff166116e2611744565b73ffffffffffffffffffffffffffffffffffffffff1614611738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172f90613cfd565b60405180910390fd5b611742600061211e565b565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611776611c84565b73ffffffffffffffffffffffffffffffffffffffff16611794611744565b73ffffffffffffffffffffffffffffffffffffffff16146117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e190613cfd565b60405180910390fd5b80600f9080519060200190611800929190613003565b5050565b606060038054611813906140e6565b80601f016020809104026020016040519081016040528092919081815260200182805461183f906140e6565b801561188c5780601f106118615761010080835404028352916020019161188c565b820191906000526020600020905b81548152906001019060200180831161186f57829003601f168201915b5050505050905090565b6118a86118a1611c84565b83836121e4565b5050565b6118bd6118b7611c84565b83611dcf565b6118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f390613d7d565b60405180910390fd5b61190884848484612351565b50505050565b606061191982611c8c565b611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90613d3d565b60405180910390fd5b60006119626123ad565b9050600081511161198257604051806020016040528060008152506119b0565b8061198c8461243f565b600e6040516020016119a0939291906139e8565b6040516020818303038152906040525b915050919050565b60115481565b6119c6611c84565b73ffffffffffffffffffffffffffffffffffffffff166119e4611744565b73ffffffffffffffffffffffffffffffffffffffff1614611a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3190613cfd565b60405180910390fd5b80600e9080519060200190611a50929190613003565b5050565b6060600f8054611a63906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8f906140e6565b8015611adc5780601f10611ab157610100808354040283529160200191611adc565b820191906000526020600020905b815481529060010190602001808311611abf57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b82611c84565b73ffffffffffffffffffffffffffffffffffffffff16611ba0611744565b73ffffffffffffffffffffffffffffffffffffffff1614611bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bed90613cfd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5d90613b5d565b60405180910390fd5b611c6f8161211e565b50565b6000611c7d826125a0565b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d6b8361143e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611dcb82826040518060200160405280600081525061261a565b5050565b6000611dda82611c8c565b611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090613bfd565b60405180910390fd5b6000611e248361143e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e9357508373ffffffffffffffffffffffffffffffffffffffff16611e7b846109d5565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ea45750611ea38185611ae6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ecd8261143e565b73ffffffffffffffffffffffffffffffffffffffff1614611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a90613b7d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8a90613bbd565b60405180910390fd5b611f9e838383612675565b611fa9600082611cf8565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ff99190613ffc565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120509190613f1b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461210f838383612685565b505050565b6000612710905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a90613bdd565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123449190613ae0565b60405180910390a3505050565b61235c848484611ead565b6123688484848461268a565b6123a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239e90613b3d565b60405180910390fd5b50505050565b6060600d80546123bc906140e6565b80601f01602080910402602001604051908101604052809291908181526020018280546123e8906140e6565b80156124355780601f1061240a57610100808354040283529160200191612435565b820191906000526020600020905b81548152906001019060200180831161241857829003601f168201915b5050505050905090565b60606000821415612487576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061259b565b600082905060005b600082146124b95780806124a290614149565b915050600a826124b29190613f71565b915061248f565b60008167ffffffffffffffff8111156124d5576124d46142ae565b5b6040519080825280601f01601f1916602001820160405280156125075781602001600182028036833780820191505090505b5090505b60008514612594576001826125209190613ffc565b9150600a8561252f9190614192565b603061253b9190613f1b565b60f81b8183815181106125515761255061427f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561258d9190613f71565b945061250b565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612613575061261282612821565b5b9050919050565b6126248383612903565b612631600084848461268a565b612670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266790613b3d565b60405180910390fd5b505050565b612680838383612add565b505050565b505050565b60006126ab8473ffffffffffffffffffffffffffffffffffffffff16612bf1565b15612814578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126d4611c84565b8786866040518563ffffffff1660e01b81526004016126f69493929190613a49565b602060405180830381600087803b15801561271057600080fd5b505af192505050801561274157506040513d601f19601f8201168201806040525081019061273e919061340c565b60015b6127c4573d8060008114612771576040519150601f19603f3d011682016040523d82523d6000602084013e612776565b606091505b506000815114156127bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b390613b3d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612819565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128ec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128fc57506128fb82612c14565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296a90613cbd565b60405180910390fd5b61297c81611c8c565b156129bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b390613b9d565b60405180910390fd5b6129c860008383612675565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a189190613f1b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ad960008383612685565b5050565b612ae8838383612c8e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b2b57612b2681612c93565b612b6a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b6957612b688382612cdc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bad57612ba881612e49565b612bec565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612beb57612bea8282612f1a565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c875750612c8682612f99565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ce984611604565b612cf39190613ffc565b9050600060096000848152602001908152602001600020549050818114612dd8576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612e5d9190613ffc565b90506000600b60008481526020019081526020016000205490506000600a8381548110612e8d57612e8c61427f565b5b9060005260206000200154905080600a8381548110612eaf57612eae61427f565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612efe57612efd614250565b5b6001900381819060005260206000200160009055905550505050565b6000612f2583611604565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461300f906140e6565b90600052602060002090601f0160209004810192826130315760008555613078565b82601f1061304a57805160ff1916838001178555613078565b82800160010185558215613078579182015b8281111561307757825182559160200191906001019061305c565b5b5090506130859190613089565b5090565b5b808211156130a257600081600090555060010161308a565b5090565b60006130b96130b484613e1d565b613df8565b9050828152602081018484840111156130d5576130d46142e2565b5b6130e08482856140a4565b509392505050565b60006130fb6130f684613e4e565b613df8565b905082815260208101848484011115613117576131166142e2565b5b6131228482856140a4565b509392505050565b6000813590506131398161489f565b92915050565b60008135905061314e816148b6565b92915050565b600081359050613163816148cd565b92915050565b600081519050613178816148cd565b92915050565b600082601f830112613193576131926142dd565b5b81356131a38482602086016130a6565b91505092915050565b600082601f8301126131c1576131c06142dd565b5b81356131d18482602086016130e8565b91505092915050565b6000813590506131e9816148e4565b92915050565b600060208284031215613205576132046142ec565b5b60006132138482850161312a565b91505092915050565b60008060408385031215613233576132326142ec565b5b60006132418582860161312a565b92505060206132528582860161312a565b9150509250929050565b600080600060608486031215613275576132746142ec565b5b60006132838682870161312a565b93505060206132948682870161312a565b92505060406132a5868287016131da565b9150509250925092565b600080600080608085870312156132c9576132c86142ec565b5b60006132d78782880161312a565b94505060206132e88782880161312a565b93505060406132f9878288016131da565b925050606085013567ffffffffffffffff81111561331a576133196142e7565b5b6133268782880161317e565b91505092959194509250565b60008060408385031215613349576133486142ec565b5b60006133578582860161312a565b92505060206133688582860161313f565b9150509250929050565b60008060408385031215613389576133886142ec565b5b60006133978582860161312a565b92505060206133a8858286016131da565b9150509250929050565b6000602082840312156133c8576133c76142ec565b5b60006133d68482850161313f565b91505092915050565b6000602082840312156133f5576133f46142ec565b5b600061340384828501613154565b91505092915050565b600060208284031215613422576134216142ec565b5b600061343084828501613169565b91505092915050565b60006020828403121561344f5761344e6142ec565b5b600082013567ffffffffffffffff81111561346d5761346c6142e7565b5b613479848285016131ac565b91505092915050565b600060208284031215613498576134976142ec565b5b60006134a6848285016131da565b91505092915050565b600080604083850312156134c6576134c56142ec565b5b60006134d4858286016131da565b92505060206134e5858286016131da565b9150509250929050565b60006134fb83836139ca565b60208301905092915050565b61351081614030565b82525050565b600061352182613ea4565b61352b8185613ed2565b935061353683613e7f565b8060005b8381101561356757815161354e88826134ef565b975061355983613ec5565b92505060018101905061353a565b5085935050505092915050565b61357d81614042565b82525050565b600061358e82613eaf565b6135988185613ee3565b93506135a88185602086016140b3565b6135b1816142f1565b840191505092915050565b60006135c782613eba565b6135d18185613eff565b93506135e18185602086016140b3565b6135ea816142f1565b840191505092915050565b600061360082613eba565b61360a8185613f10565b935061361a8185602086016140b3565b80840191505092915050565b60008154613633816140e6565b61363d8186613f10565b9450600182166000811461365857600181146136695761369c565b60ff1983168652818601935061369c565b61367285613e8f565b60005b8381101561369457815481890152600182019150602081019050613675565b838801955050505b50505092915050565b60006136b2602b83613eff565b91506136bd82614302565b604082019050919050565b60006136d5603283613eff565b91506136e082614351565b604082019050919050565b60006136f8602683613eff565b9150613703826143a0565b604082019050919050565b600061371b602583613eff565b9150613726826143ef565b604082019050919050565b600061373e601c83613eff565b91506137498261443e565b602082019050919050565b6000613761602483613eff565b915061376c82614467565b604082019050919050565b6000613784601983613eff565b915061378f826144b6565b602082019050919050565b60006137a7602c83613eff565b91506137b2826144df565b604082019050919050565b60006137ca603883613eff565b91506137d58261452e565b604082019050919050565b60006137ed600a83613eff565b91506137f88261457d565b602082019050919050565b6000613810602a83613eff565b915061381b826145a6565b604082019050919050565b6000613833602983613eff565b915061383e826145f5565b604082019050919050565b6000613856601683613eff565b915061386182614644565b602082019050919050565b6000613879602083613eff565b91506138848261466d565b602082019050919050565b600061389c602c83613eff565b91506138a782614696565b604082019050919050565b60006138bf602083613eff565b91506138ca826146e5565b602082019050919050565b60006138e2601683613eff565b91506138ed8261470e565b602082019050919050565b6000613905602f83613eff565b915061391082614737565b604082019050919050565b6000613928602183613eff565b915061393382614786565b604082019050919050565b600061394b600083613ef4565b9150613956826147d5565b600082019050919050565b600061396e603183613eff565b9150613979826147d8565b604082019050919050565b6000613991602c83613eff565b915061399c82614827565b604082019050919050565b60006139b4601b83613eff565b91506139bf82614876565b602082019050919050565b6139d38161409a565b82525050565b6139e28161409a565b82525050565b60006139f482866135f5565b9150613a0082856135f5565b9150613a0c8284613626565b9150819050949350505050565b6000613a248261393e565b9150819050919050565b6000602082019050613a436000830184613507565b92915050565b6000608082019050613a5e6000830187613507565b613a6b6020830186613507565b613a7860408301856139d9565b8181036060830152613a8a8184613583565b905095945050505050565b6000604082019050613aaa6000830185613507565b613ab760208301846139d9565b9392505050565b60006020820190508181036000830152613ad88184613516565b905092915050565b6000602082019050613af56000830184613574565b92915050565b60006020820190508181036000830152613b1581846135bc565b905092915050565b60006020820190508181036000830152613b36816136a5565b9050919050565b60006020820190508181036000830152613b56816136c8565b9050919050565b60006020820190508181036000830152613b76816136eb565b9050919050565b60006020820190508181036000830152613b968161370e565b9050919050565b60006020820190508181036000830152613bb681613731565b9050919050565b60006020820190508181036000830152613bd681613754565b9050919050565b60006020820190508181036000830152613bf681613777565b9050919050565b60006020820190508181036000830152613c168161379a565b9050919050565b60006020820190508181036000830152613c36816137bd565b9050919050565b60006020820190508181036000830152613c56816137e0565b9050919050565b60006020820190508181036000830152613c7681613803565b9050919050565b60006020820190508181036000830152613c9681613826565b9050919050565b60006020820190508181036000830152613cb681613849565b9050919050565b60006020820190508181036000830152613cd68161386c565b9050919050565b60006020820190508181036000830152613cf68161388f565b9050919050565b60006020820190508181036000830152613d16816138b2565b9050919050565b60006020820190508181036000830152613d36816138d5565b9050919050565b60006020820190508181036000830152613d56816138f8565b9050919050565b60006020820190508181036000830152613d768161391b565b9050919050565b60006020820190508181036000830152613d9681613961565b9050919050565b60006020820190508181036000830152613db681613984565b9050919050565b60006020820190508181036000830152613dd6816139a7565b9050919050565b6000602082019050613df260008301846139d9565b92915050565b6000613e02613e13565b9050613e0e8282614118565b919050565b6000604051905090565b600067ffffffffffffffff821115613e3857613e376142ae565b5b613e41826142f1565b9050602081019050919050565b600067ffffffffffffffff821115613e6957613e686142ae565b5b613e72826142f1565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f268261409a565b9150613f318361409a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f6657613f656141c3565b5b828201905092915050565b6000613f7c8261409a565b9150613f878361409a565b925082613f9757613f966141f2565b5b828204905092915050565b6000613fad8261409a565b9150613fb88361409a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ff157613ff06141c3565b5b828202905092915050565b60006140078261409a565b91506140128361409a565b925082821015614025576140246141c3565b5b828203905092915050565b600061403b8261407a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140d15780820151818401526020810190506140b6565b838111156140e0576000848401525b50505050565b600060028204905060018216806140fe57607f821691505b6020821081141561411257614111614221565b5b50919050565b614121826142f1565b810181811067ffffffffffffffff821117156141405761413f6142ae565b5b80604052505050565b60006141548261409a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614187576141866141c3565b5b600182019050919050565b600061419d8261409a565b91506141a88361409a565b9250826141b8576141b76141f2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f70617373206572726f7200000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6148a881614030565b81146148b357600080fd5b50565b6148bf81614042565b81146148ca57600080fd5b50565b6148d68161404e565b81146148e157600080fd5b50565b6148ed8161409a565b81146148f857600080fd5b5056fea2646970667358221220c23038aa1e6c545c44e4359429b4e10f455e68c21d9dea3e93f37e8e005b924764736f6c63430008070033697066733a2f2f516d61726264466b7753554670437a7231586846616467777470325a463476677a3142763233394a647851446a6b2f697066733a2f2f516d594a6f506e415a33426b37385441334771624238757866444b64325462733677714a3248504d4e4e74344a46
Deployed Bytecode
0x60806040526004361061020f5760003560e01c806355f804b31161011857806395d89b41116100a0578063d5abeb011161006f578063d5abeb01146107b3578063da3ef23f146107de578063e8a3d48514610807578063e985e9c514610832578063f2fde38b1461086f5761020f565b806395d89b41146106f9578063a22cb46514610724578063b88d4fde1461074d578063c87b56dd146107765761020f565b80636f8b44b0116100e75780636f8b44b01461062857806370a0823114610651578063715018a61461068e5780638da5cb5b146106a5578063938e3d7b146106d05761020f565b806355f804b31461056c5780635c975abb146105955780636352211e146105c05780636c0360eb146105fd5761020f565b80631b2ef1ca1161019b5780633ccfd60b1161016a5780633ccfd60b1461048957806342842e0e146104a0578063438b6300146104c957806344a0d68a146105065780634f6ccce71461052f5761020f565b80631b2ef1ca146103c957806323b872dd146103e55780632a55205a1461040e5780632f745c591461044c5761020f565b8063095ea7b3116101e2578063095ea7b3146102e257806312065fe01461030b57806313faede61461033657806318160ddd1461036157806318cae2691461038c5761020f565b806301ffc9a71461021457806302329a291461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906133df565b610898565b6040516102489190613ae0565b60405180910390f35b34801561025d57600080fd5b50610278600480360381019061027391906133b2565b6108aa565b005b34801561028657600080fd5b5061028f610943565b60405161029c9190613afb565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190613482565b6109d5565b6040516102d99190613a2e565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190613372565b610a5a565b005b34801561031757600080fd5b50610320610b72565b60405161032d9190613ddd565b60405180910390f35b34801561034257600080fd5b5061034b610bf6565b6040516103589190613ddd565b60405180910390f35b34801561036d57600080fd5b50610376610bfc565b6040516103839190613ddd565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae91906131ef565b610c09565b6040516103c09190613ddd565b60405180910390f35b6103e360048036038101906103de91906134af565b610c21565b005b3480156103f157600080fd5b5061040c6004803603810190610407919061325c565b610de4565b005b34801561041a57600080fd5b50610435600480360381019061043091906134af565b610e44565b604051610443929190613a95565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190613372565b61102f565b6040516104809190613ddd565b60405180910390f35b34801561049557600080fd5b5061049e6110d4565b005b3480156104ac57600080fd5b506104c760048036038101906104c2919061325c565b6111d0565b005b3480156104d557600080fd5b506104f060048036038101906104eb91906131ef565b6111f0565b6040516104fd9190613abe565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190613482565b61129e565b005b34801561053b57600080fd5b5061055660048036038101906105519190613482565b611324565b6040516105639190613ddd565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e9190613439565b611395565b005b3480156105a157600080fd5b506105aa61142b565b6040516105b79190613ae0565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e29190613482565b61143e565b6040516105f49190613a2e565b60405180910390f35b34801561060957600080fd5b506106126114f0565b60405161061f9190613afb565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a9190613482565b61157e565b005b34801561065d57600080fd5b50610678600480360381019061067391906131ef565b611604565b6040516106859190613ddd565b60405180910390f35b34801561069a57600080fd5b506106a36116bc565b005b3480156106b157600080fd5b506106ba611744565b6040516106c79190613a2e565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f29190613439565b61176e565b005b34801561070557600080fd5b5061070e611804565b60405161071b9190613afb565b60405180910390f35b34801561073057600080fd5b5061074b60048036038101906107469190613332565b611896565b005b34801561075957600080fd5b50610774600480360381019061076f91906132af565b6118ac565b005b34801561078257600080fd5b5061079d60048036038101906107989190613482565b61190e565b6040516107aa9190613afb565b60405180910390f35b3480156107bf57600080fd5b506107c86119b8565b6040516107d59190613ddd565b60405180910390f35b3480156107ea57600080fd5b5061080560048036038101906108009190613439565b6119be565b005b34801561081357600080fd5b5061081c611a54565b6040516108299190613afb565b60405180910390f35b34801561083e57600080fd5b506108596004803603810190610854919061321c565b611ae6565b6040516108669190613ae0565b60405180910390f35b34801561087b57600080fd5b50610896600480360381019061089191906131ef565b611b7a565b005b60006108a382611c72565b9050919050565b6108b2611c84565b73ffffffffffffffffffffffffffffffffffffffff166108d0611744565b73ffffffffffffffffffffffffffffffffffffffff1614610926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091d90613cfd565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b606060028054610952906140e6565b80601f016020809104026020016040519081016040528092919081815260200182805461097e906140e6565b80156109cb5780601f106109a0576101008083540402835291602001916109cb565b820191906000526020600020905b8154815290600101906020018083116109ae57829003601f168201915b5050505050905090565b60006109e082611c8c565b610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1690613cdd565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a658261143e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90613d5d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af5611c84565b73ffffffffffffffffffffffffffffffffffffffff161480610b245750610b2381610b1e611c84565b611ae6565b5b610b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5a90613c1d565b60405180910390fd5b610b6d8383611cf8565b505050565b6000610b7c611c84565b73ffffffffffffffffffffffffffffffffffffffff16610b9a611744565b73ffffffffffffffffffffffffffffffffffffffff1614610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be790613cfd565b60405180910390fd5b47905090565b60105481565b6000600a80549050905090565b60136020528060005260406000206000915090505481565b607b8114610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90613c3d565b60405180910390fd5b601260009054906101000a900460ff1615610cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cab90613d1d565b60405180910390fd5b6000610cbe610bfc565b905060008311610d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfa90613dbd565b60405180910390fd5b6011548382610d129190613f1b565b1115610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90613c9d565b60405180910390fd5b6000600190505b838111610dde57601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610db190614149565b9190505550610dcb338284610dc69190613f1b565b611db1565b8080610dd690614149565b915050610d5a565b50505050565b610df5610def611c84565b82611dcf565b610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90613d7d565b60405180910390fd5b610e3f838383611ead565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610fda5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610fe4612114565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866110109190613fa2565b61101a9190613f71565b90508160000151819350935050509250929050565b600061103a83611604565b821061107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107290613b1d565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110dc611c84565b73ffffffffffffffffffffffffffffffffffffffff166110fa611744565b73ffffffffffffffffffffffffffffffffffffffff1614611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114790613cfd565b60405180910390fd5b600061115a611744565b73ffffffffffffffffffffffffffffffffffffffff164760405161117d90613a19565b60006040518083038185875af1925050503d80600081146111ba576040519150601f19603f3d011682016040523d82523d6000602084013e6111bf565b606091505b50509050806111cd57600080fd5b50565b6111eb838383604051806020016040528060008152506118ac565b505050565b606060006111fd83611604565b905060008167ffffffffffffffff81111561121b5761121a6142ae565b5b6040519080825280602002602001820160405280156112495781602001602082028036833780820191505090505b50905060005b8281101561129357611261858261102f565b8282815181106112745761127361427f565b5b602002602001018181525050808061128b90614149565b91505061124f565b508092505050919050565b6112a6611c84565b73ffffffffffffffffffffffffffffffffffffffff166112c4611744565b73ffffffffffffffffffffffffffffffffffffffff161461131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190613cfd565b60405180910390fd5b8060108190555050565b600061132e610bfc565b821061136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690613d9d565b60405180910390fd5b600a82815481106113835761138261427f565b5b90600052602060002001549050919050565b61139d611c84565b73ffffffffffffffffffffffffffffffffffffffff166113bb611744565b73ffffffffffffffffffffffffffffffffffffffff1614611411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140890613cfd565b60405180910390fd5b80600d9080519060200190611427929190613003565b5050565b601260009054906101000a900460ff1681565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90613c7d565b60405180910390fd5b80915050919050565b600d80546114fd906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611529906140e6565b80156115765780601f1061154b57610100808354040283529160200191611576565b820191906000526020600020905b81548152906001019060200180831161155957829003601f168201915b505050505081565b611586611c84565b73ffffffffffffffffffffffffffffffffffffffff166115a4611744565b73ffffffffffffffffffffffffffffffffffffffff16146115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f190613cfd565b60405180910390fd5b8060118190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166c90613c5d565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116c4611c84565b73ffffffffffffffffffffffffffffffffffffffff166116e2611744565b73ffffffffffffffffffffffffffffffffffffffff1614611738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172f90613cfd565b60405180910390fd5b611742600061211e565b565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611776611c84565b73ffffffffffffffffffffffffffffffffffffffff16611794611744565b73ffffffffffffffffffffffffffffffffffffffff16146117ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e190613cfd565b60405180910390fd5b80600f9080519060200190611800929190613003565b5050565b606060038054611813906140e6565b80601f016020809104026020016040519081016040528092919081815260200182805461183f906140e6565b801561188c5780601f106118615761010080835404028352916020019161188c565b820191906000526020600020905b81548152906001019060200180831161186f57829003601f168201915b5050505050905090565b6118a86118a1611c84565b83836121e4565b5050565b6118bd6118b7611c84565b83611dcf565b6118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f390613d7d565b60405180910390fd5b61190884848484612351565b50505050565b606061191982611c8c565b611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90613d3d565b60405180910390fd5b60006119626123ad565b9050600081511161198257604051806020016040528060008152506119b0565b8061198c8461243f565b600e6040516020016119a0939291906139e8565b6040516020818303038152906040525b915050919050565b60115481565b6119c6611c84565b73ffffffffffffffffffffffffffffffffffffffff166119e4611744565b73ffffffffffffffffffffffffffffffffffffffff1614611a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3190613cfd565b60405180910390fd5b80600e9080519060200190611a50929190613003565b5050565b6060600f8054611a63906140e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8f906140e6565b8015611adc5780601f10611ab157610100808354040283529160200191611adc565b820191906000526020600020905b815481529060010190602001808311611abf57829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b82611c84565b73ffffffffffffffffffffffffffffffffffffffff16611ba0611744565b73ffffffffffffffffffffffffffffffffffffffff1614611bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bed90613cfd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5d90613b5d565b60405180910390fd5b611c6f8161211e565b50565b6000611c7d826125a0565b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d6b8361143e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611dcb82826040518060200160405280600081525061261a565b5050565b6000611dda82611c8c565b611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090613bfd565b60405180910390fd5b6000611e248361143e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e9357508373ffffffffffffffffffffffffffffffffffffffff16611e7b846109d5565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ea45750611ea38185611ae6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ecd8261143e565b73ffffffffffffffffffffffffffffffffffffffff1614611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a90613b7d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8a90613bbd565b60405180910390fd5b611f9e838383612675565b611fa9600082611cf8565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ff99190613ffc565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120509190613f1b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461210f838383612685565b505050565b6000612710905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a90613bdd565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123449190613ae0565b60405180910390a3505050565b61235c848484611ead565b6123688484848461268a565b6123a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239e90613b3d565b60405180910390fd5b50505050565b6060600d80546123bc906140e6565b80601f01602080910402602001604051908101604052809291908181526020018280546123e8906140e6565b80156124355780601f1061240a57610100808354040283529160200191612435565b820191906000526020600020905b81548152906001019060200180831161241857829003601f168201915b5050505050905090565b60606000821415612487576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061259b565b600082905060005b600082146124b95780806124a290614149565b915050600a826124b29190613f71565b915061248f565b60008167ffffffffffffffff8111156124d5576124d46142ae565b5b6040519080825280601f01601f1916602001820160405280156125075781602001600182028036833780820191505090505b5090505b60008514612594576001826125209190613ffc565b9150600a8561252f9190614192565b603061253b9190613f1b565b60f81b8183815181106125515761255061427f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561258d9190613f71565b945061250b565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612613575061261282612821565b5b9050919050565b6126248383612903565b612631600084848461268a565b612670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266790613b3d565b60405180910390fd5b505050565b612680838383612add565b505050565b505050565b60006126ab8473ffffffffffffffffffffffffffffffffffffffff16612bf1565b15612814578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126d4611c84565b8786866040518563ffffffff1660e01b81526004016126f69493929190613a49565b602060405180830381600087803b15801561271057600080fd5b505af192505050801561274157506040513d601f19601f8201168201806040525081019061273e919061340c565b60015b6127c4573d8060008114612771576040519150601f19603f3d011682016040523d82523d6000602084013e612776565b606091505b506000815114156127bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b390613b3d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612819565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128ec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128fc57506128fb82612c14565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296a90613cbd565b60405180910390fd5b61297c81611c8c565b156129bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b390613b9d565b60405180910390fd5b6129c860008383612675565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a189190613f1b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ad960008383612685565b5050565b612ae8838383612c8e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b2b57612b2681612c93565b612b6a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b6957612b688382612cdc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bad57612ba881612e49565b612bec565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612beb57612bea8282612f1a565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c875750612c8682612f99565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ce984611604565b612cf39190613ffc565b9050600060096000848152602001908152602001600020549050818114612dd8576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612e5d9190613ffc565b90506000600b60008481526020019081526020016000205490506000600a8381548110612e8d57612e8c61427f565b5b9060005260206000200154905080600a8381548110612eaf57612eae61427f565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612efe57612efd614250565b5b6001900381819060005260206000200160009055905550505050565b6000612f2583611604565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461300f906140e6565b90600052602060002090601f0160209004810192826130315760008555613078565b82601f1061304a57805160ff1916838001178555613078565b82800160010185558215613078579182015b8281111561307757825182559160200191906001019061305c565b5b5090506130859190613089565b5090565b5b808211156130a257600081600090555060010161308a565b5090565b60006130b96130b484613e1d565b613df8565b9050828152602081018484840111156130d5576130d46142e2565b5b6130e08482856140a4565b509392505050565b60006130fb6130f684613e4e565b613df8565b905082815260208101848484011115613117576131166142e2565b5b6131228482856140a4565b509392505050565b6000813590506131398161489f565b92915050565b60008135905061314e816148b6565b92915050565b600081359050613163816148cd565b92915050565b600081519050613178816148cd565b92915050565b600082601f830112613193576131926142dd565b5b81356131a38482602086016130a6565b91505092915050565b600082601f8301126131c1576131c06142dd565b5b81356131d18482602086016130e8565b91505092915050565b6000813590506131e9816148e4565b92915050565b600060208284031215613205576132046142ec565b5b60006132138482850161312a565b91505092915050565b60008060408385031215613233576132326142ec565b5b60006132418582860161312a565b92505060206132528582860161312a565b9150509250929050565b600080600060608486031215613275576132746142ec565b5b60006132838682870161312a565b93505060206132948682870161312a565b92505060406132a5868287016131da565b9150509250925092565b600080600080608085870312156132c9576132c86142ec565b5b60006132d78782880161312a565b94505060206132e88782880161312a565b93505060406132f9878288016131da565b925050606085013567ffffffffffffffff81111561331a576133196142e7565b5b6133268782880161317e565b91505092959194509250565b60008060408385031215613349576133486142ec565b5b60006133578582860161312a565b92505060206133688582860161313f565b9150509250929050565b60008060408385031215613389576133886142ec565b5b60006133978582860161312a565b92505060206133a8858286016131da565b9150509250929050565b6000602082840312156133c8576133c76142ec565b5b60006133d68482850161313f565b91505092915050565b6000602082840312156133f5576133f46142ec565b5b600061340384828501613154565b91505092915050565b600060208284031215613422576134216142ec565b5b600061343084828501613169565b91505092915050565b60006020828403121561344f5761344e6142ec565b5b600082013567ffffffffffffffff81111561346d5761346c6142e7565b5b613479848285016131ac565b91505092915050565b600060208284031215613498576134976142ec565b5b60006134a6848285016131da565b91505092915050565b600080604083850312156134c6576134c56142ec565b5b60006134d4858286016131da565b92505060206134e5858286016131da565b9150509250929050565b60006134fb83836139ca565b60208301905092915050565b61351081614030565b82525050565b600061352182613ea4565b61352b8185613ed2565b935061353683613e7f565b8060005b8381101561356757815161354e88826134ef565b975061355983613ec5565b92505060018101905061353a565b5085935050505092915050565b61357d81614042565b82525050565b600061358e82613eaf565b6135988185613ee3565b93506135a88185602086016140b3565b6135b1816142f1565b840191505092915050565b60006135c782613eba565b6135d18185613eff565b93506135e18185602086016140b3565b6135ea816142f1565b840191505092915050565b600061360082613eba565b61360a8185613f10565b935061361a8185602086016140b3565b80840191505092915050565b60008154613633816140e6565b61363d8186613f10565b9450600182166000811461365857600181146136695761369c565b60ff1983168652818601935061369c565b61367285613e8f565b60005b8381101561369457815481890152600182019150602081019050613675565b838801955050505b50505092915050565b60006136b2602b83613eff565b91506136bd82614302565b604082019050919050565b60006136d5603283613eff565b91506136e082614351565b604082019050919050565b60006136f8602683613eff565b9150613703826143a0565b604082019050919050565b600061371b602583613eff565b9150613726826143ef565b604082019050919050565b600061373e601c83613eff565b91506137498261443e565b602082019050919050565b6000613761602483613eff565b915061376c82614467565b604082019050919050565b6000613784601983613eff565b915061378f826144b6565b602082019050919050565b60006137a7602c83613eff565b91506137b2826144df565b604082019050919050565b60006137ca603883613eff565b91506137d58261452e565b604082019050919050565b60006137ed600a83613eff565b91506137f88261457d565b602082019050919050565b6000613810602a83613eff565b915061381b826145a6565b604082019050919050565b6000613833602983613eff565b915061383e826145f5565b604082019050919050565b6000613856601683613eff565b915061386182614644565b602082019050919050565b6000613879602083613eff565b91506138848261466d565b602082019050919050565b600061389c602c83613eff565b91506138a782614696565b604082019050919050565b60006138bf602083613eff565b91506138ca826146e5565b602082019050919050565b60006138e2601683613eff565b91506138ed8261470e565b602082019050919050565b6000613905602f83613eff565b915061391082614737565b604082019050919050565b6000613928602183613eff565b915061393382614786565b604082019050919050565b600061394b600083613ef4565b9150613956826147d5565b600082019050919050565b600061396e603183613eff565b9150613979826147d8565b604082019050919050565b6000613991602c83613eff565b915061399c82614827565b604082019050919050565b60006139b4601b83613eff565b91506139bf82614876565b602082019050919050565b6139d38161409a565b82525050565b6139e28161409a565b82525050565b60006139f482866135f5565b9150613a0082856135f5565b9150613a0c8284613626565b9150819050949350505050565b6000613a248261393e565b9150819050919050565b6000602082019050613a436000830184613507565b92915050565b6000608082019050613a5e6000830187613507565b613a6b6020830186613507565b613a7860408301856139d9565b8181036060830152613a8a8184613583565b905095945050505050565b6000604082019050613aaa6000830185613507565b613ab760208301846139d9565b9392505050565b60006020820190508181036000830152613ad88184613516565b905092915050565b6000602082019050613af56000830184613574565b92915050565b60006020820190508181036000830152613b1581846135bc565b905092915050565b60006020820190508181036000830152613b36816136a5565b9050919050565b60006020820190508181036000830152613b56816136c8565b9050919050565b60006020820190508181036000830152613b76816136eb565b9050919050565b60006020820190508181036000830152613b968161370e565b9050919050565b60006020820190508181036000830152613bb681613731565b9050919050565b60006020820190508181036000830152613bd681613754565b9050919050565b60006020820190508181036000830152613bf681613777565b9050919050565b60006020820190508181036000830152613c168161379a565b9050919050565b60006020820190508181036000830152613c36816137bd565b9050919050565b60006020820190508181036000830152613c56816137e0565b9050919050565b60006020820190508181036000830152613c7681613803565b9050919050565b60006020820190508181036000830152613c9681613826565b9050919050565b60006020820190508181036000830152613cb681613849565b9050919050565b60006020820190508181036000830152613cd68161386c565b9050919050565b60006020820190508181036000830152613cf68161388f565b9050919050565b60006020820190508181036000830152613d16816138b2565b9050919050565b60006020820190508181036000830152613d36816138d5565b9050919050565b60006020820190508181036000830152613d56816138f8565b9050919050565b60006020820190508181036000830152613d768161391b565b9050919050565b60006020820190508181036000830152613d9681613961565b9050919050565b60006020820190508181036000830152613db681613984565b9050919050565b60006020820190508181036000830152613dd6816139a7565b9050919050565b6000602082019050613df260008301846139d9565b92915050565b6000613e02613e13565b9050613e0e8282614118565b919050565b6000604051905090565b600067ffffffffffffffff821115613e3857613e376142ae565b5b613e41826142f1565b9050602081019050919050565b600067ffffffffffffffff821115613e6957613e686142ae565b5b613e72826142f1565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f268261409a565b9150613f318361409a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f6657613f656141c3565b5b828201905092915050565b6000613f7c8261409a565b9150613f878361409a565b925082613f9757613f966141f2565b5b828204905092915050565b6000613fad8261409a565b9150613fb88361409a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ff157613ff06141c3565b5b828202905092915050565b60006140078261409a565b91506140128361409a565b925082821015614025576140246141c3565b5b828203905092915050565b600061403b8261407a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140d15780820151818401526020810190506140b6565b838111156140e0576000848401525b50505050565b600060028204905060018216806140fe57607f821691505b6020821081141561411257614111614221565b5b50919050565b614121826142f1565b810181811067ffffffffffffffff821117156141405761413f6142ae565b5b80604052505050565b60006141548261409a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614187576141866141c3565b5b600182019050919050565b600061419d8261409a565b91506141a88361409a565b9250826141b8576141b76141f2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f70617373206572726f7200000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6148a881614030565b81146148b357600080fd5b50565b6148bf81614042565b81146148ca57600080fd5b50565b6148d68161404e565b81146148e157600080fd5b50565b6148ed8161409a565b81146148f857600080fd5b5056fea2646970667358221220c23038aa1e6c545c44e4359429b4e10f455e68c21d9dea3e93f37e8e005b924764736f6c63430008070033
Deployed Bytecode Sourcemap
68953:4186:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70075:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72783:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48027:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49586:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49109:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73027:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69235:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63355:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69395:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70840:520;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50336:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36327:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;63023:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72870:149;;;;;;;;;;;;;:::i;:::-;;50746:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71368:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72417:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63545:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72511:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69362:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47721:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69127:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70740:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47451:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21324:103;;;;;;;;;;;;;:::i;:::-;;20673:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69835:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48196:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49879:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51002:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71766:643;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69289:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72623:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69730:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50105:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21582:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70075:236;70238:4;70267:36;70291:11;70267:23;:36::i;:::-;70260:43;;70075:236;;;:::o;72783:79::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72848:6:::1;72839;;:15;;;;;;;;;;;;;;;;;;72783:79:::0;:::o;48027:100::-;48081:13;48114:5;48107:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48027:100;:::o;49586:221::-;49662:7;49690:16;49698:7;49690;:16::i;:::-;49682:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49775:15;:24;49791:7;49775:24;;;;;;;;;;;;;;;;;;;;;49768:31;;49586:221;;;:::o;49109:411::-;49190:13;49206:23;49221:7;49206:14;:23::i;:::-;49190:39;;49254:5;49248:11;;:2;:11;;;;49240:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49348:5;49332:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;49357:37;49374:5;49381:12;:10;:12::i;:::-;49357:16;:37::i;:::-;49332:62;49310:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;49491:21;49500:2;49504:7;49491:8;:21::i;:::-;49179:341;49109:411;;:::o;73027:109::-;73080:7;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73107:21:::1;73100:28;;73027:109:::0;:::o;69235:29::-;;;;:::o;63355:113::-;63416:7;63443:10;:17;;;;63436:24;;63355:113;:::o;69395:55::-;;;;;;;;;;;;;;;;;:::o;70840:520::-;70931:3;70923:4;:11;70915:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;70969:6;;;;;;;;;;;70968:7;70960:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;71013:14;71030:13;:11;:13::i;:::-;71013:30;;71076:1;71062:11;:15;71054:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;71152:9;;71137:11;71128:6;:20;;;;:::i;:::-;:33;;71120:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71206:9;71218:1;71206:13;;71201:152;71226:11;71221:1;:16;71201:152;;71259:20;:32;71280:10;71259:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;71308:33;71318:10;71339:1;71330:6;:10;;;;:::i;:::-;71308:9;:33::i;:::-;71239:3;;;;;:::i;:::-;;;;71201:152;;;;70904:456;70840:520;;:::o;50336:339::-;50531:41;50550:12;:10;:12::i;:::-;50564:7;50531:18;:41::i;:::-;50523:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50639:28;50649:4;50655:2;50659:7;50639:9;:28::i;:::-;50336:339;;;:::o;36327:494::-;36471:7;36480;36505:26;36534:17;:27;36552:8;36534:27;;;;;;;;;;;36505:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36606:1;36578:30;;:7;:16;;;:30;;;36574:92;;;36635:19;36625:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36574:92;36678:21;36743:17;:15;:17::i;:::-;36702:58;;36716:7;:23;;;36703:36;;:10;:36;;;;:::i;:::-;36702:58;;;;:::i;:::-;36678:82;;36781:7;:16;;;36799:13;36773:40;;;;;;36327:494;;;;;:::o;63023:256::-;63120:7;63156:23;63173:5;63156:16;:23::i;:::-;63148:5;:31;63140:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;63245:12;:19;63258:5;63245:19;;;;;;;;;;;;;;;:26;63265:5;63245:26;;;;;;;;;;;;63238:33;;63023:256;;;;:::o;72870:149::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72921:7:::1;72942;:5;:7::i;:::-;72934:21;;72963;72934:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72920:69;;;73008:2;73000:11;;;::::0;::::1;;72909:110;72870:149::o:0;50746:185::-;50884:39;50901:4;50907:2;50911:7;50884:39;;;;;;;;;;;;:16;:39::i;:::-;50746:185;;;:::o;71368:390::-;71455:16;71489:23;71515:17;71525:6;71515:9;:17::i;:::-;71489:43;;71543:25;71585:15;71571:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71543:58;;71617:9;71612:113;71632:15;71628:1;:19;71612:113;;;71683:30;71703:6;71711:1;71683:19;:30::i;:::-;71669:8;71678:1;71669:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;71649:3;;;;;:::i;:::-;;;;71612:113;;;;71742:8;71735:15;;;;71368:390;;;:::o;72417:86::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72487:8:::1;72480:4;:15;;;;72417:86:::0;:::o;63545:233::-;63620:7;63656:30;:28;:30::i;:::-;63648:5;:38;63640:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;63753:10;63764:5;63753:17;;;;;;;;:::i;:::-;;;;;;;;;;63746:24;;63545:233;;;:::o;72511:104::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72596:11:::1;72586:7;:21;;;;;;;;;;;;:::i;:::-;;72511:104:::0;:::o;69362:26::-;;;;;;;;;;;;;:::o;47721:239::-;47793:7;47813:13;47829:7;:16;47837:7;47829:16;;;;;;;;;;;;;;;;;;;;;47813:32;;47881:1;47864:19;;:5;:19;;;;47856:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47947:5;47940:12;;;47721:239;;;:::o;69127:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70740:94::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70819:7:::1;70807:9;:19;;;;70740:94:::0;:::o;47451:208::-;47523:7;47568:1;47551:19;;:5;:19;;;;47543:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47635:9;:16;47645:5;47635:16;;;;;;;;;;;;;;;;47628:23;;47451:208;;;:::o;21324:103::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21389:30:::1;21416:1;21389:18;:30::i;:::-;21324:103::o:0;20673:87::-;20719:7;20746:6;;;;;;;;;;;20739:13;;20673:87;:::o;69835:99::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69922:4:::1;69907:12;:19;;;;;;;;;;;;:::i;:::-;;69835:99:::0;:::o;48196:104::-;48252:13;48285:7;48278:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48196:104;:::o;49879:155::-;49974:52;49993:12;:10;:12::i;:::-;50007:8;50017;49974:18;:52::i;:::-;49879:155;;:::o;51002:328::-;51177:41;51196:12;:10;:12::i;:::-;51210:7;51177:18;:41::i;:::-;51169:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51283:39;51297:4;51303:2;51307:7;51316:5;51283:13;:39::i;:::-;51002:328;;;;:::o;71766:643::-;71884:13;71937:16;71945:7;71937;:16::i;:::-;71915:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;72041:28;72072:10;:8;:10::i;:::-;72041:41;;72144:1;72119:14;72113:28;:32;:288;;;;;;;;;;;;;;;;;72237:14;72278:18;:7;:16;:18::i;:::-;72323:14;72194:166;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72113:288;72093:308;;;71766:643;;;:::o;69289:31::-;;;;:::o;72623:152::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72750:17:::1;72733:14;:34;;;;;;;;;;;;:::i;:::-;;72623:152:::0;:::o;69730:97::-;69774:13;69807:12;69800:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69730:97;:::o;50105:164::-;50202:4;50226:18;:25;50245:5;50226:25;;;;;;;;;;;;;;;:35;50252:8;50226:35;;;;;;;;;;;;;;;;;;;;;;;;;50219:42;;50105:164;;;;:::o;21582:201::-;20904:12;:10;:12::i;:::-;20893:23;;:7;:5;:7::i;:::-;:23;;;20885:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21691:1:::1;21671:22;;:8;:22;;;;21663:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21747:28;21766:8;21747:18;:28::i;:::-;21582:201:::0;:::o;61260:170::-;61362:4;61386:36;61410:11;61386:23;:36::i;:::-;61379:43;;61260:170;;;:::o;19397:98::-;19450:7;19477:10;19470:17;;19397:98;:::o;52840:127::-;52905:4;52957:1;52929:30;;:7;:16;52937:7;52929:16;;;;;;;;;;;;;;;;;;;;;:30;;;;52922:37;;52840:127;;;:::o;56986:174::-;57088:2;57061:15;:24;57077:7;57061:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57144:7;57140:2;57106:46;;57115:23;57130:7;57115:14;:23::i;:::-;57106:46;;;;;;;;;;;;56986:174;;:::o;53824:110::-;53900:26;53910:2;53914:7;53900:26;;;;;;;;;;;;:9;:26::i;:::-;53824:110;;:::o;53134:348::-;53227:4;53252:16;53260:7;53252;:16::i;:::-;53244:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53328:13;53344:23;53359:7;53344:14;:23::i;:::-;53328:39;;53397:5;53386:16;;:7;:16;;;:51;;;;53430:7;53406:31;;:20;53418:7;53406:11;:20::i;:::-;:31;;;53386:51;:87;;;;53441:32;53458:5;53465:7;53441:16;:32::i;:::-;53386:87;53378:96;;;53134:348;;;;:::o;56243:625::-;56402:4;56375:31;;:23;56390:7;56375:14;:23::i;:::-;:31;;;56367:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56481:1;56467:16;;:2;:16;;;;56459:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56537:39;56558:4;56564:2;56568:7;56537:20;:39::i;:::-;56641:29;56658:1;56662:7;56641:8;:29::i;:::-;56702:1;56683:9;:15;56693:4;56683:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;56731:1;56714:9;:13;56724:2;56714:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;56762:2;56743:7;:16;56751:7;56743:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56801:7;56797:2;56782:27;;56791:4;56782:27;;;;;;;;;;;;56822:38;56842:4;56848:2;56852:7;56822:19;:38::i;:::-;56243:625;;;:::o;37103:97::-;37161:6;37187:5;37180:12;;37103:97;:::o;21943:191::-;22017:16;22036:6;;;;;;;;;;;22017:25;;22062:8;22053:6;;:17;;;;;;;;;;;;;;;;;;22117:8;22086:40;;22107:8;22086:40;;;;;;;;;;;;22006:128;21943:191;:::o;57302:315::-;57457:8;57448:17;;:5;:17;;;;57440:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57544:8;57506:18;:25;57525:5;57506:25;;;;;;;;;;;;;;;:35;57532:8;57506:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;57590:8;57568:41;;57583:5;57568:41;;;57600:8;57568:41;;;;;;:::i;:::-;;;;;;;;57302:315;;;:::o;52212:::-;52369:28;52379:4;52385:2;52389:7;52369:9;:28::i;:::-;52416:48;52439:4;52445:2;52449:7;52458:5;52416:22;:48::i;:::-;52408:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;52212:315;;;;:::o;69959:108::-;70019:13;70052:7;70045:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69959:108;:::o;7425:723::-;7481:13;7711:1;7702:5;:10;7698:53;;;7729:10;;;;;;;;;;;;;;;;;;;;;7698:53;7761:12;7776:5;7761:20;;7792:14;7817:78;7832:1;7824:4;:9;7817:78;;7850:8;;;;;:::i;:::-;;;;7881:2;7873:10;;;;;:::i;:::-;;;7817:78;;;7905:19;7937:6;7927:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7905:39;;7955:154;7971:1;7962:5;:10;7955:154;;7999:1;7989:11;;;;;:::i;:::-;;;8066:2;8058:5;:10;;;;:::i;:::-;8045:2;:24;;;;:::i;:::-;8032:39;;8015:6;8022;8015:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8095:2;8086:11;;;;;:::i;:::-;;;7955:154;;;8133:6;8119:21;;;;;7425:723;;;;:::o;62715:224::-;62817:4;62856:35;62841:50;;;:11;:50;;;;:90;;;;62895:36;62919:11;62895:23;:36::i;:::-;62841:90;62834:97;;62715:224;;;:::o;54161:321::-;54291:18;54297:2;54301:7;54291:5;:18::i;:::-;54342:54;54373:1;54377:2;54381:7;54390:5;54342:22;:54::i;:::-;54320:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;54161:321;;;:::o;70319:215::-;70481:45;70508:4;70514:2;70518:7;70481:26;:45::i;:::-;70319:215;;;:::o;60064:125::-;;;;:::o;58182:799::-;58337:4;58358:15;:2;:13;;;:15::i;:::-;58354:620;;;58410:2;58394:36;;;58431:12;:10;:12::i;:::-;58445:4;58451:7;58460:5;58394:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58390:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58653:1;58636:6;:13;:18;58632:272;;;58679:60;;;;;;;;;;:::i;:::-;;;;;;;;58632:272;58854:6;58848:13;58839:6;58835:2;58831:15;58824:38;58390:529;58527:41;;;58517:51;;;:6;:51;;;;58510:58;;;;;58354:620;58958:4;58951:11;;58182:799;;;;;;;:::o;47082:305::-;47184:4;47236:25;47221:40;;;:11;:40;;;;:105;;;;47293:33;47278:48;;;:11;:48;;;;47221:105;:158;;;;47343:36;47367:11;47343:23;:36::i;:::-;47221:158;47201:178;;47082:305;;;:::o;54818:439::-;54912:1;54898:16;;:2;:16;;;;54890:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54971:16;54979:7;54971;:16::i;:::-;54970:17;54962:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55033:45;55062:1;55066:2;55070:7;55033:20;:45::i;:::-;55108:1;55091:9;:13;55101:2;55091:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;55139:2;55120:7;:16;55128:7;55120:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55184:7;55180:2;55159:33;;55176:1;55159:33;;;;;;;;;;;;55205:44;55233:1;55237:2;55241:7;55205:19;:44::i;:::-;54818:439;;:::o;64391:589::-;64535:45;64562:4;64568:2;64572:7;64535:26;:45::i;:::-;64613:1;64597:18;;:4;:18;;;64593:187;;;64632:40;64664:7;64632:31;:40::i;:::-;64593:187;;;64702:2;64694:10;;:4;:10;;;64690:90;;64721:47;64754:4;64760:7;64721:32;:47::i;:::-;64690:90;64593:187;64808:1;64794:16;;:2;:16;;;64790:183;;;64827:45;64864:7;64827:36;:45::i;:::-;64790:183;;;64900:4;64894:10;;:2;:10;;;64890:83;;64921:40;64949:2;64953:7;64921:27;:40::i;:::-;64890:83;64790:183;64391:589;;;:::o;23374:326::-;23434:4;23691:1;23669:7;:19;;;:23;23662:30;;23374:326;;;:::o;36057:215::-;36159:4;36198:26;36183:41;;;:11;:41;;;;:81;;;;36228:36;36252:11;36228:23;:36::i;:::-;36183:81;36176:88;;36057:215;;;:::o;59553:126::-;;;;:::o;65703:164::-;65807:10;:17;;;;65780:15;:24;65796:7;65780:24;;;;;;;;;;;:44;;;;65835:10;65851:7;65835:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65703:164;:::o;66494:988::-;66760:22;66810:1;66785:22;66802:4;66785:16;:22::i;:::-;:26;;;;:::i;:::-;66760:51;;66822:18;66843:17;:26;66861:7;66843:26;;;;;;;;;;;;66822:47;;66990:14;66976:10;:28;66972:328;;67021:19;67043:12;:18;67056:4;67043:18;;;;;;;;;;;;;;;:34;67062:14;67043:34;;;;;;;;;;;;67021:56;;67127:11;67094:12;:18;67107:4;67094:18;;;;;;;;;;;;;;;:30;67113:10;67094:30;;;;;;;;;;;:44;;;;67244:10;67211:17;:30;67229:11;67211:30;;;;;;;;;;;:43;;;;67006:294;66972:328;67396:17;:26;67414:7;67396:26;;;;;;;;;;;67389:33;;;67440:12;:18;67453:4;67440:18;;;;;;;;;;;;;;;:34;67459:14;67440:34;;;;;;;;;;;67433:41;;;66575:907;;66494:988;;:::o;67777:1079::-;68030:22;68075:1;68055:10;:17;;;;:21;;;;:::i;:::-;68030:46;;68087:18;68108:15;:24;68124:7;68108:24;;;;;;;;;;;;68087:45;;68459:19;68481:10;68492:14;68481:26;;;;;;;;:::i;:::-;;;;;;;;;;68459:48;;68545:11;68520:10;68531;68520:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;68656:10;68625:15;:28;68641:11;68625:28;;;;;;;;;;;:41;;;;68797:15;:24;68813:7;68797:24;;;;;;;;;;;68790:31;;;68832:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;67848:1008;;;67777:1079;:::o;65281:221::-;65366:14;65383:20;65400:2;65383:16;:20::i;:::-;65366:37;;65441:7;65414:12;:16;65427:2;65414:16;;;;;;;;;;;;;;;:24;65431:6;65414:24;;;;;;;;;;;:34;;;;65488:6;65459:17;:26;65477:7;65459:26;;;;;;;;;;;:35;;;;65355:147;65281:221;;:::o;34507:157::-;34592:4;34631:25;34616:40;;;:11;:40;;;;34609:47;;34507:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:474::-;7555:6;7563;7612:2;7600:9;7591:7;7587:23;7583:32;7580:119;;;7618:79;;:::i;:::-;7580:119;7738:1;7763:53;7808:7;7799:6;7788:9;7784:22;7763:53;:::i;:::-;7753:63;;7709:117;7865:2;7891:53;7936:7;7927:6;7916:9;7912:22;7891:53;:::i;:::-;7881:63;;7836:118;7487:474;;;;;:::o;7967:179::-;8036:10;8057:46;8099:3;8091:6;8057:46;:::i;:::-;8135:4;8130:3;8126:14;8112:28;;7967:179;;;;:::o;8152:118::-;8239:24;8257:5;8239:24;:::i;:::-;8234:3;8227:37;8152:118;;:::o;8306:732::-;8425:3;8454:54;8502:5;8454:54;:::i;:::-;8524:86;8603:6;8598:3;8524:86;:::i;:::-;8517:93;;8634:56;8684:5;8634:56;:::i;:::-;8713:7;8744:1;8729:284;8754:6;8751:1;8748:13;8729:284;;;8830:6;8824:13;8857:63;8916:3;8901:13;8857:63;:::i;:::-;8850:70;;8943:60;8996:6;8943:60;:::i;:::-;8933:70;;8789:224;8776:1;8773;8769:9;8764:14;;8729:284;;;8733:14;9029:3;9022:10;;8430:608;;;8306:732;;;;:::o;9044:109::-;9125:21;9140:5;9125:21;:::i;:::-;9120:3;9113:34;9044:109;;:::o;9159:360::-;9245:3;9273:38;9305:5;9273:38;:::i;:::-;9327:70;9390:6;9385:3;9327:70;:::i;:::-;9320:77;;9406:52;9451:6;9446:3;9439:4;9432:5;9428:16;9406:52;:::i;:::-;9483:29;9505:6;9483:29;:::i;:::-;9478:3;9474:39;9467:46;;9249:270;9159:360;;;;:::o;9525:364::-;9613:3;9641:39;9674:5;9641:39;:::i;:::-;9696:71;9760:6;9755:3;9696:71;:::i;:::-;9689:78;;9776:52;9821:6;9816:3;9809:4;9802:5;9798:16;9776:52;:::i;:::-;9853:29;9875:6;9853:29;:::i;:::-;9848:3;9844:39;9837:46;;9617:272;9525:364;;;;:::o;9895:377::-;10001:3;10029:39;10062:5;10029:39;:::i;:::-;10084:89;10166:6;10161:3;10084:89;:::i;:::-;10077:96;;10182:52;10227:6;10222:3;10215:4;10208:5;10204:16;10182:52;:::i;:::-;10259:6;10254:3;10250:16;10243:23;;10005:267;9895:377;;;;:::o;10302:845::-;10405:3;10442:5;10436:12;10471:36;10497:9;10471:36;:::i;:::-;10523:89;10605:6;10600:3;10523:89;:::i;:::-;10516:96;;10643:1;10632:9;10628:17;10659:1;10654:137;;;;10805:1;10800:341;;;;10621:520;;10654:137;10738:4;10734:9;10723;10719:25;10714:3;10707:38;10774:6;10769:3;10765:16;10758:23;;10654:137;;10800:341;10867:38;10899:5;10867:38;:::i;:::-;10927:1;10941:154;10955:6;10952:1;10949:13;10941:154;;;11029:7;11023:14;11019:1;11014:3;11010:11;11003:35;11079:1;11070:7;11066:15;11055:26;;10977:4;10974:1;10970:12;10965:17;;10941:154;;;11124:6;11119:3;11115:16;11108:23;;10807:334;;10621:520;;10409:738;;10302:845;;;;:::o;11153:366::-;11295:3;11316:67;11380:2;11375:3;11316:67;:::i;:::-;11309:74;;11392:93;11481:3;11392:93;:::i;:::-;11510:2;11505:3;11501:12;11494:19;;11153:366;;;:::o;11525:::-;11667:3;11688:67;11752:2;11747:3;11688:67;:::i;:::-;11681:74;;11764:93;11853:3;11764:93;:::i;:::-;11882:2;11877:3;11873:12;11866:19;;11525:366;;;:::o;11897:::-;12039:3;12060:67;12124:2;12119:3;12060:67;:::i;:::-;12053:74;;12136:93;12225:3;12136:93;:::i;:::-;12254:2;12249:3;12245:12;12238:19;;11897:366;;;:::o;12269:::-;12411:3;12432:67;12496:2;12491:3;12432:67;:::i;:::-;12425:74;;12508:93;12597:3;12508:93;:::i;:::-;12626:2;12621:3;12617:12;12610:19;;12269:366;;;:::o;12641:::-;12783:3;12804:67;12868:2;12863:3;12804:67;:::i;:::-;12797:74;;12880:93;12969:3;12880:93;:::i;:::-;12998:2;12993:3;12989:12;12982:19;;12641:366;;;:::o;13013:::-;13155:3;13176:67;13240:2;13235:3;13176:67;:::i;:::-;13169:74;;13252:93;13341:3;13252:93;:::i;:::-;13370:2;13365:3;13361:12;13354:19;;13013:366;;;:::o;13385:::-;13527:3;13548:67;13612:2;13607:3;13548:67;:::i;:::-;13541:74;;13624:93;13713:3;13624:93;:::i;:::-;13742:2;13737:3;13733:12;13726:19;;13385:366;;;:::o;13757:::-;13899:3;13920:67;13984:2;13979:3;13920:67;:::i;:::-;13913:74;;13996:93;14085:3;13996:93;:::i;:::-;14114:2;14109:3;14105:12;14098:19;;13757:366;;;:::o;14129:::-;14271:3;14292:67;14356:2;14351:3;14292:67;:::i;:::-;14285:74;;14368:93;14457:3;14368:93;:::i;:::-;14486:2;14481:3;14477:12;14470:19;;14129:366;;;:::o;14501:::-;14643:3;14664:67;14728:2;14723:3;14664:67;:::i;:::-;14657:74;;14740:93;14829:3;14740:93;:::i;:::-;14858:2;14853:3;14849:12;14842:19;;14501:366;;;:::o;14873:::-;15015:3;15036:67;15100:2;15095:3;15036:67;:::i;:::-;15029:74;;15112:93;15201:3;15112:93;:::i;:::-;15230:2;15225:3;15221:12;15214:19;;14873:366;;;:::o;15245:::-;15387:3;15408:67;15472:2;15467:3;15408:67;:::i;:::-;15401:74;;15484:93;15573:3;15484:93;:::i;:::-;15602:2;15597:3;15593:12;15586:19;;15245:366;;;:::o;15617:::-;15759:3;15780:67;15844:2;15839:3;15780:67;:::i;:::-;15773:74;;15856:93;15945:3;15856:93;:::i;:::-;15974:2;15969:3;15965:12;15958:19;;15617:366;;;:::o;15989:::-;16131:3;16152:67;16216:2;16211:3;16152:67;:::i;:::-;16145:74;;16228:93;16317:3;16228:93;:::i;:::-;16346:2;16341:3;16337:12;16330:19;;15989:366;;;:::o;16361:::-;16503:3;16524:67;16588:2;16583:3;16524:67;:::i;:::-;16517:74;;16600:93;16689:3;16600:93;:::i;:::-;16718:2;16713:3;16709:12;16702:19;;16361:366;;;:::o;16733:::-;16875:3;16896:67;16960:2;16955:3;16896:67;:::i;:::-;16889:74;;16972:93;17061:3;16972:93;:::i;:::-;17090:2;17085:3;17081:12;17074:19;;16733:366;;;:::o;17105:::-;17247:3;17268:67;17332:2;17327:3;17268:67;:::i;:::-;17261:74;;17344:93;17433:3;17344:93;:::i;:::-;17462:2;17457:3;17453:12;17446:19;;17105:366;;;:::o;17477:::-;17619:3;17640:67;17704:2;17699:3;17640:67;:::i;:::-;17633:74;;17716:93;17805:3;17716:93;:::i;:::-;17834:2;17829:3;17825:12;17818:19;;17477:366;;;:::o;17849:::-;17991:3;18012:67;18076:2;18071:3;18012:67;:::i;:::-;18005:74;;18088:93;18177:3;18088:93;:::i;:::-;18206:2;18201:3;18197:12;18190:19;;17849:366;;;:::o;18221:398::-;18380:3;18401:83;18482:1;18477:3;18401:83;:::i;:::-;18394:90;;18493:93;18582:3;18493:93;:::i;:::-;18611:1;18606:3;18602:11;18595:18;;18221:398;;;:::o;18625:366::-;18767:3;18788:67;18852:2;18847:3;18788:67;:::i;:::-;18781:74;;18864:93;18953:3;18864:93;:::i;:::-;18982:2;18977:3;18973:12;18966:19;;18625:366;;;:::o;18997:::-;19139:3;19160:67;19224:2;19219:3;19160:67;:::i;:::-;19153:74;;19236:93;19325:3;19236:93;:::i;:::-;19354:2;19349:3;19345:12;19338:19;;18997:366;;;:::o;19369:::-;19511:3;19532:67;19596:2;19591:3;19532:67;:::i;:::-;19525:74;;19608:93;19697:3;19608:93;:::i;:::-;19726:2;19721:3;19717:12;19710:19;;19369:366;;;:::o;19741:108::-;19818:24;19836:5;19818:24;:::i;:::-;19813:3;19806:37;19741:108;;:::o;19855:118::-;19942:24;19960:5;19942:24;:::i;:::-;19937:3;19930:37;19855:118;;:::o;19979:589::-;20204:3;20226:95;20317:3;20308:6;20226:95;:::i;:::-;20219:102;;20338:95;20429:3;20420:6;20338:95;:::i;:::-;20331:102;;20450:92;20538:3;20529:6;20450:92;:::i;:::-;20443:99;;20559:3;20552:10;;19979:589;;;;;;:::o;20574:379::-;20758:3;20780:147;20923:3;20780:147;:::i;:::-;20773:154;;20944:3;20937:10;;20574:379;;;:::o;20959:222::-;21052:4;21090:2;21079:9;21075:18;21067:26;;21103:71;21171:1;21160:9;21156:17;21147:6;21103:71;:::i;:::-;20959:222;;;;:::o;21187:640::-;21382:4;21420:3;21409:9;21405:19;21397:27;;21434:71;21502:1;21491:9;21487:17;21478:6;21434:71;:::i;:::-;21515:72;21583:2;21572:9;21568:18;21559:6;21515:72;:::i;:::-;21597;21665:2;21654:9;21650:18;21641:6;21597:72;:::i;:::-;21716:9;21710:4;21706:20;21701:2;21690:9;21686:18;21679:48;21744:76;21815:4;21806:6;21744:76;:::i;:::-;21736:84;;21187:640;;;;;;;:::o;21833:332::-;21954:4;21992:2;21981:9;21977:18;21969:26;;22005:71;22073:1;22062:9;22058:17;22049:6;22005:71;:::i;:::-;22086:72;22154:2;22143:9;22139:18;22130:6;22086:72;:::i;:::-;21833:332;;;;;:::o;22171:373::-;22314:4;22352:2;22341:9;22337:18;22329:26;;22401:9;22395:4;22391:20;22387:1;22376:9;22372:17;22365:47;22429:108;22532:4;22523:6;22429:108;:::i;:::-;22421:116;;22171:373;;;;:::o;22550:210::-;22637:4;22675:2;22664:9;22660:18;22652:26;;22688:65;22750:1;22739:9;22735:17;22726:6;22688:65;:::i;:::-;22550:210;;;;:::o;22766:313::-;22879:4;22917:2;22906:9;22902:18;22894:26;;22966:9;22960:4;22956:20;22952:1;22941:9;22937:17;22930:47;22994:78;23067:4;23058:6;22994:78;:::i;:::-;22986:86;;22766:313;;;;:::o;23085:419::-;23251:4;23289:2;23278:9;23274:18;23266:26;;23338:9;23332:4;23328:20;23324:1;23313:9;23309:17;23302:47;23366:131;23492:4;23366:131;:::i;:::-;23358:139;;23085:419;;;:::o;23510:::-;23676:4;23714:2;23703:9;23699:18;23691:26;;23763:9;23757:4;23753:20;23749:1;23738:9;23734:17;23727:47;23791:131;23917:4;23791:131;:::i;:::-;23783:139;;23510:419;;;:::o;23935:::-;24101:4;24139:2;24128:9;24124:18;24116:26;;24188:9;24182:4;24178:20;24174:1;24163:9;24159:17;24152:47;24216:131;24342:4;24216:131;:::i;:::-;24208:139;;23935:419;;;:::o;24360:::-;24526:4;24564:2;24553:9;24549:18;24541:26;;24613:9;24607:4;24603:20;24599:1;24588:9;24584:17;24577:47;24641:131;24767:4;24641:131;:::i;:::-;24633:139;;24360:419;;;:::o;24785:::-;24951:4;24989:2;24978:9;24974:18;24966:26;;25038:9;25032:4;25028:20;25024:1;25013:9;25009:17;25002:47;25066:131;25192:4;25066:131;:::i;:::-;25058:139;;24785:419;;;:::o;25210:::-;25376:4;25414:2;25403:9;25399:18;25391:26;;25463:9;25457:4;25453:20;25449:1;25438:9;25434:17;25427:47;25491:131;25617:4;25491:131;:::i;:::-;25483:139;;25210:419;;;:::o;25635:::-;25801:4;25839:2;25828:9;25824:18;25816:26;;25888:9;25882:4;25878:20;25874:1;25863:9;25859:17;25852:47;25916:131;26042:4;25916:131;:::i;:::-;25908:139;;25635:419;;;:::o;26060:::-;26226:4;26264:2;26253:9;26249:18;26241:26;;26313:9;26307:4;26303:20;26299:1;26288:9;26284:17;26277:47;26341:131;26467:4;26341:131;:::i;:::-;26333:139;;26060:419;;;:::o;26485:::-;26651:4;26689:2;26678:9;26674:18;26666:26;;26738:9;26732:4;26728:20;26724:1;26713:9;26709:17;26702:47;26766:131;26892:4;26766:131;:::i;:::-;26758:139;;26485:419;;;:::o;26910:::-;27076:4;27114:2;27103:9;27099:18;27091:26;;27163:9;27157:4;27153:20;27149:1;27138:9;27134:17;27127:47;27191:131;27317:4;27191:131;:::i;:::-;27183:139;;26910:419;;;:::o;27335:::-;27501:4;27539:2;27528:9;27524:18;27516:26;;27588:9;27582:4;27578:20;27574:1;27563:9;27559:17;27552:47;27616:131;27742:4;27616:131;:::i;:::-;27608:139;;27335:419;;;:::o;27760:::-;27926:4;27964:2;27953:9;27949:18;27941:26;;28013:9;28007:4;28003:20;27999:1;27988:9;27984:17;27977:47;28041:131;28167:4;28041:131;:::i;:::-;28033:139;;27760:419;;;:::o;28185:::-;28351:4;28389:2;28378:9;28374:18;28366:26;;28438:9;28432:4;28428:20;28424:1;28413:9;28409:17;28402:47;28466:131;28592:4;28466:131;:::i;:::-;28458:139;;28185:419;;;:::o;28610:::-;28776:4;28814:2;28803:9;28799:18;28791:26;;28863:9;28857:4;28853:20;28849:1;28838:9;28834:17;28827:47;28891:131;29017:4;28891:131;:::i;:::-;28883:139;;28610:419;;;:::o;29035:::-;29201:4;29239:2;29228:9;29224:18;29216:26;;29288:9;29282:4;29278:20;29274:1;29263:9;29259:17;29252:47;29316:131;29442:4;29316:131;:::i;:::-;29308:139;;29035:419;;;:::o;29460:::-;29626:4;29664:2;29653:9;29649:18;29641:26;;29713:9;29707:4;29703:20;29699:1;29688:9;29684:17;29677:47;29741:131;29867:4;29741:131;:::i;:::-;29733:139;;29460:419;;;:::o;29885:::-;30051:4;30089:2;30078:9;30074:18;30066:26;;30138:9;30132:4;30128:20;30124:1;30113:9;30109:17;30102:47;30166:131;30292:4;30166:131;:::i;:::-;30158:139;;29885:419;;;:::o;30310:::-;30476:4;30514:2;30503:9;30499:18;30491:26;;30563:9;30557:4;30553:20;30549:1;30538:9;30534:17;30527:47;30591:131;30717:4;30591:131;:::i;:::-;30583:139;;30310:419;;;:::o;30735:::-;30901:4;30939:2;30928:9;30924:18;30916:26;;30988:9;30982:4;30978:20;30974:1;30963:9;30959:17;30952:47;31016:131;31142:4;31016:131;:::i;:::-;31008:139;;30735:419;;;:::o;31160:::-;31326:4;31364:2;31353:9;31349:18;31341:26;;31413:9;31407:4;31403:20;31399:1;31388:9;31384:17;31377:47;31441:131;31567:4;31441:131;:::i;:::-;31433:139;;31160:419;;;:::o;31585:::-;31751:4;31789:2;31778:9;31774:18;31766:26;;31838:9;31832:4;31828:20;31824:1;31813:9;31809:17;31802:47;31866:131;31992:4;31866:131;:::i;:::-;31858:139;;31585:419;;;:::o;32010:::-;32176:4;32214:2;32203:9;32199:18;32191:26;;32263:9;32257:4;32253:20;32249:1;32238:9;32234:17;32227:47;32291:131;32417:4;32291:131;:::i;:::-;32283:139;;32010:419;;;:::o;32435:222::-;32528:4;32566:2;32555:9;32551:18;32543:26;;32579:71;32647:1;32636:9;32632:17;32623:6;32579:71;:::i;:::-;32435:222;;;;:::o;32663:129::-;32697:6;32724:20;;:::i;:::-;32714:30;;32753:33;32781:4;32773:6;32753:33;:::i;:::-;32663:129;;;:::o;32798:75::-;32831:6;32864:2;32858:9;32848:19;;32798:75;:::o;32879:307::-;32940:4;33030:18;33022:6;33019:30;33016:56;;;33052:18;;:::i;:::-;33016:56;33090:29;33112:6;33090:29;:::i;:::-;33082:37;;33174:4;33168;33164:15;33156:23;;32879:307;;;:::o;33192:308::-;33254:4;33344:18;33336:6;33333:30;33330:56;;;33366:18;;:::i;:::-;33330:56;33404:29;33426:6;33404:29;:::i;:::-;33396:37;;33488:4;33482;33478:15;33470:23;;33192:308;;;:::o;33506:132::-;33573:4;33596:3;33588:11;;33626:4;33621:3;33617:14;33609:22;;33506:132;;;:::o;33644:141::-;33693:4;33716:3;33708:11;;33739:3;33736:1;33729:14;33773:4;33770:1;33760:18;33752:26;;33644:141;;;:::o;33791:114::-;33858:6;33892:5;33886:12;33876:22;;33791:114;;;:::o;33911:98::-;33962:6;33996:5;33990:12;33980:22;;33911:98;;;:::o;34015:99::-;34067:6;34101:5;34095:12;34085:22;;34015:99;;;:::o;34120:113::-;34190:4;34222;34217:3;34213:14;34205:22;;34120:113;;;:::o;34239:184::-;34338:11;34372:6;34367:3;34360:19;34412:4;34407:3;34403:14;34388:29;;34239:184;;;;:::o;34429:168::-;34512:11;34546:6;34541:3;34534:19;34586:4;34581:3;34577:14;34562:29;;34429:168;;;;:::o;34603:147::-;34704:11;34741:3;34726:18;;34603:147;;;;:::o;34756:169::-;34840:11;34874:6;34869:3;34862:19;34914:4;34909:3;34905:14;34890:29;;34756:169;;;;:::o;34931:148::-;35033:11;35070:3;35055:18;;34931:148;;;;:::o;35085:305::-;35125:3;35144:20;35162:1;35144:20;:::i;:::-;35139:25;;35178:20;35196:1;35178:20;:::i;:::-;35173:25;;35332:1;35264:66;35260:74;35257:1;35254:81;35251:107;;;35338:18;;:::i;:::-;35251:107;35382:1;35379;35375:9;35368:16;;35085:305;;;;:::o;35396:185::-;35436:1;35453:20;35471:1;35453:20;:::i;:::-;35448:25;;35487:20;35505:1;35487:20;:::i;:::-;35482:25;;35526:1;35516:35;;35531:18;;:::i;:::-;35516:35;35573:1;35570;35566:9;35561:14;;35396:185;;;;:::o;35587:348::-;35627:7;35650:20;35668:1;35650:20;:::i;:::-;35645:25;;35684:20;35702:1;35684:20;:::i;:::-;35679:25;;35872:1;35804:66;35800:74;35797:1;35794:81;35789:1;35782:9;35775:17;35771:105;35768:131;;;35879:18;;:::i;:::-;35768:131;35927:1;35924;35920:9;35909:20;;35587:348;;;;:::o;35941:191::-;35981:4;36001:20;36019:1;36001:20;:::i;:::-;35996:25;;36035:20;36053:1;36035:20;:::i;:::-;36030:25;;36074:1;36071;36068:8;36065:34;;;36079:18;;:::i;:::-;36065:34;36124:1;36121;36117:9;36109:17;;35941:191;;;;:::o;36138:96::-;36175:7;36204:24;36222:5;36204:24;:::i;:::-;36193:35;;36138:96;;;:::o;36240:90::-;36274:7;36317:5;36310:13;36303:21;36292:32;;36240:90;;;:::o;36336:149::-;36372:7;36412:66;36405:5;36401:78;36390:89;;36336:149;;;:::o;36491:126::-;36528:7;36568:42;36561:5;36557:54;36546:65;;36491:126;;;:::o;36623:77::-;36660:7;36689:5;36678:16;;36623:77;;;:::o;36706:154::-;36790:6;36785:3;36780;36767:30;36852:1;36843:6;36838:3;36834:16;36827:27;36706:154;;;:::o;36866:307::-;36934:1;36944:113;36958:6;36955:1;36952:13;36944:113;;;37043:1;37038:3;37034:11;37028:18;37024:1;37019:3;37015:11;37008:39;36980:2;36977:1;36973:10;36968:15;;36944:113;;;37075:6;37072:1;37069:13;37066:101;;;37155:1;37146:6;37141:3;37137:16;37130:27;37066:101;36915:258;36866:307;;;:::o;37179:320::-;37223:6;37260:1;37254:4;37250:12;37240:22;;37307:1;37301:4;37297:12;37328:18;37318:81;;37384:4;37376:6;37372:17;37362:27;;37318:81;37446:2;37438:6;37435:14;37415:18;37412:38;37409:84;;;37465:18;;:::i;:::-;37409:84;37230:269;37179:320;;;:::o;37505:281::-;37588:27;37610:4;37588:27;:::i;:::-;37580:6;37576:40;37718:6;37706:10;37703:22;37682:18;37670:10;37667:34;37664:62;37661:88;;;37729:18;;:::i;:::-;37661:88;37769:10;37765:2;37758:22;37548:238;37505:281;;:::o;37792:233::-;37831:3;37854:24;37872:5;37854:24;:::i;:::-;37845:33;;37900:66;37893:5;37890:77;37887:103;;;37970:18;;:::i;:::-;37887:103;38017:1;38010:5;38006:13;37999:20;;37792:233;;;:::o;38031:176::-;38063:1;38080:20;38098:1;38080:20;:::i;:::-;38075:25;;38114:20;38132:1;38114:20;:::i;:::-;38109:25;;38153:1;38143:35;;38158:18;;:::i;:::-;38143:35;38199:1;38196;38192:9;38187:14;;38031:176;;;;:::o;38213:180::-;38261:77;38258:1;38251:88;38358:4;38355:1;38348:15;38382:4;38379:1;38372:15;38399:180;38447:77;38444:1;38437:88;38544:4;38541:1;38534:15;38568:4;38565:1;38558:15;38585:180;38633:77;38630:1;38623:88;38730:4;38727:1;38720:15;38754:4;38751:1;38744:15;38771:180;38819:77;38816:1;38809:88;38916:4;38913:1;38906:15;38940:4;38937:1;38930:15;38957:180;39005:77;39002:1;38995:88;39102:4;39099:1;39092:15;39126:4;39123:1;39116:15;39143:180;39191:77;39188:1;39181:88;39288:4;39285:1;39278:15;39312:4;39309:1;39302:15;39329:117;39438:1;39435;39428:12;39452:117;39561:1;39558;39551:12;39575:117;39684:1;39681;39674:12;39698:117;39807:1;39804;39797:12;39821:102;39862:6;39913:2;39909:7;39904:2;39897:5;39893:14;39889:28;39879:38;;39821:102;;;:::o;39929:230::-;40069:34;40065:1;40057:6;40053:14;40046:58;40138:13;40133:2;40125:6;40121:15;40114:38;39929:230;:::o;40165:237::-;40305:34;40301:1;40293:6;40289:14;40282:58;40374:20;40369:2;40361:6;40357:15;40350:45;40165:237;:::o;40408:225::-;40548:34;40544:1;40536:6;40532:14;40525:58;40617:8;40612:2;40604:6;40600:15;40593:33;40408:225;:::o;40639:224::-;40779:34;40775:1;40767:6;40763:14;40756:58;40848:7;40843:2;40835:6;40831:15;40824:32;40639:224;:::o;40869:178::-;41009:30;41005:1;40997:6;40993:14;40986:54;40869:178;:::o;41053:223::-;41193:34;41189:1;41181:6;41177:14;41170:58;41262:6;41257:2;41249:6;41245:15;41238:31;41053:223;:::o;41282:175::-;41422:27;41418:1;41410:6;41406:14;41399:51;41282:175;:::o;41463:231::-;41603:34;41599:1;41591:6;41587:14;41580:58;41672:14;41667:2;41659:6;41655:15;41648:39;41463:231;:::o;41700:243::-;41840:34;41836:1;41828:6;41824:14;41817:58;41909:26;41904:2;41896:6;41892:15;41885:51;41700:243;:::o;41949:160::-;42089:12;42085:1;42077:6;42073:14;42066:36;41949:160;:::o;42115:229::-;42255:34;42251:1;42243:6;42239:14;42232:58;42324:12;42319:2;42311:6;42307:15;42300:37;42115:229;:::o;42350:228::-;42490:34;42486:1;42478:6;42474:14;42467:58;42559:11;42554:2;42546:6;42542:15;42535:36;42350:228;:::o;42584:172::-;42724:24;42720:1;42712:6;42708:14;42701:48;42584:172;:::o;42762:182::-;42902:34;42898:1;42890:6;42886:14;42879:58;42762:182;:::o;42950:231::-;43090:34;43086:1;43078:6;43074:14;43067:58;43159:14;43154:2;43146:6;43142:15;43135:39;42950:231;:::o;43187:182::-;43327:34;43323:1;43315:6;43311:14;43304:58;43187:182;:::o;43375:172::-;43515:24;43511:1;43503:6;43499:14;43492:48;43375:172;:::o;43553:234::-;43693:34;43689:1;43681:6;43677:14;43670:58;43762:17;43757:2;43749:6;43745:15;43738:42;43553:234;:::o;43793:220::-;43933:34;43929:1;43921:6;43917:14;43910:58;44002:3;43997:2;43989:6;43985:15;43978:28;43793:220;:::o;44019:114::-;;:::o;44139:236::-;44279:34;44275:1;44267:6;44263:14;44256:58;44348:19;44343:2;44335:6;44331:15;44324:44;44139:236;:::o;44381:231::-;44521:34;44517:1;44509:6;44505:14;44498:58;44590:14;44585:2;44577:6;44573:15;44566:39;44381:231;:::o;44618:177::-;44758:29;44754:1;44746:6;44742:14;44735:53;44618:177;:::o;44801:122::-;44874:24;44892:5;44874:24;:::i;:::-;44867:5;44864:35;44854:63;;44913:1;44910;44903:12;44854:63;44801:122;:::o;44929:116::-;44999:21;45014:5;44999:21;:::i;:::-;44992:5;44989:32;44979:60;;45035:1;45032;45025:12;44979:60;44929:116;:::o;45051:120::-;45123:23;45140:5;45123:23;:::i;:::-;45116:5;45113:34;45103:62;;45161:1;45158;45151:12;45103:62;45051:120;:::o;45177:122::-;45250:24;45268:5;45250:24;:::i;:::-;45243:5;45240:35;45230:63;;45289:1;45286;45279:12;45230:63;45177:122;:::o
Swarm Source
ipfs://c23038aa1e6c545c44e4359429b4e10f455e68c21d9dea3e93f37e8e005b9247
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.