ERC-721
Overview
Max Total Supply
1,555 IM
Holders
491
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 IMLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
InvertedMutants
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-02 */ // SPDX-License-Identifier: MIT /* _____ _ _ __ __ _ _ |_ _| | | | | | \/ | | | | | | | _ ____ _____ _ __| |_ ___ __| | | \ / |_ _| |_ __ _ _ __ | |_ ___ | | | '_ \ \ / / _ \ '__| __/ _ \/ _` | | |\/| | | | | __/ _` | '_ \| __/ __| _| |_| | | \ V / __/ | | || __/ (_| | | | | | |_| | || (_| | | | | |_\__ \ |_____|_| |_|\_/ \___|_| \__\___|\__,_| |_| |_|\__,_|\__\__,_|_| |_|\__|___/ By Devko.dev#7286 */ 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; } } 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); } } 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 Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } 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; } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } 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); } } } } 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); } 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); } 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; } } 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; } 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); } pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } pragma solidity ^0.8.7; contract InvertedMutants is ERC721, Ownable { using Strings for uint256; using Counters for Counters.Counter; using ECDSA for bytes32; string private _tokenBaseURI = "https://gateway.pinata.cloud/ipfs/QmXPyNhvo9ZLLhq1SSaN2iGtmoxde5kdFy8dxvUWmSyyWX/"; uint256 public IM_MAX = 4344; uint256 public IM_PRICE = 0.04444 ether; uint256 public IM_PER_MINT = 8; mapping(address => uint256) public CLAIMERS_LIST; address private PRIVATE_SIGNER = 0x83d32F9D97B3189CBC9Bd7b8270924153e8f53F9; string private constant SIG_WORD = "IM_CONTRACT"; bool public mintLive; bool public founderMintCalled = false; Counters.Counter public _tokensMinted; constructor() ERC721("Inverted Mutants", "IM") {} function founderMint() external onlyOwner { require(!founderMintCalled, "Called"); for(uint256 i = 0; i < 100; i++) { _tokensMinted.increment(); _safeMint(msg.sender, _tokensMinted.current()); } founderMintCalled = true; } function matchAddresSigner(bytes memory signature, uint256 allowedQuantity) private view returns(bool) { bytes32 hash = keccak256(abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(msg.sender, SIG_WORD, allowedQuantity))) ); return PRIVATE_SIGNER == hash.recover(signature); } function mintFP(uint256 paidTokensQuantity, bytes memory signature, uint256 freeTokensQuantity, uint256 allowedFreeQuantity) external payable { require(mintLive, "MINT_CLOSED"); require(matchAddresSigner(signature, allowedFreeQuantity), "DIRECT_MINT_DISALLOWED"); require(_tokensMinted.current() + paidTokensQuantity + freeTokensQuantity <= IM_MAX, "EXCEED_MAX"); require(CLAIMERS_LIST[msg.sender] + freeTokensQuantity <= allowedFreeQuantity, "EXCEED_PER_WALLET"); require(paidTokensQuantity + freeTokensQuantity <= IM_PER_MINT, "EXCEED_PER_MINT"); require(IM_PRICE * paidTokensQuantity <= msg.value, "INSUFFICIENT_ETH"); for (uint256 i = 0; i < freeTokensQuantity; i++) { CLAIMERS_LIST[msg.sender]++; _tokensMinted.increment(); _safeMint(msg.sender, _tokensMinted.current()); } for (uint256 i = 0; i < paidTokensQuantity; i++) { _tokensMinted.increment(); _safeMint(msg.sender, _tokensMinted.current()); } } function freeMint(bytes memory signature, uint256 freeTokensQuantity, uint256 allowedFreeQuantity) external { require(mintLive, "MINT_CLOSED"); require(matchAddresSigner(signature, allowedFreeQuantity), "DIRECT_MINT_DISALLOWED"); require(_tokensMinted.current() + freeTokensQuantity <= IM_MAX, "EXCEED_MAX"); require(CLAIMERS_LIST[msg.sender] + freeTokensQuantity <= allowedFreeQuantity, "EXCEED_PER_WALLET"); require(freeTokensQuantity <= IM_PER_MINT, "EXCEED_PER_MINT"); for (uint256 i = 0; i < freeTokensQuantity; i++) { CLAIMERS_LIST[msg.sender]++; _tokensMinted.increment(); _safeMint(msg.sender, _tokensMinted.current()); } } function mint(uint256 tokenQuantity) external payable { require(mintLive, "MINT_CLOSED"); require(_tokensMinted.current() + tokenQuantity <= IM_MAX, "EXCEED_MAX"); require(tokenQuantity <= IM_PER_MINT, "EXCEED_PER_MINT"); require(IM_PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH"); for (uint256 i = 0; i < tokenQuantity; i++) { _tokensMinted.increment(); _safeMint(msg.sender, _tokensMinted.current()); } } function withdraw() external onlyOwner { uint256 currentBalance = address(this).balance; payable(0x11111F01570EeAA3e5a2Fd51f4A2f127661B9834).transfer(currentBalance * 20 / 100); payable(0xF9ddAaE4cB4EeA050810D9F695B84978277cAD2e).transfer(address(this).balance); } function togglePublicMintStatus() external onlyOwner { mintLive = !mintLive; } function setPrice(uint256 newPrice) external onlyOwner { IM_PRICE = newPrice; } function setMax(uint256 newCount) external onlyOwner { IM_MAX = newCount; } function setBaseURI(string calldata URI) external onlyOwner { _tokenBaseURI = URI; } function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), "Cannot query non-existent token"); return string(abi.encodePacked(_tokenBaseURI, tokenId.toString())); } function totalSupply() public view returns (uint256) { return _tokensMinted.current(); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"CLAIMERS_LIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IM_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IM_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IM_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokensMinted","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"founderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"founderMintCalled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"freeTokensQuantity","type":"uint256"},{"internalType":"uint256","name":"allowedFreeQuantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"paidTokensQuantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"freeTokensQuantity","type":"uint256"},{"internalType":"uint256","name":"allowedFreeQuantity","type":"uint256"}],"name":"mintFP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCount","type":"uint256"}],"name":"setMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePublicMintStatus","outputs":[],"stateMutability":"nonpayable","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101006040526051608081815290620029c760a03980516200002a9160079160209091019062000157565b506110f86008908155669de1f1cdd18000600955600a55600c8054600161ff0160a01b0319167383d32f9d97b3189cbc9bd7b8270924153e8f53f91790553480156200007557600080fd5b50604080518082018252601081526f496e766572746564204d7574616e747360801b602080830191825283518085019094526002845261494d60f01b908401528151919291620000c89160009162000157565b508051620000de90600190602084019062000157565b505050620000fb620000f56200010160201b60201c565b62000105565b6200023a565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200016590620001fd565b90600052602060002090601f016020900481019282620001895760008555620001d4565b82601f10620001a457805160ff1916838001178555620001d4565b82800160010185558215620001d4579182015b82811115620001d4578251825591602001919060010190620001b7565b50620001e2929150620001e6565b5090565b5b80821115620001e25760008155600101620001e7565b600181811c908216806200021257607f821691505b602082108114156200023457634e487b7160e01b600052602260045260246000fd5b50919050565b61277d806200024a6000396000f3fe6080604052600436106101f25760003560e01c806370a082311161010d578063a0712d68116100a0578063c87b56dd1161006f578063c87b56dd14610550578063cb74850314610570578063e8656fcc14610586578063e985e9c5146105a7578063f2fde38b146105f057600080fd5b8063a0712d68146104dd578063a22cb465146104f0578063b88d4fde14610510578063be3da5251461053057600080fd5b80638da5cb5b116100dc5780638da5cb5b1461047557806391b7f5ed1461049357806395d89b41146104b357806397f5ec67146104c857600080fd5b806370a0823114610413578063715018a61461043357806381e790e8146104485780638d6f5df61461045e57600080fd5b806323b872dd1161018557806342842e0e1161015457806342842e0e146103a057806355f804b3146103c05780636352211e146103e0578063656bad071461040057600080fd5b806323b872dd1461032957806328fabd7f1461034957806335a4dee5146103765780633ccfd60b1461038b57600080fd5b80630f2b2506116101c15780630f2b2506146102af57806318160ddd146102d057806319aec117146102f35780631fe9eabc1461030957600080fd5b806301ffc9a7146101fe57806306fdde0314610233578063081812fc14610255578063095ea7b31461028d57600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021e610219366004612199565b610610565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b50610248610662565b60405161022a919061246e565b34801561026157600080fd5b50610275610270366004612293565b6106f4565b6040516001600160a01b03909116815260200161022a565b34801561029957600080fd5b506102ad6102a836600461216f565b61078e565b005b3480156102bb57600080fd5b50600c5461021e90600160a81b900460ff1681565b3480156102dc57600080fd5b506102e56108a4565b60405190815260200161022a565b3480156102ff57600080fd5b506102e560095481565b34801561031557600080fd5b506102ad610324366004612293565b6108b4565b34801561033557600080fd5b506102ad61034436600461208f565b6108e3565b34801561035557600080fd5b506102e561036436600461203a565b600b6020526000908152604090205481565b34801561038257600080fd5b506102ad610914565b34801561039757600080fd5b506102ad6109d5565b3480156103ac57600080fd5b506102ad6103bb36600461208f565b610a9c565b3480156103cc57600080fd5b506102ad6103db366004612221565b610ab7565b3480156103ec57600080fd5b506102756103fb366004612293565b610aed565b6102ad61040e3660046122ac565b610b64565b34801561041f57600080fd5b506102e561042e36600461203a565b610d8e565b34801561043f57600080fd5b506102ad610e15565b34801561045457600080fd5b506102e5600a5481565b34801561046a57600080fd5b50600d546102e59081565b34801561048157600080fd5b506006546001600160a01b0316610275565b34801561049f57600080fd5b506102ad6104ae366004612293565b610e4b565b3480156104bf57600080fd5b50610248610e7a565b3480156104d457600080fd5b506102ad610e89565b6102ad6104eb366004612293565b610ed4565b3480156104fc57600080fd5b506102ad61050b366004612133565b610fdc565b34801561051c57600080fd5b506102ad61052b3660046120cb565b610fe7565b34801561053c57600080fd5b506102ad61054b3660046121d3565b61101f565b34801561055c57600080fd5b5061024861056b366004612293565b6111a5565b34801561057c57600080fd5b506102e560085481565b34801561059257600080fd5b50600c5461021e90600160a01b900460ff1681565b3480156105b357600080fd5b5061021e6105c236600461205c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105fc57600080fd5b506102ad61060b36600461203a565b61123e565b60006001600160e01b031982166380ac58cd60e01b148061064157506001600160e01b03198216635b5e139f60e01b145b8061065c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461067190612659565b80601f016020809104026020016040519081016040528092919081815260200182805461069d90612659565b80156106ea5780601f106106bf576101008083540402835291602001916106ea565b820191906000526020600020905b8154815290600101906020018083116106cd57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107725760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061079982610aed565b9050806001600160a01b0316836001600160a01b031614156108075760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610769565b336001600160a01b0382161480610823575061082381336105c2565b6108955760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610769565b61089f83836112d9565b505050565b60006108af600d5490565b905090565b6006546001600160a01b031633146108de5760405162461bcd60e51b815260040161076990612521565b600855565b6108ed3382611347565b6109095760405162461bcd60e51b81526004016107699061257a565b61089f83838361143e565b6006546001600160a01b0316331461093e5760405162461bcd60e51b815260040161076990612521565b600c54600160a81b900460ff16156109815760405162461bcd60e51b815260206004820152600660248201526510d85b1b195960d21b6044820152606401610769565b60005b60648110156109bf5761099b600d80546001019055565b6109ad336109a8600d5490565b6115de565b806109b781612694565b915050610984565b50600c805460ff60a81b1916600160a81b179055565b6006546001600160a01b031633146109ff5760405162461bcd60e51b815260040161076990612521565b477311111f01570eeaa3e5a2fd51f4a2f127661b98346108fc6064610a258460146125f7565b610a2f91906125e3565b6040518115909202916000818181858888f19350505050158015610a57573d6000803e3d6000fd5b5060405173f9ddaae4cb4eea050810d9f695b84978277cad2e904780156108fc02916000818181858888f19350505050158015610a98573d6000803e3d6000fd5b5050565b61089f83838360405180602001604052806000815250610fe7565b6006546001600160a01b03163314610ae15760405162461bcd60e51b815260040161076990612521565b61089f60078383611ef8565b6000818152600260205260408120546001600160a01b03168061065c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610769565b600c54600160a01b900460ff16610b8d5760405162461bcd60e51b8152600401610769906124d3565b610b9783826115f8565b610bdc5760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b6044820152606401610769565b6008548285610bea600d5490565b610bf491906125cb565b610bfe91906125cb565b1115610c1c5760405162461bcd60e51b815260040161076990612556565b336000908152600b60205260409020548190610c399084906125cb565b1115610c7b5760405162461bcd60e51b8152602060048201526011602482015270115610d1515117d4115497d5d053131155607a1b6044820152606401610769565b600a54610c8883866125cb565b1115610ca65760405162461bcd60e51b8152600401610769906124f8565b3484600954610cb591906125f7565b1115610cf65760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b6044820152606401610769565b60005b82811015610d4e57336000908152600b60205260408120805491610d1c83612694565b9190505550610d2f600d80546001019055565b610d3c336109a8600d5490565b80610d4681612694565b915050610cf9565b5060005b84811015610d8757610d68600d80546001019055565b610d75336109a8600d5490565b80610d7f81612694565b915050610d52565b5050505050565b60006001600160a01b038216610df95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610769565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610e3f5760405162461bcd60e51b815260040161076990612521565b610e4960006116b9565b565b6006546001600160a01b03163314610e755760405162461bcd60e51b815260040161076990612521565b600955565b60606001805461067190612659565b6006546001600160a01b03163314610eb35760405162461bcd60e51b815260040161076990612521565b600c805460ff60a01b198116600160a01b9182900460ff1615909102179055565b600c54600160a01b900460ff16610efd5760405162461bcd60e51b8152600401610769906124d3565b60085481610f0a600d5490565b610f1491906125cb565b1115610f325760405162461bcd60e51b815260040161076990612556565b600a54811115610f545760405162461bcd60e51b8152600401610769906124f8565b3481600954610f6391906125f7565b1115610fa45760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b6044820152606401610769565b60005b81811015610a9857610fbd600d80546001019055565b610fca336109a8600d5490565b80610fd481612694565b915050610fa7565b610a9833838361170b565b610ff13383611347565b61100d5760405162461bcd60e51b81526004016107699061257a565b611019848484846117da565b50505050565b600c54600160a01b900460ff166110485760405162461bcd60e51b8152600401610769906124d3565b61105283826115f8565b6110975760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b6044820152606401610769565b600854826110a4600d5490565b6110ae91906125cb565b11156110cc5760405162461bcd60e51b815260040161076990612556565b336000908152600b602052604090205481906110e99084906125cb565b111561112b5760405162461bcd60e51b8152602060048201526011602482015270115610d1515117d4115497d5d053131155607a1b6044820152606401610769565b600a5482111561114d5760405162461bcd60e51b8152600401610769906124f8565b60005b8281101561101957336000908152600b6020526040812080549161117383612694565b9190505550611186600d80546001019055565b611193336109a8600d5490565b8061119d81612694565b915050611150565b6000818152600260205260409020546060906001600160a01b031661120c5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610769565b60076112178361180d565b60405160200161122892919061238a565b6040516020818303038152906040529050919050565b6006546001600160a01b031633146112685760405162461bcd60e51b815260040161076990612521565b6001600160a01b0381166112cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610769565b6112d6816116b9565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061130e82610aed565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166113c05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610769565b60006113cb83610aed565b9050806001600160a01b0316846001600160a01b031614806114065750836001600160a01b03166113fb846106f4565b6001600160a01b0316145b8061143657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661145182610aed565b6001600160a01b0316146114b95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610769565b6001600160a01b03821661151b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610769565b6115266000826112d9565b6001600160a01b038316600090815260036020526040812080546001929061154f908490612616565b90915550506001600160a01b038216600090815260036020526040812080546001929061157d9084906125cb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610a9882826040518060200160405280600081525061190b565b600080336040518060400160405280600b81526020016a125357d0d3d395149050d560aa1b815250846040516020016116339392919061234b565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f19818403018152919052805160209091012090506116a0818561193e565b600c546001600160a01b03918216911614949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561176d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610769565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6117e584848461143e565b6117f184848484611962565b6110195760405162461bcd60e51b815260040161076990612481565b6060816118315750506040805180820190915260018152600360fc1b602082015290565b8160005b811561185b578061184581612694565b91506118549050600a836125e3565b9150611835565b60008167ffffffffffffffff8111156118765761187661271b565b6040519080825280601f01601f1916602001820160405280156118a0576020820181803683370190505b5090505b8415611436576118b5600183612616565b91506118c2600a866126af565b6118cd9060306125cb565b60f81b8183815181106118e2576118e2612705565b60200101906001600160f81b031916908160001a905350611904600a866125e3565b94506118a4565b6119158383611a6f565b6119226000848484611962565b61089f5760405162461bcd60e51b815260040161076990612481565b600080600061194d8585611bb1565b9150915061195a81611c21565b509392505050565b60006001600160a01b0384163b15611a6457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119a6903390899088908890600401612431565b602060405180830381600087803b1580156119c057600080fd5b505af19250505080156119f0575060408051601f3d908101601f191682019092526119ed918101906121b6565b60015b611a4a573d808015611a1e576040519150601f19603f3d011682016040523d82523d6000602084013e611a23565b606091505b508051611a425760405162461bcd60e51b815260040161076990612481565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611436565b506001949350505050565b6001600160a01b038216611ac55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610769565b6000818152600260205260409020546001600160a01b031615611b2a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610769565b6001600160a01b0382166000908152600360205260408120805460019290611b539084906125cb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080825160411415611be85760208301516040840151606085015160001a611bdc87828585611ddc565b94509450505050611c1a565b825160401415611c125760208301516040840151611c07868383611ec9565b935093505050611c1a565b506000905060025b9250929050565b6000816004811115611c3557611c356126ef565b1415611c3e5750565b6001816004811115611c5257611c526126ef565b1415611ca05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610769565b6002816004811115611cb457611cb46126ef565b1415611d025760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610769565b6003816004811115611d1657611d166126ef565b1415611d6f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610769565b6004816004811115611d8357611d836126ef565b14156112d65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610769565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e135750600090506003611ec0565b8460ff16601b14158015611e2b57508460ff16601c14155b15611e3c5750600090506004611ec0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e90573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611eb957600060019250925050611ec0565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01611eea87828885611ddc565b935093505050935093915050565b828054611f0490612659565b90600052602060002090601f016020900481019282611f265760008555611f6c565b82601f10611f3f5782800160ff19823516178555611f6c565b82800160010185558215611f6c579182015b82811115611f6c578235825591602001919060010190611f51565b50611f78929150611f7c565b5090565b5b80821115611f785760008155600101611f7d565b80356001600160a01b0381168114611fa857600080fd5b919050565b600082601f830112611fbe57600080fd5b813567ffffffffffffffff80821115611fd957611fd961271b565b604051601f8301601f19908116603f011681019082821181831017156120015761200161271b565b8160405283815286602085880101111561201a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561204c57600080fd5b61205582611f91565b9392505050565b6000806040838503121561206f57600080fd5b61207883611f91565b915061208660208401611f91565b90509250929050565b6000806000606084860312156120a457600080fd5b6120ad84611f91565b92506120bb60208501611f91565b9150604084013590509250925092565b600080600080608085870312156120e157600080fd5b6120ea85611f91565b93506120f860208601611f91565b925060408501359150606085013567ffffffffffffffff81111561211b57600080fd5b61212787828801611fad565b91505092959194509250565b6000806040838503121561214657600080fd5b61214f83611f91565b91506020830135801515811461216457600080fd5b809150509250929050565b6000806040838503121561218257600080fd5b61218b83611f91565b946020939093013593505050565b6000602082840312156121ab57600080fd5b813561205581612731565b6000602082840312156121c857600080fd5b815161205581612731565b6000806000606084860312156121e857600080fd5b833567ffffffffffffffff8111156121ff57600080fd5b61220b86828701611fad565b9660208601359650604090950135949350505050565b6000806020838503121561223457600080fd5b823567ffffffffffffffff8082111561224c57600080fd5b818501915085601f83011261226057600080fd5b81358181111561226f57600080fd5b86602082850101111561228157600080fd5b60209290920196919550909350505050565b6000602082840312156122a557600080fd5b5035919050565b600080600080608085870312156122c257600080fd5b84359350602085013567ffffffffffffffff8111156122e057600080fd5b6122ec87828801611fad565b949794965050505060408301359260600135919050565b6000815180845261231b81602086016020860161262d565b601f01601f19169290920160200192915050565b6000815161234181856020860161262d565b9290920192915050565b6bffffffffffffffffffffffff198460601b1681526000835161237581601485016020880161262d565b60149201918201929092526034019392505050565b600080845481600182811c9150808316806123a657607f831692505b60208084108214156123c657634e487b7160e01b86526022600452602486fd5b8180156123da57600181146123eb57612418565b60ff19861689528489019650612418565b60008b81526020902060005b868110156124105781548b8201529085019083016123f7565b505084890196505b505050505050612428818561232f565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061246490830184612303565b9695505050505050565b6020815260006120556020830184612303565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600b908201526a1352539517d0d313d4d15160aa1b604082015260600190565b6020808252600f908201526e115610d1515117d4115497d3525395608a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600a908201526908ab0868a8a88be9a82b60b31b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156125de576125de6126c3565b500190565b6000826125f2576125f26126d9565b500490565b6000816000190483118215151615612611576126116126c3565b500290565b600082821015612628576126286126c3565b500390565b60005b83811015612648578181015183820152602001612630565b838111156110195750506000910152565b600181811c9082168061266d57607f821691505b6020821081141561268e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126a8576126a86126c3565b5060010190565b6000826126be576126be6126d9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146112d657600080fdfea26469706673582212205209401e9f4ba55a30565af559b819fb32ec3225f7cafb0c4157b2579bfe904464736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5850794e68766f395a4c4c6871315353614e326947746d6f786465356b6446793864787655576d53797957582f
Deployed Bytecode
0x6080604052600436106101f25760003560e01c806370a082311161010d578063a0712d68116100a0578063c87b56dd1161006f578063c87b56dd14610550578063cb74850314610570578063e8656fcc14610586578063e985e9c5146105a7578063f2fde38b146105f057600080fd5b8063a0712d68146104dd578063a22cb465146104f0578063b88d4fde14610510578063be3da5251461053057600080fd5b80638da5cb5b116100dc5780638da5cb5b1461047557806391b7f5ed1461049357806395d89b41146104b357806397f5ec67146104c857600080fd5b806370a0823114610413578063715018a61461043357806381e790e8146104485780638d6f5df61461045e57600080fd5b806323b872dd1161018557806342842e0e1161015457806342842e0e146103a057806355f804b3146103c05780636352211e146103e0578063656bad071461040057600080fd5b806323b872dd1461032957806328fabd7f1461034957806335a4dee5146103765780633ccfd60b1461038b57600080fd5b80630f2b2506116101c15780630f2b2506146102af57806318160ddd146102d057806319aec117146102f35780631fe9eabc1461030957600080fd5b806301ffc9a7146101fe57806306fdde0314610233578063081812fc14610255578063095ea7b31461028d57600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021e610219366004612199565b610610565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b50610248610662565b60405161022a919061246e565b34801561026157600080fd5b50610275610270366004612293565b6106f4565b6040516001600160a01b03909116815260200161022a565b34801561029957600080fd5b506102ad6102a836600461216f565b61078e565b005b3480156102bb57600080fd5b50600c5461021e90600160a81b900460ff1681565b3480156102dc57600080fd5b506102e56108a4565b60405190815260200161022a565b3480156102ff57600080fd5b506102e560095481565b34801561031557600080fd5b506102ad610324366004612293565b6108b4565b34801561033557600080fd5b506102ad61034436600461208f565b6108e3565b34801561035557600080fd5b506102e561036436600461203a565b600b6020526000908152604090205481565b34801561038257600080fd5b506102ad610914565b34801561039757600080fd5b506102ad6109d5565b3480156103ac57600080fd5b506102ad6103bb36600461208f565b610a9c565b3480156103cc57600080fd5b506102ad6103db366004612221565b610ab7565b3480156103ec57600080fd5b506102756103fb366004612293565b610aed565b6102ad61040e3660046122ac565b610b64565b34801561041f57600080fd5b506102e561042e36600461203a565b610d8e565b34801561043f57600080fd5b506102ad610e15565b34801561045457600080fd5b506102e5600a5481565b34801561046a57600080fd5b50600d546102e59081565b34801561048157600080fd5b506006546001600160a01b0316610275565b34801561049f57600080fd5b506102ad6104ae366004612293565b610e4b565b3480156104bf57600080fd5b50610248610e7a565b3480156104d457600080fd5b506102ad610e89565b6102ad6104eb366004612293565b610ed4565b3480156104fc57600080fd5b506102ad61050b366004612133565b610fdc565b34801561051c57600080fd5b506102ad61052b3660046120cb565b610fe7565b34801561053c57600080fd5b506102ad61054b3660046121d3565b61101f565b34801561055c57600080fd5b5061024861056b366004612293565b6111a5565b34801561057c57600080fd5b506102e560085481565b34801561059257600080fd5b50600c5461021e90600160a01b900460ff1681565b3480156105b357600080fd5b5061021e6105c236600461205c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105fc57600080fd5b506102ad61060b36600461203a565b61123e565b60006001600160e01b031982166380ac58cd60e01b148061064157506001600160e01b03198216635b5e139f60e01b145b8061065c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461067190612659565b80601f016020809104026020016040519081016040528092919081815260200182805461069d90612659565b80156106ea5780601f106106bf576101008083540402835291602001916106ea565b820191906000526020600020905b8154815290600101906020018083116106cd57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107725760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061079982610aed565b9050806001600160a01b0316836001600160a01b031614156108075760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610769565b336001600160a01b0382161480610823575061082381336105c2565b6108955760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610769565b61089f83836112d9565b505050565b60006108af600d5490565b905090565b6006546001600160a01b031633146108de5760405162461bcd60e51b815260040161076990612521565b600855565b6108ed3382611347565b6109095760405162461bcd60e51b81526004016107699061257a565b61089f83838361143e565b6006546001600160a01b0316331461093e5760405162461bcd60e51b815260040161076990612521565b600c54600160a81b900460ff16156109815760405162461bcd60e51b815260206004820152600660248201526510d85b1b195960d21b6044820152606401610769565b60005b60648110156109bf5761099b600d80546001019055565b6109ad336109a8600d5490565b6115de565b806109b781612694565b915050610984565b50600c805460ff60a81b1916600160a81b179055565b6006546001600160a01b031633146109ff5760405162461bcd60e51b815260040161076990612521565b477311111f01570eeaa3e5a2fd51f4a2f127661b98346108fc6064610a258460146125f7565b610a2f91906125e3565b6040518115909202916000818181858888f19350505050158015610a57573d6000803e3d6000fd5b5060405173f9ddaae4cb4eea050810d9f695b84978277cad2e904780156108fc02916000818181858888f19350505050158015610a98573d6000803e3d6000fd5b5050565b61089f83838360405180602001604052806000815250610fe7565b6006546001600160a01b03163314610ae15760405162461bcd60e51b815260040161076990612521565b61089f60078383611ef8565b6000818152600260205260408120546001600160a01b03168061065c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610769565b600c54600160a01b900460ff16610b8d5760405162461bcd60e51b8152600401610769906124d3565b610b9783826115f8565b610bdc5760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b6044820152606401610769565b6008548285610bea600d5490565b610bf491906125cb565b610bfe91906125cb565b1115610c1c5760405162461bcd60e51b815260040161076990612556565b336000908152600b60205260409020548190610c399084906125cb565b1115610c7b5760405162461bcd60e51b8152602060048201526011602482015270115610d1515117d4115497d5d053131155607a1b6044820152606401610769565b600a54610c8883866125cb565b1115610ca65760405162461bcd60e51b8152600401610769906124f8565b3484600954610cb591906125f7565b1115610cf65760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b6044820152606401610769565b60005b82811015610d4e57336000908152600b60205260408120805491610d1c83612694565b9190505550610d2f600d80546001019055565b610d3c336109a8600d5490565b80610d4681612694565b915050610cf9565b5060005b84811015610d8757610d68600d80546001019055565b610d75336109a8600d5490565b80610d7f81612694565b915050610d52565b5050505050565b60006001600160a01b038216610df95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610769565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610e3f5760405162461bcd60e51b815260040161076990612521565b610e4960006116b9565b565b6006546001600160a01b03163314610e755760405162461bcd60e51b815260040161076990612521565b600955565b60606001805461067190612659565b6006546001600160a01b03163314610eb35760405162461bcd60e51b815260040161076990612521565b600c805460ff60a01b198116600160a01b9182900460ff1615909102179055565b600c54600160a01b900460ff16610efd5760405162461bcd60e51b8152600401610769906124d3565b60085481610f0a600d5490565b610f1491906125cb565b1115610f325760405162461bcd60e51b815260040161076990612556565b600a54811115610f545760405162461bcd60e51b8152600401610769906124f8565b3481600954610f6391906125f7565b1115610fa45760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b6044820152606401610769565b60005b81811015610a9857610fbd600d80546001019055565b610fca336109a8600d5490565b80610fd481612694565b915050610fa7565b610a9833838361170b565b610ff13383611347565b61100d5760405162461bcd60e51b81526004016107699061257a565b611019848484846117da565b50505050565b600c54600160a01b900460ff166110485760405162461bcd60e51b8152600401610769906124d3565b61105283826115f8565b6110975760405162461bcd60e51b81526020600482015260166024820152751112549150d517d352539517d11254d0531313d5d15160521b6044820152606401610769565b600854826110a4600d5490565b6110ae91906125cb565b11156110cc5760405162461bcd60e51b815260040161076990612556565b336000908152600b602052604090205481906110e99084906125cb565b111561112b5760405162461bcd60e51b8152602060048201526011602482015270115610d1515117d4115497d5d053131155607a1b6044820152606401610769565b600a5482111561114d5760405162461bcd60e51b8152600401610769906124f8565b60005b8281101561101957336000908152600b6020526040812080549161117383612694565b9190505550611186600d80546001019055565b611193336109a8600d5490565b8061119d81612694565b915050611150565b6000818152600260205260409020546060906001600160a01b031661120c5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610769565b60076112178361180d565b60405160200161122892919061238a565b6040516020818303038152906040529050919050565b6006546001600160a01b031633146112685760405162461bcd60e51b815260040161076990612521565b6001600160a01b0381166112cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610769565b6112d6816116b9565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061130e82610aed565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166113c05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610769565b60006113cb83610aed565b9050806001600160a01b0316846001600160a01b031614806114065750836001600160a01b03166113fb846106f4565b6001600160a01b0316145b8061143657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661145182610aed565b6001600160a01b0316146114b95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610769565b6001600160a01b03821661151b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610769565b6115266000826112d9565b6001600160a01b038316600090815260036020526040812080546001929061154f908490612616565b90915550506001600160a01b038216600090815260036020526040812080546001929061157d9084906125cb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610a9882826040518060200160405280600081525061190b565b600080336040518060400160405280600b81526020016a125357d0d3d395149050d560aa1b815250846040516020016116339392919061234b565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f19818403018152919052805160209091012090506116a0818561193e565b600c546001600160a01b03918216911614949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561176d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610769565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6117e584848461143e565b6117f184848484611962565b6110195760405162461bcd60e51b815260040161076990612481565b6060816118315750506040805180820190915260018152600360fc1b602082015290565b8160005b811561185b578061184581612694565b91506118549050600a836125e3565b9150611835565b60008167ffffffffffffffff8111156118765761187661271b565b6040519080825280601f01601f1916602001820160405280156118a0576020820181803683370190505b5090505b8415611436576118b5600183612616565b91506118c2600a866126af565b6118cd9060306125cb565b60f81b8183815181106118e2576118e2612705565b60200101906001600160f81b031916908160001a905350611904600a866125e3565b94506118a4565b6119158383611a6f565b6119226000848484611962565b61089f5760405162461bcd60e51b815260040161076990612481565b600080600061194d8585611bb1565b9150915061195a81611c21565b509392505050565b60006001600160a01b0384163b15611a6457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119a6903390899088908890600401612431565b602060405180830381600087803b1580156119c057600080fd5b505af19250505080156119f0575060408051601f3d908101601f191682019092526119ed918101906121b6565b60015b611a4a573d808015611a1e576040519150601f19603f3d011682016040523d82523d6000602084013e611a23565b606091505b508051611a425760405162461bcd60e51b815260040161076990612481565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611436565b506001949350505050565b6001600160a01b038216611ac55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610769565b6000818152600260205260409020546001600160a01b031615611b2a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610769565b6001600160a01b0382166000908152600360205260408120805460019290611b539084906125cb565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080825160411415611be85760208301516040840151606085015160001a611bdc87828585611ddc565b94509450505050611c1a565b825160401415611c125760208301516040840151611c07868383611ec9565b935093505050611c1a565b506000905060025b9250929050565b6000816004811115611c3557611c356126ef565b1415611c3e5750565b6001816004811115611c5257611c526126ef565b1415611ca05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610769565b6002816004811115611cb457611cb46126ef565b1415611d025760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610769565b6003816004811115611d1657611d166126ef565b1415611d6f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610769565b6004816004811115611d8357611d836126ef565b14156112d65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610769565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611e135750600090506003611ec0565b8460ff16601b14158015611e2b57508460ff16601c14155b15611e3c5750600090506004611ec0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e90573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611eb957600060019250925050611ec0565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01611eea87828885611ddc565b935093505050935093915050565b828054611f0490612659565b90600052602060002090601f016020900481019282611f265760008555611f6c565b82601f10611f3f5782800160ff19823516178555611f6c565b82800160010185558215611f6c579182015b82811115611f6c578235825591602001919060010190611f51565b50611f78929150611f7c565b5090565b5b80821115611f785760008155600101611f7d565b80356001600160a01b0381168114611fa857600080fd5b919050565b600082601f830112611fbe57600080fd5b813567ffffffffffffffff80821115611fd957611fd961271b565b604051601f8301601f19908116603f011681019082821181831017156120015761200161271b565b8160405283815286602085880101111561201a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561204c57600080fd5b61205582611f91565b9392505050565b6000806040838503121561206f57600080fd5b61207883611f91565b915061208660208401611f91565b90509250929050565b6000806000606084860312156120a457600080fd5b6120ad84611f91565b92506120bb60208501611f91565b9150604084013590509250925092565b600080600080608085870312156120e157600080fd5b6120ea85611f91565b93506120f860208601611f91565b925060408501359150606085013567ffffffffffffffff81111561211b57600080fd5b61212787828801611fad565b91505092959194509250565b6000806040838503121561214657600080fd5b61214f83611f91565b91506020830135801515811461216457600080fd5b809150509250929050565b6000806040838503121561218257600080fd5b61218b83611f91565b946020939093013593505050565b6000602082840312156121ab57600080fd5b813561205581612731565b6000602082840312156121c857600080fd5b815161205581612731565b6000806000606084860312156121e857600080fd5b833567ffffffffffffffff8111156121ff57600080fd5b61220b86828701611fad565b9660208601359650604090950135949350505050565b6000806020838503121561223457600080fd5b823567ffffffffffffffff8082111561224c57600080fd5b818501915085601f83011261226057600080fd5b81358181111561226f57600080fd5b86602082850101111561228157600080fd5b60209290920196919550909350505050565b6000602082840312156122a557600080fd5b5035919050565b600080600080608085870312156122c257600080fd5b84359350602085013567ffffffffffffffff8111156122e057600080fd5b6122ec87828801611fad565b949794965050505060408301359260600135919050565b6000815180845261231b81602086016020860161262d565b601f01601f19169290920160200192915050565b6000815161234181856020860161262d565b9290920192915050565b6bffffffffffffffffffffffff198460601b1681526000835161237581601485016020880161262d565b60149201918201929092526034019392505050565b600080845481600182811c9150808316806123a657607f831692505b60208084108214156123c657634e487b7160e01b86526022600452602486fd5b8180156123da57600181146123eb57612418565b60ff19861689528489019650612418565b60008b81526020902060005b868110156124105781548b8201529085019083016123f7565b505084890196505b505050505050612428818561232f565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061246490830184612303565b9695505050505050565b6020815260006120556020830184612303565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600b908201526a1352539517d0d313d4d15160aa1b604082015260600190565b6020808252600f908201526e115610d1515117d4115497d3525395608a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600a908201526908ab0868a8a88be9a82b60b31b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156125de576125de6126c3565b500190565b6000826125f2576125f26126d9565b500490565b6000816000190483118215151615612611576126116126c3565b500290565b600082821015612628576126286126c3565b500390565b60005b83811015612648578181015183820152602001612630565b838111156110195750506000910152565b600181811c9082168061266d57607f821691505b6020821081141561268e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126a8576126a86126c3565b5060010190565b6000826126be576126be6126d9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146112d657600080fdfea26469706673582212205209401e9f4ba55a30565af559b819fb32ec3225f7cafb0c4157b2579bfe904464736f6c63430008070033
Deployed Bytecode Sourcemap
46380:4882:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33913:305;;;;;;;;;;-1:-1:-1;33913:305:0;;;;;:::i;:::-;;:::i;:::-;;;8503:14:1;;8496:22;8478:41;;8466:2;8451:18;33913:305:0;;;;;;;;34858:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;36417:221::-;;;;;;;;;;-1:-1:-1;36417:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7801:32:1;;;7783:51;;7771:2;7756:18;36417:221:0;7637:203:1;35940:411:0;;;;;;;;;;-1:-1:-1;35940:411:0;;;;;:::i;:::-;;:::i;:::-;;46993:37;;;;;;;;;;-1:-1:-1;46993:37:0;;;;-1:-1:-1;;;46993:37:0;;;;;;51120:102;;;;;;;;;;;;;:::i;:::-;;;19547:25:1;;;19535:2;19520:18;51120:102:0;19401:177:1;46691:39:0;;;;;;;;;;;;;;;;50657:89;;;;;;;;;;-1:-1:-1;50657:89:0;;;;;:::i;:::-;;:::i;37167:339::-;;;;;;;;;;-1:-1:-1;37167:339:0;;;;;:::i;:::-;;:::i;46774:48::-;;;;;;;;;;-1:-1:-1;46774:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;47144:289;;;;;;;;;;;;;:::i;50148:296::-;;;;;;;;;;;;;:::i;37577:185::-;;;;;;;;;;-1:-1:-1;37577:185:0;;;;;:::i;:::-;;:::i;50758:98::-;;;;;;;;;;-1:-1:-1;50758:98:0;;;;;:::i;:::-;;:::i;34552:239::-;;;;;;;;;;-1:-1:-1;34552:239:0;;;;;:::i;:::-;;:::i;47819:1068::-;;;;;;:::i;:::-;;:::i;34282:208::-;;;;;;;;;;-1:-1:-1;34282:208:0;;;;;:::i;:::-;;:::i;15867:103::-;;;;;;;;;;;;;:::i;46737:30::-;;;;;;;;;;;;;;;;47037:37;;;;;;;;;;-1:-1:-1;47037:37:0;;;;;;15216:87;;;;;;;;;;-1:-1:-1;15289:6:0;;-1:-1:-1;;;;;15289:6:0;15216:87;;50552:93;;;;;;;;;;-1:-1:-1;50552:93:0;;;;;:::i;:::-;;:::i;35027:104::-;;;;;;;;;;;;;:::i;50452:92::-;;;;;;;;;;;;;:::i;49641:499::-;;;;;;:::i;:::-;;:::i;36710:155::-;;;;;;;;;;-1:-1:-1;36710:155:0;;;;;:::i;:::-;;:::i;37833:328::-;;;;;;;;;;-1:-1:-1;37833:328:0;;;;;:::i;:::-;;:::i;48895:738::-;;;;;;;;;;-1:-1:-1;48895:738:0;;;;;:::i;:::-;;:::i;50868:244::-;;;;;;;;;;-1:-1:-1;50868:244:0;;;;;:::i;:::-;;:::i;46656:28::-;;;;;;;;;;;;;;;;46966:20;;;;;;;;;;-1:-1:-1;46966:20:0;;;;-1:-1:-1;;;46966:20:0;;;;;;36936:164;;;;;;;;;;-1:-1:-1;36936:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;37057:25:0;;;37033:4;37057:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;36936:164;16125:201;;;;;;;;;;-1:-1:-1;16125:201:0;;;;;:::i;:::-;;:::i;33913:305::-;34015:4;-1:-1:-1;;;;;;34052:40:0;;-1:-1:-1;;;34052:40:0;;:105;;-1:-1:-1;;;;;;;34109:48:0;;-1:-1:-1;;;34109:48:0;34052:105;:158;;;-1:-1:-1;;;;;;;;;;27223:40:0;;;34174:36;34032:178;33913:305;-1:-1:-1;;33913:305:0:o;34858:100::-;34912:13;34945:5;34938:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34858:100;:::o;36417:221::-;36493:7;39760:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39760:16:0;36513:73;;;;-1:-1:-1;;;36513:73:0;;16209:2:1;36513:73:0;;;16191:21:1;16248:2;16228:18;;;16221:30;16287:34;16267:18;;;16260:62;-1:-1:-1;;;16338:18:1;;;16331:42;16390:19;;36513:73:0;;;;;;;;;-1:-1:-1;36606:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36606:24:0;;36417:221::o;35940:411::-;36021:13;36037:23;36052:7;36037:14;:23::i;:::-;36021:39;;36085:5;-1:-1:-1;;;;;36079:11:0;:2;-1:-1:-1;;;;;36079:11:0;;;36071:57;;;;-1:-1:-1;;;36071:57:0;;18099:2:1;36071:57:0;;;18081:21:1;18138:2;18118:18;;;18111:30;18177:34;18157:18;;;18150:62;-1:-1:-1;;;18228:18:1;;;18221:31;18269:19;;36071:57:0;17897:397:1;36071:57:0;14136:10;-1:-1:-1;;;;;36163:21:0;;;;:62;;-1:-1:-1;36188:37:0;36205:5;14136:10;36936:164;:::i;36188:37::-;36141:168;;;;-1:-1:-1;;;36141:168:0;;13855:2:1;36141:168:0;;;13837:21:1;13894:2;13874:18;;;13867:30;13933:34;13913:18;;;13906:62;14004:26;13984:18;;;13977:54;14048:19;;36141:168:0;13653:420:1;36141:168:0;36322:21;36331:2;36335:7;36322:8;:21::i;:::-;36010:341;35940:411;;:::o;51120:102::-;51164:7;51191:23;:13;1544:14;;1452:114;51191:23;51184:30;;51120:102;:::o;50657:89::-;15289:6;;-1:-1:-1;;;;;15289:6:0;14136:10;15436:23;15428:68;;;;-1:-1:-1;;;15428:68:0;;;;;;;:::i;:::-;50721:6:::1;:17:::0;50657:89::o;37167:339::-;37362:41;14136:10;37395:7;37362:18;:41::i;:::-;37354:103;;;;-1:-1:-1;;;37354:103:0;;;;;;;:::i;:::-;37470:28;37480:4;37486:2;37490:7;37470:9;:28::i;47144:289::-;15289:6;;-1:-1:-1;;;;;15289:6:0;14136:10;15436:23;15428:68;;;;-1:-1:-1;;;15428:68:0;;;;;;;:::i;:::-;47206:17:::1;::::0;-1:-1:-1;;;47206:17:0;::::1;;;47205:18;47197:37;;;::::0;-1:-1:-1;;;47197:37:0;;10423:2:1;47197:37:0::1;::::0;::::1;10405:21:1::0;10462:1;10442:18;;;10435:29;-1:-1:-1;;;10480:18:1;;;10473:36;10526:18;;47197:37:0::1;10221:329:1::0;47197:37:0::1;47249:9;47245:146;47268:3;47264:1;:7;47245:146;;;47293:25;:13;1663:19:::0;;1681:1;1663:19;;;1574:127;47293:25:::1;47333:46;47343:10;47355:23;:13;1544:14:::0;;1452:114;47355:23:::1;47333:9;:46::i;:::-;47273:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47245:146;;;-1:-1:-1::0;47401:17:0::1;:24:::0;;-1:-1:-1;;;;47401:24:0::1;-1:-1:-1::0;;;47401:24:0::1;::::0;;47144:289::o;50148:296::-;15289:6;;-1:-1:-1;;;;;15289:6:0;14136:10;15436:23;15428:68;;;;-1:-1:-1;;;15428:68:0;;;;;;;:::i;:::-;50223:21:::1;50263:42;50255:87;50338:3;50316:19;50223:21:::0;50333:2:::1;50316:19;:::i;:::-;:25;;;;:::i;:::-;50255:87;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;50353:83:0::1;::::0;50361:42:::1;::::0;50414:21:::1;50353:83:::0;::::1;;;::::0;::::1;::::0;;;50414:21;50361:42;50353:83;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;50187:257;50148:296::o:0;37577:185::-;37715:39;37732:4;37738:2;37742:7;37715:39;;;;;;;;;;;;:16;:39::i;50758:98::-;15289:6;;-1:-1:-1;;;;;15289:6:0;14136:10;15436:23;15428:68;;;;-1:-1:-1;;;15428:68:0;;;;;;;:::i;:::-;50829:19:::1;:13;50845:3:::0;;50829:19:::1;:::i;34552:239::-:0;34624:7;34660:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34660:16:0;34695:19;34687:73;;;;-1:-1:-1;;;34687:73:0;;14691:2:1;34687:73:0;;;14673:21:1;14730:2;14710:18;;;14703:30;14769:34;14749:18;;;14742:62;-1:-1:-1;;;14820:18:1;;;14813:39;14869:19;;34687:73:0;14489:405:1;47819:1068:0;47980:8;;-1:-1:-1;;;47980:8:0;;;;47972:32;;;;-1:-1:-1;;;47972:32:0;;;;;;;:::i;:::-;48023:49;48041:9;48052:19;48023:17;:49::i;:::-;48015:84;;;;-1:-1:-1;;;48015:84:0;;9712:2:1;48015:84:0;;;9694:21:1;9751:2;9731:18;;;9724:30;-1:-1:-1;;;9770:18:1;;;9763:52;9832:18;;48015:84:0;9510:346:1;48015:84:0;48187:6;;48165:18;48144;48118:23;:13;1544:14;;1452:114;48118:23;:44;;;;:::i;:::-;:65;;;;:::i;:::-;:75;;48110:98;;;;-1:-1:-1;;;48110:98:0;;;;;;;:::i;:::-;48241:10;48227:25;;;;:13;:25;;;;;;48277:19;;48227:46;;48255:18;;48227:46;:::i;:::-;:69;;48219:99;;;;-1:-1:-1;;;48219:99:0;;17393:2:1;48219:99:0;;;17375:21:1;17432:2;17412:18;;;17405:30;-1:-1:-1;;;17451:18:1;;;17444:47;17508:18;;48219:99:0;17191:341:1;48219:99:0;48380:11;;48337:39;48358:18;48337;:39;:::i;:::-;:54;;48329:82;;;;-1:-1:-1;;;48329:82:0;;;;;;;:::i;:::-;48463:9;48441:18;48430:8;;:29;;;;:::i;:::-;:42;;48422:71;;;;-1:-1:-1;;;48422:71:0;;19258:2:1;48422:71:0;;;19240:21:1;19297:2;19277:18;;;19270:30;-1:-1:-1;;;19316:18:1;;;19309:46;19372:18;;48422:71:0;19056:340:1;48422:71:0;48509:9;48504:204;48528:18;48524:1;:22;48504:204;;;48582:10;48568:25;;;;:13;:25;;;;;:27;;;;;;:::i;:::-;;;;;;48610:25;:13;1663:19;;1681:1;1663:19;;;1574:127;48610:25;48650:46;48660:10;48672:23;:13;1544:14;;1452:114;48650:46;48548:3;;;;:::i;:::-;;;;48504:204;;;;48723:9;48718:162;48742:18;48738:1;:22;48718:162;;;48782:25;:13;1663:19;;1681:1;1663:19;;;1574:127;48782:25;48822:46;48832:10;48844:23;:13;1544:14;;1452:114;48822:46;48762:3;;;;:::i;:::-;;;;48718:162;;;;47819:1068;;;;:::o;34282:208::-;34354:7;-1:-1:-1;;;;;34382:19:0;;34374:74;;;;-1:-1:-1;;;34374:74:0;;14280:2:1;34374:74:0;;;14262:21:1;14319:2;14299:18;;;14292:30;14358:34;14338:18;;;14331:62;-1:-1:-1;;;14409:18:1;;;14402:40;14459:19;;34374:74:0;14078:406:1;34374:74:0;-1:-1:-1;;;;;;34466:16:0;;;;;:9;:16;;;;;;;34282:208::o;15867:103::-;15289:6;;-1:-1:-1;;;;;15289:6:0;14136:10;15436:23;15428:68;;;;-1:-1:-1;;;15428:68:0;;;;;;;:::i;:::-;15932:30:::1;15959:1;15932:18;:30::i;:::-;15867:103::o:0;50552:93::-;15289:6;;-1:-1:-1;;;;;15289:6:0;14136:10;15436:23;15428:68;;;;-1:-1:-1;;;15428:68:0;;;;;;;:::i;:::-;50618:8:::1;:19:::0;50552:93::o;35027:104::-;35083:13;35116:7;35109:14;;;;;:::i;50452:92::-;15289:6;;-1:-1:-1;;;;;15289:6:0;14136:10;15436:23;15428:68;;;;-1:-1:-1;;;15428:68:0;;;;;;;:::i;:::-;50528:8:::1;::::0;;-1:-1:-1;;;;50516:20:0;::::1;-1:-1:-1::0;;;50528:8:0;;;::::1;;;50527:9;50516:20:::0;;::::1;;::::0;;50452:92::o;49641:499::-;49714:8;;-1:-1:-1;;;49714:8:0;;;;49706:32;;;;-1:-1:-1;;;49706:32:0;;;;;;;:::i;:::-;49800:6;;49783:13;49757:23;:13;1544:14;;1452:114;49757:23;:39;;;;:::i;:::-;:49;;49749:72;;;;-1:-1:-1;;;49749:72:0;;;;;;;:::i;:::-;49857:11;;49840:13;:28;;49832:56;;;;-1:-1:-1;;;49832:56:0;;;;;;;:::i;:::-;49935:9;49918:13;49907:8;;:24;;;;:::i;:::-;:37;;49899:66;;;;-1:-1:-1;;;49899:66:0;;19258:2:1;49899:66:0;;;19240:21:1;19297:2;19277:18;;;19270:30;-1:-1:-1;;;19316:18:1;;;19309:46;19372:18;;49899:66:0;19056:340:1;49899:66:0;49981:9;49976:157;50000:13;49996:1;:17;49976:157;;;50035:25;:13;1663:19;;1681:1;1663:19;;;1574:127;50035:25;50075:46;50085:10;50097:23;:13;1544:14;;1452:114;50075:46;50015:3;;;;:::i;:::-;;;;49976:157;;36710:155;36805:52;14136:10;36838:8;36848;36805:18;:52::i;37833:328::-;38008:41;14136:10;38041:7;38008:18;:41::i;:::-;38000:103;;;;-1:-1:-1;;;38000:103:0;;;;;;;:::i;:::-;38114:39;38128:4;38134:2;38138:7;38147:5;38114:13;:39::i;:::-;37833:328;;;;:::o;48895:738::-;49022:8;;-1:-1:-1;;;49022:8:0;;;;49014:32;;;;-1:-1:-1;;;49014:32:0;;;;;;;:::i;:::-;49065:49;49083:9;49094:19;49065:17;:49::i;:::-;49057:84;;;;-1:-1:-1;;;49057:84:0;;9712:2:1;49057:84:0;;;9694:21:1;9751:2;9731:18;;;9724:30;-1:-1:-1;;;9770:18:1;;;9763:52;9832:18;;49057:84:0;9510:346:1;49057:84:0;49208:6;;49186:18;49160:23;:13;1544:14;;1452:114;49160:23;:44;;;;:::i;:::-;:54;;49152:77;;;;-1:-1:-1;;;49152:77:0;;;;;;;:::i;:::-;49262:10;49248:25;;;;:13;:25;;;;;;49298:19;;49248:46;;49276:18;;49248:46;:::i;:::-;:69;;49240:99;;;;-1:-1:-1;;;49240:99:0;;17393:2:1;49240:99:0;;;17375:21:1;17432:2;17412:18;;;17405:30;-1:-1:-1;;;17451:18:1;;;17444:47;17508:18;;49240:99:0;17191:341:1;49240:99:0;49380:11;;49358:18;:33;;49350:61;;;;-1:-1:-1;;;49350:61:0;;;;;;;:::i;:::-;49427:9;49422:204;49446:18;49442:1;:22;49422:204;;;49500:10;49486:25;;;;:13;:25;;;;;:27;;;;;;:::i;:::-;;;;;;49528:25;:13;1663:19;;1681:1;1663:19;;;1574:127;49528:25;49568:46;49578:10;49590:23;:13;1544:14;;1452:114;49568:46;49466:3;;;;:::i;:::-;;;;49422:204;;50868:244;39736:4;39760:16;;;:7;:16;;;;;;50941:13;;-1:-1:-1;;;;;39760:16:0;50967:60;;;;-1:-1:-1;;;50967:60:0;;17739:2:1;50967:60:0;;;17721:21:1;17778:2;17758:18;;;17751:30;17817:33;17797:18;;;17790:61;17868:18;;50967:60:0;17537:355:1;50967:60:0;51069:13;51084:18;:7;:16;:18::i;:::-;51052:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51038:66;;50868:244;;;:::o;16125:201::-;15289:6;;-1:-1:-1;;;;;15289:6:0;14136:10;15436:23;15428:68;;;;-1:-1:-1;;;15428:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16214:22:0;::::1;16206:73;;;::::0;-1:-1:-1;;;16206:73:0;;11176:2:1;16206:73:0::1;::::0;::::1;11158:21:1::0;11215:2;11195:18;;;11188:30;11254:34;11234:18;;;11227:62;-1:-1:-1;;;11305:18:1;;;11298:36;11351:19;;16206:73:0::1;10974:402:1::0;16206:73:0::1;16290:28;16309:8;16290:18;:28::i;:::-;16125:201:::0;:::o;43653:174::-;43728:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;43728:29:0;-1:-1:-1;;;;;43728:29:0;;;;;;;;:24;;43782:23;43728:24;43782:14;:23::i;:::-;-1:-1:-1;;;;;43773:46:0;;;;;;;;;;;43653:174;;:::o;39965:348::-;40058:4;39760:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39760:16:0;40075:73;;;;-1:-1:-1;;;40075:73:0;;13442:2:1;40075:73:0;;;13424:21:1;13481:2;13461:18;;;13454:30;13520:34;13500:18;;;13493:62;-1:-1:-1;;;13571:18:1;;;13564:42;13623:19;;40075:73:0;13240:408:1;40075:73:0;40159:13;40175:23;40190:7;40175:14;:23::i;:::-;40159:39;;40228:5;-1:-1:-1;;;;;40217:16:0;:7;-1:-1:-1;;;;;40217:16:0;;:51;;;;40261:7;-1:-1:-1;;;;;40237:31:0;:20;40249:7;40237:11;:20::i;:::-;-1:-1:-1;;;;;40237:31:0;;40217:51;:87;;;-1:-1:-1;;;;;;37057:25:0;;;37033:4;37057:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;40272:32;40209:96;39965:348;-1:-1:-1;;;;39965:348:0:o;42957:578::-;43116:4;-1:-1:-1;;;;;43089:31:0;:23;43104:7;43089:14;:23::i;:::-;-1:-1:-1;;;;;43089:31:0;;43081:85;;;;-1:-1:-1;;;43081:85:0;;16983:2:1;43081:85:0;;;16965:21:1;17022:2;17002:18;;;16995:30;17061:34;17041:18;;;17034:62;-1:-1:-1;;;17112:18:1;;;17105:39;17161:19;;43081:85:0;16781:405:1;43081:85:0;-1:-1:-1;;;;;43185:16:0;;43177:65;;;;-1:-1:-1;;;43177:65:0;;12280:2:1;43177:65:0;;;12262:21:1;12319:2;12299:18;;;12292:30;12358:34;12338:18;;;12331:62;-1:-1:-1;;;12409:18:1;;;12402:34;12453:19;;43177:65:0;12078:400:1;43177:65:0;43359:29;43376:1;43380:7;43359:8;:29::i;:::-;-1:-1:-1;;;;;43401:15:0;;;;;;:9;:15;;;;;:20;;43420:1;;43401:15;:20;;43420:1;;43401:20;:::i;:::-;;;;-1:-1:-1;;;;;;;43432:13:0;;;;;;:9;:13;;;;;:18;;43449:1;;43432:13;:18;;43449:1;;43432:18;:::i;:::-;;;;-1:-1:-1;;43461:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43461:21:0;-1:-1:-1;;;;;43461:21:0;;;;;;;;;43500:27;;43461:16;;43500:27;;;;;;;42957:578;;;:::o;40655:110::-;40731:26;40741:2;40745:7;40731:26;;;;;;;;;;;;:9;:26::i;47441:367::-;47538:4;47556:12;47688:10;47700:8;;;;;;;;;;;;;-1:-1:-1;;;47700:8:0;;;47710:15;47671:55;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;47671:55:0;;;;;;;;;;47661:66;;47671:55;47661:66;;;;7494::1;47581:147:0;;;7482:79:1;;;;7577:12;;;7570:28;7614:12;;47581:147:0;;;-1:-1:-1;;47581:147:0;;;;;;;;;47571:170;;47581:147;47571:170;;;;;-1:-1:-1;47777:23:0;47571:170;47790:9;47777:12;:23::i;:::-;47759:14;;-1:-1:-1;;;;;47759:41:0;;;:14;;:41;;47441:367;-1:-1:-1;;;;47441:367:0:o;16486:191::-;16579:6;;;-1:-1:-1;;;;;16596:17:0;;;-1:-1:-1;;;;;;16596:17:0;;;;;;;16629:40;;16579:6;;;16596:17;16579:6;;16629:40;;16560:16;;16629:40;16549:128;16486:191;:::o;43969:315::-;44124:8;-1:-1:-1;;;;;44115:17:0;:5;-1:-1:-1;;;;;44115:17:0;;;44107:55;;;;-1:-1:-1;;;44107:55:0;;12685:2:1;44107:55:0;;;12667:21:1;12724:2;12704:18;;;12697:30;12763:27;12743:18;;;12736:55;12808:18;;44107:55:0;12483:349:1;44107:55:0;-1:-1:-1;;;;;44173:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;44173:46:0;;;;;;;;;;44235:41;;8478::1;;;44235::0;;8451:18:1;44235:41:0;;;;;;;43969:315;;;:::o;39043:::-;39200:28;39210:4;39216:2;39220:7;39200:9;:28::i;:::-;39247:48;39270:4;39276:2;39280:7;39289:5;39247:22;:48::i;:::-;39239:111;;;;-1:-1:-1;;;39239:111:0;;;;;;;:::i;2298:723::-;2354:13;2575:10;2571:53;;-1:-1:-1;;2602:10:0;;;;;;;;;;;;-1:-1:-1;;;2602:10:0;;;;;2298:723::o;2571:53::-;2649:5;2634:12;2690:78;2697:9;;2690:78;;2723:8;;;;:::i;:::-;;-1:-1:-1;2746:10:0;;-1:-1:-1;2754:2:0;2746:10;;:::i;:::-;;;2690:78;;;2778:19;2810:6;2800:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2800:17:0;;2778:39;;2828:154;2835:10;;2828:154;;2862:11;2872:1;2862:11;;:::i;:::-;;-1:-1:-1;2931:10:0;2939:2;2931:5;:10;:::i;:::-;2918:24;;:2;:24;:::i;:::-;2905:39;;2888:6;2895;2888:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2888:56:0;;;;;;;;-1:-1:-1;2959:11:0;2968:2;2959:11;;:::i;:::-;;;2828:154;;40992:321;41122:18;41128:2;41132:7;41122:5;:18::i;:::-;41173:54;41204:1;41208:2;41212:7;41221:5;41173:22;:54::i;:::-;41151:154;;;;-1:-1:-1;;;41151:154:0;;;;;;;:::i;8325:231::-;8403:7;8424:17;8443:18;8465:27;8476:4;8482:9;8465:10;:27::i;:::-;8423:69;;;;8503:18;8515:5;8503:11;:18::i;:::-;-1:-1:-1;8539:9:0;8325:231;-1:-1:-1;;;8325:231:0:o;44849:799::-;45004:4;-1:-1:-1;;;;;45025:13:0;;17715:20;17763:8;45021:620;;45061:72;;-1:-1:-1;;;45061:72:0;;-1:-1:-1;;;;;45061:36:0;;;;;:72;;14136:10;;45112:4;;45118:7;;45127:5;;45061:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45061:72:0;;;;;;;;-1:-1:-1;;45061:72:0;;;;;;;;;;;;:::i;:::-;;;45057:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45303:13:0;;45299:272;;45346:60;;-1:-1:-1;;;45346:60:0;;;;;;;:::i;45299:272::-;45521:6;45515:13;45506:6;45502:2;45498:15;45491:38;45057:529;-1:-1:-1;;;;;;45184:51:0;-1:-1:-1;;;45184:51:0;;-1:-1:-1;45177:58:0;;45021:620;-1:-1:-1;45625:4:0;44849:799;;;;;;:::o;41649:382::-;-1:-1:-1;;;;;41729:16:0;;41721:61;;;;-1:-1:-1;;;41721:61:0;;15848:2:1;41721:61:0;;;15830:21:1;;;15867:18;;;15860:30;15926:34;15906:18;;;15899:62;15978:18;;41721:61:0;15646:356:1;41721:61:0;39736:4;39760:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39760:16:0;:30;41793:58;;;;-1:-1:-1;;;41793:58:0;;11583:2:1;41793:58:0;;;11565:21:1;11622:2;11602:18;;;11595:30;11661;11641:18;;;11634:58;11709:18;;41793:58:0;11381:352:1;41793:58:0;-1:-1:-1;;;;;41922:13:0;;;;;;:9;:13;;;;;:18;;41939:1;;41922:13;:18;;41939:1;;41922:18;:::i;:::-;;;;-1:-1:-1;;41951:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41951:21:0;-1:-1:-1;;;;;41951:21:0;;;;;;;;41990:33;;41951:16;;;41990:33;;41951:16;;41990:33;41649:382;;:::o;6215:1308::-;6296:7;6305:12;6530:9;:16;6550:2;6530:22;6526:990;;;6826:4;6811:20;;6805:27;6876:4;6861:20;;6855:27;6934:4;6919:20;;6913:27;6569:9;6905:36;6977:25;6988:4;6905:36;6805:27;6855;6977:10;:25::i;:::-;6970:32;;;;;;;;;6526:990;7024:9;:16;7044:2;7024:22;7020:496;;;7299:4;7284:20;;7278:27;7350:4;7335:20;;7329:27;7392:23;7403:4;7278:27;7329;7392:10;:23::i;:::-;7385:30;;;;;;;;7020:496;-1:-1:-1;7464:1:0;;-1:-1:-1;7468:35:0;7020:496;6215:1308;;;;;:::o;4486:643::-;4564:20;4555:5;:29;;;;;;;;:::i;:::-;;4551:571;;;4486:643;:::o;4551:571::-;4662:29;4653:5;:38;;;;;;;;:::i;:::-;;4649:473;;;4708:34;;-1:-1:-1;;;4708:34:0;;9359:2:1;4708:34:0;;;9341:21:1;9398:2;9378:18;;;9371:30;9437:26;9417:18;;;9410:54;9481:18;;4708:34:0;9157:348:1;4649:473:0;4773:35;4764:5;:44;;;;;;;;:::i;:::-;;4760:362;;;4825:41;;-1:-1:-1;;;4825:41:0;;10063:2:1;4825:41:0;;;10045:21:1;10102:2;10082:18;;;10075:30;10141:33;10121:18;;;10114:61;10192:18;;4825:41:0;9861:355:1;4760:362:0;4897:30;4888:5;:39;;;;;;;;:::i;:::-;;4884:238;;;4944:44;;-1:-1:-1;;;4944:44:0;;13039:2:1;4944:44:0;;;13021:21:1;13078:2;13058:18;;;13051:30;13117:34;13097:18;;;13090:62;-1:-1:-1;;;13168:18:1;;;13161:32;13210:19;;4944:44:0;12837:398:1;4884:238:0;5019:30;5010:5;:39;;;;;;;;:::i;:::-;;5006:116;;;5066:44;;-1:-1:-1;;;5066:44:0;;15445:2:1;5066:44:0;;;15427:21:1;15484:2;15464:18;;;15457:30;15523:34;15503:18;;;15496:62;-1:-1:-1;;;15574:18:1;;;15567:32;15616:19;;5066:44:0;15243:398:1;9824:1632:0;9955:7;;10889:66;10876:79;;10872:163;;;-1:-1:-1;10988:1:0;;-1:-1:-1;10992:30:0;10972:51;;10872:163;11049:1;:7;;11054:2;11049:7;;:18;;;;;11060:1;:7;;11065:2;11060:7;;11049:18;11045:102;;;-1:-1:-1;11100:1:0;;-1:-1:-1;11104:30:0;11084:51;;11045:102;11261:24;;;11244:14;11261:24;;;;;;;;;8757:25:1;;;8830:4;8818:17;;8798:18;;;8791:45;;;;8852:18;;;8845:34;;;8895:18;;;8888:34;;;11261:24:0;;8729:19:1;;11261:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11261:24:0;;-1:-1:-1;;11261:24:0;;;-1:-1:-1;;;;;;;11300:20:0;;11296:103;;11353:1;11357:29;11337:50;;;;;;;11296:103;11419:6;-1:-1:-1;11427:20:0;;-1:-1:-1;9824:1632:0;;;;;;;;:::o;8819:391::-;8933:7;;-1:-1:-1;;;;;9034:75:0;;9136:3;9132:12;;;9146:2;9128:21;9177:25;9188:4;9128:21;9197:1;9034:75;9177:10;:25::i;:::-;9170:32;;;;;;8819:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:718::-;234:5;287:3;280:4;272:6;268:17;264:27;254:55;;305:1;302;295:12;254:55;341:6;328:20;367:18;404:2;400;397:10;394:36;;;410:18;;:::i;:::-;485:2;479:9;453:2;539:13;;-1:-1:-1;;535:22:1;;;559:2;531:31;527:40;515:53;;;583:18;;;603:22;;;580:46;577:72;;;629:18;;:::i;:::-;669:10;665:2;658:22;704:2;696:6;689:18;750:3;743:4;738:2;730:6;726:15;722:26;719:35;716:55;;;767:1;764;757:12;716:55;831:2;824:4;816:6;812:17;805:4;797:6;793:17;780:54;878:1;871:4;866:2;858:6;854:15;850:26;843:37;898:6;889:15;;;;;;192:718;;;;:::o;915:186::-;974:6;1027:2;1015:9;1006:7;1002:23;998:32;995:52;;;1043:1;1040;1033:12;995:52;1066:29;1085:9;1066:29;:::i;:::-;1056:39;915:186;-1:-1:-1;;;915:186:1:o;1106:260::-;1174:6;1182;1235:2;1223:9;1214:7;1210:23;1206:32;1203:52;;;1251:1;1248;1241:12;1203:52;1274:29;1293:9;1274:29;:::i;:::-;1264:39;;1322:38;1356:2;1345:9;1341:18;1322:38;:::i;:::-;1312:48;;1106:260;;;;;:::o;1371:328::-;1448:6;1456;1464;1517:2;1505:9;1496:7;1492:23;1488:32;1485:52;;;1533:1;1530;1523:12;1485:52;1556:29;1575:9;1556:29;:::i;:::-;1546:39;;1604:38;1638:2;1627:9;1623:18;1604:38;:::i;:::-;1594:48;;1689:2;1678:9;1674:18;1661:32;1651:42;;1371:328;;;;;:::o;1704:537::-;1799:6;1807;1815;1823;1876:3;1864:9;1855:7;1851:23;1847:33;1844:53;;;1893:1;1890;1883:12;1844:53;1916:29;1935:9;1916:29;:::i;:::-;1906:39;;1964:38;1998:2;1987:9;1983:18;1964:38;:::i;:::-;1954:48;;2049:2;2038:9;2034:18;2021:32;2011:42;;2104:2;2093:9;2089:18;2076:32;2131:18;2123:6;2120:30;2117:50;;;2163:1;2160;2153:12;2117:50;2186:49;2227:7;2218:6;2207:9;2203:22;2186:49;:::i;:::-;2176:59;;;1704:537;;;;;;;:::o;2246:347::-;2311:6;2319;2372:2;2360:9;2351:7;2347:23;2343:32;2340:52;;;2388:1;2385;2378:12;2340:52;2411:29;2430:9;2411:29;:::i;:::-;2401:39;;2490:2;2479:9;2475:18;2462:32;2537:5;2530:13;2523:21;2516:5;2513:32;2503:60;;2559:1;2556;2549:12;2503:60;2582:5;2572:15;;;2246:347;;;;;:::o;2598:254::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2766:29;2785:9;2766:29;:::i;:::-;2756:39;2842:2;2827:18;;;;2814:32;;-1:-1:-1;;;2598:254:1:o;2857:245::-;2915:6;2968:2;2956:9;2947:7;2943:23;2939:32;2936:52;;;2984:1;2981;2974:12;2936:52;3023:9;3010:23;3042:30;3066:5;3042:30;:::i;3107:249::-;3176:6;3229:2;3217:9;3208:7;3204:23;3200:32;3197:52;;;3245:1;3242;3235:12;3197:52;3277:9;3271:16;3296:30;3320:5;3296:30;:::i;3361:456::-;3447:6;3455;3463;3516:2;3504:9;3495:7;3491:23;3487:32;3484:52;;;3532:1;3529;3522:12;3484:52;3572:9;3559:23;3605:18;3597:6;3594:30;3591:50;;;3637:1;3634;3627:12;3591:50;3660:49;3701:7;3692:6;3681:9;3677:22;3660:49;:::i;:::-;3650:59;3756:2;3741:18;;3728:32;;-1:-1:-1;3807:2:1;3792:18;;;3779:32;;3361:456;-1:-1:-1;;;;3361:456:1:o;3822:592::-;3893:6;3901;3954:2;3942:9;3933:7;3929:23;3925:32;3922:52;;;3970:1;3967;3960:12;3922:52;4010:9;3997:23;4039:18;4080:2;4072:6;4069:14;4066:34;;;4096:1;4093;4086:12;4066:34;4134:6;4123:9;4119:22;4109:32;;4179:7;4172:4;4168:2;4164:13;4160:27;4150:55;;4201:1;4198;4191:12;4150:55;4241:2;4228:16;4267:2;4259:6;4256:14;4253:34;;;4283:1;4280;4273:12;4253:34;4328:7;4323:2;4314:6;4310:2;4306:15;4302:24;4299:37;4296:57;;;4349:1;4346;4339:12;4296:57;4380:2;4372:11;;;;;4402:6;;-1:-1:-1;3822:592:1;;-1:-1:-1;;;;3822:592:1:o;4419:180::-;4478:6;4531:2;4519:9;4510:7;4506:23;4502:32;4499:52;;;4547:1;4544;4537:12;4499:52;-1:-1:-1;4570:23:1;;4419:180;-1:-1:-1;4419:180:1:o;4604:525::-;4699:6;4707;4715;4723;4776:3;4764:9;4755:7;4751:23;4747:33;4744:53;;;4793:1;4790;4783:12;4744:53;4829:9;4816:23;4806:33;;4890:2;4879:9;4875:18;4862:32;4917:18;4909:6;4906:30;4903:50;;;4949:1;4946;4939:12;4903:50;4972:49;5013:7;5004:6;4993:9;4989:22;4972:49;:::i;:::-;4604:525;;4962:59;;-1:-1:-1;;;;5068:2:1;5053:18;;5040:32;;5119:2;5104:18;5091:32;;4604:525;-1:-1:-1;4604:525:1:o;5134:257::-;5175:3;5213:5;5207:12;5240:6;5235:3;5228:19;5256:63;5312:6;5305:4;5300:3;5296:14;5289:4;5282:5;5278:16;5256:63;:::i;:::-;5373:2;5352:15;-1:-1:-1;;5348:29:1;5339:39;;;;5380:4;5335:50;;5134:257;-1:-1:-1;;5134:257:1:o;5396:185::-;5438:3;5476:5;5470:12;5491:52;5536:6;5531:3;5524:4;5517:5;5513:16;5491:52;:::i;:::-;5559:16;;;;;5396:185;-1:-1:-1;;5396:185:1:o;5586:482::-;5828:26;5824:31;5815:6;5811:2;5807:15;5803:53;5798:3;5791:66;5773:3;5886:6;5880:13;5902:62;5957:6;5952:2;5947:3;5943:12;5936:4;5928:6;5924:17;5902:62;:::i;:::-;6023:2;5983:16;;6015:11;;;6008:27;;;;6059:2;6051:11;;5586:482;-1:-1:-1;;;5586:482:1:o;6073:1174::-;6249:3;6278:1;6311:6;6305:13;6341:3;6363:1;6391:9;6387:2;6383:18;6373:28;;6451:2;6440:9;6436:18;6473;6463:61;;6517:4;6509:6;6505:17;6495:27;;6463:61;6543:2;6591;6583:6;6580:14;6560:18;6557:38;6554:165;;;-1:-1:-1;;;6618:33:1;;6674:4;6671:1;6664:15;6704:4;6625:3;6692:17;6554:165;6735:18;6762:104;;;;6880:1;6875:320;;;;6728:467;;6762:104;-1:-1:-1;;6795:24:1;;6783:37;;6840:16;;;;-1:-1:-1;6762:104:1;;6875:320;19656:1;19649:14;;;19693:4;19680:18;;6970:1;6984:165;6998:6;6995:1;6992:13;6984:165;;;7076:14;;7063:11;;;7056:35;7119:16;;;;7013:10;;6984:165;;;6988:3;;7178:6;7173:3;7169:16;7162:23;;6728:467;;;;;;;7211:30;7237:3;7229:6;7211:30;:::i;:::-;7204:37;6073:1174;-1:-1:-1;;;;;6073:1174:1:o;7845:488::-;-1:-1:-1;;;;;8114:15:1;;;8096:34;;8166:15;;8161:2;8146:18;;8139:43;8213:2;8198:18;;8191:34;;;8261:3;8256:2;8241:18;;8234:31;;;8039:4;;8282:45;;8307:19;;8299:6;8282:45;:::i;:::-;8274:53;7845:488;-1:-1:-1;;;;;;7845:488:1:o;8933:219::-;9082:2;9071:9;9064:21;9045:4;9102:44;9142:2;9131:9;9127:18;9119:6;9102:44;:::i;10555:414::-;10757:2;10739:21;;;10796:2;10776:18;;;10769:30;10835:34;10830:2;10815:18;;10808:62;-1:-1:-1;;;10901:2:1;10886:18;;10879:48;10959:3;10944:19;;10555:414::o;11738:335::-;11940:2;11922:21;;;11979:2;11959:18;;;11952:30;-1:-1:-1;;;12013:2:1;11998:18;;11991:41;12064:2;12049:18;;11738:335::o;14899:339::-;15101:2;15083:21;;;15140:2;15120:18;;;15113:30;-1:-1:-1;;;15174:2:1;15159:18;;15152:45;15229:2;15214:18;;14899:339::o;16420:356::-;16622:2;16604:21;;;16641:18;;;16634:30;16700:34;16695:2;16680:18;;16673:62;16767:2;16752:18;;16420:356::o;18299:334::-;18501:2;18483:21;;;18540:2;18520:18;;;18513:30;-1:-1:-1;;;18574:2:1;18559:18;;18552:40;18624:2;18609:18;;18299:334::o;18638:413::-;18840:2;18822:21;;;18879:2;18859:18;;;18852:30;18918:34;18913:2;18898:18;;18891:62;-1:-1:-1;;;18984:2:1;18969:18;;18962:47;19041:3;19026:19;;18638:413::o;19709:128::-;19749:3;19780:1;19776:6;19773:1;19770:13;19767:39;;;19786:18;;:::i;:::-;-1:-1:-1;19822:9:1;;19709:128::o;19842:120::-;19882:1;19908;19898:35;;19913:18;;:::i;:::-;-1:-1:-1;19947:9:1;;19842:120::o;19967:168::-;20007:7;20073:1;20069;20065:6;20061:14;20058:1;20055:21;20050:1;20043:9;20036:17;20032:45;20029:71;;;20080:18;;:::i;:::-;-1:-1:-1;20120:9:1;;19967:168::o;20140:125::-;20180:4;20208:1;20205;20202:8;20199:34;;;20213:18;;:::i;:::-;-1:-1:-1;20250:9:1;;20140:125::o;20270:258::-;20342:1;20352:113;20366:6;20363:1;20360:13;20352:113;;;20442:11;;;20436:18;20423:11;;;20416:39;20388:2;20381:10;20352:113;;;20483:6;20480:1;20477:13;20474:48;;;-1:-1:-1;;20518:1:1;20500:16;;20493:27;20270:258::o;20533:380::-;20612:1;20608:12;;;;20655;;;20676:61;;20730:4;20722:6;20718:17;20708:27;;20676:61;20783:2;20775:6;20772:14;20752:18;20749:38;20746:161;;;20829:10;20824:3;20820:20;20817:1;20810:31;20864:4;20861:1;20854:15;20892:4;20889:1;20882:15;20746:161;;20533:380;;;:::o;20918:135::-;20957:3;-1:-1:-1;;20978:17:1;;20975:43;;;20998:18;;:::i;:::-;-1:-1:-1;21045:1:1;21034:13;;20918:135::o;21058:112::-;21090:1;21116;21106:35;;21121:18;;:::i;:::-;-1:-1:-1;21155:9:1;;21058:112::o;21175:127::-;21236:10;21231:3;21227:20;21224:1;21217:31;21267:4;21264:1;21257:15;21291:4;21288:1;21281:15;21307:127;21368:10;21363:3;21359:20;21356:1;21349:31;21399:4;21396:1;21389:15;21423:4;21420:1;21413:15;21439:127;21500:10;21495:3;21491:20;21488:1;21481:31;21531:4;21528:1;21521:15;21555:4;21552:1;21545:15;21571:127;21632:10;21627:3;21623:20;21620:1;21613:31;21663:4;21660:1;21653:15;21687:4;21684:1;21677:15;21703:127;21764:10;21759:3;21755:20;21752:1;21745:31;21795:4;21792:1;21785:15;21819:4;21816:1;21809:15;21835:131;-1:-1:-1;;;;;;21909:32:1;;21899:43;;21889:71;;21956:1;21953;21946:12
Swarm Source
ipfs://5209401e9f4ba55a30565af559b819fb32ec3225f7cafb0c4157b2579bfe9044
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.