Token ClubCRO
Overview CRC721
Total Supply:
46 ELITE
Holders:
36 addresses
Contract:
Balance
1 ELITE
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EnumerableNFT
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // 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); } } } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @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)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); error MaxSupplyReached(); error BatchSizeLimit(); error PriceTooLow(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ abstract contract ERC721a is Context, ERC165, IERC721, IERC721Metadata, Ownable, Pausable { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } function _baseURI() internal view virtual returns (string memory) { return ""; } function _maxBatchSize() internal view virtual returns (uint256) { return 0; } function _maxSupply() internal view virtual returns (uint256) { return 0; } function _nftCost() internal view virtual returns (uint256) { return 0; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721a.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 { _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 { _transfer(from, to, tokenId); if ( to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data) ) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; uint64 _adjustedQuantity = uint64( Math.min(quantity, _maxSupply() - _totalMinted()) ); if (to == address(0)) revert MintToZeroAddress(); if (_adjustedQuantity == 0) revert MintZeroQuantity(); if (_totalMinted() >= _maxSupply()) revert MaxSupplyReached(); if (quantity > _maxBatchSize()) revert BatchSizeLimit(); _beforeTokenTransfers(address(0), to, startTokenId, _adjustedQuantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += _adjustedQuantity; _addressData[to].numberMinted += _adjustedQuantity; _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + _adjustedQuantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if ( !_checkContractOnERC721Received( address(0), to, updatedIndex++, _data ) ) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end && _totalMinted() < _maxSupply()); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end && _totalMinted() < _maxSupply()); } _currentIndex = updatedIndex; if (_adjustedQuantity < quantity) { payable(address(_msgSender())).transfer( (quantity - _adjustedQuantity) * _nftCost() ); } } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; uint64 _adjustedQuantity = uint64( Math.min(quantity, _maxSupply() - _totalMinted()) ); if (to == address(0)) revert MintToZeroAddress(); if (_adjustedQuantity == 0) revert MintZeroQuantity(); if (_totalMinted() >= _maxSupply()) revert MaxSupplyReached(); _beforeTokenTransfers(address(0), to, startTokenId, _adjustedQuantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += _adjustedQuantity; _addressData[to].numberMinted += _adjustedQuantity; _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end && _totalMinted() < _maxSupply()); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./ERC721/ERC721a.sol"; import "./extensions/Whitelist.sol"; import "./extensions/Referral.sol"; contract EnumerableNFT is ERC721a, Whitelist, Referral { // Token name string private _name; // Token symbol string private _symbol; // Max batch size uint256 private __maxBatchSize; // Max supply uint256 private __maxSupply; // Metadata BaseURI string private __baseURI; // NFT unit cost uint256 private __nftCost; constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 maxSupply_, uint256 nftCost_ ) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); __maxBatchSize = maxBatchSize_; __maxSupply = maxSupply_; __nftCost = nftCost_; _setWhitelistCost(nftCost_); _pause(); } function _baseURI() internal view override returns (string memory) { return __baseURI; } function _maxBatchSize() internal view override returns (uint256) { return isWhitelistOpen() && paused() ? 999 : __maxBatchSize; } function _maxSupply() internal view override returns (uint256) { return __maxSupply; } function _nftCost() internal view override returns (uint256) { return __nftCost; } // Owner only functions /** * @dev sets the metadata baseURI. */ function setBaseURI(string memory baseURI_) external onlyOwner { __baseURI = baseURI_; } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function withdraw() external onlyOwner { payable(owner()).transfer(address(this).balance); } function openWhitelist() external onlyOwner { _openWhitelist(); } function closeWhitelist() external onlyOwner { _closeWhitelist(); } function setMessageSigner(address _signer) external onlyOwner { _setMessageSigner(_signer); } function setWhitelistCost(uint256 _cost) external onlyOwner { _setWhitelistCost(_cost); } function withdrawAmountTo(address to, uint256 amount) external onlyOwner { require(address(this).balance >= amount); payable(to).transfer(amount); } function approveReferrer(address _referrer) external onlyOwner { _approveAddressToRefer(_referrer); } function revokeReferrer(address _referrer) external onlyOwner { _revokeAddressToRefer(_referrer); } function setReferralFee(uint256 _fee) external onlyOwner { _setReferralFee(_fee); } // Public functions /** * @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; } function claim(uint256 quantity, bytes memory signedMessage) public payable whenWhitelistOpen { if (msg.value < quantity * _whitelistCost()) revert PriceTooLow(); _verifyWhitelistSignedMessage(_msgSender(), quantity, signedMessage); _safeMint(_msgSender(), quantity); } function mint(uint256 quantity) public payable whenNotPaused { if (msg.value < quantity * _nftCost()) revert PriceTooLow(); _safeMint(_msgSender(), quantity); } function mint(uint256 quantity, address referrer) public payable whenNotPaused { if (msg.value < quantity * _nftCost()) revert PriceTooLow(); _safeMint(_msgSender(), quantity); _handleReferral(referrer); } function ownerMint(uint256 quantity) public onlyOwner { _mint(owner(), quantity); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; contract Referral { event Refer(bool sent, bytes data, address referrer); // Addresses that have the ability to refer mapping(address => bool) private _canRefer; // Flat fee given to referrers when a user purchases uint256 private _referralFee; function _setReferralFee(uint256 _newFee) internal { _referralFee = _newFee; } function _approveAddressToRefer(address _newReferrer) internal { _canRefer[_newReferrer] = true; } function _revokeAddressToRefer(address _referrer) internal { _canRefer[_referrer] = false; } function _handleReferral(address _referrer) internal { if (_canRefer[_referrer] && address(this).balance >= _referralFee) { (bool sent, bytes memory data) = _referrer.call{ value: _referralFee }(""); emit Refer(sent, data, _referrer); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; error WhitelistClaimed(); error InvalidWhitelistClaim(); contract Whitelist { using Strings for uint256; // Whitelist is open bool private _whitelistIsOpen; // Whitelist cost uint256 private __whitelistCost; // Status of signed messages mapping(bytes => bool) private _usedSignedMessages; // public signer address address private _messageSigner; modifier whenWhitelistOpen() { require(_whitelistIsOpen, "WL"); _; } function isWhitelistOpen() internal view returns (bool) { return _whitelistIsOpen; } function _openWhitelist() internal { _whitelistIsOpen = true; } function _closeWhitelist() internal { _whitelistIsOpen = false; } function _setMessageSigner(address _signer) internal { _messageSigner = _signer; } function _setWhitelistCost(uint256 _cost) internal { __whitelistCost = _cost; } function _whitelistCost() internal view returns (uint256) { return __whitelistCost; } function _verifyWhitelistSignedMessage( address _claimant, uint256 _quantity, bytes memory _signedMessage ) internal { if (_usedSignedMessages[_signedMessage]) revert WhitelistClaimed(); bytes32 _message = ECDSA.toEthSignedMessageHash( abi.encodePacked( Strings.toHexString(uint256(uint160(_claimant)), 20), _quantity.toString() ) ); address _signer = ECDSA.recover(_message, _signedMessage); if (_signer != _messageSigner) revert InvalidWhitelistClaim(); _usedSignedMessages[_signedMessage] = true; } }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "london", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"maxSupply_","type":"uint256"},{"internalType":"uint256","name":"nftCost_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BatchSizeLimit","type":"error"},{"inputs":[],"name":"InvalidWhitelistClaim","type":"error"},{"inputs":[],"name":"MaxSupplyReached","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"PriceTooLow","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WhitelistClaimed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"sent","type":"bool"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"address","name":"referrer","type":"address"}],"name":"Refer","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"approveReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"signedMessage","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"closeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"address","name":"_referrer","type":"address"}],"name":"revokeReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setMessageSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setReferralFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAmountTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005a4638038062005a46833981810160405281019062000037919062000467565b620000576200004b620000ec60201b60201c565b620000f460201b60201c565b60008060146101000a81548160ff02191690831515021790555084600d90816200008291906200076e565b5083600e90816200009491906200076e565b50620000a5620001b860201b60201c565b60018190555082600f819055508160108190555080601281905550620000d181620001c160201b60201c565b620000e1620001cb60201b60201c565b50505050506200093a565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b8060088190555050565b620001db6200028360201b60201c565b156200021e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021590620008b6565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200026a620000ec60201b60201c565b6040516200027991906200091d565b60405180910390a1565b60008060149054906101000a900460ff16905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200030282620002b7565b810181811067ffffffffffffffff82111715620003245762000323620002c8565b5b80604052505050565b60006200033962000299565b9050620003478282620002f7565b919050565b600067ffffffffffffffff8211156200036a5762000369620002c8565b5b6200037582620002b7565b9050602081019050919050565b60005b83811015620003a257808201518184015260208101905062000385565b60008484015250505050565b6000620003c5620003bf846200034c565b6200032d565b905082815260208101848484011115620003e457620003e3620002b2565b5b620003f184828562000382565b509392505050565b600082601f830112620004115762000410620002ad565b5b815162000423848260208601620003ae565b91505092915050565b6000819050919050565b62000441816200042c565b81146200044d57600080fd5b50565b600081519050620004618162000436565b92915050565b600080600080600060a08688031215620004865762000485620002a3565b5b600086015167ffffffffffffffff811115620004a757620004a6620002a8565b5b620004b588828901620003f9565b955050602086015167ffffffffffffffff811115620004d957620004d8620002a8565b5b620004e788828901620003f9565b9450506040620004fa8882890162000450565b93505060606200050d8882890162000450565b9250506080620005208882890162000450565b9150509295509295909350565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200058057607f821691505b60208210810362000596576200059562000538565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005c1565b6200060c8683620005c1565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200064f6200064962000643846200042c565b62000624565b6200042c565b9050919050565b6000819050919050565b6200066b836200062e565b620006836200067a8262000656565b848454620005ce565b825550505050565b600090565b6200069a6200068b565b620006a781848462000660565b505050565b5b81811015620006cf57620006c360008262000690565b600181019050620006ad565b5050565b601f8211156200071e57620006e8816200059c565b620006f384620005b1565b8101602085101562000703578190505b6200071b6200071285620005b1565b830182620006ac565b50505b505050565b600082821c905092915050565b6000620007436000198460080262000723565b1980831691505092915050565b60006200075e838362000730565b9150826002028217905092915050565b62000779826200052d565b67ffffffffffffffff811115620007955762000794620002c8565b5b620007a1825462000567565b620007ae828285620006d3565b600060209050601f831160018114620007e65760008415620007d1578287015190505b620007dd858262000750565b8655506200084d565b601f198416620007f6866200059c565b60005b828110156200082057848901518255600182019150602085019450602081019050620007f9565b868310156200084057848901516200083c601f89168262000730565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006200089e60108362000855565b9150620008ab8262000866565b602082019050919050565b60006020820190508181036000830152620008d1816200088f565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200090582620008d8565b9050919050565b6200091781620008f8565b82525050565b60006020820190506200093460008301846200090c565b92915050565b6150fc806200094a6000396000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063d8a236f81161006f578063d8a236f81461067e578063e465f1f5146106a7578063e985e9c5146106d0578063f19e75d41461070d578063f2fde38b14610736576101f9565b8063a22cb465146105c6578063b88d4fde146105ef578063c87b56dd14610618578063d49479eb14610655576101f9565b80638da5cb5b116100dc5780638da5cb5b1461053857806394bf804d1461056357806395d89b411461057f578063a0712d68146105aa576101f9565b806370a08231146104a4578063713494d7146104e1578063715018a61461050a5780638456cb5914610521576101f9565b806338926b6d116101905780634b36df531161015f5780634b36df53146103d357806355f804b3146103fc578063586b9a7c146104255780635c975abb1461043c5780636352211e14610467576101f9565b806338926b6d146103605780633ccfd60b1461037c5780633f4ba83a1461039357806342842e0e146103aa576101f9565b8063095ea7b3116101cc578063095ea7b3146102ba578063100e54eb146102e357806318160ddd1461030c57806323b872dd14610337576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063083bbe7f146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613d15565b61075f565b6040516102329190613d5d565b60405180910390f35b34801561024757600080fd5b50610250610841565b60405161025d9190613e08565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613e60565b6108d3565b60405161029a9190613ece565b60405180910390f35b3480156102af57600080fd5b506102b861094f565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190613f15565b6109d5565b005b3480156102ef57600080fd5b5061030a60048036038101906103059190613f55565b610adf565b005b34801561031857600080fd5b50610321610b67565b60405161032e9190613f91565b60405180910390f35b34801561034357600080fd5b5061035e60048036038101906103599190613fac565b610b7e565b005b61037a60048036038101906103759190614134565b610b8e565b005b34801561038857600080fd5b50610391610c50565b005b34801561039f57600080fd5b506103a8610d1c565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190613fac565b610da2565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190613f55565b610dc2565b005b34801561040857600080fd5b50610423600480360381019061041e9190614231565b610e4a565b005b34801561043157600080fd5b5061043a610ed9565b005b34801561044857600080fd5b50610451610f5f565b60405161045e9190613d5d565b60405180910390f35b34801561047357600080fd5b5061048e60048036038101906104899190613e60565b610f75565b60405161049b9190613ece565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190613f55565b610f8b565b6040516104d89190613f91565b60405180910390f35b3480156104ed57600080fd5b5061050860048036038101906105039190613e60565b61105a565b005b34801561051657600080fd5b5061051f6110e2565b005b34801561052d57600080fd5b5061053661116a565b005b34801561054457600080fd5b5061054d6111f0565b60405161055a9190613ece565b60405180910390f35b61057d6004803603810190610578919061427a565b611219565b005b34801561058b57600080fd5b506105946112cb565b6040516105a19190613e08565b60405180910390f35b6105c460048036038101906105bf9190613e60565b61135d565b005b3480156105d257600080fd5b506105ed60048036038101906105e891906142e6565b611405565b005b3480156105fb57600080fd5b5061061660048036038101906106119190614326565b61157c565b005b34801561062457600080fd5b5061063f600480360381019061063a9190613e60565b6115f8565b60405161064c9190613e08565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190613e60565b611696565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613f55565b61171e565b005b3480156106b357600080fd5b506106ce60048036038101906106c99190613f15565b6117a6565b005b3480156106dc57600080fd5b506106f760048036038101906106f291906143a9565b61187a565b6040516107049190613d5d565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f9190613e60565b61190e565b005b34801561074257600080fd5b5061075d60048036038101906107589190613f55565b61199e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061083a575061083982611a95565b5b9050919050565b6060600d805461085090614418565b80601f016020809104026020016040519081016040528092919081815260200182805461087c90614418565b80156108c95780601f1061089e576101008083540402835291602001916108c9565b820191906000526020600020905b8154815290600101906020018083116108ac57829003601f168201915b5050505050905090565b60006108de82611aff565b610914576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610957611b4d565b73ffffffffffffffffffffffffffffffffffffffff166109756111f0565b73ffffffffffffffffffffffffffffffffffffffff16146109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290614495565b60405180910390fd5b6109d3611b55565b565b60006109e082610f75565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a47576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a66611b4d565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a985750610a9681610a91611b4d565b61187a565b155b15610acf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ada838383611b72565b505050565b610ae7611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610b056111f0565b73ffffffffffffffffffffffffffffffffffffffff1614610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5290614495565b60405180910390fd5b610b6481611c24565b50565b6000610b71611c7f565b6002546001540303905090565b610b89838383611c88565b505050565b600760009054906101000a900460ff16610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd490614501565b60405180910390fd5b610be561213c565b82610bf09190614550565b341015610c29576040517fdbbbe82200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3b610c34611b4d565b8383612146565b610c4c610c46611b4d565b836122d2565b5050565b610c58611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610c766111f0565b73ffffffffffffffffffffffffffffffffffffffff1614610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390614495565b60405180910390fd5b610cd46111f0565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d19573d6000803e3d6000fd5b50565b610d24611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610d426111f0565b73ffffffffffffffffffffffffffffffffffffffff1614610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f90614495565b60405180910390fd5b610da06122f0565b565b610dbd8383836040518060200160405280600081525061157c565b505050565b610dca611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610de86111f0565b73ffffffffffffffffffffffffffffffffffffffff1614610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3590614495565b60405180910390fd5b610e4781612391565b50565b610e52611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610e706111f0565b73ffffffffffffffffffffffffffffffffffffffff1614610ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebd90614495565b60405180910390fd5b8060119081610ed59190614756565b5050565b610ee1611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610eff6111f0565b73ffffffffffffffffffffffffffffffffffffffff1614610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90614495565b60405180910390fd5b610f5d6123d5565b565b60008060149054906101000a900460ff16905090565b6000610f80826123f2565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ff2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611062611b4d565b73ffffffffffffffffffffffffffffffffffffffff166110806111f0565b73ffffffffffffffffffffffffffffffffffffffff16146110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90614495565b60405180910390fd5b6110df81612681565b50565b6110ea611b4d565b73ffffffffffffffffffffffffffffffffffffffff166111086111f0565b73ffffffffffffffffffffffffffffffffffffffff161461115e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115590614495565b60405180910390fd5b611168600061268b565b565b611172611b4d565b73ffffffffffffffffffffffffffffffffffffffff166111906111f0565b73ffffffffffffffffffffffffffffffffffffffff16146111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90614495565b60405180910390fd5b6111ee61274f565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611221610f5f565b15611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614874565b60405180910390fd5b6112696127f2565b826112749190614550565b3410156112ad576040517fdbbbe82200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112be6112b8611b4d565b836122d2565b6112c7816127fc565b5050565b6060600e80546112da90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461130690614418565b80156113535780601f1061132857610100808354040283529160200191611353565b820191906000526020600020905b81548152906001019060200180831161133657829003601f168201915b5050505050905090565b611365610f5f565b156113a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139c90614874565b60405180910390fd5b6113ad6127f2565b816113b89190614550565b3410156113f1576040517fdbbbe82200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114026113fc611b4d565b826122d2565b50565b61140d611b4d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611471576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806006600061147e611b4d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661152b611b4d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115709190613d5d565b60405180910390a35050565b611587848484611c88565b6115a68373ffffffffffffffffffffffffffffffffffffffff1661290d565b80156115bb57506115b984848484612930565b155b156115f2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061160382611aff565b611639576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611643612a80565b90506000815103611663576040518060200160405280600081525061168e565b8061166d84612b12565b60405160200161167e9291906148d0565b6040516020818303038152906040525b915050919050565b61169e611b4d565b73ffffffffffffffffffffffffffffffffffffffff166116bc6111f0565b73ffffffffffffffffffffffffffffffffffffffff1614611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170990614495565b60405180910390fd5b61171b81612c72565b50565b611726611b4d565b73ffffffffffffffffffffffffffffffffffffffff166117446111f0565b73ffffffffffffffffffffffffffffffffffffffff161461179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190614495565b60405180910390fd5b6117a381612c7c565b50565b6117ae611b4d565b73ffffffffffffffffffffffffffffffffffffffff166117cc6111f0565b73ffffffffffffffffffffffffffffffffffffffff1614611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614495565b60405180910390fd5b8047101561182f57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611875573d6000803e3d6000fd5b505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611916611b4d565b73ffffffffffffffffffffffffffffffffffffffff166119346111f0565b73ffffffffffffffffffffffffffffffffffffffff161461198a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198190614495565b60405180910390fd5b61199b6119956111f0565b82612cd7565b50565b6119a6611b4d565b73ffffffffffffffffffffffffffffffffffffffff166119c46111f0565b73ffffffffffffffffffffffffffffffffffffffff1614611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1190614495565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8090614966565b60405180910390fd5b611a928161268b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611b0a611c7f565b11158015611b19575060015482105b8015611b46575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b6001600760006101000a81548160ff021916908315150217905550565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006001905090565b6000611c93826123f2565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611cfe576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611d1f611b4d565b73ffffffffffffffffffffffffffffffffffffffff161480611d4e5750611d4d85611d48611b4d565b61187a565b5b80611d935750611d5c611b4d565b73ffffffffffffffffffffffffffffffffffffffff16611d7b846108d3565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611dcc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e32576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e3f858585600161304f565b611e4b60008487611b72565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600360008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600360008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036120ca5760015482146120c957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121358585856001613055565b5050505050565b6000600854905090565b60098160405161215691906149cd565b908152602001604051809103902060009054906101000a900460ff16156121a9576040517fafb3768900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006121fd6121cf8573ffffffffffffffffffffffffffffffffffffffff16601461305b565b6121d885612b12565b6040516020016121e99291906148d0565b604051602081830303815290604052613297565b9050600061220b82846132d2565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612294576040517f4825ec7b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016009846040516122a691906149cd565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050505050565b6122ec8282604051806020016040528060008152506132f9565b5050565b6122f8610f5f565b612337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232e90614a30565b60405180910390fd5b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61237a611b4d565b6040516123879190613ece565b60405180910390a1565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760006101000a81548160ff021916908315150217905550565b6123fa613c66565b600082905080612408611c7f565b11158015612417575060015481105b1561264a576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161264857600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461252c57809250505061267c565b5b60011561264757818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461264257809250505061267c565b61252d565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b80600c8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612757610f5f565b15612797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278e90614874565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586127db611b4d565b6040516127e89190613ece565b60405180910390a1565b6000601254905090565b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156128575750600c544710155b1561290a576000808273ffffffffffffffffffffffffffffffffffffffff16600c5460405161288590614a76565b60006040518083038185875af1925050503d80600081146128c2576040519150601f19603f3d011682016040523d82523d6000602084013e6128c7565b606091505b50915091507fc6c7269f00b5ce195224a7e43fa780967aa8c847817cebda0377599c421d64948282856040516128ff93929190614ad5565b60405180910390a150505b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612956611b4d565b8786866040518563ffffffff1660e01b81526004016129789493929190614b13565b6020604051808303816000875af19250505080156129b457506040513d601f19601f820116820180604052508101906129b19190614b74565b60015b612a2d573d80600081146129e4576040519150601f19603f3d011682016040523d82523d6000602084013e6129e9565b606091505b506000815103612a25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060118054612a8f90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054612abb90614418565b8015612b085780601f10612add57610100808354040283529160200191612b08565b820191906000526020600020905b815481529060010190602001808311612aeb57829003601f168201915b5050505050905090565b606060008203612b59576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c6d565b600082905060005b60008214612b8b578080612b7490614ba1565b915050600a82612b849190614c18565b9150612b61565b60008167ffffffffffffffff811115612ba757612ba6614009565b5b6040519080825280601f01601f191660200182016040528015612bd95781602001600182028036833780820191505090505b5090505b60008514612c6657600182612bf29190614c49565b9150600a85612c019190614c7d565b6030612c0d9190614cae565b60f81b818381518110612c2357612c22614ce2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c5f9190614c18565b9450612bdd565b8093505050505b919050565b8060088190555050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600060015490506000612d0383612cec613832565b612cf4613845565b612cfe9190614c49565b61384f565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612d6b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff1603612daf576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612db7613845565b612dbf613832565b10612df6576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e0d600085848467ffffffffffffffff1661304f565b80600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000829050600084820190505b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415801561302f5750613025613845565b61302d613832565b105b612fb0578160018190555050506130496000858486613055565b50505050565b50505050565b50505050565b60606000600283600261306e9190614550565b6130789190614cae565b67ffffffffffffffff81111561309157613090614009565b5b6040519080825280601f01601f1916602001820160405280156130c35781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106130fb576130fa614ce2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061315f5761315e614ce2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261319f9190614550565b6131a99190614cae565b90505b6001811115613249577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106131eb576131ea614ce2565b5b1a60f81b82828151811061320257613201614ce2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061324290614d11565b90506131ac565b506000841461328d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328490614d86565b60405180910390fd5b8091505092915050565b60006132a38251612b12565b826040516020016132b5929190614df2565b604051602081830303815290604052805190602001209050919050565b60008060006132e18585613868565b915091506132ee816138e9565b819250505092915050565b6000600154905060006133258461330e613832565b613316613845565b6133209190614c49565b61384f565b9050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361338d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff16036133d1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133d9613845565b6133e1613832565b10613418576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613420613ab5565b841115613459576040517fdb986f8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613470600086848467ffffffffffffffff1661304f565b80600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600082905060008267ffffffffffffffff168201905061363b8773ffffffffffffffffffffffffffffffffffffffff1661290d565b1561371a575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136b06000888480600101955088612930565b6136e6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415801561370357506136f9613845565b613701613832565b105b61364157836001541461371557600080fd5b61379f565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415801561379a5750613790613845565b613798613832565b105b61371b575b81600181905550858367ffffffffffffffff16101561381c576137c0611b4d565b73ffffffffffffffffffffffffffffffffffffffff166108fc6137e16127f2565b8567ffffffffffffffff168903029081150290604051600060405180830381858888f1935050505015801561381a573d6000803e3d6000fd5b505b505061382b6000868487613055565b5050505050565b600061383c611c7f565b60015403905090565b6000601054905090565b600081831061385e5781613860565b825b905092915050565b60008060418351036138a95760008060006020860151925060408601519150606086015160001a905061389d87828585613ae4565b945094505050506138e2565b60408351036138d95760008060208501519150604085015190506138ce868383613bf0565b9350935050506138e2565b60006002915091505b9250929050565b600060048111156138fd576138fc614e21565b5b8160048111156139105761390f614e21565b5b0315613ab2576001600481111561392a57613929614e21565b5b81600481111561393d5761393c614e21565b5b0361397d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397490614e9c565b60405180910390fd5b6002600481111561399157613990614e21565b5b8160048111156139a4576139a3614e21565b5b036139e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139db90614f08565b60405180910390fd5b600360048111156139f8576139f7614e21565b5b816004811115613a0b57613a0a614e21565b5b03613a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4290614f9a565b60405180910390fd5b600480811115613a5e57613a5d614e21565b5b816004811115613a7157613a70614e21565b5b03613ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aa89061502c565b60405180910390fd5b5b50565b6000613abf613c4f565b8015613acf5750613ace610f5f565b5b613adb57600f54613adf565b6103e75b905090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613b1f576000600391509150613be7565b601b8560ff1614158015613b375750601c8560ff1614155b15613b49576000600491509150613be7565b600060018787878760405160008152602001604052604051613b6e9493929190615081565b6020604051602081039080840390855afa158015613b90573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613bde57600060019250925050613be7565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613c339190614cae565b9050613c4187828885613ae4565b935093505050935093915050565b6000600760009054906101000a900460ff16905090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cf281613cbd565b8114613cfd57600080fd5b50565b600081359050613d0f81613ce9565b92915050565b600060208284031215613d2b57613d2a613cb3565b5b6000613d3984828501613d00565b91505092915050565b60008115159050919050565b613d5781613d42565b82525050565b6000602082019050613d726000830184613d4e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613db2578082015181840152602081019050613d97565b60008484015250505050565b6000601f19601f8301169050919050565b6000613dda82613d78565b613de48185613d83565b9350613df4818560208601613d94565b613dfd81613dbe565b840191505092915050565b60006020820190508181036000830152613e228184613dcf565b905092915050565b6000819050919050565b613e3d81613e2a565b8114613e4857600080fd5b50565b600081359050613e5a81613e34565b92915050565b600060208284031215613e7657613e75613cb3565b5b6000613e8484828501613e4b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613eb882613e8d565b9050919050565b613ec881613ead565b82525050565b6000602082019050613ee36000830184613ebf565b92915050565b613ef281613ead565b8114613efd57600080fd5b50565b600081359050613f0f81613ee9565b92915050565b60008060408385031215613f2c57613f2b613cb3565b5b6000613f3a85828601613f00565b9250506020613f4b85828601613e4b565b9150509250929050565b600060208284031215613f6b57613f6a613cb3565b5b6000613f7984828501613f00565b91505092915050565b613f8b81613e2a565b82525050565b6000602082019050613fa66000830184613f82565b92915050565b600080600060608486031215613fc557613fc4613cb3565b5b6000613fd386828701613f00565b9350506020613fe486828701613f00565b9250506040613ff586828701613e4b565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61404182613dbe565b810181811067ffffffffffffffff821117156140605761405f614009565b5b80604052505050565b6000614073613ca9565b905061407f8282614038565b919050565b600067ffffffffffffffff82111561409f5761409e614009565b5b6140a882613dbe565b9050602081019050919050565b82818337600083830152505050565b60006140d76140d284614084565b614069565b9050828152602081018484840111156140f3576140f2614004565b5b6140fe8482856140b5565b509392505050565b600082601f83011261411b5761411a613fff565b5b813561412b8482602086016140c4565b91505092915050565b6000806040838503121561414b5761414a613cb3565b5b600061415985828601613e4b565b925050602083013567ffffffffffffffff81111561417a57614179613cb8565b5b61418685828601614106565b9150509250929050565b600067ffffffffffffffff8211156141ab576141aa614009565b5b6141b482613dbe565b9050602081019050919050565b60006141d46141cf84614190565b614069565b9050828152602081018484840111156141f0576141ef614004565b5b6141fb8482856140b5565b509392505050565b600082601f83011261421857614217613fff565b5b81356142288482602086016141c1565b91505092915050565b60006020828403121561424757614246613cb3565b5b600082013567ffffffffffffffff81111561426557614264613cb8565b5b61427184828501614203565b91505092915050565b6000806040838503121561429157614290613cb3565b5b600061429f85828601613e4b565b92505060206142b085828601613f00565b9150509250929050565b6142c381613d42565b81146142ce57600080fd5b50565b6000813590506142e0816142ba565b92915050565b600080604083850312156142fd576142fc613cb3565b5b600061430b85828601613f00565b925050602061431c858286016142d1565b9150509250929050565b600080600080608085870312156143405761433f613cb3565b5b600061434e87828801613f00565b945050602061435f87828801613f00565b935050604061437087828801613e4b565b925050606085013567ffffffffffffffff81111561439157614390613cb8565b5b61439d87828801614106565b91505092959194509250565b600080604083850312156143c0576143bf613cb3565b5b60006143ce85828601613f00565b92505060206143df85828601613f00565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061443057607f821691505b602082108103614443576144426143e9565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061447f602083613d83565b915061448a82614449565b602082019050919050565b600060208201905081810360008301526144ae81614472565b9050919050565b7f574c000000000000000000000000000000000000000000000000000000000000600082015250565b60006144eb600283613d83565b91506144f6826144b5565b602082019050919050565b6000602082019050818103600083015261451a816144de565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061455b82613e2a565b915061456683613e2a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561459f5761459e614521565b5b828202905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261460c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826145cf565b61461686836145cf565b95508019841693508086168417925050509392505050565b6000819050919050565b600061465361464e61464984613e2a565b61462e565b613e2a565b9050919050565b6000819050919050565b61466d83614638565b6146816146798261465a565b8484546145dc565b825550505050565b600090565b614696614689565b6146a1818484614664565b505050565b5b818110156146c5576146ba60008261468e565b6001810190506146a7565b5050565b601f82111561470a576146db816145aa565b6146e4846145bf565b810160208510156146f3578190505b6147076146ff856145bf565b8301826146a6565b50505b505050565b600082821c905092915050565b600061472d6000198460080261470f565b1980831691505092915050565b6000614746838361471c565b9150826002028217905092915050565b61475f82613d78565b67ffffffffffffffff81111561477857614777614009565b5b6147828254614418565b61478d8282856146c9565b600060209050601f8311600181146147c057600084156147ae578287015190505b6147b8858261473a565b865550614820565b601f1984166147ce866145aa565b60005b828110156147f6578489015182556001820191506020850194506020810190506147d1565b86831015614813578489015161480f601f89168261471c565b8355505b6001600288020188555050505b505050505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061485e601083613d83565b915061486982614828565b602082019050919050565b6000602082019050818103600083015261488d81614851565b9050919050565b600081905092915050565b60006148aa82613d78565b6148b48185614894565b93506148c4818560208601613d94565b80840191505092915050565b60006148dc828561489f565b91506148e8828461489f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614950602683613d83565b915061495b826148f4565b604082019050919050565b6000602082019050818103600083015261497f81614943565b9050919050565b600081519050919050565b600081905092915050565b60006149a782614986565b6149b18185614991565b93506149c1818560208601613d94565b80840191505092915050565b60006149d9828461499c565b915081905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614a1a601483613d83565b9150614a25826149e4565b602082019050919050565b60006020820190508181036000830152614a4981614a0d565b9050919050565b50565b6000614a60600083614991565b9150614a6b82614a50565b600082019050919050565b6000614a8182614a53565b9150819050919050565b600082825260208201905092915050565b6000614aa782614986565b614ab18185614a8b565b9350614ac1818560208601613d94565b614aca81613dbe565b840191505092915050565b6000606082019050614aea6000830186613d4e565b8181036020830152614afc8185614a9c565b9050614b0b6040830184613ebf565b949350505050565b6000608082019050614b286000830187613ebf565b614b356020830186613ebf565b614b426040830185613f82565b8181036060830152614b548184614a9c565b905095945050505050565b600081519050614b6e81613ce9565b92915050565b600060208284031215614b8a57614b89613cb3565b5b6000614b9884828501614b5f565b91505092915050565b6000614bac82613e2a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bde57614bdd614521565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c2382613e2a565b9150614c2e83613e2a565b925082614c3e57614c3d614be9565b5b828204905092915050565b6000614c5482613e2a565b9150614c5f83613e2a565b9250828203905081811115614c7757614c76614521565b5b92915050565b6000614c8882613e2a565b9150614c9383613e2a565b925082614ca357614ca2614be9565b5b828206905092915050565b6000614cb982613e2a565b9150614cc483613e2a565b9250828201905080821115614cdc57614cdb614521565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614d1c82613e2a565b915060008203614d2f57614d2e614521565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614d70602083613d83565b9150614d7b82614d3a565b602082019050919050565b60006020820190508181036000830152614d9f81614d63565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000600082015250565b6000614ddc601a83614894565b9150614de782614da6565b601a82019050919050565b6000614dfd82614dcf565b9150614e09828561489f565b9150614e15828461499c565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614e86601883613d83565b9150614e9182614e50565b602082019050919050565b60006020820190508181036000830152614eb581614e79565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614ef2601f83613d83565b9150614efd82614ebc565b602082019050919050565b60006020820190508181036000830152614f2181614ee5565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f84602283613d83565b9150614f8f82614f28565b604082019050919050565b60006020820190508181036000830152614fb381614f77565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615016602283613d83565b915061502182614fba565b604082019050919050565b6000602082019050818103600083015261504581615009565b9050919050565b6000819050919050565b61505f8161504c565b82525050565b600060ff82169050919050565b61507b81615065565b82525050565b60006080820190506150966000830187615056565b6150a36020830186615072565b6150b06040830185615056565b6150bd6060830184615056565b9594505050505056fea2646970667358221220c69ee3769e21b538a0cba995602f9cd404c58e4816028d509b41ec964562d4ed64736f6c6343000810003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000010f0cf064dd592000000000000000000000000000000000000000000000000000000000000000000007436c756243524f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005454c495445000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063d8a236f81161006f578063d8a236f81461067e578063e465f1f5146106a7578063e985e9c5146106d0578063f19e75d41461070d578063f2fde38b14610736576101f9565b8063a22cb465146105c6578063b88d4fde146105ef578063c87b56dd14610618578063d49479eb14610655576101f9565b80638da5cb5b116100dc5780638da5cb5b1461053857806394bf804d1461056357806395d89b411461057f578063a0712d68146105aa576101f9565b806370a08231146104a4578063713494d7146104e1578063715018a61461050a5780638456cb5914610521576101f9565b806338926b6d116101905780634b36df531161015f5780634b36df53146103d357806355f804b3146103fc578063586b9a7c146104255780635c975abb1461043c5780636352211e14610467576101f9565b806338926b6d146103605780633ccfd60b1461037c5780633f4ba83a1461039357806342842e0e146103aa576101f9565b8063095ea7b3116101cc578063095ea7b3146102ba578063100e54eb146102e357806318160ddd1461030c57806323b872dd14610337576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063083bbe7f146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613d15565b61075f565b6040516102329190613d5d565b60405180910390f35b34801561024757600080fd5b50610250610841565b60405161025d9190613e08565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613e60565b6108d3565b60405161029a9190613ece565b60405180910390f35b3480156102af57600080fd5b506102b861094f565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190613f15565b6109d5565b005b3480156102ef57600080fd5b5061030a60048036038101906103059190613f55565b610adf565b005b34801561031857600080fd5b50610321610b67565b60405161032e9190613f91565b60405180910390f35b34801561034357600080fd5b5061035e60048036038101906103599190613fac565b610b7e565b005b61037a60048036038101906103759190614134565b610b8e565b005b34801561038857600080fd5b50610391610c50565b005b34801561039f57600080fd5b506103a8610d1c565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190613fac565b610da2565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190613f55565b610dc2565b005b34801561040857600080fd5b50610423600480360381019061041e9190614231565b610e4a565b005b34801561043157600080fd5b5061043a610ed9565b005b34801561044857600080fd5b50610451610f5f565b60405161045e9190613d5d565b60405180910390f35b34801561047357600080fd5b5061048e60048036038101906104899190613e60565b610f75565b60405161049b9190613ece565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190613f55565b610f8b565b6040516104d89190613f91565b60405180910390f35b3480156104ed57600080fd5b5061050860048036038101906105039190613e60565b61105a565b005b34801561051657600080fd5b5061051f6110e2565b005b34801561052d57600080fd5b5061053661116a565b005b34801561054457600080fd5b5061054d6111f0565b60405161055a9190613ece565b60405180910390f35b61057d6004803603810190610578919061427a565b611219565b005b34801561058b57600080fd5b506105946112cb565b6040516105a19190613e08565b60405180910390f35b6105c460048036038101906105bf9190613e60565b61135d565b005b3480156105d257600080fd5b506105ed60048036038101906105e891906142e6565b611405565b005b3480156105fb57600080fd5b5061061660048036038101906106119190614326565b61157c565b005b34801561062457600080fd5b5061063f600480360381019061063a9190613e60565b6115f8565b60405161064c9190613e08565b60405180910390f35b34801561066157600080fd5b5061067c60048036038101906106779190613e60565b611696565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613f55565b61171e565b005b3480156106b357600080fd5b506106ce60048036038101906106c99190613f15565b6117a6565b005b3480156106dc57600080fd5b506106f760048036038101906106f291906143a9565b61187a565b6040516107049190613d5d565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f9190613e60565b61190e565b005b34801561074257600080fd5b5061075d60048036038101906107589190613f55565b61199e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061083a575061083982611a95565b5b9050919050565b6060600d805461085090614418565b80601f016020809104026020016040519081016040528092919081815260200182805461087c90614418565b80156108c95780601f1061089e576101008083540402835291602001916108c9565b820191906000526020600020905b8154815290600101906020018083116108ac57829003601f168201915b5050505050905090565b60006108de82611aff565b610914576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610957611b4d565b73ffffffffffffffffffffffffffffffffffffffff166109756111f0565b73ffffffffffffffffffffffffffffffffffffffff16146109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c290614495565b60405180910390fd5b6109d3611b55565b565b60006109e082610f75565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a47576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a66611b4d565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a985750610a9681610a91611b4d565b61187a565b155b15610acf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ada838383611b72565b505050565b610ae7611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610b056111f0565b73ffffffffffffffffffffffffffffffffffffffff1614610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5290614495565b60405180910390fd5b610b6481611c24565b50565b6000610b71611c7f565b6002546001540303905090565b610b89838383611c88565b505050565b600760009054906101000a900460ff16610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd490614501565b60405180910390fd5b610be561213c565b82610bf09190614550565b341015610c29576040517fdbbbe82200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3b610c34611b4d565b8383612146565b610c4c610c46611b4d565b836122d2565b5050565b610c58611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610c766111f0565b73ffffffffffffffffffffffffffffffffffffffff1614610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390614495565b60405180910390fd5b610cd46111f0565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d19573d6000803e3d6000fd5b50565b610d24611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610d426111f0565b73ffffffffffffffffffffffffffffffffffffffff1614610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f90614495565b60405180910390fd5b610da06122f0565b565b610dbd8383836040518060200160405280600081525061157c565b505050565b610dca611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610de86111f0565b73ffffffffffffffffffffffffffffffffffffffff1614610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3590614495565b60405180910390fd5b610e4781612391565b50565b610e52611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610e706111f0565b73ffffffffffffffffffffffffffffffffffffffff1614610ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebd90614495565b60405180910390fd5b8060119081610ed59190614756565b5050565b610ee1611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610eff6111f0565b73ffffffffffffffffffffffffffffffffffffffff1614610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90614495565b60405180910390fd5b610f5d6123d5565b565b60008060149054906101000a900460ff16905090565b6000610f80826123f2565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ff2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611062611b4d565b73ffffffffffffffffffffffffffffffffffffffff166110806111f0565b73ffffffffffffffffffffffffffffffffffffffff16146110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90614495565b60405180910390fd5b6110df81612681565b50565b6110ea611b4d565b73ffffffffffffffffffffffffffffffffffffffff166111086111f0565b73ffffffffffffffffffffffffffffffffffffffff161461115e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115590614495565b60405180910390fd5b611168600061268b565b565b611172611b4d565b73ffffffffffffffffffffffffffffffffffffffff166111906111f0565b73ffffffffffffffffffffffffffffffffffffffff16146111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90614495565b60405180910390fd5b6111ee61274f565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611221610f5f565b15611261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125890614874565b60405180910390fd5b6112696127f2565b826112749190614550565b3410156112ad576040517fdbbbe82200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112be6112b8611b4d565b836122d2565b6112c7816127fc565b5050565b6060600e80546112da90614418565b80601f016020809104026020016040519081016040528092919081815260200182805461130690614418565b80156113535780601f1061132857610100808354040283529160200191611353565b820191906000526020600020905b81548152906001019060200180831161133657829003601f168201915b5050505050905090565b611365610f5f565b156113a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139c90614874565b60405180910390fd5b6113ad6127f2565b816113b89190614550565b3410156113f1576040517fdbbbe82200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114026113fc611b4d565b826122d2565b50565b61140d611b4d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611471576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806006600061147e611b4d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661152b611b4d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115709190613d5d565b60405180910390a35050565b611587848484611c88565b6115a68373ffffffffffffffffffffffffffffffffffffffff1661290d565b80156115bb57506115b984848484612930565b155b156115f2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061160382611aff565b611639576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611643612a80565b90506000815103611663576040518060200160405280600081525061168e565b8061166d84612b12565b60405160200161167e9291906148d0565b6040516020818303038152906040525b915050919050565b61169e611b4d565b73ffffffffffffffffffffffffffffffffffffffff166116bc6111f0565b73ffffffffffffffffffffffffffffffffffffffff1614611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170990614495565b60405180910390fd5b61171b81612c72565b50565b611726611b4d565b73ffffffffffffffffffffffffffffffffffffffff166117446111f0565b73ffffffffffffffffffffffffffffffffffffffff161461179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190614495565b60405180910390fd5b6117a381612c7c565b50565b6117ae611b4d565b73ffffffffffffffffffffffffffffffffffffffff166117cc6111f0565b73ffffffffffffffffffffffffffffffffffffffff1614611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614495565b60405180910390fd5b8047101561182f57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611875573d6000803e3d6000fd5b505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611916611b4d565b73ffffffffffffffffffffffffffffffffffffffff166119346111f0565b73ffffffffffffffffffffffffffffffffffffffff161461198a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198190614495565b60405180910390fd5b61199b6119956111f0565b82612cd7565b50565b6119a6611b4d565b73ffffffffffffffffffffffffffffffffffffffff166119c46111f0565b73ffffffffffffffffffffffffffffffffffffffff1614611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1190614495565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8090614966565b60405180910390fd5b611a928161268b565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611b0a611c7f565b11158015611b19575060015482105b8015611b46575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b6001600760006101000a81548160ff021916908315150217905550565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006001905090565b6000611c93826123f2565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611cfe576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611d1f611b4d565b73ffffffffffffffffffffffffffffffffffffffff161480611d4e5750611d4d85611d48611b4d565b61187a565b5b80611d935750611d5c611b4d565b73ffffffffffffffffffffffffffffffffffffffff16611d7b846108d3565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611dcc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e32576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e3f858585600161304f565b611e4b60008487611b72565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600360008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600360008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036120ca5760015482146120c957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121358585856001613055565b5050505050565b6000600854905090565b60098160405161215691906149cd565b908152602001604051809103902060009054906101000a900460ff16156121a9576040517fafb3768900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006121fd6121cf8573ffffffffffffffffffffffffffffffffffffffff16601461305b565b6121d885612b12565b6040516020016121e99291906148d0565b604051602081830303815290604052613297565b9050600061220b82846132d2565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612294576040517f4825ec7b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016009846040516122a691906149cd565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050505050565b6122ec8282604051806020016040528060008152506132f9565b5050565b6122f8610f5f565b612337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232e90614a30565b60405180910390fd5b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61237a611b4d565b6040516123879190613ece565b60405180910390a1565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760006101000a81548160ff021916908315150217905550565b6123fa613c66565b600082905080612408611c7f565b11158015612417575060015481105b1561264a576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161264857600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461252c57809250505061267c565b5b60011561264757818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461264257809250505061267c565b61252d565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b80600c8190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612757610f5f565b15612797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278e90614874565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586127db611b4d565b6040516127e89190613ece565b60405180910390a1565b6000601254905090565b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156128575750600c544710155b1561290a576000808273ffffffffffffffffffffffffffffffffffffffff16600c5460405161288590614a76565b60006040518083038185875af1925050503d80600081146128c2576040519150601f19603f3d011682016040523d82523d6000602084013e6128c7565b606091505b50915091507fc6c7269f00b5ce195224a7e43fa780967aa8c847817cebda0377599c421d64948282856040516128ff93929190614ad5565b60405180910390a150505b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612956611b4d565b8786866040518563ffffffff1660e01b81526004016129789493929190614b13565b6020604051808303816000875af19250505080156129b457506040513d601f19601f820116820180604052508101906129b19190614b74565b60015b612a2d573d80600081146129e4576040519150601f19603f3d011682016040523d82523d6000602084013e6129e9565b606091505b506000815103612a25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060118054612a8f90614418565b80601f0160208091040260200160405190810160405280929190818152602001828054612abb90614418565b8015612b085780601f10612add57610100808354040283529160200191612b08565b820191906000526020600020905b815481529060010190602001808311612aeb57829003601f168201915b5050505050905090565b606060008203612b59576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c6d565b600082905060005b60008214612b8b578080612b7490614ba1565b915050600a82612b849190614c18565b9150612b61565b60008167ffffffffffffffff811115612ba757612ba6614009565b5b6040519080825280601f01601f191660200182016040528015612bd95781602001600182028036833780820191505090505b5090505b60008514612c6657600182612bf29190614c49565b9150600a85612c019190614c7d565b6030612c0d9190614cae565b60f81b818381518110612c2357612c22614ce2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c5f9190614c18565b9450612bdd565b8093505050505b919050565b8060088190555050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600060015490506000612d0383612cec613832565b612cf4613845565b612cfe9190614c49565b61384f565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612d6b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff1603612daf576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612db7613845565b612dbf613832565b10612df6576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e0d600085848467ffffffffffffffff1661304f565b80600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000829050600084820190505b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415801561302f5750613025613845565b61302d613832565b105b612fb0578160018190555050506130496000858486613055565b50505050565b50505050565b50505050565b60606000600283600261306e9190614550565b6130789190614cae565b67ffffffffffffffff81111561309157613090614009565b5b6040519080825280601f01601f1916602001820160405280156130c35781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106130fb576130fa614ce2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061315f5761315e614ce2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261319f9190614550565b6131a99190614cae565b90505b6001811115613249577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106131eb576131ea614ce2565b5b1a60f81b82828151811061320257613201614ce2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061324290614d11565b90506131ac565b506000841461328d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328490614d86565b60405180910390fd5b8091505092915050565b60006132a38251612b12565b826040516020016132b5929190614df2565b604051602081830303815290604052805190602001209050919050565b60008060006132e18585613868565b915091506132ee816138e9565b819250505092915050565b6000600154905060006133258461330e613832565b613316613845565b6133209190614c49565b61384f565b9050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361338d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff16036133d1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133d9613845565b6133e1613832565b10613418576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613420613ab5565b841115613459576040517fdb986f8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613470600086848467ffffffffffffffff1661304f565b80600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600084815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600082905060008267ffffffffffffffff168201905061363b8773ffffffffffffffffffffffffffffffffffffffff1661290d565b1561371a575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136b06000888480600101955088612930565b6136e6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415801561370357506136f9613845565b613701613832565b105b61364157836001541461371557600080fd5b61379f565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415801561379a5750613790613845565b613798613832565b105b61371b575b81600181905550858367ffffffffffffffff16101561381c576137c0611b4d565b73ffffffffffffffffffffffffffffffffffffffff166108fc6137e16127f2565b8567ffffffffffffffff168903029081150290604051600060405180830381858888f1935050505015801561381a573d6000803e3d6000fd5b505b505061382b6000868487613055565b5050505050565b600061383c611c7f565b60015403905090565b6000601054905090565b600081831061385e5781613860565b825b905092915050565b60008060418351036138a95760008060006020860151925060408601519150606086015160001a905061389d87828585613ae4565b945094505050506138e2565b60408351036138d95760008060208501519150604085015190506138ce868383613bf0565b9350935050506138e2565b60006002915091505b9250929050565b600060048111156138fd576138fc614e21565b5b8160048111156139105761390f614e21565b5b0315613ab2576001600481111561392a57613929614e21565b5b81600481111561393d5761393c614e21565b5b0361397d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397490614e9c565b60405180910390fd5b6002600481111561399157613990614e21565b5b8160048111156139a4576139a3614e21565b5b036139e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139db90614f08565b60405180910390fd5b600360048111156139f8576139f7614e21565b5b816004811115613a0b57613a0a614e21565b5b03613a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4290614f9a565b60405180910390fd5b600480811115613a5e57613a5d614e21565b5b816004811115613a7157613a70614e21565b5b03613ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aa89061502c565b60405180910390fd5b5b50565b6000613abf613c4f565b8015613acf5750613ace610f5f565b5b613adb57600f54613adf565b6103e75b905090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613b1f576000600391509150613be7565b601b8560ff1614158015613b375750601c8560ff1614155b15613b49576000600491509150613be7565b600060018787878760405160008152602001604052604051613b6e9493929190615081565b6020604051602081039080840390855afa158015613b90573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613bde57600060019250925050613be7565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613c339190614cae565b9050613c4187828885613ae4565b935093505050935093915050565b6000600760009054906101000a900460ff16905090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cf281613cbd565b8114613cfd57600080fd5b50565b600081359050613d0f81613ce9565b92915050565b600060208284031215613d2b57613d2a613cb3565b5b6000613d3984828501613d00565b91505092915050565b60008115159050919050565b613d5781613d42565b82525050565b6000602082019050613d726000830184613d4e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613db2578082015181840152602081019050613d97565b60008484015250505050565b6000601f19601f8301169050919050565b6000613dda82613d78565b613de48185613d83565b9350613df4818560208601613d94565b613dfd81613dbe565b840191505092915050565b60006020820190508181036000830152613e228184613dcf565b905092915050565b6000819050919050565b613e3d81613e2a565b8114613e4857600080fd5b50565b600081359050613e5a81613e34565b92915050565b600060208284031215613e7657613e75613cb3565b5b6000613e8484828501613e4b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613eb882613e8d565b9050919050565b613ec881613ead565b82525050565b6000602082019050613ee36000830184613ebf565b92915050565b613ef281613ead565b8114613efd57600080fd5b50565b600081359050613f0f81613ee9565b92915050565b60008060408385031215613f2c57613f2b613cb3565b5b6000613f3a85828601613f00565b9250506020613f4b85828601613e4b565b9150509250929050565b600060208284031215613f6b57613f6a613cb3565b5b6000613f7984828501613f00565b91505092915050565b613f8b81613e2a565b82525050565b6000602082019050613fa66000830184613f82565b92915050565b600080600060608486031215613fc557613fc4613cb3565b5b6000613fd386828701613f00565b9350506020613fe486828701613f00565b9250506040613ff586828701613e4b565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61404182613dbe565b810181811067ffffffffffffffff821117156140605761405f614009565b5b80604052505050565b6000614073613ca9565b905061407f8282614038565b919050565b600067ffffffffffffffff82111561409f5761409e614009565b5b6140a882613dbe565b9050602081019050919050565b82818337600083830152505050565b60006140d76140d284614084565b614069565b9050828152602081018484840111156140f3576140f2614004565b5b6140fe8482856140b5565b509392505050565b600082601f83011261411b5761411a613fff565b5b813561412b8482602086016140c4565b91505092915050565b6000806040838503121561414b5761414a613cb3565b5b600061415985828601613e4b565b925050602083013567ffffffffffffffff81111561417a57614179613cb8565b5b61418685828601614106565b9150509250929050565b600067ffffffffffffffff8211156141ab576141aa614009565b5b6141b482613dbe565b9050602081019050919050565b60006141d46141cf84614190565b614069565b9050828152602081018484840111156141f0576141ef614004565b5b6141fb8482856140b5565b509392505050565b600082601f83011261421857614217613fff565b5b81356142288482602086016141c1565b91505092915050565b60006020828403121561424757614246613cb3565b5b600082013567ffffffffffffffff81111561426557614264613cb8565b5b61427184828501614203565b91505092915050565b6000806040838503121561429157614290613cb3565b5b600061429f85828601613e4b565b92505060206142b085828601613f00565b9150509250929050565b6142c381613d42565b81146142ce57600080fd5b50565b6000813590506142e0816142ba565b92915050565b600080604083850312156142fd576142fc613cb3565b5b600061430b85828601613f00565b925050602061431c858286016142d1565b9150509250929050565b600080600080608085870312156143405761433f613cb3565b5b600061434e87828801613f00565b945050602061435f87828801613f00565b935050604061437087828801613e4b565b925050606085013567ffffffffffffffff81111561439157614390613cb8565b5b61439d87828801614106565b91505092959194509250565b600080604083850312156143c0576143bf613cb3565b5b60006143ce85828601613f00565b92505060206143df85828601613f00565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061443057607f821691505b602082108103614443576144426143e9565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061447f602083613d83565b915061448a82614449565b602082019050919050565b600060208201905081810360008301526144ae81614472565b9050919050565b7f574c000000000000000000000000000000000000000000000000000000000000600082015250565b60006144eb600283613d83565b91506144f6826144b5565b602082019050919050565b6000602082019050818103600083015261451a816144de565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061455b82613e2a565b915061456683613e2a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561459f5761459e614521565b5b828202905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261460c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826145cf565b61461686836145cf565b95508019841693508086168417925050509392505050565b6000819050919050565b600061465361464e61464984613e2a565b61462e565b613e2a565b9050919050565b6000819050919050565b61466d83614638565b6146816146798261465a565b8484546145dc565b825550505050565b600090565b614696614689565b6146a1818484614664565b505050565b5b818110156146c5576146ba60008261468e565b6001810190506146a7565b5050565b601f82111561470a576146db816145aa565b6146e4846145bf565b810160208510156146f3578190505b6147076146ff856145bf565b8301826146a6565b50505b505050565b600082821c905092915050565b600061472d6000198460080261470f565b1980831691505092915050565b6000614746838361471c565b9150826002028217905092915050565b61475f82613d78565b67ffffffffffffffff81111561477857614777614009565b5b6147828254614418565b61478d8282856146c9565b600060209050601f8311600181146147c057600084156147ae578287015190505b6147b8858261473a565b865550614820565b601f1984166147ce866145aa565b60005b828110156147f6578489015182556001820191506020850194506020810190506147d1565b86831015614813578489015161480f601f89168261471c565b8355505b6001600288020188555050505b505050505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061485e601083613d83565b915061486982614828565b602082019050919050565b6000602082019050818103600083015261488d81614851565b9050919050565b600081905092915050565b60006148aa82613d78565b6148b48185614894565b93506148c4818560208601613d94565b80840191505092915050565b60006148dc828561489f565b91506148e8828461489f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614950602683613d83565b915061495b826148f4565b604082019050919050565b6000602082019050818103600083015261497f81614943565b9050919050565b600081519050919050565b600081905092915050565b60006149a782614986565b6149b18185614991565b93506149c1818560208601613d94565b80840191505092915050565b60006149d9828461499c565b915081905092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614a1a601483613d83565b9150614a25826149e4565b602082019050919050565b60006020820190508181036000830152614a4981614a0d565b9050919050565b50565b6000614a60600083614991565b9150614a6b82614a50565b600082019050919050565b6000614a8182614a53565b9150819050919050565b600082825260208201905092915050565b6000614aa782614986565b614ab18185614a8b565b9350614ac1818560208601613d94565b614aca81613dbe565b840191505092915050565b6000606082019050614aea6000830186613d4e565b8181036020830152614afc8185614a9c565b9050614b0b6040830184613ebf565b949350505050565b6000608082019050614b286000830187613ebf565b614b356020830186613ebf565b614b426040830185613f82565b8181036060830152614b548184614a9c565b905095945050505050565b600081519050614b6e81613ce9565b92915050565b600060208284031215614b8a57614b89613cb3565b5b6000614b9884828501614b5f565b91505092915050565b6000614bac82613e2a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bde57614bdd614521565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c2382613e2a565b9150614c2e83613e2a565b925082614c3e57614c3d614be9565b5b828204905092915050565b6000614c5482613e2a565b9150614c5f83613e2a565b9250828203905081811115614c7757614c76614521565b5b92915050565b6000614c8882613e2a565b9150614c9383613e2a565b925082614ca357614ca2614be9565b5b828206905092915050565b6000614cb982613e2a565b9150614cc483613e2a565b9250828201905080821115614cdc57614cdb614521565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614d1c82613e2a565b915060008203614d2f57614d2e614521565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614d70602083613d83565b9150614d7b82614d3a565b602082019050919050565b60006020820190508181036000830152614d9f81614d63565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000600082015250565b6000614ddc601a83614894565b9150614de782614da6565b601a82019050919050565b6000614dfd82614dcf565b9150614e09828561489f565b9150614e15828461499c565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614e86601883613d83565b9150614e9182614e50565b602082019050919050565b60006020820190508181036000830152614eb581614e79565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614ef2601f83613d83565b9150614efd82614ebc565b602082019050919050565b60006020820190508181036000830152614f2181614ee5565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f84602283613d83565b9150614f8f82614f28565b604082019050919050565b60006020820190508181036000830152614fb381614f77565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615016602283613d83565b915061502182614fba565b604082019050919050565b6000602082019050818103600083015261504581615009565b9050919050565b6000819050919050565b61505f8161504c565b82525050565b600060ff82169050919050565b61507b81615065565b82525050565b60006080820190506150966000830187615056565b6150a36020830186615072565b6150b06040830185615056565b6150bd6060830184615056565b9594505050505056fea2646970667358221220c69ee3769e21b538a0cba995602f9cd404c58e4816028d509b41ec964562d4ed64736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000010f0cf064dd592000000000000000000000000000000000000000000000000000000000000000000007436c756243524f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005454c495445000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): ClubCRO
Arg [1] : symbol_ (string): ELITE
Arg [2] : maxBatchSize_ (uint256): 5
Arg [3] : maxSupply_ (uint256): 1500
Arg [4] : nftCost_ (uint256): 5000000000000000000000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [3] : 00000000000000000000000000000000000000000000000000000000000005dc
Arg [4] : 00000000000000000000000000000000000000000000010f0cf064dd59200000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 436c756243524f00000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 454c495445000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
163:3825:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4560:344:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2837:98:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8923:236:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1860:77:13;;;;;;;;;;;;;:::i;:::-;;8500:362:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2420:113:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3831:297:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9870:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3107:325:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1750:104;;;;;;;;;;;;;:::i;:::-;;1679:65;;;;;;;;;;;;;:::i;:::-;;10100:179:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2028:105:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1506:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1943:79;;;;;;;;;;;;;:::i;:::-;;1098:84:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7853:123:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4963:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2656:95:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;1612:61:13;;;;;;;;;;;;;:::i;:::-;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3624:261:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2999:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3438:180;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9226:310:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10345:393;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8042:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2139:101:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2539:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2246:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9602:206:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3891:95:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4560:344:12;4702:4;4756:25;4741:40;;;:11;:40;;;;:104;;;;4812:33;4797:48;;;:11;:48;;;;4741:104;:156;;;;4861:36;4885:11;4861:23;:36::i;:::-;4741:156;4722:175;;4560:344;;;:::o;2837:98:13:-;2891:13;2923:5;2916:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2837:98;:::o;8923:236:12:-;9023:7;9051:16;9059:7;9051;:16::i;:::-;9046:64;;9076:34;;;;;;;;;;;;;;9046:64;9128:15;:24;9144:7;9128:24;;;;;;;;;;;;;;;;;;;;;9121:31;;8923:236;;;:::o;1860:77:13:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1914:16:13::1;:14;:16::i;:::-;1860:77::o:0;8500:362:12:-;8572:13;8588:24;8604:7;8588:15;:24::i;:::-;8572:40;;8632:5;8626:11;;:2;:11;;;8622:48;;8646:24;;;;;;;;;;;;;;8622:48;8701:5;8685:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;8711:37;8728:5;8735:12;:10;:12::i;:::-;8711:16;:37::i;:::-;8710:38;8685:63;8681:136;;;8771:35;;;;;;;;;;;;;;8681:136;8827:28;8836:2;8840:7;8849:5;8827:8;:28::i;:::-;8562:300;8500:362;;:::o;2420:113:13:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2493:33:13::1;2516:9;2493:22;:33::i;:::-;2420:113:::0;:::o;3831:297:12:-;3875:7;4096:15;:13;:15::i;:::-;4081:12;;4065:13;;:28;:46;4058:53;;3831:297;:::o;9870:164::-;9999:28;10009:4;10015:2;10019:7;9999:9;:28::i;:::-;9870:164;;;:::o;3107:325:13:-;612:16:15;;;;;;;;;;;604:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;3266:16:13::1;:14;:16::i;:::-;3255:8;:27;;;;:::i;:::-;3243:9;:39;3239:65;;;3291:13;;;;;;;;;;;;;;3239:65;3314:68;3344:12;:10;:12::i;:::-;3358:8;3368:13;3314:29;:68::i;:::-;3392:33;3402:12;:10;:12::i;:::-;3416:8;3392:9;:33::i;:::-;3107:325:::0;;:::o;1750:104::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1807:7:13::1;:5;:7::i;:::-;1799:25;;:48;1825:21;1799:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1750:104::o:0;1679:65::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1727:10:13::1;:8;:10::i;:::-;1679:65::o:0;10100:179:12:-;10233:39;10250:4;10256:2;10260:7;10233:39;;;;;;;;;;;;:16;:39::i;:::-;10100:179;;;:::o;2028:105:13:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2100:26:13::1;2118:7;2100:17;:26::i;:::-;2028:105:::0;:::o;1506:100::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1591:8:13::1;1579:9;:20;;;;;;:::i;:::-;;1506:100:::0;:::o;1943:79::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1998:17:13::1;:15;:17::i;:::-;1943:79::o:0;1098:84:1:-;1145:4;1168:7;;;;;;;;;;;1161:14;;1098:84;:::o;7853:123:12:-;7917:7;7943:21;7956:7;7943:12;:21::i;:::-;:26;;;7936:33;;7853:123;;;:::o;4963:203::-;5027:7;5067:1;5050:19;;:5;:19;;;5046:60;;5078:28;;;;;;;;;;;;;;5046:60;5131:12;:19;5144:5;5131:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;5123:36;;5116:43;;4963:203;;;:::o;2656:95:13:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2723:21:13::1;2739:4;2723:15;:21::i;:::-;2656:95:::0;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;1612:61:13:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1658:8:13::1;:6;:8::i;:::-;1612:61::o:0;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;3624:261:13:-;1412:8:1;:6;:8::i;:::-;1411:9;1403:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;3768:10:13::1;:8;:10::i;:::-;3757:8;:21;;;;:::i;:::-;3745:9;:33;3741:59;;;3787:13;;;;;;;;;;;;;;3741:59;3810:33;3820:12;:10;:12::i;:::-;3834:8;3810:9;:33::i;:::-;3853:25;3869:8;3853:15;:25::i;:::-;3624:261:::0;;:::o;2999:102::-;3055:13;3087:7;3080:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2999:102;:::o;3438:180::-;1412:8:1;:6;:8::i;:::-;1411:9;1403:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;3536:10:13::1;:8;:10::i;:::-;3525:8;:21;;;;:::i;:::-;3513:9;:33;3509:59;;;3555:13;;;;;;;;;;;;;;3509:59;3578:33;3588:12;:10;:12::i;:::-;3602:8;3578:9;:33::i;:::-;3438:180:::0;:::o;9226:310:12:-;9364:12;:10;:12::i;:::-;9352:24;;:8;:24;;;9348:54;;9385:17;;;;;;;;;;;;;;9348:54;9458:8;9413:18;:32;9432:12;:10;:12::i;:::-;9413:32;;;;;;;;;;;;;;;:42;9446:8;9413:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;9510:8;9481:48;;9496:12;:10;:12::i;:::-;9481:48;;;9520:8;9481:48;;;;;;:::i;:::-;;;;;;;;9226:310;;:::o;10345:393::-;10506:28;10516:4;10522:2;10526:7;10506:9;:28::i;:::-;10561:15;:2;:13;;;:15::i;:::-;:88;;;;;10593:56;10624:4;10630:2;10634:7;10643:5;10593:30;:56::i;:::-;10592:57;10561:88;10544:188;;;10681:40;;;;;;;;;;;;;;10544:188;10345:393;;;;:::o;8042:401::-;8155:13;8189:16;8197:7;8189;:16::i;:::-;8184:59;;8214:29;;;;;;;;;;;;;;8184:59;8254:21;8278:10;:8;:10::i;:::-;8254:34;;8342:1;8323:7;8317:21;:26;:119;;;;;;;;;;;;;;;;;8386:7;8395:18;:7;:16;:18::i;:::-;8369:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8317:119;8298:138;;;8042:401;;;:::o;2139:101:13:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2209:24:13::1;2227:5;2209:17;:24::i;:::-;2139:101:::0;:::o;2539:111::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2611:32:13::1;2633:9;2611:21;:32::i;:::-;2539:111:::0;:::o;2246:168::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2362:6:13::1;2337:21;:31;;2329:40;;;::::0;::::1;;2387:2;2379:20;;:28;2400:6;2379:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2246:168:::0;;:::o;9602:206:12:-;9739:4;9766:18;:25;9785:5;9766:25;;;;;;;;;;;;;;;:35;9792:8;9766:35;;;;;;;;;;;;;;;;;;;;;;;;;9759:42;;9602:206;;;;:::o;3891:95:13:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3955:24:13::1;3961:7;:5;:7::i;:::-;3970:8;3955:5;:24::i;:::-;3891:95:::0;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;::::0;1998:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;829:155:9:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;10984:208:12:-;11041:4;11095:7;11076:15;:13;:15::i;:::-;:26;;:65;;;;;11128:13;;11118:7;:23;11076:65;:109;;;;;11158:11;:20;11170:7;11158:20;;;;;;;;;;;:27;;;;;;;;;;;;11157:28;11076:109;11057:128;;10984:208;;;:::o;640:96:6:-;693:7;719:10;712:17;;640:96;:::o;761:75:15:-;825:4;806:16;;:23;;;;;;;;;;;;;;;;;;761:75::o;20977:189:12:-;21114:2;21087:15;:24;21103:7;21087:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;21151:7;21147:2;21131:28;;21140:5;21131:28;;;;;;;;;;;;20977:189;;;:::o;425:110:14:-;524:4;498:9;:23;508:12;498:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;425:110;:::o;3612:90:12:-;3668:7;3694:1;3687:8;;3612:90;:::o;16052:2082::-;16162:35;16200:21;16213:7;16200:12;:21::i;:::-;16162:59;;16258:4;16236:26;;:13;:18;;;:26;;;16232:67;;16271:28;;;;;;;;;;;;;;16232:67;16310:22;16352:4;16336:20;;:12;:10;:12::i;:::-;:20;;;:72;;;;16372:36;16389:4;16395:12;:10;:12::i;:::-;16372:16;:36::i;:::-;16336:72;:124;;;;16448:12;:10;:12::i;:::-;16424:36;;:20;16436:7;16424:11;:20::i;:::-;:36;;;16336:124;16310:151;;16477:17;16472:66;;16503:35;;;;;;;;;;;;;;16472:66;16566:1;16552:16;;:2;:16;;;16548:52;;16577:23;;;;;;;;;;;;;;16548:52;16611:43;16633:4;16639:2;16643:7;16652:1;16611:21;:43::i;:::-;16716:35;16733:1;16737:7;16746:4;16716:8;:35::i;:::-;17071:1;17041:12;:18;17054:4;17041:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17114:1;17086:12;:16;17099:2;17086:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17130:31;17164:11;:20;17176:7;17164:20;;;;;;;;;;;17130:54;;17214:2;17198:8;:13;;;:18;;;;;;;;;;;;;;;;;;17263:15;17230:8;:23;;;:49;;;;;;;;;;;;;;;;;;17527:19;17559:1;17549:7;:11;17527:33;;17574:31;17608:11;:24;17620:11;17608:24;;;;;;;;;;;17574:58;;17675:1;17650:27;;:8;:13;;;;;;;;;;;;:27;;;17646:377;;17857:13;;17842:11;:28;17838:171;;17910:4;17894:8;:13;;;:20;;;;;;;;;;;;;;;;;;17962:13;:28;;;17936:8;:23;;;:54;;;;;;;;;;;;;;;;;;17838:171;17646:377;17017:1016;;;18067:7;18063:2;18048:27;;18057:4;18048:27;;;;;;;;;;;;18085:42;18106:4;18112:2;18116:7;18125:1;18085:20;:42::i;:::-;16152:1982;;16052:2082;;;:::o;1122:97:15:-;1171:7;1197:15;;1190:22;;1122:97;:::o;1225:639::-;1384:19;1404:14;1384:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1380:66;;;1428:18;;;;;;;;;;;;;;1380:66;1457:16;1476:190;1552:52;1588:9;1572:27;;1601:2;1552:19;:52::i;:::-;1622:20;:9;:18;:20::i;:::-;1518:138;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1476:28;:190::i;:::-;1457:209;;1676:15;1694:39;1708:8;1718:14;1694:13;:39::i;:::-;1676:57;;1759:14;;;;;;;;;;;1748:25;;:7;:25;;;1744:61;;1782:23;;;;;;;;;;;;;;1744:61;1853:4;1815:19;1835:14;1815:35;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;1370:494;;1225:639;;;:::o;11271:102:12:-;11339:27;11349:2;11353:8;11339:27;;;;;;;;;;;;:9;:27::i;:::-;11271:102;;:::o;2110:117:1:-;1677:8;:6;:8::i;:::-;1669:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2178:5:::1;2168:7:::0;::::1;:15;;;;;;;;;;;;;;;;;;2198:22;2207:12;:10;:12::i;:::-;2198:22;;;;;;:::i;:::-;;;;;;;;2110:117::o:0;925:94:15:-;1005:7;988:14;;:24;;;;;;;;;;;;;;;;;;925:94;:::o;842:77::-;907:5;888:16;;:24;;;;;;;;;;;;;;;;;;842:77::o;6684:1112:12:-;6770:21;;:::i;:::-;6807:12;6822:7;6807:22;;6887:4;6868:15;:13;:15::i;:::-;:23;;:47;;;;;6902:13;;6895:4;:20;6868:47;6864:868;;;6935:31;6969:11;:17;6981:4;6969:17;;;;;;;;;;;6935:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7009:9;:16;;;7004:714;;7079:1;7053:28;;:9;:14;;;:28;;;7049:99;;7116:9;7109:16;;;;;;7049:99;7445:255;7452:4;7445:255;;;7484:6;;;;;;;;7528:11;:17;7540:4;7528:17;;;;;;;;;;;7516:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7601:1;7575:28;;:9;:14;;;:28;;;7571:107;;7642:9;7635:16;;;;;;7571:107;7445:255;;;7004:714;6917:815;6864:868;7758:31;;;;;;;;;;;;;;6684:1112;;;;:::o;329:90:14:-;405:7;390:12;:22;;;;329:90;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;1863:115:1:-;1412:8;:6;:8::i;:::-;1411:9;1403:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1932:4:::1;1922:7;;:14;;;;;;;;;;;;;;;;;;1951:20;1958:12;:10;:12::i;:::-;1951:20;;;;;;:::i;:::-;;;;;;;;1863:115::o:0;1323:94:13:-;1375:7;1401:9;;1394:16;;1323:94;:::o;651:310:14:-;718:9;:20;728:9;718:20;;;;;;;;;;;;;;;;;;;;;;;;;:61;;;;;767:12;;742:21;:37;;718:61;714:241;;;796:9;807:17;828:9;:14;;867:12;;828:69;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:102;;;;916:28;922:4;928;934:9;916:28;;;;;;;;:::i;:::-;;;;;;;;781:174;;714:241;651:310;:::o;1175:320:5:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;21647:748:12:-;21805:4;21853:2;21837:36;;;21891:12;:10;:12::i;:::-;21921:4;21943:7;21968:5;21837:150;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;21821:568;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22171:1;22154:6;:13;:18;22150:229;;22199:40;;;;;;;;;;;;;;22150:229;22339:6;22333:13;22324:6;22320:2;22316:15;22309:38;21821:568;22051:45;;;22041:55;;;:6;:55;;;;22034:62;;;21647:748;;;;;;:::o;965:100:13:-;1017:13;1049:9;1042:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;965:100;:::o;328:703:7:-;384:13;610:1;601:5;:10;597:51;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;1025:91:15:-;1104:5;1086:15;:23;;;;1025:91;:::o;541:104:14:-;633:5;610:9;:20;620:9;610:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;541:104;:::o;14423:1387:12:-;14487:20;14510:13;;14487:36;;14533:24;14580:49;14589:8;14614:14;:12;:14::i;:::-;14599:12;:10;:12::i;:::-;:29;;;;:::i;:::-;14580:8;:49::i;:::-;14533:106;;14667:1;14653:16;;:2;:16;;;14649:48;;14678:19;;;;;;;;;;;;;;14649:48;14732:1;14711:17;:22;;;14707:53;;14742:18;;;;;;;;;;;;;;14707:53;14792:12;:10;:12::i;:::-;14774:14;:12;:14::i;:::-;:30;14770:61;;14813:18;;;;;;;;;;;;;;14770:61;14842:70;14872:1;14876:2;14880:12;14894:17;14842:70;;:21;:70::i;:::-;15211:17;15183:12;:16;15196:2;15183:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15275:17;15242:12;:16;15255:2;15242:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15340:2;15307:11;:25;15319:12;15307:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;15406:15;15356:11;:25;15368:12;15356:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;15437:20;15460:12;15437:35;;15486:11;15515:8;15500:12;:23;15486:37;;15538:143;15589:14;;;;;;15585:2;15564:40;;15581:1;15564:40;;;;;;;;;;;;15643:3;15627:12;:19;;:52;;;;;15667:12;:10;:12::i;:::-;15650:14;:12;:14::i;:::-;:29;15627:52;15538:143;;15711:12;15695:13;:28;;;;15159:575;;15743:60;15772:1;15776:2;15780:12;15794:8;15743:20;:60::i;:::-;14477:1333;;14423:1387;;:::o;23026:154::-;;;;;:::o;23821:153::-;;;;;:::o;1588:441:7:-;1663:13;1688:19;1733:1;1724:6;1720:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1710:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1688:47;;1745:15;:6;1752:1;1745:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1770;:6;1777:1;1770:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1800:9;1825:1;1816:6;1812:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1800:26;;1795:132;1832:1;1828;:5;1795:132;;;1866:12;1887:3;1879:5;:11;1866:25;;;;;;;:::i;:::-;;;;;1854:6;1861:1;1854:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1915:1;1905:11;;;;;1835:3;;;;:::i;:::-;;;1795:132;;;;1953:1;1944:5;:10;1936:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2015:6;2001:21;;;1588:441;;;;:::o;8562:196:8:-;8633:7;8720:26;8737:1;:8;8720:16;:26::i;:::-;8748:1;8669:81;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8659:92;;;;;;8652:99;;8562:196;;;:::o;4308:227::-;4386:7;4406:17;4425:18;4447:27;4458:4;4464:9;4447:10;:27::i;:::-;4405:69;;;;4484:18;4496:5;4484:11;:18::i;:::-;4519:9;4512:16;;;;4308:227;;;;:::o;11733:2443:12:-;11851:20;11874:13;;11851:36;;11897:24;11944:49;11953:8;11978:14;:12;:14::i;:::-;11963:12;:10;:12::i;:::-;:29;;;;:::i;:::-;11944:8;:49::i;:::-;11897:106;;12031:1;12017:16;;:2;:16;;;12013:48;;12042:19;;;;;;;;;;;;;;12013:48;12096:1;12075:17;:22;;;12071:53;;12106:18;;;;;;;;;;;;;;12071:53;12156:12;:10;:12::i;:::-;12138:14;:12;:14::i;:::-;:30;12134:61;;12177:18;;;;;;;;;;;;;;12134:61;12220:15;:13;:15::i;:::-;12209:8;:26;12205:55;;;12244:16;;;;;;;;;;;;;;12205:55;12271:70;12301:1;12305:2;12309:12;12323:17;12271:70;;:21;:70::i;:::-;12640:17;12612:12;:16;12625:2;12612:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12704:17;12671:12;:16;12684:2;12671:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12769:2;12736:11;:25;12748:12;12736:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;12835:15;12785:11;:25;12797:12;12785:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;12866:20;12889:12;12866:35;;12915:11;12944:17;12929:32;;:12;:32;12915:46;;12980:15;:2;:13;;;:15::i;:::-;12976:870;;;13015:526;13070:12;13066:2;13045:38;;13062:1;13045:38;;;;;;;;;;;;13135:207;13203:1;13235:2;13267:14;;;;;;13311:5;13135:30;:207::i;:::-;13105:356;;13398:40;;;;;;;;;;;;;;13105:356;13503:3;13487:12;:19;;:52;;;;;13527:12;:10;:12::i;:::-;13510:14;:12;:14::i;:::-;:29;13487:52;13015:526;;13620:12;13603:13;;:29;13599:43;;13634:8;;;13599:43;12976:870;;;13681:151;13736:14;;;;;;13732:2;13711:40;;13728:1;13711:40;;;;;;;;;;;;13794:3;13778:12;:19;;:52;;;;;13818:12;:10;:12::i;:::-;13801:14;:12;:14::i;:::-;:29;13778:52;13681:151;;12976:870;13875:12;13859:13;:28;;;;13925:8;13905:17;:28;;;13901:189;;;13969:12;:10;:12::i;:::-;13953:39;;:122;14047:10;:8;:10::i;:::-;14026:17;14015:28;;:8;:28;14014:43;13953:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13901:189;12588:1512;;14109:60;14138:1;14142:2;14146:12;14160:8;14109:20;:60::i;:::-;11841:2335;;11733:2443;;;:::o;4216:277::-;4263:7;4461:15;:13;:15::i;:::-;4445:13;;:31;4438:38;;4216:277;:::o;1219:98:13:-;1273:7;1299:11;;1292:18;;1219:98;:::o;461:104:11:-;519:7;549:1;545;:5;:13;;557:1;545:13;;;553:1;545:13;538:20;;461:104;;;;:::o;2243:1279:8:-;2324:7;2333:12;2574:2;2554:9;:16;:22;2550:966;;2592:9;2615;2638:7;2843:4;2832:9;2828:20;2822:27;2817:32;;2892:4;2881:9;2877:20;2871:27;2866:32;;2949:4;2938:9;2934:20;2928:27;2925:1;2920:36;2915:41;;2990:25;3001:4;3007:1;3010;3013;2990:10;:25::i;:::-;2983:32;;;;;;;;;2550:966;3056:2;3036:9;:16;:22;3032:484;;3074:9;3097:10;3305:4;3294:9;3290:20;3284:27;3279:32;;3355:4;3344:9;3340:20;3334:27;3328:33;;3395:23;3406:4;3412:1;3415:2;3395:10;:23::i;:::-;3388:30;;;;;;;;3032:484;3465:1;3469:35;3449:56;;;;2243:1279;;;;;;:::o;548:631::-;625:20;616:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;612:561;661:7;612:561;721:29;712:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;708:465;;766:34;;;;;;;;;;:::i;:::-;;;;;;;;708:465;830:35;821:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;817:356;;881:41;;;;;;;;;;:::i;:::-;;;;;;;;817:356;952:30;943:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;939:234;;998:44;;;;;;;;;;:::i;:::-;;;;;;;;939:234;1072:30;1063:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;1059:114;;1118:44;;;;;;;;;;:::i;:::-;;;;;;;;1059:114;548:631;;:::o;1071:142:13:-;1128:7;1154:17;:15;:17::i;:::-;:29;;;;;1175:8;:6;:8::i;:::-;1154:29;:52;;1192:14;;1154:52;;;1186:3;1154:52;1147:59;;1071:142;:::o;5716:1603:8:-;5842:7;5851:12;6766:66;6761:1;6753:10;;:79;6749:161;;;6864:1;6868:30;6848:51;;;;;;6749:161;6928:2;6923:1;:7;;;;:18;;;;;6939:2;6934:1;:7;;;;6923:18;6919:100;;;6973:1;6977:30;6957:51;;;;;;6919:100;7113:14;7130:24;7140:4;7146:1;7149;7152;7130:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7113:41;;7186:1;7168:20;;:6;:20;;;7164:101;;7220:1;7224:29;7204:50;;;;;;;7164:101;7283:6;7291:20;7275:37;;;;;5716:1603;;;;;;;;:::o;4789:336::-;4899:7;4908:12;4932:9;4957:66;4949:75;;4944:2;:80;4932:92;;5034:7;5073:2;5066:3;5059:2;5051:11;;:18;;5050:25;;;;:::i;:::-;5034:42;;5093:25;5104:4;5110:1;5113;5116;5093:10;:25::i;:::-;5086:32;;;;;;4789:336;;;;;;:::o;659:96:15:-;709:4;732:16;;;;;;;;;;;725:23;;659:96;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:16:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:329::-;4949:6;4998:2;4986:9;4977:7;4973:23;4969:32;4966:119;;;5004:79;;:::i;:::-;4966:119;5124:1;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5095:117;4890:329;;;;:::o;5225:118::-;5312:24;5330:5;5312:24;:::i;:::-;5307:3;5300:37;5225:118;;:::o;5349:222::-;5442:4;5480:2;5469:9;5465:18;5457:26;;5493:71;5561:1;5550:9;5546:17;5537:6;5493:71;:::i;:::-;5349:222;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:307::-;7117:4;7207:18;7199:6;7196:30;7193:56;;;7229:18;;:::i;:::-;7193:56;7267:29;7289:6;7267:29;:::i;:::-;7259:37;;7351:4;7345;7341:15;7333:23;;7056:307;;;:::o;7369:146::-;7466:6;7461:3;7456;7443:30;7507:1;7498:6;7493:3;7489:16;7482:27;7369:146;;;:::o;7521:423::-;7598:5;7623:65;7639:48;7680:6;7639:48;:::i;:::-;7623:65;:::i;:::-;7614:74;;7711:6;7704:5;7697:21;7749:4;7742:5;7738:16;7787:3;7778:6;7773:3;7769:16;7766:25;7763:112;;;7794:79;;:::i;:::-;7763:112;7884:54;7931:6;7926:3;7921;7884:54;:::i;:::-;7604:340;7521:423;;;;;:::o;7963:338::-;8018:5;8067:3;8060:4;8052:6;8048:17;8044:27;8034:122;;8075:79;;:::i;:::-;8034:122;8192:6;8179:20;8217:78;8291:3;8283:6;8276:4;8268:6;8264:17;8217:78;:::i;:::-;8208:87;;8024:277;7963:338;;;;:::o;8307:652::-;8384:6;8392;8441:2;8429:9;8420:7;8416:23;8412:32;8409:119;;;8447:79;;:::i;:::-;8409:119;8567:1;8592:53;8637:7;8628:6;8617:9;8613:22;8592:53;:::i;:::-;8582:63;;8538:117;8722:2;8711:9;8707:18;8694:32;8753:18;8745:6;8742:30;8739:117;;;8775:79;;:::i;:::-;8739:117;8880:62;8934:7;8925:6;8914:9;8910:22;8880:62;:::i;:::-;8870:72;;8665:287;8307:652;;;;;:::o;8965:308::-;9027:4;9117:18;9109:6;9106:30;9103:56;;;9139:18;;:::i;:::-;9103:56;9177:29;9199:6;9177:29;:::i;:::-;9169:37;;9261:4;9255;9251:15;9243:23;;8965:308;;;:::o;9279:425::-;9357:5;9382:66;9398:49;9440:6;9398:49;:::i;:::-;9382:66;:::i;:::-;9373:75;;9471:6;9464:5;9457:21;9509:4;9502:5;9498:16;9547:3;9538:6;9533:3;9529:16;9526:25;9523:112;;;9554:79;;:::i;:::-;9523:112;9644:54;9691:6;9686:3;9681;9644:54;:::i;:::-;9363:341;9279:425;;;;;:::o;9724:340::-;9780:5;9829:3;9822:4;9814:6;9810:17;9806:27;9796:122;;9837:79;;:::i;:::-;9796:122;9954:6;9941:20;9979:79;10054:3;10046:6;10039:4;10031:6;10027:17;9979:79;:::i;:::-;9970:88;;9786:278;9724:340;;;;:::o;10070:509::-;10139:6;10188:2;10176:9;10167:7;10163:23;10159:32;10156:119;;;10194:79;;:::i;:::-;10156:119;10342:1;10331:9;10327:17;10314:31;10372:18;10364:6;10361:30;10358:117;;;10394:79;;:::i;:::-;10358:117;10499:63;10554:7;10545:6;10534:9;10530:22;10499:63;:::i;:::-;10489:73;;10285:287;10070:509;;;;:::o;10585:474::-;10653:6;10661;10710:2;10698:9;10689:7;10685:23;10681:32;10678:119;;;10716:79;;:::i;:::-;10678:119;10836:1;10861:53;10906:7;10897:6;10886:9;10882:22;10861:53;:::i;:::-;10851:63;;10807:117;10963:2;10989:53;11034:7;11025:6;11014:9;11010:22;10989:53;:::i;:::-;10979:63;;10934:118;10585:474;;;;;:::o;11065:116::-;11135:21;11150:5;11135:21;:::i;:::-;11128:5;11125:32;11115:60;;11171:1;11168;11161:12;11115:60;11065:116;:::o;11187:133::-;11230:5;11268:6;11255:20;11246:29;;11284:30;11308:5;11284:30;:::i;:::-;11187:133;;;;:::o;11326:468::-;11391:6;11399;11448:2;11436:9;11427:7;11423:23;11419:32;11416:119;;;11454:79;;:::i;:::-;11416:119;11574:1;11599:53;11644:7;11635:6;11624:9;11620:22;11599:53;:::i;:::-;11589:63;;11545:117;11701:2;11727:50;11769:7;11760:6;11749:9;11745:22;11727:50;:::i;:::-;11717:60;;11672:115;11326:468;;;;;:::o;11800:943::-;11895:6;11903;11911;11919;11968:3;11956:9;11947:7;11943:23;11939:33;11936:120;;;11975:79;;:::i;:::-;11936:120;12095:1;12120:53;12165:7;12156:6;12145:9;12141:22;12120:53;:::i;:::-;12110:63;;12066:117;12222:2;12248:53;12293:7;12284:6;12273:9;12269:22;12248:53;:::i;:::-;12238:63;;12193:118;12350:2;12376:53;12421:7;12412:6;12401:9;12397:22;12376:53;:::i;:::-;12366:63;;12321:118;12506:2;12495:9;12491:18;12478:32;12537:18;12529:6;12526:30;12523:117;;;12559:79;;:::i;:::-;12523:117;12664:62;12718:7;12709:6;12698:9;12694:22;12664:62;:::i;:::-;12654:72;;12449:287;11800:943;;;;;;;:::o;12749:474::-;12817:6;12825;12874:2;12862:9;12853:7;12849:23;12845:32;12842:119;;;12880:79;;:::i;:::-;12842:119;13000:1;13025:53;13070:7;13061:6;13050:9;13046:22;13025:53;:::i;:::-;13015:63;;12971:117;13127:2;13153:53;13198:7;13189:6;13178:9;13174:22;13153:53;:::i;:::-;13143:63;;13098:118;12749:474;;;;;:::o;13229:180::-;13277:77;13274:1;13267:88;13374:4;13371:1;13364:15;13398:4;13395:1;13388:15;13415:320;13459:6;13496:1;13490:4;13486:12;13476:22;;13543:1;13537:4;13533:12;13564:18;13554:81;;13620:4;13612:6;13608:17;13598:27;;13554:81;13682:2;13674:6;13671:14;13651:18;13648:38;13645:84;;13701:18;;:::i;:::-;13645:84;13466:269;13415:320;;;:::o;13741:182::-;13881:34;13877:1;13869:6;13865:14;13858:58;13741:182;:::o;13929:366::-;14071:3;14092:67;14156:2;14151:3;14092:67;:::i;:::-;14085:74;;14168:93;14257:3;14168:93;:::i;:::-;14286:2;14281:3;14277:12;14270:19;;13929:366;;;:::o;14301:419::-;14467:4;14505:2;14494:9;14490:18;14482:26;;14554:9;14548:4;14544:20;14540:1;14529:9;14525:17;14518:47;14582:131;14708:4;14582:131;:::i;:::-;14574:139;;14301:419;;;:::o;14726:152::-;14866:4;14862:1;14854:6;14850:14;14843:28;14726:152;:::o;14884:365::-;15026:3;15047:66;15111:1;15106:3;15047:66;:::i;:::-;15040:73;;15122:93;15211:3;15122:93;:::i;:::-;15240:2;15235:3;15231:12;15224:19;;14884:365;;;:::o;15255:419::-;15421:4;15459:2;15448:9;15444:18;15436:26;;15508:9;15502:4;15498:20;15494:1;15483:9;15479:17;15472:47;15536:131;15662:4;15536:131;:::i;:::-;15528:139;;15255:419;;;:::o;15680:180::-;15728:77;15725:1;15718:88;15825:4;15822:1;15815:15;15849:4;15846:1;15839:15;15866:348;15906:7;15929:20;15947:1;15929:20;:::i;:::-;15924:25;;15963:20;15981:1;15963:20;:::i;:::-;15958:25;;16151:1;16083:66;16079:74;16076:1;16073:81;16068:1;16061:9;16054:17;16050:105;16047:131;;;16158:18;;:::i;:::-;16047:131;16206:1;16203;16199:9;16188:20;;15866:348;;;;:::o;16220:141::-;16269:4;16292:3;16284:11;;16315:3;16312:1;16305:14;16349:4;16346:1;16336:18;16328:26;;16220:141;;;:::o;16367:93::-;16404:6;16451:2;16446;16439:5;16435:14;16431:23;16421:33;;16367:93;;;:::o;16466:107::-;16510:8;16560:5;16554:4;16550:16;16529:37;;16466:107;;;;:::o;16579:393::-;16648:6;16698:1;16686:10;16682:18;16721:97;16751:66;16740:9;16721:97;:::i;:::-;16839:39;16869:8;16858:9;16839:39;:::i;:::-;16827:51;;16911:4;16907:9;16900:5;16896:21;16887:30;;16960:4;16950:8;16946:19;16939:5;16936:30;16926:40;;16655:317;;16579:393;;;;;:::o;16978:60::-;17006:3;17027:5;17020:12;;16978:60;;;:::o;17044:142::-;17094:9;17127:53;17145:34;17154:24;17172:5;17154:24;:::i;:::-;17145:34;:::i;:::-;17127:53;:::i;:::-;17114:66;;17044:142;;;:::o;17192:75::-;17235:3;17256:5;17249:12;;17192:75;;;:::o;17273:269::-;17383:39;17414:7;17383:39;:::i;:::-;17444:91;17493:41;17517:16;17493:41;:::i;:::-;17485:6;17478:4;17472:11;17444:91;:::i;:::-;17438:4;17431:105;17349:193;17273:269;;;:::o;17548:73::-;17593:3;17548:73;:::o;17627:189::-;17704:32;;:::i;:::-;17745:65;17803:6;17795;17789:4;17745:65;:::i;:::-;17680:136;17627:189;;:::o;17822:186::-;17882:120;17899:3;17892:5;17889:14;17882:120;;;17953:39;17990:1;17983:5;17953:39;:::i;:::-;17926:1;17919:5;17915:13;17906:22;;17882:120;;;17822:186;;:::o;18014:543::-;18115:2;18110:3;18107:11;18104:446;;;18149:38;18181:5;18149:38;:::i;:::-;18233:29;18251:10;18233:29;:::i;:::-;18223:8;18219:44;18416:2;18404:10;18401:18;18398:49;;;18437:8;18422:23;;18398:49;18460:80;18516:22;18534:3;18516:22;:::i;:::-;18506:8;18502:37;18489:11;18460:80;:::i;:::-;18119:431;;18104:446;18014:543;;;:::o;18563:117::-;18617:8;18667:5;18661:4;18657:16;18636:37;;18563:117;;;;:::o;18686:169::-;18730:6;18763:51;18811:1;18807:6;18799:5;18796:1;18792:13;18763:51;:::i;:::-;18759:56;18844:4;18838;18834:15;18824:25;;18737:118;18686:169;;;;:::o;18860:295::-;18936:4;19082:29;19107:3;19101:4;19082:29;:::i;:::-;19074:37;;19144:3;19141:1;19137:11;19131:4;19128:21;19120:29;;18860:295;;;;:::o;19160:1395::-;19277:37;19310:3;19277:37;:::i;:::-;19379:18;19371:6;19368:30;19365:56;;;19401:18;;:::i;:::-;19365:56;19445:38;19477:4;19471:11;19445:38;:::i;:::-;19530:67;19590:6;19582;19576:4;19530:67;:::i;:::-;19624:1;19648:4;19635:17;;19680:2;19672:6;19669:14;19697:1;19692:618;;;;20354:1;20371:6;20368:77;;;20420:9;20415:3;20411:19;20405:26;20396:35;;20368:77;20471:67;20531:6;20524:5;20471:67;:::i;:::-;20465:4;20458:81;20327:222;19662:887;;19692:618;19744:4;19740:9;19732:6;19728:22;19778:37;19810:4;19778:37;:::i;:::-;19837:1;19851:208;19865:7;19862:1;19859:14;19851:208;;;19944:9;19939:3;19935:19;19929:26;19921:6;19914:42;19995:1;19987:6;19983:14;19973:24;;20042:2;20031:9;20027:18;20014:31;;19888:4;19885:1;19881:12;19876:17;;19851:208;;;20087:6;20078:7;20075:19;20072:179;;;20145:9;20140:3;20136:19;20130:26;20188:48;20230:4;20222:6;20218:17;20207:9;20188:48;:::i;:::-;20180:6;20173:64;20095:156;20072:179;20297:1;20293;20285:6;20281:14;20277:22;20271:4;20264:36;19699:611;;;19662:887;;19252:1303;;;19160:1395;;:::o;20561:166::-;20701:18;20697:1;20689:6;20685:14;20678:42;20561:166;:::o;20733:366::-;20875:3;20896:67;20960:2;20955:3;20896:67;:::i;:::-;20889:74;;20972:93;21061:3;20972:93;:::i;:::-;21090:2;21085:3;21081:12;21074:19;;20733:366;;;:::o;21105:419::-;21271:4;21309:2;21298:9;21294:18;21286:26;;21358:9;21352:4;21348:20;21344:1;21333:9;21329:17;21322:47;21386:131;21512:4;21386:131;:::i;:::-;21378:139;;21105:419;;;:::o;21530:148::-;21632:11;21669:3;21654:18;;21530:148;;;;:::o;21684:390::-;21790:3;21818:39;21851:5;21818:39;:::i;:::-;21873:89;21955:6;21950:3;21873:89;:::i;:::-;21866:96;;21971:65;22029:6;22024:3;22017:4;22010:5;22006:16;21971:65;:::i;:::-;22061:6;22056:3;22052:16;22045:23;;21794:280;21684:390;;;;:::o;22080:435::-;22260:3;22282:95;22373:3;22364:6;22282:95;:::i;:::-;22275:102;;22394:95;22485:3;22476:6;22394:95;:::i;:::-;22387:102;;22506:3;22499:10;;22080:435;;;;;:::o;22521:225::-;22661:34;22657:1;22649:6;22645:14;22638:58;22730:8;22725:2;22717:6;22713:15;22706:33;22521:225;:::o;22752:366::-;22894:3;22915:67;22979:2;22974:3;22915:67;:::i;:::-;22908:74;;22991:93;23080:3;22991:93;:::i;:::-;23109:2;23104:3;23100:12;23093:19;;22752:366;;;:::o;23124:419::-;23290:4;23328:2;23317:9;23313:18;23305:26;;23377:9;23371:4;23367:20;23363:1;23352:9;23348:17;23341:47;23405:131;23531:4;23405:131;:::i;:::-;23397:139;;23124:419;;;:::o;23549:98::-;23600:6;23634:5;23628:12;23618:22;;23549:98;;;:::o;23653:147::-;23754:11;23791:3;23776:18;;23653:147;;;;:::o;23806:386::-;23910:3;23938:38;23970:5;23938:38;:::i;:::-;23992:88;24073:6;24068:3;23992:88;:::i;:::-;23985:95;;24089:65;24147:6;24142:3;24135:4;24128:5;24124:16;24089:65;:::i;:::-;24179:6;24174:3;24170:16;24163:23;;23914:278;23806:386;;;;:::o;24198:271::-;24328:3;24350:93;24439:3;24430:6;24350:93;:::i;:::-;24343:100;;24460:3;24453:10;;24198:271;;;;:::o;24475:170::-;24615:22;24611:1;24603:6;24599:14;24592:46;24475:170;:::o;24651:366::-;24793:3;24814:67;24878:2;24873:3;24814:67;:::i;:::-;24807:74;;24890:93;24979:3;24890:93;:::i;:::-;25008:2;25003:3;24999:12;24992:19;;24651:366;;;:::o;25023:419::-;25189:4;25227:2;25216:9;25212:18;25204:26;;25276:9;25270:4;25266:20;25262:1;25251:9;25247:17;25240:47;25304:131;25430:4;25304:131;:::i;:::-;25296:139;;25023:419;;;:::o;25448:114::-;;:::o;25568:398::-;25727:3;25748:83;25829:1;25824:3;25748:83;:::i;:::-;25741:90;;25840:93;25929:3;25840:93;:::i;:::-;25958:1;25953:3;25949:11;25942:18;;25568:398;;;:::o;25972:379::-;26156:3;26178:147;26321:3;26178:147;:::i;:::-;26171:154;;26342:3;26335:10;;25972:379;;;:::o;26357:168::-;26440:11;26474:6;26469:3;26462:19;26514:4;26509:3;26505:14;26490:29;;26357:168;;;;:::o;26531:373::-;26617:3;26645:38;26677:5;26645:38;:::i;:::-;26699:70;26762:6;26757:3;26699:70;:::i;:::-;26692:77;;26778:65;26836:6;26831:3;26824:4;26817:5;26813:16;26778:65;:::i;:::-;26868:29;26890:6;26868:29;:::i;:::-;26863:3;26859:39;26852:46;;26621:283;26531:373;;;;:::o;26910:517::-;27071:4;27109:2;27098:9;27094:18;27086:26;;27122:65;27184:1;27173:9;27169:17;27160:6;27122:65;:::i;:::-;27234:9;27228:4;27224:20;27219:2;27208:9;27204:18;27197:48;27262:76;27333:4;27324:6;27262:76;:::i;:::-;27254:84;;27348:72;27416:2;27405:9;27401:18;27392:6;27348:72;:::i;:::-;26910:517;;;;;;:::o;27433:640::-;27628:4;27666:3;27655:9;27651:19;27643:27;;27680:71;27748:1;27737:9;27733:17;27724:6;27680:71;:::i;:::-;27761:72;27829:2;27818:9;27814:18;27805:6;27761:72;:::i;:::-;27843;27911:2;27900:9;27896:18;27887:6;27843:72;:::i;:::-;27962:9;27956:4;27952:20;27947:2;27936:9;27932:18;27925:48;27990:76;28061:4;28052:6;27990:76;:::i;:::-;27982:84;;27433:640;;;;;;;:::o;28079:141::-;28135:5;28166:6;28160:13;28151:22;;28182:32;28208:5;28182:32;:::i;:::-;28079:141;;;;:::o;28226:349::-;28295:6;28344:2;28332:9;28323:7;28319:23;28315:32;28312:119;;;28350:79;;:::i;:::-;28312:119;28470:1;28495:63;28550:7;28541:6;28530:9;28526:22;28495:63;:::i;:::-;28485:73;;28441:127;28226:349;;;;:::o;28581:233::-;28620:3;28643:24;28661:5;28643:24;:::i;:::-;28634:33;;28689:66;28682:5;28679:77;28676:103;;28759:18;;:::i;:::-;28676:103;28806:1;28799:5;28795:13;28788:20;;28581:233;;;:::o;28820:180::-;28868:77;28865:1;28858:88;28965:4;28962:1;28955:15;28989:4;28986:1;28979:15;29006:185;29046:1;29063:20;29081:1;29063:20;:::i;:::-;29058:25;;29097:20;29115:1;29097:20;:::i;:::-;29092:25;;29136:1;29126:35;;29141:18;;:::i;:::-;29126:35;29183:1;29180;29176:9;29171:14;;29006:185;;;;:::o;29197:194::-;29237:4;29257:20;29275:1;29257:20;:::i;:::-;29252:25;;29291:20;29309:1;29291:20;:::i;:::-;29286:25;;29335:1;29332;29328:9;29320:17;;29359:1;29353:4;29350:11;29347:37;;;29364:18;;:::i;:::-;29347:37;29197:194;;;;:::o;29397:176::-;29429:1;29446:20;29464:1;29446:20;:::i;:::-;29441:25;;29480:20;29498:1;29480:20;:::i;:::-;29475:25;;29519:1;29509:35;;29524:18;;:::i;:::-;29509:35;29565:1;29562;29558:9;29553:14;;29397:176;;;;:::o;29579:191::-;29619:3;29638:20;29656:1;29638:20;:::i;:::-;29633:25;;29672:20;29690:1;29672:20;:::i;:::-;29667:25;;29715:1;29712;29708:9;29701:16;;29736:3;29733:1;29730:10;29727:36;;;29743:18;;:::i;:::-;29727:36;29579:191;;;;:::o;29776:180::-;29824:77;29821:1;29814:88;29921:4;29918:1;29911:15;29945:4;29942:1;29935:15;29962:171;30001:3;30024:24;30042:5;30024:24;:::i;:::-;30015:33;;30070:4;30063:5;30060:15;30057:41;;30078:18;;:::i;:::-;30057:41;30125:1;30118:5;30114:13;30107:20;;29962:171;;;:::o;30139:182::-;30279:34;30275:1;30267:6;30263:14;30256:58;30139:182;:::o;30327:366::-;30469:3;30490:67;30554:2;30549:3;30490:67;:::i;:::-;30483:74;;30566:93;30655:3;30566:93;:::i;:::-;30684:2;30679:3;30675:12;30668:19;;30327:366;;;:::o;30699:419::-;30865:4;30903:2;30892:9;30888:18;30880:26;;30952:9;30946:4;30942:20;30938:1;30927:9;30923:17;30916:47;30980:131;31106:4;30980:131;:::i;:::-;30972:139;;30699:419;;;:::o;31124:214::-;31264:66;31260:1;31252:6;31248:14;31241:90;31124:214;:::o;31344:402::-;31504:3;31525:85;31607:2;31602:3;31525:85;:::i;:::-;31518:92;;31619:93;31708:3;31619:93;:::i;:::-;31737:2;31732:3;31728:12;31721:19;;31344:402;;;:::o;31752:697::-;32031:3;32053:148;32197:3;32053:148;:::i;:::-;32046:155;;32218:95;32309:3;32300:6;32218:95;:::i;:::-;32211:102;;32330:93;32419:3;32410:6;32330:93;:::i;:::-;32323:100;;32440:3;32433:10;;31752:697;;;;;:::o;32455:180::-;32503:77;32500:1;32493:88;32600:4;32597:1;32590:15;32624:4;32621:1;32614:15;32641:174;32781:26;32777:1;32769:6;32765:14;32758:50;32641:174;:::o;32821:366::-;32963:3;32984:67;33048:2;33043:3;32984:67;:::i;:::-;32977:74;;33060:93;33149:3;33060:93;:::i;:::-;33178:2;33173:3;33169:12;33162:19;;32821:366;;;:::o;33193:419::-;33359:4;33397:2;33386:9;33382:18;33374:26;;33446:9;33440:4;33436:20;33432:1;33421:9;33417:17;33410:47;33474:131;33600:4;33474:131;:::i;:::-;33466:139;;33193:419;;;:::o;33618:181::-;33758:33;33754:1;33746:6;33742:14;33735:57;33618:181;:::o;33805:366::-;33947:3;33968:67;34032:2;34027:3;33968:67;:::i;:::-;33961:74;;34044:93;34133:3;34044:93;:::i;:::-;34162:2;34157:3;34153:12;34146:19;;33805:366;;;:::o;34177:419::-;34343:4;34381:2;34370:9;34366:18;34358:26;;34430:9;34424:4;34420:20;34416:1;34405:9;34401:17;34394:47;34458:131;34584:4;34458:131;:::i;:::-;34450:139;;34177:419;;;:::o;34602:221::-;34742:34;34738:1;34730:6;34726:14;34719:58;34811:4;34806:2;34798:6;34794:15;34787:29;34602:221;:::o;34829:366::-;34971:3;34992:67;35056:2;35051:3;34992:67;:::i;:::-;34985:74;;35068:93;35157:3;35068:93;:::i;:::-;35186:2;35181:3;35177:12;35170:19;;34829:366;;;:::o;35201:419::-;35367:4;35405:2;35394:9;35390:18;35382:26;;35454:9;35448:4;35444:20;35440:1;35429:9;35425:17;35418:47;35482:131;35608:4;35482:131;:::i;:::-;35474:139;;35201:419;;;:::o;35626:221::-;35766:34;35762:1;35754:6;35750:14;35743:58;35835:4;35830:2;35822:6;35818:15;35811:29;35626:221;:::o;35853:366::-;35995:3;36016:67;36080:2;36075:3;36016:67;:::i;:::-;36009:74;;36092:93;36181:3;36092:93;:::i;:::-;36210:2;36205:3;36201:12;36194:19;;35853:366;;;:::o;36225:419::-;36391:4;36429:2;36418:9;36414:18;36406:26;;36478:9;36472:4;36468:20;36464:1;36453:9;36449:17;36442:47;36506:131;36632:4;36506:131;:::i;:::-;36498:139;;36225:419;;;:::o;36650:77::-;36687:7;36716:5;36705:16;;36650:77;;;:::o;36733:118::-;36820:24;36838:5;36820:24;:::i;:::-;36815:3;36808:37;36733:118;;:::o;36857:86::-;36892:7;36932:4;36925:5;36921:16;36910:27;;36857:86;;;:::o;36949:112::-;37032:22;37048:5;37032:22;:::i;:::-;37027:3;37020:35;36949:112;;:::o;37067:545::-;37240:4;37278:3;37267:9;37263:19;37255:27;;37292:71;37360:1;37349:9;37345:17;37336:6;37292:71;:::i;:::-;37373:68;37437:2;37426:9;37422:18;37413:6;37373:68;:::i;:::-;37451:72;37519:2;37508:9;37504:18;37495:6;37451:72;:::i;:::-;37533;37601:2;37590:9;37586:18;37577:6;37533:72;:::i;:::-;37067:545;;;;;;;:::o
Swarm Source
ipfs://c69ee3769e21b538a0cba995602f9cd404c58e4816028d509b41ec964562d4ed