Feature Tip: Add private address tag to any address under My Name Tag !
NFT
Website Down
Overview
TokenID
2998
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TheHumanoids
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-30 */ // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 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 Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/Counters.sol pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: contracts/thehumanoids.sol pragma solidity 0.8.0; contract TheHumanoids is ERC721, Ownable { using Address for address; using Counters for Counters.Counter; Counters.Counter private _tokenCount; string public baseURI; uint256 public constant price = 80000000000000000; // 0.08 ETH uint256 public constant maxTokens = 10000; uint256 public maxWallet = 10; bool public saleIsActive = false; bool public presaleIsActive = false; bool public hasReserved = false; mapping(address => uint256) public minted; // To check how many tokens an address has minted address private _signerAddress = 0xe6317C8292182bd4edd882946D54D51E970d10fb; constructor() ERC721("The Humanoids ", "HMNDS") { } // reserve (60 tokens) function reserve() external onlyOwner { require(!hasReserved, "Tokens have already been reserved."); for (uint i; i < 60; i++) { _tokenCount.increment(); _safeMint(msg.sender, _tokenCount.current()); } hasReserved = true; } function mint(uint256 _amount) external payable { require(saleIsActive, "Sale must be active"); require(!Address.isContract(msg.sender), "Contracts are not allowed to mint"); require(minted[msg.sender] + _amount <= maxWallet, "Purchase would exceed max tokens per wallet"); require(_tokenCount.current() + _amount <= maxTokens, "Purchase would exceed max supply of tokens"); require(msg.value >= price * _amount, "Ether value sent is not correct"); for(uint i; i < _amount; i++) { _tokenCount.increment(); _safeMint(msg.sender, _tokenCount.current()); } minted[msg.sender] += _amount; } function mintPresale(uint256 _amount, uint256 _maxTotal, uint8 _signatureV, bytes32 _signatureR, bytes32 _signatureS) external payable { require(presaleIsActive,"Presale must be active"); require(_tokenCount.current() + _amount <= maxTokens, "Purchase would exceed max supply of Tokens"); require(msg.value >= price * _amount, "Ether value sent is not correct"); require(minted[msg.sender] + _amount <= _maxTotal, "Purchase would exceed max tokens for presale"); bytes32 hash = keccak256(abi.encode(msg.sender, _maxTotal)); address signer = ECDSA.recover(hash, _signatureV, _signatureR, _signatureS); require(signer == _signerAddress, "Invalid signature"); for(uint i; i < _amount; i++){ _tokenCount.increment(); _safeMint(msg.sender, _tokenCount.current()); } minted[msg.sender] += _amount; } function totalSupply() public view returns (uint256) { return _tokenCount.current(); } function setBaseURI(string memory __baseURI) external onlyOwner { baseURI = __baseURI; } function _baseURI() internal view override returns (string memory) { return baseURI; } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function flipPresaleState() public onlyOwner { presaleIsActive = !presaleIsActive; } function setMaxWallet(uint _newMaxWallet) external onlyOwner { maxWallet = _newMaxWallet; } function withdrawAll() external onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","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":[],"name":"hasReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxTotal","type":"uint256"},{"internalType":"uint8","name":"_signatureV","type":"uint8"},{"internalType":"bytes32","name":"_signatureR","type":"bytes32"},{"internalType":"bytes32","name":"_signatureS","type":"bytes32"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uint256","name":"_newMaxWallet","type":"uint256"}],"name":"setMaxWallet","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":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600a6009556000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055506000600a60026101000a81548160ff02191690831515021790555073e6317c8292182bd4edd882946d54d51e970d10fb600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000bc57600080fd5b506040518060400160405280600e81526020017f5468652048756d616e6f696473200000000000000000000000000000000000008152506040518060400160405280600581526020017f484d4e445300000000000000000000000000000000000000000000000000000081525081600090805190602001906200014192919062000251565b5080600190805190602001906200015a92919062000251565b5050506200017d620001716200018360201b60201c565b6200018b60201b60201c565b62000366565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025f9062000301565b90600052602060002090601f016020900481019282620002835760008555620002cf565b82601f106200029e57805160ff1916838001178555620002cf565b82800160010185558215620002cf579182015b82811115620002ce578251825591602001919060010190620002b1565b5b509050620002de9190620002e2565b5090565b5b80821115620002fd576000816000905550600101620002e3565b5090565b600060028204905060018216806200031a57607f821691505b6020821081141562000331576200033062000337565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61479d80620003766000396000f3fe6080604052600436106101ee5760003560e01c8063715018a61161010d578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610697578063eb8d2444146106d4578063f2fde38b146106ff578063f81227d414610728578063f8b45b051461073f576101ee565b8063b88d4fde146105ef578063c87b56dd14610618578063cd3293de14610655578063e83157421461066c576101ee565b8063a035b1fe116100dc578063a035b1fe14610563578063a0712d681461058e578063a22cb465146105aa578063b29c94e7146105d3576101ee565b8063715018a6146104df578063853828b6146104f65780638da5cb5b1461050d57806395d89b4114610538576101ee565b806334918dfd1161018557806361eb605d1161015457806361eb605d1461040f5780636352211e1461043a5780636c0360eb1461047757806370a08231146104a2576101ee565b806334918dfd1461037d57806342842e0e1461039457806355f804b3146103bd5780635d0044ca146103e6576101ee565b806318160ddd116101c157806318160ddd146102c15780631e7269c5146102ec57806323b872dd1461032957806330f72cd414610352576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190613104565b61076a565b6040516102279190613e51565b60405180910390f35b34801561023c57600080fd5b5061024561084c565b6040516102529190613eb1565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613197565b6108de565b60405161028f9190613dc1565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba91906130c8565b610963565b005b3480156102cd57600080fd5b506102d6610a7b565b6040516102e39190614293565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190612f5d565b610a8c565b6040516103209190614293565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b9190612fc2565b610aa4565b005b34801561035e57600080fd5b50610367610b04565b6040516103749190613e51565b60405180910390f35b34801561038957600080fd5b50610392610b17565b005b3480156103a057600080fd5b506103bb60048036038101906103b69190612fc2565b610bbf565b005b3480156103c957600080fd5b506103e460048036038101906103df9190613156565b610bdf565b005b3480156103f257600080fd5b5061040d60048036038101906104089190613197565b610c75565b005b34801561041b57600080fd5b50610424610cfb565b6040516104319190613e51565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190613197565b610d0e565b60405161046e9190613dc1565b60405180910390f35b34801561048357600080fd5b5061048c610dc0565b6040516104999190613eb1565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190612f5d565b610e4e565b6040516104d69190614293565b60405180910390f35b3480156104eb57600080fd5b506104f4610f06565b005b34801561050257600080fd5b5061050b610f8e565b005b34801561051957600080fd5b50610522611059565b60405161052f9190613dc1565b60405180910390f35b34801561054457600080fd5b5061054d611083565b60405161055a9190613eb1565b60405180910390f35b34801561056f57600080fd5b50610578611115565b6040516105859190614293565b60405180910390f35b6105a860048036038101906105a39190613197565b611121565b005b3480156105b657600080fd5b506105d160048036038101906105cc919061308c565b61138c565b005b6105ed60048036038101906105e891906131c0565b61150d565b005b3480156105fb57600080fd5b5061061660048036038101906106119190613011565b611800565b005b34801561062457600080fd5b5061063f600480360381019061063a9190613197565b611862565b60405161064c9190613eb1565b60405180910390f35b34801561066157600080fd5b5061066a611909565b005b34801561067857600080fd5b50610681611a2f565b60405161068e9190614293565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190612f86565b611a35565b6040516106cb9190613e51565b60405180910390f35b3480156106e057600080fd5b506106e9611ac9565b6040516106f69190613e51565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190612f5d565b611adc565b005b34801561073457600080fd5b5061073d611bd4565b005b34801561074b57600080fd5b50610754611c7c565b6040516107619190614293565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610845575061084482611c82565b5b9050919050565b60606000805461085b90614564565b80601f016020809104026020016040519081016040528092919081815260200182805461088790614564565b80156108d45780601f106108a9576101008083540402835291602001916108d4565b820191906000526020600020905b8154815290600101906020018083116108b757829003601f168201915b5050505050905090565b60006108e982611cec565b610928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091f90614173565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096e82610d0e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d690614213565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109fe611d58565b73ffffffffffffffffffffffffffffffffffffffff161480610a2d5750610a2c81610a27611d58565b611a35565b5b610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390614093565b60405180910390fd5b610a768383611d60565b505050565b6000610a876007611e19565b905090565b600b6020528060005260406000206000915090505481565b610ab5610aaf611d58565b82611e27565b610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb90614233565b60405180910390fd5b610aff838383611f05565b505050565b600a60019054906101000a900460ff1681565b610b1f611d58565b73ffffffffffffffffffffffffffffffffffffffff16610b3d611059565b73ffffffffffffffffffffffffffffffffffffffff1614610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90614193565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b610bda83838360405180602001604052806000815250611800565b505050565b610be7611d58565b73ffffffffffffffffffffffffffffffffffffffff16610c05611059565b73ffffffffffffffffffffffffffffffffffffffff1614610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5290614193565b60405180910390fd5b8060089080519060200190610c71929190612d57565b5050565b610c7d611d58565b73ffffffffffffffffffffffffffffffffffffffff16610c9b611059565b73ffffffffffffffffffffffffffffffffffffffff1614610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890614193565b60405180910390fd5b8060098190555050565b600a60029054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae906140d3565b60405180910390fd5b80915050919050565b60088054610dcd90614564565b80601f0160208091040260200160405190810160405280929190818152602001828054610df990614564565b8015610e465780601f10610e1b57610100808354040283529160200191610e46565b820191906000526020600020905b815481529060010190602001808311610e2957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb6906140b3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f0e611d58565b73ffffffffffffffffffffffffffffffffffffffff16610f2c611059565b73ffffffffffffffffffffffffffffffffffffffff1614610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7990614193565b60405180910390fd5b610f8c6000612161565b565b610f96611d58565b73ffffffffffffffffffffffffffffffffffffffff16610fb4611059565b73ffffffffffffffffffffffffffffffffffffffff161461100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190614193565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611055573d6000803e3d6000fd5b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461109290614564565b80601f01602080910402602001604051908101604052809291908181526020018280546110be90614564565b801561110b5780601f106110e05761010080835404028352916020019161110b565b820191906000526020600020905b8154815290600101906020018083116110ee57829003601f168201915b5050505050905090565b67011c37937e08000081565b600a60009054906101000a900460ff16611170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116790613ef3565b60405180910390fd5b61117933612227565b156111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b090614273565b60405180910390fd5b60095481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112079190614382565b1115611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f90613f33565b60405180910390fd5b612710816112566007611e19565b6112609190614382565b11156112a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611298906140f3565b60405180910390fd5b8067011c37937e0800006112b59190614409565b3410156112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee90614013565b60405180910390fd5b60005b818110156113325761130c600761223a565b61131f3361131a6007611e19565b612250565b808061132a90614596565b9150506112fa565b5080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113829190614382565b9250508190555050565b611394611d58565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613ff3565b60405180910390fd5b806005600061140f611d58565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114bc611d58565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115019190613e51565b60405180910390a35050565b600a60019054906101000a900460ff1661155c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611553906141b3565b60405180910390fd5b6127108561156a6007611e19565b6115749190614382565b11156115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac90613fb3565b60405180910390fd5b8467011c37937e0800006115c99190614409565b34101561160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160290614013565b60405180910390fd5b8385600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116579190614382565b1115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614113565b60405180910390fd5b600033856040516020016116ad929190613e28565b60405160208183030381529060405280519060200120905060006116d38286868661226e565b9050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c90614033565b60405180910390fd5b60005b878110156117a05761177a600761223a565b61178d336117886007611e19565b612250565b808061179890614596565b915050611768565b5086600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117f09190614382565b9250508190555050505050505050565b61181161180b611d58565b83611e27565b611850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184790614233565b60405180910390fd5b61185c84848484612299565b50505050565b606061186d82611cec565b6118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a3906141f3565b60405180910390fd5b60006118b66122f5565b905060008151116118d65760405180602001604052806000815250611901565b806118e084612387565b6040516020016118f1929190613d9d565b6040516020818303038152906040525b915050919050565b611911611d58565b73ffffffffffffffffffffffffffffffffffffffff1661192f611059565b73ffffffffffffffffffffffffffffffffffffffff1614611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c90614193565b60405180910390fd5b600a60029054906101000a900460ff16156119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90614253565b60405180910390fd5b60005b603c811015611a11576119eb600761223a565b6119fe336119f96007611e19565b612250565b8080611a0990614596565b9150506119d8565b506001600a60026101000a81548160ff021916908315150217905550565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60009054906101000a900460ff1681565b611ae4611d58565b73ffffffffffffffffffffffffffffffffffffffff16611b02611059565b73ffffffffffffffffffffffffffffffffffffffff1614611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90614193565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf90613f73565b60405180910390fd5b611bd181612161565b50565b611bdc611d58565b73ffffffffffffffffffffffffffffffffffffffff16611bfa611059565b73ffffffffffffffffffffffffffffffffffffffff1614611c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4790614193565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b60095481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dd383610d0e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611e3282611cec565b611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6890614073565b60405180910390fd5b6000611e7c83610d0e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611eeb57508373ffffffffffffffffffffffffffffffffffffffff16611ed3846108de565b73ffffffffffffffffffffffffffffffffffffffff16145b80611efc5750611efb8185611a35565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f2582610d0e565b73ffffffffffffffffffffffffffffffffffffffff1614611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f72906141d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290613fd3565b60405180910390fd5b611ff6838383612534565b612001600082611d60565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120519190614463565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a89190614382565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b6001816000016000828254019250508190555050565b61226a828260405180602001604052806000815250612539565b5050565b600080600061227f87878787612594565b9150915061228c816126a1565b8192505050949350505050565b6122a4848484611f05565b6122b0848484846129f2565b6122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e690613f53565b60405180910390fd5b50505050565b60606008805461230490614564565b80601f016020809104026020016040519081016040528092919081815260200182805461233090614564565b801561237d5780601f106123525761010080835404028352916020019161237d565b820191906000526020600020905b81548152906001019060200180831161236057829003601f168201915b5050505050905090565b606060008214156123cf576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061252f565b600082905060005b600082146124015780806123ea90614596565b915050600a826123fa91906143d8565b91506123d7565b60008167ffffffffffffffff811115612443577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124755781602001600182028036833780820191505090505b5090505b600085146125285760018261248e9190614463565b9150600a8561249d91906145df565b60306124a99190614382565b60f81b8183815181106124e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561252191906143d8565b9450612479565b8093505050505b919050565b505050565b6125438383612b89565b61255060008484846129f2565b61258f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258690613f53565b60405180910390fd5b505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156125cf576000600391509150612698565b601b8560ff16141580156125e75750601c8560ff1614155b156125f9576000600491509150612698565b60006001878787876040516000815260200160405260405161261e9493929190613e6c565b6020604051602081039080840390855afa158015612640573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561268f57600060019250925050612698565b80600092509250505b94509492505050565b600060048111156126db577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612714577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561271f576129ef565b60016004811115612759577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612792577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ca90613ed3565b60405180910390fd5b6002600481111561280d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612846577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287e90613f13565b60405180910390fd5b600360048111156128c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156128fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561293b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293290614053565b60405180910390fd5b600480811115612974577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156129ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156129ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e590614133565b60405180910390fd5b5b50565b6000612a138473ffffffffffffffffffffffffffffffffffffffff16612227565b15612b7c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a3c611d58565b8786866040518563ffffffff1660e01b8152600401612a5e9493929190613ddc565b602060405180830381600087803b158015612a7857600080fd5b505af1925050508015612aa957506040513d601f19601f82011682018060405250810190612aa6919061312d565b60015b612b2c573d8060008114612ad9576040519150601f19603f3d011682016040523d82523d6000602084013e612ade565b606091505b50600081511415612b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1b90613f53565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b81565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf090614153565b60405180910390fd5b612c0281611cec565b15612c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3990613f93565b60405180910390fd5b612c4e60008383612534565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c9e9190614382565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612d6390614564565b90600052602060002090601f016020900481019282612d855760008555612dcc565b82601f10612d9e57805160ff1916838001178555612dcc565b82800160010185558215612dcc579182015b82811115612dcb578251825591602001919060010190612db0565b5b509050612dd99190612ddd565b5090565b5b80821115612df6576000816000905550600101612dde565b5090565b6000612e0d612e08846142df565b6142ae565b905082815260208101848484011115612e2557600080fd5b612e30848285614522565b509392505050565b6000612e4b612e468461430f565b6142ae565b905082815260208101848484011115612e6357600080fd5b612e6e848285614522565b509392505050565b600081359050612e85816146dd565b92915050565b600081359050612e9a816146f4565b92915050565b600081359050612eaf8161470b565b92915050565b600081359050612ec481614722565b92915050565b600081519050612ed981614722565b92915050565b600082601f830112612ef057600080fd5b8135612f00848260208601612dfa565b91505092915050565b600082601f830112612f1a57600080fd5b8135612f2a848260208601612e38565b91505092915050565b600081359050612f4281614739565b92915050565b600081359050612f5781614750565b92915050565b600060208284031215612f6f57600080fd5b6000612f7d84828501612e76565b91505092915050565b60008060408385031215612f9957600080fd5b6000612fa785828601612e76565b9250506020612fb885828601612e76565b9150509250929050565b600080600060608486031215612fd757600080fd5b6000612fe586828701612e76565b9350506020612ff686828701612e76565b925050604061300786828701612f33565b9150509250925092565b6000806000806080858703121561302757600080fd5b600061303587828801612e76565b945050602061304687828801612e76565b935050604061305787828801612f33565b925050606085013567ffffffffffffffff81111561307457600080fd5b61308087828801612edf565b91505092959194509250565b6000806040838503121561309f57600080fd5b60006130ad85828601612e76565b92505060206130be85828601612e8b565b9150509250929050565b600080604083850312156130db57600080fd5b60006130e985828601612e76565b92505060206130fa85828601612f33565b9150509250929050565b60006020828403121561311657600080fd5b600061312484828501612eb5565b91505092915050565b60006020828403121561313f57600080fd5b600061314d84828501612eca565b91505092915050565b60006020828403121561316857600080fd5b600082013567ffffffffffffffff81111561318257600080fd5b61318e84828501612f09565b91505092915050565b6000602082840312156131a957600080fd5b60006131b784828501612f33565b91505092915050565b600080600080600060a086880312156131d857600080fd5b60006131e688828901612f33565b95505060206131f788828901612f33565b945050604061320888828901612f48565b935050606061321988828901612ea0565b925050608061322a88828901612ea0565b9150509295509295909350565b61324081614497565b82525050565b61324f816144a9565b82525050565b61325e816144b5565b82525050565b600061326f8261433f565b6132798185614355565b9350613289818560208601614531565b613292816146cc565b840191505092915050565b60006132a88261434a565b6132b28185614366565b93506132c2818560208601614531565b6132cb816146cc565b840191505092915050565b60006132e18261434a565b6132eb8185614377565b93506132fb818560208601614531565b80840191505092915050565b6000613314601883614366565b91507f45434453413a20696e76616c6964207369676e617475726500000000000000006000830152602082019050919050565b6000613354601383614366565b91507f53616c65206d75737420626520616374697665000000000000000000000000006000830152602082019050919050565b6000613394601f83614366565b91507f45434453413a20696e76616c6964207369676e6174757265206c656e677468006000830152602082019050919050565b60006133d4602b83614366565b91507f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008301527f207065722077616c6c65740000000000000000000000000000000000000000006020830152604082019050919050565b600061343a603283614366565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006134a0602683614366565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613506601c83614366565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613546602a83614366565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620546f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b60006135ac602483614366565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613612601983614366565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613652601f83614366565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613692601183614366565b91507f496e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b60006136d2602283614366565b91507f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613738602c83614366565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061379e603883614366565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613804602a83614366565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061386a602983614366565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006138d0602a83614366565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000613936602c83614366565b91507f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008301527f20666f722070726573616c6500000000000000000000000000000000000000006020830152604082019050919050565b600061399c602283614366565b91507f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a02602083614366565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613a42602c83614366565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613aa8602083614366565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613ae8601683614366565b91507f50726573616c65206d75737420626520616374697665000000000000000000006000830152602082019050919050565b6000613b28602983614366565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b8e602f83614366565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613bf4602183614366565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c5a603183614366565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613cc0602283614366565b91507f546f6b656e73206861766520616c7265616479206265656e207265736572766560008301527f642e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d26602183614366565b91507f436f6e74726163747320617265206e6f7420616c6c6f77656420746f206d696e60008301527f74000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b613d888161450b565b82525050565b613d9781614515565b82525050565b6000613da982856132d6565b9150613db582846132d6565b91508190509392505050565b6000602082019050613dd66000830184613237565b92915050565b6000608082019050613df16000830187613237565b613dfe6020830186613237565b613e0b6040830185613d7f565b8181036060830152613e1d8184613264565b905095945050505050565b6000604082019050613e3d6000830185613237565b613e4a6020830184613d7f565b9392505050565b6000602082019050613e666000830184613246565b92915050565b6000608082019050613e816000830187613255565b613e8e6020830186613d8e565b613e9b6040830185613255565b613ea86060830184613255565b95945050505050565b60006020820190508181036000830152613ecb818461329d565b905092915050565b60006020820190508181036000830152613eec81613307565b9050919050565b60006020820190508181036000830152613f0c81613347565b9050919050565b60006020820190508181036000830152613f2c81613387565b9050919050565b60006020820190508181036000830152613f4c816133c7565b9050919050565b60006020820190508181036000830152613f6c8161342d565b9050919050565b60006020820190508181036000830152613f8c81613493565b9050919050565b60006020820190508181036000830152613fac816134f9565b9050919050565b60006020820190508181036000830152613fcc81613539565b9050919050565b60006020820190508181036000830152613fec8161359f565b9050919050565b6000602082019050818103600083015261400c81613605565b9050919050565b6000602082019050818103600083015261402c81613645565b9050919050565b6000602082019050818103600083015261404c81613685565b9050919050565b6000602082019050818103600083015261406c816136c5565b9050919050565b6000602082019050818103600083015261408c8161372b565b9050919050565b600060208201905081810360008301526140ac81613791565b9050919050565b600060208201905081810360008301526140cc816137f7565b9050919050565b600060208201905081810360008301526140ec8161385d565b9050919050565b6000602082019050818103600083015261410c816138c3565b9050919050565b6000602082019050818103600083015261412c81613929565b9050919050565b6000602082019050818103600083015261414c8161398f565b9050919050565b6000602082019050818103600083015261416c816139f5565b9050919050565b6000602082019050818103600083015261418c81613a35565b9050919050565b600060208201905081810360008301526141ac81613a9b565b9050919050565b600060208201905081810360008301526141cc81613adb565b9050919050565b600060208201905081810360008301526141ec81613b1b565b9050919050565b6000602082019050818103600083015261420c81613b81565b9050919050565b6000602082019050818103600083015261422c81613be7565b9050919050565b6000602082019050818103600083015261424c81613c4d565b9050919050565b6000602082019050818103600083015261426c81613cb3565b9050919050565b6000602082019050818103600083015261428c81613d19565b9050919050565b60006020820190506142a86000830184613d7f565b92915050565b6000604051905081810181811067ffffffffffffffff821117156142d5576142d461469d565b5b8060405250919050565b600067ffffffffffffffff8211156142fa576142f961469d565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561432a5761432961469d565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061438d8261450b565b91506143988361450b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143cd576143cc614610565b5b828201905092915050565b60006143e38261450b565b91506143ee8361450b565b9250826143fe576143fd61463f565b5b828204905092915050565b60006144148261450b565b915061441f8361450b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561445857614457614610565b5b828202905092915050565b600061446e8261450b565b91506144798361450b565b92508282101561448c5761448b614610565b5b828203905092915050565b60006144a2826144eb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561454f578082015181840152602081019050614534565b8381111561455e576000848401525b50505050565b6000600282049050600182168061457c57607f821691505b602082108114156145905761458f61466e565b5b50919050565b60006145a18261450b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145d4576145d3614610565b5b600182019050919050565b60006145ea8261450b565b91506145f58361450b565b9250826146055761460461463f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6146e681614497565b81146146f157600080fd5b50565b6146fd816144a9565b811461470857600080fd5b50565b614714816144b5565b811461471f57600080fd5b50565b61472b816144bf565b811461473657600080fd5b50565b6147428161450b565b811461474d57600080fd5b50565b61475981614515565b811461476457600080fd5b5056fea2646970667358221220397bf856164582d56f2d2a7c29058c1d7fd431012224d829e26ff75333eeaccc64736f6c63430008000033
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c8063715018a61161010d578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610697578063eb8d2444146106d4578063f2fde38b146106ff578063f81227d414610728578063f8b45b051461073f576101ee565b8063b88d4fde146105ef578063c87b56dd14610618578063cd3293de14610655578063e83157421461066c576101ee565b8063a035b1fe116100dc578063a035b1fe14610563578063a0712d681461058e578063a22cb465146105aa578063b29c94e7146105d3576101ee565b8063715018a6146104df578063853828b6146104f65780638da5cb5b1461050d57806395d89b4114610538576101ee565b806334918dfd1161018557806361eb605d1161015457806361eb605d1461040f5780636352211e1461043a5780636c0360eb1461047757806370a08231146104a2576101ee565b806334918dfd1461037d57806342842e0e1461039457806355f804b3146103bd5780635d0044ca146103e6576101ee565b806318160ddd116101c157806318160ddd146102c15780631e7269c5146102ec57806323b872dd1461032957806330f72cd414610352576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190613104565b61076a565b6040516102279190613e51565b60405180910390f35b34801561023c57600080fd5b5061024561084c565b6040516102529190613eb1565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613197565b6108de565b60405161028f9190613dc1565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba91906130c8565b610963565b005b3480156102cd57600080fd5b506102d6610a7b565b6040516102e39190614293565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190612f5d565b610a8c565b6040516103209190614293565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b9190612fc2565b610aa4565b005b34801561035e57600080fd5b50610367610b04565b6040516103749190613e51565b60405180910390f35b34801561038957600080fd5b50610392610b17565b005b3480156103a057600080fd5b506103bb60048036038101906103b69190612fc2565b610bbf565b005b3480156103c957600080fd5b506103e460048036038101906103df9190613156565b610bdf565b005b3480156103f257600080fd5b5061040d60048036038101906104089190613197565b610c75565b005b34801561041b57600080fd5b50610424610cfb565b6040516104319190613e51565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190613197565b610d0e565b60405161046e9190613dc1565b60405180910390f35b34801561048357600080fd5b5061048c610dc0565b6040516104999190613eb1565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190612f5d565b610e4e565b6040516104d69190614293565b60405180910390f35b3480156104eb57600080fd5b506104f4610f06565b005b34801561050257600080fd5b5061050b610f8e565b005b34801561051957600080fd5b50610522611059565b60405161052f9190613dc1565b60405180910390f35b34801561054457600080fd5b5061054d611083565b60405161055a9190613eb1565b60405180910390f35b34801561056f57600080fd5b50610578611115565b6040516105859190614293565b60405180910390f35b6105a860048036038101906105a39190613197565b611121565b005b3480156105b657600080fd5b506105d160048036038101906105cc919061308c565b61138c565b005b6105ed60048036038101906105e891906131c0565b61150d565b005b3480156105fb57600080fd5b5061061660048036038101906106119190613011565b611800565b005b34801561062457600080fd5b5061063f600480360381019061063a9190613197565b611862565b60405161064c9190613eb1565b60405180910390f35b34801561066157600080fd5b5061066a611909565b005b34801561067857600080fd5b50610681611a2f565b60405161068e9190614293565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190612f86565b611a35565b6040516106cb9190613e51565b60405180910390f35b3480156106e057600080fd5b506106e9611ac9565b6040516106f69190613e51565b60405180910390f35b34801561070b57600080fd5b5061072660048036038101906107219190612f5d565b611adc565b005b34801561073457600080fd5b5061073d611bd4565b005b34801561074b57600080fd5b50610754611c7c565b6040516107619190614293565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610845575061084482611c82565b5b9050919050565b60606000805461085b90614564565b80601f016020809104026020016040519081016040528092919081815260200182805461088790614564565b80156108d45780601f106108a9576101008083540402835291602001916108d4565b820191906000526020600020905b8154815290600101906020018083116108b757829003601f168201915b5050505050905090565b60006108e982611cec565b610928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091f90614173565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096e82610d0e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d690614213565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109fe611d58565b73ffffffffffffffffffffffffffffffffffffffff161480610a2d5750610a2c81610a27611d58565b611a35565b5b610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390614093565b60405180910390fd5b610a768383611d60565b505050565b6000610a876007611e19565b905090565b600b6020528060005260406000206000915090505481565b610ab5610aaf611d58565b82611e27565b610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb90614233565b60405180910390fd5b610aff838383611f05565b505050565b600a60019054906101000a900460ff1681565b610b1f611d58565b73ffffffffffffffffffffffffffffffffffffffff16610b3d611059565b73ffffffffffffffffffffffffffffffffffffffff1614610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90614193565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b610bda83838360405180602001604052806000815250611800565b505050565b610be7611d58565b73ffffffffffffffffffffffffffffffffffffffff16610c05611059565b73ffffffffffffffffffffffffffffffffffffffff1614610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5290614193565b60405180910390fd5b8060089080519060200190610c71929190612d57565b5050565b610c7d611d58565b73ffffffffffffffffffffffffffffffffffffffff16610c9b611059565b73ffffffffffffffffffffffffffffffffffffffff1614610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890614193565b60405180910390fd5b8060098190555050565b600a60029054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae906140d3565b60405180910390fd5b80915050919050565b60088054610dcd90614564565b80601f0160208091040260200160405190810160405280929190818152602001828054610df990614564565b8015610e465780601f10610e1b57610100808354040283529160200191610e46565b820191906000526020600020905b815481529060010190602001808311610e2957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb6906140b3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f0e611d58565b73ffffffffffffffffffffffffffffffffffffffff16610f2c611059565b73ffffffffffffffffffffffffffffffffffffffff1614610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7990614193565b60405180910390fd5b610f8c6000612161565b565b610f96611d58565b73ffffffffffffffffffffffffffffffffffffffff16610fb4611059565b73ffffffffffffffffffffffffffffffffffffffff161461100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100190614193565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611055573d6000803e3d6000fd5b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461109290614564565b80601f01602080910402602001604051908101604052809291908181526020018280546110be90614564565b801561110b5780601f106110e05761010080835404028352916020019161110b565b820191906000526020600020905b8154815290600101906020018083116110ee57829003601f168201915b5050505050905090565b67011c37937e08000081565b600a60009054906101000a900460ff16611170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116790613ef3565b60405180910390fd5b61117933612227565b156111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b090614273565b60405180910390fd5b60095481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112079190614382565b1115611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f90613f33565b60405180910390fd5b612710816112566007611e19565b6112609190614382565b11156112a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611298906140f3565b60405180910390fd5b8067011c37937e0800006112b59190614409565b3410156112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee90614013565b60405180910390fd5b60005b818110156113325761130c600761223a565b61131f3361131a6007611e19565b612250565b808061132a90614596565b9150506112fa565b5080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113829190614382565b9250508190555050565b611394611d58565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990613ff3565b60405180910390fd5b806005600061140f611d58565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114bc611d58565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115019190613e51565b60405180910390a35050565b600a60019054906101000a900460ff1661155c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611553906141b3565b60405180910390fd5b6127108561156a6007611e19565b6115749190614382565b11156115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac90613fb3565b60405180910390fd5b8467011c37937e0800006115c99190614409565b34101561160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160290614013565b60405180910390fd5b8385600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116579190614382565b1115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614113565b60405180910390fd5b600033856040516020016116ad929190613e28565b60405160208183030381529060405280519060200120905060006116d38286868661226e565b9050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c90614033565b60405180910390fd5b60005b878110156117a05761177a600761223a565b61178d336117886007611e19565b612250565b808061179890614596565b915050611768565b5086600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117f09190614382565b9250508190555050505050505050565b61181161180b611d58565b83611e27565b611850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184790614233565b60405180910390fd5b61185c84848484612299565b50505050565b606061186d82611cec565b6118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a3906141f3565b60405180910390fd5b60006118b66122f5565b905060008151116118d65760405180602001604052806000815250611901565b806118e084612387565b6040516020016118f1929190613d9d565b6040516020818303038152906040525b915050919050565b611911611d58565b73ffffffffffffffffffffffffffffffffffffffff1661192f611059565b73ffffffffffffffffffffffffffffffffffffffff1614611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c90614193565b60405180910390fd5b600a60029054906101000a900460ff16156119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90614253565b60405180910390fd5b60005b603c811015611a11576119eb600761223a565b6119fe336119f96007611e19565b612250565b8080611a0990614596565b9150506119d8565b506001600a60026101000a81548160ff021916908315150217905550565b61271081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60009054906101000a900460ff1681565b611ae4611d58565b73ffffffffffffffffffffffffffffffffffffffff16611b02611059565b73ffffffffffffffffffffffffffffffffffffffff1614611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90614193565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf90613f73565b60405180910390fd5b611bd181612161565b50565b611bdc611d58565b73ffffffffffffffffffffffffffffffffffffffff16611bfa611059565b73ffffffffffffffffffffffffffffffffffffffff1614611c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4790614193565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b60095481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dd383610d0e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611e3282611cec565b611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6890614073565b60405180910390fd5b6000611e7c83610d0e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611eeb57508373ffffffffffffffffffffffffffffffffffffffff16611ed3846108de565b73ffffffffffffffffffffffffffffffffffffffff16145b80611efc5750611efb8185611a35565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f2582610d0e565b73ffffffffffffffffffffffffffffffffffffffff1614611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f72906141d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290613fd3565b60405180910390fd5b611ff6838383612534565b612001600082611d60565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120519190614463565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a89190614382565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b6001816000016000828254019250508190555050565b61226a828260405180602001604052806000815250612539565b5050565b600080600061227f87878787612594565b9150915061228c816126a1565b8192505050949350505050565b6122a4848484611f05565b6122b0848484846129f2565b6122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e690613f53565b60405180910390fd5b50505050565b60606008805461230490614564565b80601f016020809104026020016040519081016040528092919081815260200182805461233090614564565b801561237d5780601f106123525761010080835404028352916020019161237d565b820191906000526020600020905b81548152906001019060200180831161236057829003601f168201915b5050505050905090565b606060008214156123cf576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061252f565b600082905060005b600082146124015780806123ea90614596565b915050600a826123fa91906143d8565b91506123d7565b60008167ffffffffffffffff811115612443577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124755781602001600182028036833780820191505090505b5090505b600085146125285760018261248e9190614463565b9150600a8561249d91906145df565b60306124a99190614382565b60f81b8183815181106124e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561252191906143d8565b9450612479565b8093505050505b919050565b505050565b6125438383612b89565b61255060008484846129f2565b61258f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258690613f53565b60405180910390fd5b505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156125cf576000600391509150612698565b601b8560ff16141580156125e75750601c8560ff1614155b156125f9576000600491509150612698565b60006001878787876040516000815260200160405260405161261e9493929190613e6c565b6020604051602081039080840390855afa158015612640573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561268f57600060019250925050612698565b80600092509250505b94509492505050565b600060048111156126db577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612714577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561271f576129ef565b60016004811115612759577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612792577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156127d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ca90613ed3565b60405180910390fd5b6002600481111561280d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612846577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287e90613f13565b60405180910390fd5b600360048111156128c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156128fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561293b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293290614053565b60405180910390fd5b600480811115612974577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156129ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156129ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e590614133565b60405180910390fd5b5b50565b6000612a138473ffffffffffffffffffffffffffffffffffffffff16612227565b15612b7c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a3c611d58565b8786866040518563ffffffff1660e01b8152600401612a5e9493929190613ddc565b602060405180830381600087803b158015612a7857600080fd5b505af1925050508015612aa957506040513d601f19601f82011682018060405250810190612aa6919061312d565b60015b612b2c573d8060008114612ad9576040519150601f19603f3d011682016040523d82523d6000602084013e612ade565b606091505b50600081511415612b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1b90613f53565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b81565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf090614153565b60405180910390fd5b612c0281611cec565b15612c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3990613f93565b60405180910390fd5b612c4e60008383612534565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c9e9190614382565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612d6390614564565b90600052602060002090601f016020900481019282612d855760008555612dcc565b82601f10612d9e57805160ff1916838001178555612dcc565b82800160010185558215612dcc579182015b82811115612dcb578251825591602001919060010190612db0565b5b509050612dd99190612ddd565b5090565b5b80821115612df6576000816000905550600101612dde565b5090565b6000612e0d612e08846142df565b6142ae565b905082815260208101848484011115612e2557600080fd5b612e30848285614522565b509392505050565b6000612e4b612e468461430f565b6142ae565b905082815260208101848484011115612e6357600080fd5b612e6e848285614522565b509392505050565b600081359050612e85816146dd565b92915050565b600081359050612e9a816146f4565b92915050565b600081359050612eaf8161470b565b92915050565b600081359050612ec481614722565b92915050565b600081519050612ed981614722565b92915050565b600082601f830112612ef057600080fd5b8135612f00848260208601612dfa565b91505092915050565b600082601f830112612f1a57600080fd5b8135612f2a848260208601612e38565b91505092915050565b600081359050612f4281614739565b92915050565b600081359050612f5781614750565b92915050565b600060208284031215612f6f57600080fd5b6000612f7d84828501612e76565b91505092915050565b60008060408385031215612f9957600080fd5b6000612fa785828601612e76565b9250506020612fb885828601612e76565b9150509250929050565b600080600060608486031215612fd757600080fd5b6000612fe586828701612e76565b9350506020612ff686828701612e76565b925050604061300786828701612f33565b9150509250925092565b6000806000806080858703121561302757600080fd5b600061303587828801612e76565b945050602061304687828801612e76565b935050604061305787828801612f33565b925050606085013567ffffffffffffffff81111561307457600080fd5b61308087828801612edf565b91505092959194509250565b6000806040838503121561309f57600080fd5b60006130ad85828601612e76565b92505060206130be85828601612e8b565b9150509250929050565b600080604083850312156130db57600080fd5b60006130e985828601612e76565b92505060206130fa85828601612f33565b9150509250929050565b60006020828403121561311657600080fd5b600061312484828501612eb5565b91505092915050565b60006020828403121561313f57600080fd5b600061314d84828501612eca565b91505092915050565b60006020828403121561316857600080fd5b600082013567ffffffffffffffff81111561318257600080fd5b61318e84828501612f09565b91505092915050565b6000602082840312156131a957600080fd5b60006131b784828501612f33565b91505092915050565b600080600080600060a086880312156131d857600080fd5b60006131e688828901612f33565b95505060206131f788828901612f33565b945050604061320888828901612f48565b935050606061321988828901612ea0565b925050608061322a88828901612ea0565b9150509295509295909350565b61324081614497565b82525050565b61324f816144a9565b82525050565b61325e816144b5565b82525050565b600061326f8261433f565b6132798185614355565b9350613289818560208601614531565b613292816146cc565b840191505092915050565b60006132a88261434a565b6132b28185614366565b93506132c2818560208601614531565b6132cb816146cc565b840191505092915050565b60006132e18261434a565b6132eb8185614377565b93506132fb818560208601614531565b80840191505092915050565b6000613314601883614366565b91507f45434453413a20696e76616c6964207369676e617475726500000000000000006000830152602082019050919050565b6000613354601383614366565b91507f53616c65206d75737420626520616374697665000000000000000000000000006000830152602082019050919050565b6000613394601f83614366565b91507f45434453413a20696e76616c6964207369676e6174757265206c656e677468006000830152602082019050919050565b60006133d4602b83614366565b91507f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008301527f207065722077616c6c65740000000000000000000000000000000000000000006020830152604082019050919050565b600061343a603283614366565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006134a0602683614366565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613506601c83614366565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613546602a83614366565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620546f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b60006135ac602483614366565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613612601983614366565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613652601f83614366565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613692601183614366565b91507f496e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b60006136d2602283614366565b91507f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613738602c83614366565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061379e603883614366565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613804602a83614366565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061386a602983614366565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006138d0602a83614366565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000613936602c83614366565b91507f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008301527f20666f722070726573616c6500000000000000000000000000000000000000006020830152604082019050919050565b600061399c602283614366565b91507f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a02602083614366565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613a42602c83614366565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613aa8602083614366565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613ae8601683614366565b91507f50726573616c65206d75737420626520616374697665000000000000000000006000830152602082019050919050565b6000613b28602983614366565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b8e602f83614366565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613bf4602183614366565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c5a603183614366565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613cc0602283614366565b91507f546f6b656e73206861766520616c7265616479206265656e207265736572766560008301527f642e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d26602183614366565b91507f436f6e74726163747320617265206e6f7420616c6c6f77656420746f206d696e60008301527f74000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b613d888161450b565b82525050565b613d9781614515565b82525050565b6000613da982856132d6565b9150613db582846132d6565b91508190509392505050565b6000602082019050613dd66000830184613237565b92915050565b6000608082019050613df16000830187613237565b613dfe6020830186613237565b613e0b6040830185613d7f565b8181036060830152613e1d8184613264565b905095945050505050565b6000604082019050613e3d6000830185613237565b613e4a6020830184613d7f565b9392505050565b6000602082019050613e666000830184613246565b92915050565b6000608082019050613e816000830187613255565b613e8e6020830186613d8e565b613e9b6040830185613255565b613ea86060830184613255565b95945050505050565b60006020820190508181036000830152613ecb818461329d565b905092915050565b60006020820190508181036000830152613eec81613307565b9050919050565b60006020820190508181036000830152613f0c81613347565b9050919050565b60006020820190508181036000830152613f2c81613387565b9050919050565b60006020820190508181036000830152613f4c816133c7565b9050919050565b60006020820190508181036000830152613f6c8161342d565b9050919050565b60006020820190508181036000830152613f8c81613493565b9050919050565b60006020820190508181036000830152613fac816134f9565b9050919050565b60006020820190508181036000830152613fcc81613539565b9050919050565b60006020820190508181036000830152613fec8161359f565b9050919050565b6000602082019050818103600083015261400c81613605565b9050919050565b6000602082019050818103600083015261402c81613645565b9050919050565b6000602082019050818103600083015261404c81613685565b9050919050565b6000602082019050818103600083015261406c816136c5565b9050919050565b6000602082019050818103600083015261408c8161372b565b9050919050565b600060208201905081810360008301526140ac81613791565b9050919050565b600060208201905081810360008301526140cc816137f7565b9050919050565b600060208201905081810360008301526140ec8161385d565b9050919050565b6000602082019050818103600083015261410c816138c3565b9050919050565b6000602082019050818103600083015261412c81613929565b9050919050565b6000602082019050818103600083015261414c8161398f565b9050919050565b6000602082019050818103600083015261416c816139f5565b9050919050565b6000602082019050818103600083015261418c81613a35565b9050919050565b600060208201905081810360008301526141ac81613a9b565b9050919050565b600060208201905081810360008301526141cc81613adb565b9050919050565b600060208201905081810360008301526141ec81613b1b565b9050919050565b6000602082019050818103600083015261420c81613b81565b9050919050565b6000602082019050818103600083015261422c81613be7565b9050919050565b6000602082019050818103600083015261424c81613c4d565b9050919050565b6000602082019050818103600083015261426c81613cb3565b9050919050565b6000602082019050818103600083015261428c81613d19565b9050919050565b60006020820190506142a86000830184613d7f565b92915050565b6000604051905081810181811067ffffffffffffffff821117156142d5576142d461469d565b5b8060405250919050565b600067ffffffffffffffff8211156142fa576142f961469d565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561432a5761432961469d565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061438d8261450b565b91506143988361450b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143cd576143cc614610565b5b828201905092915050565b60006143e38261450b565b91506143ee8361450b565b9250826143fe576143fd61463f565b5b828204905092915050565b60006144148261450b565b915061441f8361450b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561445857614457614610565b5b828202905092915050565b600061446e8261450b565b91506144798361450b565b92508282101561448c5761448b614610565b5b828203905092915050565b60006144a2826144eb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561454f578082015181840152602081019050614534565b8381111561455e576000848401525b50505050565b6000600282049050600182168061457c57607f821691505b602082108114156145905761458f61466e565b5b50919050565b60006145a18261450b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145d4576145d3614610565b5b600182019050919050565b60006145ea8261450b565b91506145f58361450b565b9250826146055761460461463f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6146e681614497565b81146146f157600080fd5b50565b6146fd816144a9565b811461470857600080fd5b50565b614714816144b5565b811461471f57600080fd5b50565b61472b816144bf565b811461473657600080fd5b50565b6147428161450b565b811461474d57600080fd5b50565b61475981614515565b811461476457600080fd5b5056fea2646970667358221220397bf856164582d56f2d2a7c29058c1d7fd431012224d829e26ff75333eeaccc64736f6c63430008000033
Deployed Bytecode Sourcemap
45547:3485:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33343:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34288:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35847:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35370:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48234:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46018:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36737:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45936:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48566:89;;;;;;;;;;;;;:::i;:::-;;37147:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48344:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48769:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45978:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33982:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45717:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33712:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14980:94;;;;;;;;;;;;;:::i;:::-;;48882:145;;;;;;;;;;;;;:::i;:::-;;14329:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34457:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45745:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46593:695;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36140:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47296:930;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37403:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34632:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46293:292;;;;;;;;;;;;;:::i;:::-;;45813:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36506:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45897:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15229:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48663:98;;;;;;;;;;;;;:::i;:::-;;45861:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33343:305;33445:4;33497:25;33482:40;;;:11;:40;;;;:105;;;;33554:33;33539:48;;;:11;:48;;;;33482:105;:158;;;;33604:36;33628:11;33604:23;:36::i;:::-;33482:158;33462:178;;33343:305;;;:::o;34288:100::-;34342:13;34375:5;34368:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34288:100;:::o;35847:221::-;35923:7;35951:16;35959:7;35951;:16::i;:::-;35943:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36036:15;:24;36052:7;36036:24;;;;;;;;;;;;;;;;;;;;;36029:31;;35847:221;;;:::o;35370:411::-;35451:13;35467:23;35482:7;35467:14;:23::i;:::-;35451:39;;35515:5;35509:11;;:2;:11;;;;35501:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35609:5;35593:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35618:37;35635:5;35642:12;:10;:12::i;:::-;35618:16;:37::i;:::-;35593:62;35571:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;35752:21;35761:2;35765:7;35752:8;:21::i;:::-;35370:411;;;:::o;48234:102::-;48278:7;48306:21;:11;:19;:21::i;:::-;48299:28;;48234:102;:::o;46018:41::-;;;;;;;;;;;;;;;;;:::o;36737:339::-;36932:41;36951:12;:10;:12::i;:::-;36965:7;36932:18;:41::i;:::-;36924:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37040:28;37050:4;37056:2;37060:7;37040:9;:28::i;:::-;36737:339;;;:::o;45936:35::-;;;;;;;;;;;;;:::o;48566:89::-;14560:12;:10;:12::i;:::-;14549:23;;:7;:5;:7::i;:::-;:23;;;14541:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48635:12:::1;;;;;;;;;;;48634:13;48619:12;;:28;;;;;;;;;;;;;;;;;;48566:89::o:0;37147:185::-;37285:39;37302:4;37308:2;37312:7;37285:39;;;;;;;;;;;;:16;:39::i;:::-;37147:185;;;:::o;48344:102::-;14560:12;:10;:12::i;:::-;14549:23;;:7;:5;:7::i;:::-;:23;;;14541:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48429:9:::1;48419:7;:19;;;;;;;;;;;;:::i;:::-;;48344:102:::0;:::o;48769:105::-;14560:12;:10;:12::i;:::-;14549:23;;:7;:5;:7::i;:::-;:23;;;14541:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48853:13:::1;48841:9;:25;;;;48769:105:::0;:::o;45978:31::-;;;;;;;;;;;;;:::o;33982:239::-;34054:7;34074:13;34090:7;:16;34098:7;34090:16;;;;;;;;;;;;;;;;;;;;;34074:32;;34142:1;34125:19;;:5;:19;;;;34117:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34208:5;34201:12;;;33982:239;;;:::o;45717:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33712:208::-;33784:7;33829:1;33812:19;;:5;:19;;;;33804:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33896:9;:16;33906:5;33896:16;;;;;;;;;;;;;;;;33889:23;;33712:208;;;:::o;14980:94::-;14560:12;:10;:12::i;:::-;14549:23;;:7;:5;:7::i;:::-;:23;;;14541:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15045:21:::1;15063:1;15045:9;:21::i;:::-;14980:94::o:0;48882:145::-;14560:12;:10;:12::i;:::-;14549:23;;:7;:5;:7::i;:::-;:23;;;14541:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48935:12:::1;48950:21;48935:36;;48990:10;48982:28;;:37;49011:7;48982:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;14620:1;48882:145::o:0;14329:87::-;14375:7;14402:6;;;;;;;;;;;14395:13;;14329:87;:::o;34457:104::-;34513:13;34546:7;34539:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34457:104;:::o;45745:49::-;45777:17;45745:49;:::o;46593:695::-;46660:12;;;;;;;;;;;46652:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;46716:30;46735:10;46716:18;:30::i;:::-;46715:31;46707:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;46835:9;;46824:7;46803:6;:18;46810:10;46803:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;:41;;46795:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;45849:5;46935:7;46911:21;:11;:19;:21::i;:::-;:31;;;;:::i;:::-;:44;;46903:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;47042:7;45777:17;47034:15;;;;:::i;:::-;47021:9;:28;;47013:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;47104:6;47100:139;47116:7;47112:1;:11;47100:139;;;47145:23;:11;:21;:23::i;:::-;47183:44;47193:10;47205:21;:11;:19;:21::i;:::-;47183:9;:44::i;:::-;47125:3;;;;;:::i;:::-;;;;47100:139;;;;47273:7;47251:6;:18;47258:10;47251:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;46593:695;:::o;36140:295::-;36255:12;:10;:12::i;:::-;36243:24;;:8;:24;;;;36235:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;36355:8;36310:18;:32;36329:12;:10;:12::i;:::-;36310:32;;;;;;;;;;;;;;;:42;36343:8;36310:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36408:8;36379:48;;36394:12;:10;:12::i;:::-;36379:48;;;36418:8;36379:48;;;;;;:::i;:::-;;;;;;;;36140:295;;:::o;47296:930::-;47450:15;;;;;;;;;;;47442:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;45849:5;47534:7;47510:21;:11;:19;:21::i;:::-;:31;;;;:::i;:::-;:44;;47502:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;47641:7;45777:17;47633:15;;;;:::i;:::-;47620:9;:28;;47612:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;47735:9;47724:7;47703:6;:18;47710:10;47703:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;:41;;47695:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;47806:12;47842:10;47854:9;47831:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47821:44;;;;;;47806:59;;47876:14;47893:60;47907:4;47913:11;47927;47941;47893:13;:60::i;:::-;47876:77;;47982:14;;;;;;;;;;;47972:24;;:6;:24;;;47964:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;48043:6;48039:138;48055:7;48051:1;:11;48039:138;;;48083:23;:11;:21;:23::i;:::-;48121:44;48131:10;48143:21;:11;:19;:21::i;:::-;48121:9;:44::i;:::-;48064:3;;;;;:::i;:::-;;;;48039:138;;;;48211:7;48189:6;:18;48196:10;48189:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;47296:930;;;;;;;:::o;37403:328::-;37578:41;37597:12;:10;:12::i;:::-;37611:7;37578:18;:41::i;:::-;37570:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37684:39;37698:4;37704:2;37708:7;37717:5;37684:13;:39::i;:::-;37403:328;;;;:::o;34632:334::-;34705:13;34739:16;34747:7;34739;:16::i;:::-;34731:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;34820:21;34844:10;:8;:10::i;:::-;34820:34;;34896:1;34878:7;34872:21;:25;:86;;;;;;;;;;;;;;;;;34924:7;34933:18;:7;:16;:18::i;:::-;34907:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34872:86;34865:93;;;34632:334;;;:::o;46293:292::-;14560:12;:10;:12::i;:::-;14549:23;;:7;:5;:7::i;:::-;:23;;;14541:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46351:11:::1;;;;;;;;;;;46350:12;46342:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;46419:6;46414:135;46431:2;46427:1;:6;46414:135;;;46455:23;:11;:21;:23::i;:::-;46493:44;46503:10;46515:21;:11;:19;:21::i;:::-;46493:9;:44::i;:::-;46435:3;;;;;:::i;:::-;;;;46414:135;;;;46573:4;46559:11;;:18;;;;;;;;;;;;;;;;;;46293:292::o:0;45813:41::-;45849:5;45813:41;:::o;36506:164::-;36603:4;36627:18;:25;36646:5;36627:25;;;;;;;;;;;;;;;:35;36653:8;36627:35;;;;;;;;;;;;;;;;;;;;;;;;;36620:42;;36506:164;;;;:::o;45897:32::-;;;;;;;;;;;;;:::o;15229:192::-;14560:12;:10;:12::i;:::-;14549:23;;:7;:5;:7::i;:::-;:23;;;14541:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15338:1:::1;15318:22;;:8;:22;;;;15310:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15394:19;15404:8;15394:9;:19::i;:::-;15229:192:::0;:::o;48663:98::-;14560:12;:10;:12::i;:::-;14549:23;;:7;:5;:7::i;:::-;:23;;;14541:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48738:15:::1;;;;;;;;;;;48737:16;48719:15;;:34;;;;;;;;;;;;;;;;;;48663:98::o:0;45861:29::-;;;;:::o;26319:157::-;26404:4;26443:25;26428:40;;;:11;:40;;;;26421:47;;26319:157;;;:::o;39241:127::-;39306:4;39358:1;39330:30;;:7;:16;39338:7;39330:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39323:37;;39241:127;;;:::o;13117:98::-;13170:7;13197:10;13190:17;;13117:98;:::o;43223:174::-;43325:2;43298:15;:24;43314:7;43298:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43381:7;43377:2;43343:46;;43352:23;43367:7;43352:14;:23::i;:::-;43343:46;;;;;;;;;;;;43223:174;;:::o;9823:114::-;9888:7;9915;:14;;;9908:21;;9823:114;;;:::o;39535:348::-;39628:4;39653:16;39661:7;39653;:16::i;:::-;39645:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39729:13;39745:23;39760:7;39745:14;:23::i;:::-;39729:39;;39798:5;39787:16;;:7;:16;;;:51;;;;39831:7;39807:31;;:20;39819:7;39807:11;:20::i;:::-;:31;;;39787:51;:87;;;;39842:32;39859:5;39866:7;39842:16;:32::i;:::-;39787:87;39779:96;;;39535:348;;;;:::o;42527:578::-;42686:4;42659:31;;:23;42674:7;42659:14;:23::i;:::-;:31;;;42651:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;42769:1;42755:16;;:2;:16;;;;42747:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42825:39;42846:4;42852:2;42856:7;42825:20;:39::i;:::-;42929:29;42946:1;42950:7;42929:8;:29::i;:::-;42990:1;42971:9;:15;42981:4;42971:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43019:1;43002:9;:13;43012:2;43002:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43050:2;43031:7;:16;43039:7;43031:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43089:7;43085:2;43070:27;;43079:4;43070:27;;;;;;;;;;;;42527:578;;;:::o;15429:173::-;15485:16;15504:6;;;;;;;;;;;15485:25;;15530:8;15521:6;;:17;;;;;;;;;;;;;;;;;;15585:8;15554:40;;15575:8;15554:40;;;;;;;;;;;;15429:173;;:::o;16375:387::-;16435:4;16643:12;16710:7;16698:20;16690:28;;16753:1;16746:4;:8;16739:15;;;16375:387;;;:::o;9945:127::-;10052:1;10034:7;:14;;;:19;;;;;;;;;;;9945:127;:::o;40225:110::-;40301:26;40311:2;40315:7;40301:26;;;;;;;;;;;;:9;:26::i;:::-;40225:110;;:::o;7605:279::-;7733:7;7754:17;7773:18;7795:25;7806:4;7812:1;7815;7818;7795:10;:25::i;:::-;7753:67;;;;7831:18;7843:5;7831:11;:18::i;:::-;7867:9;7860:16;;;;7605:279;;;;;;:::o;38613:315::-;38770:28;38780:4;38786:2;38790:7;38770:9;:28::i;:::-;38817:48;38840:4;38846:2;38850:7;38859:5;38817:22;:48::i;:::-;38809:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38613:315;;;;:::o;48458:100::-;48510:13;48543:7;48536:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48458:100;:::o;10733:723::-;10789:13;11019:1;11010:5;:10;11006:53;;;11037:10;;;;;;;;;;;;;;;;;;;;;11006:53;11069:12;11084:5;11069:20;;11100:14;11125:78;11140:1;11132:4;:9;11125:78;;11158:8;;;;;:::i;:::-;;;;11189:2;11181:10;;;;;:::i;:::-;;;11125:78;;;11213:19;11245:6;11235:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11213:39;;11263:154;11279:1;11270:5;:10;11263:154;;11307:1;11297:11;;;;;:::i;:::-;;;11374:2;11366:5;:10;;;;:::i;:::-;11353:2;:24;;;;:::i;:::-;11340:39;;11323:6;11330;11323:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;11403:2;11394:11;;;;;:::i;:::-;;;11263:154;;;11441:6;11427:21;;;;;10733:723;;;;:::o;45333:126::-;;;;:::o;40562:321::-;40692:18;40698:2;40702:7;40692:5;:18::i;:::-;40743:54;40774:1;40778:2;40782:7;40791:5;40743:22;:54::i;:::-;40721:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40562:321;;;:::o;5834:1632::-;5965:7;5974:12;6899:66;6894:1;6886:10;;:79;6882:163;;;6998:1;7002:30;6982:51;;;;;;6882:163;7064:2;7059:1;:7;;;;:18;;;;;7075:2;7070:1;:7;;;;7059:18;7055:102;;;7110:1;7114:30;7094:51;;;;;;7055:102;7254:14;7271:24;7281:4;7287:1;7290;7293;7271:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7254:41;;7328:1;7310:20;;:6;:20;;;7306:103;;;7363:1;7367:29;7347:50;;;;;;;7306:103;7429:6;7437:20;7421:37;;;;;5834:1632;;;;;;;;:::o;496:643::-;574:20;565:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;561:571;;;611:7;;561:571;672:29;663:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;659:473;;;718:34;;;;;;;;;;:::i;:::-;;;;;;;;659:473;783:35;774:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;770:362;;;835:41;;;;;;;;;;:::i;:::-;;;;;;;;770:362;907:30;898:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;894:238;;;954:44;;;;;;;;;;:::i;:::-;;;;;;;;894:238;1029:30;1020:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;1016:116;;;1076:44;;;;;;;;;;:::i;:::-;;;;;;;;1016:116;496:643;;:::o;43962:799::-;44117:4;44138:15;:2;:13;;;:15::i;:::-;44134:620;;;44190:2;44174:36;;;44211:12;:10;:12::i;:::-;44225:4;44231:7;44240:5;44174:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44170:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44433:1;44416:6;:13;:18;44412:272;;;44459:60;;;;;;;;;;:::i;:::-;;;;;;;;44412:272;44634:6;44628:13;44619:6;44615:2;44611:15;44604:38;44170:529;44307:41;;;44297:51;;;:6;:51;;;;44290:58;;;;;44134:620;44738:4;44731:11;;43962:799;;;;;;;:::o;41219:382::-;41313:1;41299:16;;:2;:16;;;;41291:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41372:16;41380:7;41372;:16::i;:::-;41371:17;41363:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41434:45;41463:1;41467:2;41471:7;41434:20;:45::i;:::-;41509:1;41492:9;:13;41502:2;41492:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41540:2;41521:7;:16;41529:7;41521:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41585:7;41581:2;41560:33;;41577:1;41560:33;;;;;;;;;;;;41219:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:139::-;;1073:6;1060:20;1051:29;;1089:33;1116:5;1089:33;:::i;:::-;1041:87;;;;:::o;1134:137::-;;1217:6;1204:20;1195:29;;1233:32;1259:5;1233:32;:::i;:::-;1185:86;;;;:::o;1277:141::-;;1364:6;1358:13;1349:22;;1380:32;1406:5;1380:32;:::i;:::-;1339:79;;;;:::o;1437:271::-;;1541:3;1534:4;1526:6;1522:17;1518:27;1508:2;;1559:1;1556;1549:12;1508:2;1599:6;1586:20;1624:78;1698:3;1690:6;1683:4;1675:6;1671:17;1624:78;:::i;:::-;1615:87;;1498:210;;;;;:::o;1728:273::-;;1833:3;1826:4;1818:6;1814:17;1810:27;1800:2;;1851:1;1848;1841:12;1800:2;1891:6;1878:20;1916:79;1991:3;1983:6;1976:4;1968:6;1964:17;1916:79;:::i;:::-;1907:88;;1790:211;;;;;:::o;2007:139::-;;2091:6;2078:20;2069:29;;2107:33;2134:5;2107:33;:::i;:::-;2059:87;;;;:::o;2152:135::-;;2234:6;2221:20;2212:29;;2250:31;2275:5;2250:31;:::i;:::-;2202:85;;;;:::o;2293:262::-;;2401:2;2389:9;2380:7;2376:23;2372:32;2369:2;;;2417:1;2414;2407:12;2369:2;2460:1;2485:53;2530:7;2521:6;2510:9;2506:22;2485:53;:::i;:::-;2475:63;;2431:117;2359:196;;;;:::o;2561:407::-;;;2686:2;2674:9;2665:7;2661:23;2657:32;2654:2;;;2702:1;2699;2692:12;2654:2;2745:1;2770:53;2815:7;2806:6;2795:9;2791:22;2770:53;:::i;:::-;2760:63;;2716:117;2872:2;2898:53;2943:7;2934:6;2923:9;2919:22;2898:53;:::i;:::-;2888:63;;2843:118;2644:324;;;;;:::o;2974:552::-;;;;3116:2;3104:9;3095:7;3091:23;3087:32;3084:2;;;3132:1;3129;3122:12;3084:2;3175:1;3200:53;3245:7;3236:6;3225:9;3221:22;3200:53;:::i;:::-;3190:63;;3146:117;3302:2;3328:53;3373:7;3364:6;3353:9;3349:22;3328:53;:::i;:::-;3318:63;;3273:118;3430:2;3456:53;3501:7;3492:6;3481:9;3477:22;3456:53;:::i;:::-;3446:63;;3401:118;3074:452;;;;;:::o;3532:809::-;;;;;3700:3;3688:9;3679:7;3675:23;3671:33;3668:2;;;3717:1;3714;3707:12;3668:2;3760:1;3785:53;3830:7;3821:6;3810:9;3806:22;3785:53;:::i;:::-;3775:63;;3731:117;3887:2;3913:53;3958:7;3949:6;3938:9;3934:22;3913:53;:::i;:::-;3903:63;;3858:118;4015:2;4041:53;4086:7;4077:6;4066:9;4062:22;4041:53;:::i;:::-;4031:63;;3986:118;4171:2;4160:9;4156:18;4143:32;4202:18;4194:6;4191:30;4188:2;;;4234:1;4231;4224:12;4188:2;4262:62;4316:7;4307:6;4296:9;4292:22;4262:62;:::i;:::-;4252:72;;4114:220;3658:683;;;;;;;:::o;4347:401::-;;;4469:2;4457:9;4448:7;4444:23;4440:32;4437:2;;;4485:1;4482;4475:12;4437:2;4528:1;4553:53;4598:7;4589:6;4578:9;4574:22;4553:53;:::i;:::-;4543:63;;4499:117;4655:2;4681:50;4723:7;4714:6;4703:9;4699:22;4681:50;:::i;:::-;4671:60;;4626:115;4427:321;;;;;:::o;4754:407::-;;;4879:2;4867:9;4858:7;4854:23;4850:32;4847:2;;;4895:1;4892;4885:12;4847:2;4938:1;4963:53;5008:7;4999:6;4988:9;4984:22;4963:53;:::i;:::-;4953:63;;4909:117;5065:2;5091:53;5136:7;5127:6;5116:9;5112:22;5091:53;:::i;:::-;5081:63;;5036:118;4837:324;;;;;:::o;5167:260::-;;5274:2;5262:9;5253:7;5249:23;5245:32;5242:2;;;5290:1;5287;5280:12;5242:2;5333:1;5358:52;5402:7;5393:6;5382:9;5378:22;5358:52;:::i;:::-;5348:62;;5304:116;5232:195;;;;:::o;5433:282::-;;5551:2;5539:9;5530:7;5526:23;5522:32;5519:2;;;5567:1;5564;5557:12;5519:2;5610:1;5635:63;5690:7;5681:6;5670:9;5666:22;5635:63;:::i;:::-;5625:73;;5581:127;5509:206;;;;:::o;5721:375::-;;5839:2;5827:9;5818:7;5814:23;5810:32;5807:2;;;5855:1;5852;5845:12;5807:2;5926:1;5915:9;5911:17;5898:31;5956:18;5948:6;5945:30;5942:2;;;5988:1;5985;5978:12;5942:2;6016:63;6071:7;6062:6;6051:9;6047:22;6016:63;:::i;:::-;6006:73;;5869:220;5797:299;;;;:::o;6102:262::-;;6210:2;6198:9;6189:7;6185:23;6181:32;6178:2;;;6226:1;6223;6216:12;6178:2;6269:1;6294:53;6339:7;6330:6;6319:9;6315:22;6294:53;:::i;:::-;6284:63;;6240:117;6168:196;;;;:::o;6370:840::-;;;;;;6544:3;6532:9;6523:7;6519:23;6515:33;6512:2;;;6561:1;6558;6551:12;6512:2;6604:1;6629:53;6674:7;6665:6;6654:9;6650:22;6629:53;:::i;:::-;6619:63;;6575:117;6731:2;6757:53;6802:7;6793:6;6782:9;6778:22;6757:53;:::i;:::-;6747:63;;6702:118;6859:2;6885:51;6928:7;6919:6;6908:9;6904:22;6885:51;:::i;:::-;6875:61;;6830:116;6985:2;7011:53;7056:7;7047:6;7036:9;7032:22;7011:53;:::i;:::-;7001:63;;6956:118;7113:3;7140:53;7185:7;7176:6;7165:9;7161:22;7140:53;:::i;:::-;7130:63;;7084:119;6502:708;;;;;;;;:::o;7216:118::-;7303:24;7321:5;7303:24;:::i;:::-;7298:3;7291:37;7281:53;;:::o;7340:109::-;7421:21;7436:5;7421:21;:::i;:::-;7416:3;7409:34;7399:50;;:::o;7455:118::-;7542:24;7560:5;7542:24;:::i;:::-;7537:3;7530:37;7520:53;;:::o;7579:360::-;;7693:38;7725:5;7693:38;:::i;:::-;7747:70;7810:6;7805:3;7747:70;:::i;:::-;7740:77;;7826:52;7871:6;7866:3;7859:4;7852:5;7848:16;7826:52;:::i;:::-;7903:29;7925:6;7903:29;:::i;:::-;7898:3;7894:39;7887:46;;7669:270;;;;;:::o;7945:364::-;;8061:39;8094:5;8061:39;:::i;:::-;8116:71;8180:6;8175:3;8116:71;:::i;:::-;8109:78;;8196:52;8241:6;8236:3;8229:4;8222:5;8218:16;8196:52;:::i;:::-;8273:29;8295:6;8273:29;:::i;:::-;8268:3;8264:39;8257:46;;8037:272;;;;;:::o;8315:377::-;;8449:39;8482:5;8449:39;:::i;:::-;8504:89;8586:6;8581:3;8504:89;:::i;:::-;8497:96;;8602:52;8647:6;8642:3;8635:4;8628:5;8624:16;8602:52;:::i;:::-;8679:6;8674:3;8670:16;8663:23;;8425:267;;;;;:::o;8698:322::-;;8861:67;8925:2;8920:3;8861:67;:::i;:::-;8854:74;;8958:26;8954:1;8949:3;8945:11;8938:47;9011:2;9006:3;9002:12;8995:19;;8844:176;;;:::o;9026:317::-;;9189:67;9253:2;9248:3;9189:67;:::i;:::-;9182:74;;9286:21;9282:1;9277:3;9273:11;9266:42;9334:2;9329:3;9325:12;9318:19;;9172:171;;;:::o;9349:329::-;;9512:67;9576:2;9571:3;9512:67;:::i;:::-;9505:74;;9609:33;9605:1;9600:3;9596:11;9589:54;9669:2;9664:3;9660:12;9653:19;;9495:183;;;:::o;9684:375::-;;9847:67;9911:2;9906:3;9847:67;:::i;:::-;9840:74;;9944:34;9940:1;9935:3;9931:11;9924:55;10010:13;10005:2;10000:3;9996:12;9989:35;10050:2;10045:3;10041:12;10034:19;;9830:229;;;:::o;10065:382::-;;10228:67;10292:2;10287:3;10228:67;:::i;:::-;10221:74;;10325:34;10321:1;10316:3;10312:11;10305:55;10391:20;10386:2;10381:3;10377:12;10370:42;10438:2;10433:3;10429:12;10422:19;;10211:236;;;:::o;10453:370::-;;10616:67;10680:2;10675:3;10616:67;:::i;:::-;10609:74;;10713:34;10709:1;10704:3;10700:11;10693:55;10779:8;10774:2;10769:3;10765:12;10758:30;10814:2;10809:3;10805:12;10798:19;;10599:224;;;:::o;10829:326::-;;10992:67;11056:2;11051:3;10992:67;:::i;:::-;10985:74;;11089:30;11085:1;11080:3;11076:11;11069:51;11146:2;11141:3;11137:12;11130:19;;10975:180;;;:::o;11161:374::-;;11324:67;11388:2;11383:3;11324:67;:::i;:::-;11317:74;;11421:34;11417:1;11412:3;11408:11;11401:55;11487:12;11482:2;11477:3;11473:12;11466:34;11526:2;11521:3;11517:12;11510:19;;11307:228;;;:::o;11541:368::-;;11704:67;11768:2;11763:3;11704:67;:::i;:::-;11697:74;;11801:34;11797:1;11792:3;11788:11;11781:55;11867:6;11862:2;11857:3;11853:12;11846:28;11900:2;11895:3;11891:12;11884:19;;11687:222;;;:::o;11915:323::-;;12078:67;12142:2;12137:3;12078:67;:::i;:::-;12071:74;;12175:27;12171:1;12166:3;12162:11;12155:48;12229:2;12224:3;12220:12;12213:19;;12061:177;;;:::o;12244:329::-;;12407:67;12471:2;12466:3;12407:67;:::i;:::-;12400:74;;12504:33;12500:1;12495:3;12491:11;12484:54;12564:2;12559:3;12555:12;12548:19;;12390:183;;;:::o;12579:315::-;;12742:67;12806:2;12801:3;12742:67;:::i;:::-;12735:74;;12839:19;12835:1;12830:3;12826:11;12819:40;12885:2;12880:3;12876:12;12869:19;;12725:169;;;:::o;12900:366::-;;13063:67;13127:2;13122:3;13063:67;:::i;:::-;13056:74;;13160:34;13156:1;13151:3;13147:11;13140:55;13226:4;13221:2;13216:3;13212:12;13205:26;13257:2;13252:3;13248:12;13241:19;;13046:220;;;:::o;13272:376::-;;13435:67;13499:2;13494:3;13435:67;:::i;:::-;13428:74;;13532:34;13528:1;13523:3;13519:11;13512:55;13598:14;13593:2;13588:3;13584:12;13577:36;13639:2;13634:3;13630:12;13623:19;;13418:230;;;:::o;13654:388::-;;13817:67;13881:2;13876:3;13817:67;:::i;:::-;13810:74;;13914:34;13910:1;13905:3;13901:11;13894:55;13980:26;13975:2;13970:3;13966:12;13959:48;14033:2;14028:3;14024:12;14017:19;;13800:242;;;:::o;14048:374::-;;14211:67;14275:2;14270:3;14211:67;:::i;:::-;14204:74;;14308:34;14304:1;14299:3;14295:11;14288:55;14374:12;14369:2;14364:3;14360:12;14353:34;14413:2;14408:3;14404:12;14397:19;;14194:228;;;:::o;14428:373::-;;14591:67;14655:2;14650:3;14591:67;:::i;:::-;14584:74;;14688:34;14684:1;14679:3;14675:11;14668:55;14754:11;14749:2;14744:3;14740:12;14733:33;14792:2;14787:3;14783:12;14776:19;;14574:227;;;:::o;14807:374::-;;14970:67;15034:2;15029:3;14970:67;:::i;:::-;14963:74;;15067:34;15063:1;15058:3;15054:11;15047:55;15133:12;15128:2;15123:3;15119:12;15112:34;15172:2;15167:3;15163:12;15156:19;;14953:228;;;:::o;15187:376::-;;15350:67;15414:2;15409:3;15350:67;:::i;:::-;15343:74;;15447:34;15443:1;15438:3;15434:11;15427:55;15513:14;15508:2;15503:3;15499:12;15492:36;15554:2;15549:3;15545:12;15538:19;;15333:230;;;:::o;15569:366::-;;15732:67;15796:2;15791:3;15732:67;:::i;:::-;15725:74;;15829:34;15825:1;15820:3;15816:11;15809:55;15895:4;15890:2;15885:3;15881:12;15874:26;15926:2;15921:3;15917:12;15910:19;;15715:220;;;:::o;15941:330::-;;16104:67;16168:2;16163:3;16104:67;:::i;:::-;16097:74;;16201:34;16197:1;16192:3;16188:11;16181:55;16262:2;16257:3;16253:12;16246:19;;16087:184;;;:::o;16277:376::-;;16440:67;16504:2;16499:3;16440:67;:::i;:::-;16433:74;;16537:34;16533:1;16528:3;16524:11;16517:55;16603:14;16598:2;16593:3;16589:12;16582:36;16644:2;16639:3;16635:12;16628:19;;16423:230;;;:::o;16659:330::-;;16822:67;16886:2;16881:3;16822:67;:::i;:::-;16815:74;;16919:34;16915:1;16910:3;16906:11;16899:55;16980:2;16975:3;16971:12;16964:19;;16805:184;;;:::o;16995:320::-;;17158:67;17222:2;17217:3;17158:67;:::i;:::-;17151:74;;17255:24;17251:1;17246:3;17242:11;17235:45;17306:2;17301:3;17297:12;17290:19;;17141:174;;;:::o;17321:373::-;;17484:67;17548:2;17543:3;17484:67;:::i;:::-;17477:74;;17581:34;17577:1;17572:3;17568:11;17561:55;17647:11;17642:2;17637:3;17633:12;17626:33;17685:2;17680:3;17676:12;17669:19;;17467:227;;;:::o;17700:379::-;;17863:67;17927:2;17922:3;17863:67;:::i;:::-;17856:74;;17960:34;17956:1;17951:3;17947:11;17940:55;18026:17;18021:2;18016:3;18012:12;18005:39;18070:2;18065:3;18061:12;18054:19;;17846:233;;;:::o;18085:365::-;;18248:67;18312:2;18307:3;18248:67;:::i;:::-;18241:74;;18345:34;18341:1;18336:3;18332:11;18325:55;18411:3;18406:2;18401:3;18397:12;18390:25;18441:2;18436:3;18432:12;18425:19;;18231:219;;;:::o;18456:381::-;;18619:67;18683:2;18678:3;18619:67;:::i;:::-;18612:74;;18716:34;18712:1;18707:3;18703:11;18696:55;18782:19;18777:2;18772:3;18768:12;18761:41;18828:2;18823:3;18819:12;18812:19;;18602:235;;;:::o;18843:366::-;;19006:67;19070:2;19065:3;19006:67;:::i;:::-;18999:74;;19103:34;19099:1;19094:3;19090:11;19083:55;19169:4;19164:2;19159:3;19155:12;19148:26;19200:2;19195:3;19191:12;19184:19;;18989:220;;;:::o;19215:365::-;;19378:67;19442:2;19437:3;19378:67;:::i;:::-;19371:74;;19475:34;19471:1;19466:3;19462:11;19455:55;19541:3;19536:2;19531:3;19527:12;19520:25;19571:2;19566:3;19562:12;19555:19;;19361:219;;;:::o;19586:118::-;19673:24;19691:5;19673:24;:::i;:::-;19668:3;19661:37;19651:53;;:::o;19710:112::-;19793:22;19809:5;19793:22;:::i;:::-;19788:3;19781:35;19771:51;;:::o;19828:435::-;;20030:95;20121:3;20112:6;20030:95;:::i;:::-;20023:102;;20142:95;20233:3;20224:6;20142:95;:::i;:::-;20135:102;;20254:3;20247:10;;20012:251;;;;;:::o;20269:222::-;;20400:2;20389:9;20385:18;20377:26;;20413:71;20481:1;20470:9;20466:17;20457:6;20413:71;:::i;:::-;20367:124;;;;:::o;20497:640::-;;20730:3;20719:9;20715:19;20707:27;;20744:71;20812:1;20801:9;20797:17;20788:6;20744:71;:::i;:::-;20825:72;20893:2;20882:9;20878:18;20869:6;20825:72;:::i;:::-;20907;20975:2;20964:9;20960:18;20951:6;20907:72;:::i;:::-;21026:9;21020:4;21016:20;21011:2;21000:9;20996:18;20989:48;21054:76;21125:4;21116:6;21054:76;:::i;:::-;21046:84;;20697:440;;;;;;;:::o;21143:332::-;;21302:2;21291:9;21287:18;21279:26;;21315:71;21383:1;21372:9;21368:17;21359:6;21315:71;:::i;:::-;21396:72;21464:2;21453:9;21449:18;21440:6;21396:72;:::i;:::-;21269:206;;;;;:::o;21481:210::-;;21606:2;21595:9;21591:18;21583:26;;21619:65;21681:1;21670:9;21666:17;21657:6;21619:65;:::i;:::-;21573:118;;;;:::o;21697:545::-;;21908:3;21897:9;21893:19;21885:27;;21922:71;21990:1;21979:9;21975:17;21966:6;21922:71;:::i;:::-;22003:68;22067:2;22056:9;22052:18;22043:6;22003:68;:::i;:::-;22081:72;22149:2;22138:9;22134:18;22125:6;22081:72;:::i;:::-;22163;22231:2;22220:9;22216:18;22207:6;22163:72;:::i;:::-;21875:367;;;;;;;:::o;22248:313::-;;22399:2;22388:9;22384:18;22376:26;;22448:9;22442:4;22438:20;22434:1;22423:9;22419:17;22412:47;22476:78;22549:4;22540:6;22476:78;:::i;:::-;22468:86;;22366:195;;;;:::o;22567:419::-;;22771:2;22760:9;22756:18;22748:26;;22820:9;22814:4;22810:20;22806:1;22795:9;22791:17;22784:47;22848:131;22974:4;22848:131;:::i;:::-;22840:139;;22738:248;;;:::o;22992:419::-;;23196:2;23185:9;23181:18;23173:26;;23245:9;23239:4;23235:20;23231:1;23220:9;23216:17;23209:47;23273:131;23399:4;23273:131;:::i;:::-;23265:139;;23163:248;;;:::o;23417:419::-;;23621:2;23610:9;23606:18;23598:26;;23670:9;23664:4;23660:20;23656:1;23645:9;23641:17;23634:47;23698:131;23824:4;23698:131;:::i;:::-;23690:139;;23588:248;;;:::o;23842:419::-;;24046:2;24035:9;24031:18;24023:26;;24095:9;24089:4;24085:20;24081:1;24070:9;24066:17;24059:47;24123:131;24249:4;24123:131;:::i;:::-;24115:139;;24013:248;;;:::o;24267:419::-;;24471:2;24460:9;24456:18;24448:26;;24520:9;24514:4;24510:20;24506:1;24495:9;24491:17;24484:47;24548:131;24674:4;24548:131;:::i;:::-;24540:139;;24438:248;;;:::o;24692:419::-;;24896:2;24885:9;24881:18;24873:26;;24945:9;24939:4;24935:20;24931:1;24920:9;24916:17;24909:47;24973:131;25099:4;24973:131;:::i;:::-;24965:139;;24863:248;;;:::o;25117:419::-;;25321:2;25310:9;25306:18;25298:26;;25370:9;25364:4;25360:20;25356:1;25345:9;25341:17;25334:47;25398:131;25524:4;25398:131;:::i;:::-;25390:139;;25288:248;;;:::o;25542:419::-;;25746:2;25735:9;25731:18;25723:26;;25795:9;25789:4;25785:20;25781:1;25770:9;25766:17;25759:47;25823:131;25949:4;25823:131;:::i;:::-;25815:139;;25713:248;;;:::o;25967:419::-;;26171:2;26160:9;26156:18;26148:26;;26220:9;26214:4;26210:20;26206:1;26195:9;26191:17;26184:47;26248:131;26374:4;26248:131;:::i;:::-;26240:139;;26138:248;;;:::o;26392:419::-;;26596:2;26585:9;26581:18;26573:26;;26645:9;26639:4;26635:20;26631:1;26620:9;26616:17;26609:47;26673:131;26799:4;26673:131;:::i;:::-;26665:139;;26563:248;;;:::o;26817:419::-;;27021:2;27010:9;27006:18;26998:26;;27070:9;27064:4;27060:20;27056:1;27045:9;27041:17;27034:47;27098:131;27224:4;27098:131;:::i;:::-;27090:139;;26988:248;;;:::o;27242:419::-;;27446:2;27435:9;27431:18;27423:26;;27495:9;27489:4;27485:20;27481:1;27470:9;27466:17;27459:47;27523:131;27649:4;27523:131;:::i;:::-;27515:139;;27413:248;;;:::o;27667:419::-;;27871:2;27860:9;27856:18;27848:26;;27920:9;27914:4;27910:20;27906:1;27895:9;27891:17;27884:47;27948:131;28074:4;27948:131;:::i;:::-;27940:139;;27838:248;;;:::o;28092:419::-;;28296:2;28285:9;28281:18;28273:26;;28345:9;28339:4;28335:20;28331:1;28320:9;28316:17;28309:47;28373:131;28499:4;28373:131;:::i;:::-;28365:139;;28263:248;;;:::o;28517:419::-;;28721:2;28710:9;28706:18;28698:26;;28770:9;28764:4;28760:20;28756:1;28745:9;28741:17;28734:47;28798:131;28924:4;28798:131;:::i;:::-;28790:139;;28688:248;;;:::o;28942:419::-;;29146:2;29135:9;29131:18;29123:26;;29195:9;29189:4;29185:20;29181:1;29170:9;29166:17;29159:47;29223:131;29349:4;29223:131;:::i;:::-;29215:139;;29113:248;;;:::o;29367:419::-;;29571:2;29560:9;29556:18;29548:26;;29620:9;29614:4;29610:20;29606:1;29595:9;29591:17;29584:47;29648:131;29774:4;29648:131;:::i;:::-;29640:139;;29538:248;;;:::o;29792:419::-;;29996:2;29985:9;29981:18;29973:26;;30045:9;30039:4;30035:20;30031:1;30020:9;30016:17;30009:47;30073:131;30199:4;30073:131;:::i;:::-;30065:139;;29963:248;;;:::o;30217:419::-;;30421:2;30410:9;30406:18;30398:26;;30470:9;30464:4;30460:20;30456:1;30445:9;30441:17;30434:47;30498:131;30624:4;30498:131;:::i;:::-;30490:139;;30388:248;;;:::o;30642:419::-;;30846:2;30835:9;30831:18;30823:26;;30895:9;30889:4;30885:20;30881:1;30870:9;30866:17;30859:47;30923:131;31049:4;30923:131;:::i;:::-;30915:139;;30813:248;;;:::o;31067:419::-;;31271:2;31260:9;31256:18;31248:26;;31320:9;31314:4;31310:20;31306:1;31295:9;31291:17;31284:47;31348:131;31474:4;31348:131;:::i;:::-;31340:139;;31238:248;;;:::o;31492:419::-;;31696:2;31685:9;31681:18;31673:26;;31745:9;31739:4;31735:20;31731:1;31720:9;31716:17;31709:47;31773:131;31899:4;31773:131;:::i;:::-;31765:139;;31663:248;;;:::o;31917:419::-;;32121:2;32110:9;32106:18;32098:26;;32170:9;32164:4;32160:20;32156:1;32145:9;32141:17;32134:47;32198:131;32324:4;32198:131;:::i;:::-;32190:139;;32088:248;;;:::o;32342:419::-;;32546:2;32535:9;32531:18;32523:26;;32595:9;32589:4;32585:20;32581:1;32570:9;32566:17;32559:47;32623:131;32749:4;32623:131;:::i;:::-;32615:139;;32513:248;;;:::o;32767:419::-;;32971:2;32960:9;32956:18;32948:26;;33020:9;33014:4;33010:20;33006:1;32995:9;32991:17;32984:47;33048:131;33174:4;33048:131;:::i;:::-;33040:139;;32938:248;;;:::o;33192:419::-;;33396:2;33385:9;33381:18;33373:26;;33445:9;33439:4;33435:20;33431:1;33420:9;33416:17;33409:47;33473:131;33599:4;33473:131;:::i;:::-;33465:139;;33363:248;;;:::o;33617:419::-;;33821:2;33810:9;33806:18;33798:26;;33870:9;33864:4;33860:20;33856:1;33845:9;33841:17;33834:47;33898:131;34024:4;33898:131;:::i;:::-;33890:139;;33788:248;;;:::o;34042:419::-;;34246:2;34235:9;34231:18;34223:26;;34295:9;34289:4;34285:20;34281:1;34270:9;34266:17;34259:47;34323:131;34449:4;34323:131;:::i;:::-;34315:139;;34213:248;;;:::o;34467:419::-;;34671:2;34660:9;34656:18;34648:26;;34720:9;34714:4;34710:20;34706:1;34695:9;34691:17;34684:47;34748:131;34874:4;34748:131;:::i;:::-;34740:139;;34638:248;;;:::o;34892:419::-;;35096:2;35085:9;35081:18;35073:26;;35145:9;35139:4;35135:20;35131:1;35120:9;35116:17;35109:47;35173:131;35299:4;35173:131;:::i;:::-;35165:139;;35063:248;;;:::o;35317:222::-;;35448:2;35437:9;35433:18;35425:26;;35461:71;35529:1;35518:9;35514:17;35505:6;35461:71;:::i;:::-;35415:124;;;;:::o;35545:283::-;;35611:2;35605:9;35595:19;;35653:4;35645:6;35641:17;35760:6;35748:10;35745:22;35724:18;35712:10;35709:34;35706:62;35703:2;;;35771:18;;:::i;:::-;35703:2;35811:10;35807:2;35800:22;35585:243;;;;:::o;35834:331::-;;35985:18;35977:6;35974:30;35971:2;;;36007:18;;:::i;:::-;35971:2;36092:4;36088:9;36081:4;36073:6;36069:17;36065:33;36057:41;;36153:4;36147;36143:15;36135:23;;35900:265;;;:::o;36171:332::-;;36323:18;36315:6;36312:30;36309:2;;;36345:18;;:::i;:::-;36309:2;36430:4;36426:9;36419:4;36411:6;36407:17;36403:33;36395:41;;36491:4;36485;36481:15;36473:23;;36238:265;;;:::o;36509:98::-;;36594:5;36588:12;36578:22;;36567:40;;;:::o;36613:99::-;;36699:5;36693:12;36683:22;;36672:40;;;:::o;36718:168::-;;36835:6;36830:3;36823:19;36875:4;36870:3;36866:14;36851:29;;36813:73;;;;:::o;36892:169::-;;37010:6;37005:3;36998:19;37050:4;37045:3;37041:14;37026:29;;36988:73;;;;:::o;37067:148::-;;37206:3;37191:18;;37181:34;;;;:::o;37221:305::-;;37280:20;37298:1;37280:20;:::i;:::-;37275:25;;37314:20;37332:1;37314:20;:::i;:::-;37309:25;;37468:1;37400:66;37396:74;37393:1;37390:81;37387:2;;;37474:18;;:::i;:::-;37387:2;37518:1;37515;37511:9;37504:16;;37265:261;;;;:::o;37532:185::-;;37589:20;37607:1;37589:20;:::i;:::-;37584:25;;37623:20;37641:1;37623:20;:::i;:::-;37618:25;;37662:1;37652:2;;37667:18;;:::i;:::-;37652:2;37709:1;37706;37702:9;37697:14;;37574:143;;;;:::o;37723:348::-;;37786:20;37804:1;37786:20;:::i;:::-;37781:25;;37820:20;37838:1;37820:20;:::i;:::-;37815:25;;38008:1;37940:66;37936:74;37933:1;37930:81;37925:1;37918:9;37911:17;37907:105;37904:2;;;38015:18;;:::i;:::-;37904:2;38063:1;38060;38056:9;38045:20;;37771:300;;;;:::o;38077:191::-;;38137:20;38155:1;38137:20;:::i;:::-;38132:25;;38171:20;38189:1;38171:20;:::i;:::-;38166:25;;38210:1;38207;38204:8;38201:2;;;38215:18;;:::i;:::-;38201:2;38260:1;38257;38253:9;38245:17;;38122:146;;;;:::o;38274:96::-;;38340:24;38358:5;38340:24;:::i;:::-;38329:35;;38319:51;;;:::o;38376:90::-;;38453:5;38446:13;38439:21;38428:32;;38418:48;;;:::o;38472:77::-;;38538:5;38527:16;;38517:32;;;:::o;38555:149::-;;38631:66;38624:5;38620:78;38609:89;;38599:105;;;:::o;38710:126::-;;38787:42;38780:5;38776:54;38765:65;;38755:81;;;:::o;38842:77::-;;38908:5;38897:16;;38887:32;;;:::o;38925:86::-;;39000:4;38993:5;38989:16;38978:27;;38968:43;;;:::o;39017:154::-;39101:6;39096:3;39091;39078:30;39163:1;39154:6;39149:3;39145:16;39138:27;39068:103;;;:::o;39177:307::-;39245:1;39255:113;39269:6;39266:1;39263:13;39255:113;;;39354:1;39349:3;39345:11;39339:18;39335:1;39330:3;39326:11;39319:39;39291:2;39288:1;39284:10;39279:15;;39255:113;;;39386:6;39383:1;39380:13;39377:2;;;39466:1;39457:6;39452:3;39448:16;39441:27;39377:2;39226:258;;;;:::o;39490:320::-;;39571:1;39565:4;39561:12;39551:22;;39618:1;39612:4;39608:12;39639:18;39629:2;;39695:4;39687:6;39683:17;39673:27;;39629:2;39757;39749:6;39746:14;39726:18;39723:38;39720:2;;;39776:18;;:::i;:::-;39720:2;39541:269;;;;:::o;39816:233::-;;39878:24;39896:5;39878:24;:::i;:::-;39869:33;;39924:66;39917:5;39914:77;39911:2;;;39994:18;;:::i;:::-;39911:2;40041:1;40034:5;40030:13;40023:20;;39859:190;;;:::o;40055:176::-;;40104:20;40122:1;40104:20;:::i;:::-;40099:25;;40138:20;40156:1;40138:20;:::i;:::-;40133:25;;40177:1;40167:2;;40182:18;;:::i;:::-;40167:2;40223:1;40220;40216:9;40211:14;;40089:142;;;;:::o;40237:180::-;40285:77;40282:1;40275:88;40382:4;40379:1;40372:15;40406:4;40403:1;40396:15;40423:180;40471:77;40468:1;40461:88;40568:4;40565:1;40558:15;40592:4;40589:1;40582:15;40609:180;40657:77;40654:1;40647:88;40754:4;40751:1;40744:15;40778:4;40775:1;40768:15;40795:180;40843:77;40840:1;40833:88;40940:4;40937:1;40930:15;40964:4;40961:1;40954:15;40981:102;;41073:2;41069:7;41064:2;41057:5;41053:14;41049:28;41039:38;;41029:54;;;:::o;41089:122::-;41162:24;41180:5;41162:24;:::i;:::-;41155:5;41152:35;41142:2;;41201:1;41198;41191:12;41142:2;41132:79;:::o;41217:116::-;41287:21;41302:5;41287:21;:::i;:::-;41280:5;41277:32;41267:2;;41323:1;41320;41313:12;41267:2;41257:76;:::o;41339:122::-;41412:24;41430:5;41412:24;:::i;:::-;41405:5;41402:35;41392:2;;41451:1;41448;41441:12;41392:2;41382:79;:::o;41467:120::-;41539:23;41556:5;41539:23;:::i;:::-;41532:5;41529:34;41519:2;;41577:1;41574;41567:12;41519:2;41509:78;:::o;41593:122::-;41666:24;41684:5;41666:24;:::i;:::-;41659:5;41656:35;41646:2;;41705:1;41702;41695:12;41646:2;41636:79;:::o;41721:118::-;41792:22;41808:5;41792:22;:::i;:::-;41785:5;41782:33;41772:2;;41829:1;41826;41819:12;41772:2;41762:77;:::o
Swarm Source
ipfs://397bf856164582d56f2d2a7c29058c1d7fd431012224d829e26ff75333eeaccc
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.