Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
1,590 AICO
Holders
752
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 AICOLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AIC_Operatives
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-04 */ // SPDX-License-Identifier: MIT /* _ ___ ___ ___ _ _ /_\ |_ _/ __| / _ \ _ __ ___ _ _ __ _| |_(_)_ _____ ___ / _ \ | | (__ | (_) | '_ \/ -_) '_/ _` | _| \ V / -_|_-< /_/ \_\___\___| \___/| .__/\___|_| \__,_|\__|_|\_/\___/__/ |_| By Devko.dev#7286 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contract.sol pragma solidity ^0.8.7; contract AIC_Operatives is ERC721A, Ownable { using Strings for uint256; using ECDSA for bytes32; string private baseURI = "https://gateway.pinata.cloud/ipfs/QmTp8nte7JnvQmxbESdLk3qhcCL5NViqZijKDXigdrxrvd/"; string public privateSigWord = "AIC_GEN2_PRIVATE"; uint256 public maxSaleSupply = 5486; uint256 public maxTeamSupply = 514; uint256 public privatePrice = 0.09 ether; uint256 public publicPrice = 0.11 ether; uint256 public maxMintsPerTx = 5; uint256 public mintedCounter; uint256 public teamMintedCounter; address public privateSigner = 0x89E331970dba855A8E5d86371C4c47bCf60aa4F5; bool public publicLive; bool public privateLive; mapping(address => uint256) public privateMinters; constructor() ERC721A("Operatives", "AICO") {} function _startTokenId() internal view virtual override(ERC721A) returns (uint256) { return 1; } modifier notContract() { require( (!_isContract(msg.sender)) && (msg.sender == tx.origin), "contract not allowed" ); _; } function _isContract(address addr) internal view returns (bool) { uint256 size; assembly { size := extcodesize(addr) } return size > 0; } function matchAddresSigner(bytes memory signature, uint256 maxMints) private view returns (bool) { bytes32 hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(msg.sender, privateSigWord, maxMints)))); return privateSigner == hash.recover(signature); } function mint(uint256 tokenQuantity) external payable notContract { require(publicLive, "MINT_CLOSED"); require(mintedCounter + tokenQuantity <= maxSaleSupply, "EXCEED_SALE_SUPPLY"); require(tokenQuantity <= maxMintsPerTx, "EXCEED_PER_TX"); require(publicPrice * tokenQuantity <= msg.value, "INSUFFICIENT_ETH"); mintedCounter +=tokenQuantity; _mint(msg.sender, tokenQuantity); } function privateMint(uint256 tokenQuantity, bytes memory signature, uint256 maxMints) external payable notContract { require(privateLive, "MINT_CLOSED"); require(mintedCounter + tokenQuantity <= maxSaleSupply, "EXCEED_SALE_SUPPLY"); require(matchAddresSigner(signature, maxMints), "INVALID_SIGNATURE"); require(privateMinters[msg.sender] + tokenQuantity <= maxMints, "EXCEED_PER_WALLET"); require(privatePrice * tokenQuantity <= msg.value, "INSUFFICIENT_ETH"); mintedCounter +=tokenQuantity; privateMinters[msg.sender] = privateMinters[msg.sender] + tokenQuantity; _mint(msg.sender, tokenQuantity); } function tokenURI(uint256 tokenId) public view override(ERC721A) returns (string memory) { require(_exists(tokenId), "Cannot query non-existent token"); return string(abi.encodePacked(baseURI, tokenId.toString())); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function gift(address[] calldata receivers) external onlyOwner { require(teamMintedCounter + receivers.length <= maxTeamSupply, "EXCEED_TEAM_SUPPLY"); teamMintedCounter += receivers.length; for (uint256 i = 0; i < receivers.length; i++) { _mint(receivers[i], 1); } } function founderMint(uint256 tokenQuantity) external onlyOwner { require(teamMintedCounter + tokenQuantity <= maxTeamSupply, "EXCEED_TEAM_SUPPLY"); teamMintedCounter += tokenQuantity; _mint(msg.sender, tokenQuantity); } function togglePublicStatus() external onlyOwner { publicLive = !publicLive; } function togglePrivateStatus() external onlyOwner { privateLive = !privateLive; } function setPublicPrice(uint256 newPrice) external onlyOwner { publicPrice = newPrice; } function setPrivatePrice(uint256 newPrice) external onlyOwner { privatePrice = newPrice; } function setMax(uint256 newCount) external onlyOwner { maxSaleSupply = newCount; } function setTeamMax(uint256 newCount) external onlyOwner { maxTeamSupply = newCount; } function setMaxPerTx(uint256 newCount) external onlyOwner { maxMintsPerTx = newCount; } function setSigner(address newAddress) external onlyOwner { privateSigner = newAddress; } function setBaseURI(string calldata newBaseURI) external onlyOwner { baseURI = newBaseURI; } function withdraw() external onlyOwner { uint256 currentBalance = address(this).balance; Address.sendValue(payable(0x00000040f69B8E3382734491cBAA241B6a863AB3), (currentBalance * 10) / 100); Address.sendValue(payable(0x773DAaCda9E4d7C7955BCef1fbF807D318501F44), (currentBalance * 10) / 100); Address.sendValue(payable(0x4c35286d99b5879c45538Da5f59588A601359e34), (currentBalance * 10) / 100); Address.sendValue(payable(0x3A7D619d3ED6Fb04799642f88BD3dFab63af0a83), (currentBalance * 10) / 100); Address.sendValue(payable(0xbF6c44be5AC250B30726E9405d4fD80Bd16A1ae2), (currentBalance * 8) / 100); Address.sendValue(payable(0x4D214C5Ea3ddE7E416e128E71a6A547E645e5d9b), (currentBalance * 6) / 100); Address.sendValue(payable(0xa642830cCe2e2741BB654B479DC1Dc33E910ae55), (currentBalance * 85) / 1000); Address.sendValue(payable(0xCa7987Dc570540F6045759e4207eDad2D4f04F82), (currentBalance * 85) / 1000); Address.sendValue(payable(0x3FD45f7fc6da24A360E75aFF9DE577ab5fbdcfE7), address(this).balance); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"founderMint","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":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTeamSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintedCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"maxMints","type":"uint256"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"privateMinters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSigWord","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"newBaseURI","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":"newCount","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrivatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCount","type":"uint256"}],"name":"setTeamMax","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":"teamMintedCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePrivateStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicStatus","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
61010060405260516080818152906200285860a03980516200002a9160099160209091019062000191565b506040805180820190915260108082526f4149435f47454e325f5052495641544560801b60209092019182526200006491600a9162000191565b5061156e600b55610202600c5567013fbe85edc90000600d55670186cc6acd4b0000600e556005600f55601280546001600160a01b0319167389e331970dba855a8e5d86371c4c47bcf60aa4f5179055348015620000c157600080fd5b50604080518082018252600a8152694f70657261746976657360b01b6020808301918252835180850190945260048452634149434f60e01b908401528151919291620001109160029162000191565b5080516200012690600390602084019062000191565b505060016000555062000139336200013f565b62000274565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200019f9062000237565b90600052602060002090601f016020900481019282620001c357600085556200020e565b82601f10620001de57805160ff19168380011785556200020e565b828001600101855582156200020e579182015b828111156200020e578251825591602001919060010190620001f1565b506200021c92915062000220565b5090565b5b808211156200021c576000815560010162000221565b600181811c908216806200024c57607f821691505b602082108114156200026e57634e487b7160e01b600052602260045260246000fd5b50919050565b6125d480620002846000396000f3fe6080604052600436106102605760003560e01c8063898f717211610144578063b88d4fde116100b6578063cbe116441161007a578063cbe11644146106b9578063d97d28d2146106d9578063dc30158b146106f9578063e985e9c51461070f578063f2fde38b14610758578063f42202e81461077857600080fd5b8063b88d4fde14610624578063c46eb68514610644578063c627525514610659578063c6f6f21614610679578063c87b56dd1461069957600080fd5b8063a0712d6811610108578063a0712d6814610584578063a10f151e14610597578063a22cb465146105b7578063a945bf80146105d7578063b29418d5146105ed578063b7f751d81461060357600080fd5b8063898f7172146104ee5780638da5cb5b1461050357806390edd6971461052157806395d89b411461054e57806397283d2f1461056357600080fd5b80633ccfd60b116101dd5780636352211e116101a15780636352211e1461044d5780636c19e7831461046d57806370a082311461048d578063715018a6146104ad57806379aee341146104c257806387c0568b146104d857600080fd5b80633ccfd60b146103cf57806342842e0e146103e457806343fbdefd146104045780634b2596c71461041757806355f804b31461042d57600080fd5b806318160ddd1161022457806318160ddd1461033d5780631ead3877146103645780631fe9eabc1461037a57806323b872dd1461039a57806333098c01146103ba57600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb578063163e1e611461031d57600080fd5b3661026757005b600080fd5b34801561027857600080fd5b5061028c6102873660046121b2565b610798565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b66107ea565b604051610298919061240f565b3480156102cf57600080fd5b506102e36102de36600461224c565b61087c565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b610316366004612113565b6108c0565b005b34801561032957600080fd5b5061031b61033836600461213d565b610960565b34801561034957600080fd5b5060015460005403600019015b604051908152602001610298565b34801561037057600080fd5b5061035660115481565b34801561038657600080fd5b5061031b61039536600461224c565b610a2f565b3480156103a657600080fd5b5061031b6103b5366004612033565b610a3c565b3480156103c657600080fd5b5061031b610bcd565b3480156103db57600080fd5b5061031b610bf6565b3480156103f057600080fd5b5061031b6103ff366004612033565b610d56565b61031b610412366004612265565b610d71565b34801561042357600080fd5b50610356600c5481565b34801561043957600080fd5b5061031b6104483660046121ec565b610fa5565b34801561045957600080fd5b506102e361046836600461224c565b610fb9565b34801561047957600080fd5b5061031b610488366004611fe5565b610fc4565b34801561049957600080fd5b506103566104a8366004611fe5565b610fee565b3480156104b957600080fd5b5061031b61103d565b3480156104ce57600080fd5b5061035660105481565b3480156104e457600080fd5b50610356600d5481565b3480156104fa57600080fd5b506102b6611051565b34801561050f57600080fd5b506008546001600160a01b03166102e3565b34801561052d57600080fd5b5061035661053c366004611fe5565b60136020526000908152604090205481565b34801561055a57600080fd5b506102b66110df565b34801561056f57600080fd5b5060125461028c90600160a81b900460ff1681565b61031b61059236600461224c565b6110ee565b3480156105a357600080fd5b5061031b6105b236600461224c565b61128e565b3480156105c357600080fd5b5061031b6105d23660046120d7565b61129b565b3480156105e357600080fd5b50610356600e5481565b3480156105f957600080fd5b50610356600b5481565b34801561060f57600080fd5b5060125461028c90600160a01b900460ff1681565b34801561063057600080fd5b5061031b61063f36600461206f565b611331565b34801561065057600080fd5b5061031b61137b565b34801561066557600080fd5b5061031b61067436600461224c565b6113a4565b34801561068557600080fd5b5061031b61069436600461224c565b6113b1565b3480156106a557600080fd5b506102b66106b436600461224c565b6113be565b3480156106c557600080fd5b5061031b6106d436600461224c565b611447565b3480156106e557600080fd5b506012546102e3906001600160a01b031681565b34801561070557600080fd5b50610356600f5481565b34801561071b57600080fd5b5061028c61072a366004612000565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561076457600080fd5b5061031b610773366004611fe5565b611454565b34801561078457600080fd5b5061031b61079336600461224c565b6114ca565b60006301ffc9a760e01b6001600160e01b0319831614806107c957506380ac58cd60e01b6001600160e01b03198316145b806107e45750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546107f9906124b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610825906124b0565b80156108725780601f1061084757610100808354040283529160200191610872565b820191906000526020600020905b81548152906001019060200180831161085557829003601f168201915b5050505050905090565b600061088782611538565b6108a4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108cb82610fb9565b9050336001600160a01b03821614610904576108e7813361072a565b610904576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61096861156d565b600c54601154610979908390612422565b11156109c15760405162461bcd60e51b81526020600482015260126024820152714558434545445f5445414d5f535550504c5960701b60448201526064015b60405180910390fd5b81819050601160008282546109d69190612422565b90915550600090505b81811015610a2a57610a188383838181106109fc576109fc61255c565b9050602002016020810190610a119190611fe5565b60016115c7565b80610a22816124eb565b9150506109df565b505050565b610a3761156d565b600b55565b6000610a47826116be565b9050836001600160a01b0316816001600160a01b031614610a7a5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610ac757610aaa863361072a565b610ac757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610aee57604051633a954ecd60e21b815260040160405180910390fd5b8015610af957600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610b845760018401600081815260046020526040902054610b82576000548114610b825760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b610bd561156d565b6012805460ff60a01b198116600160a01b9182900460ff1615909102179055565b610bfe61156d565b47610c307040f69b8e3382734491cbaa241b6a863ab36064610c2184600a61244e565b610c2b919061243a565b61172e565b610c5573773daacda9e4d7c7955bcef1fbf807d318501f446064610c2184600a61244e565b610c7a734c35286d99b5879c45538da5f59588a601359e346064610c2184600a61244e565b610c9f733a7d619d3ed6fb04799642f88bd3dfab63af0a836064610c2184600a61244e565b610cc473bf6c44be5ac250b30726e9405d4fd80bd16a1ae26064610c2184600861244e565b610ce9734d214c5ea3dde7e416e128e71a6a547e645e5d9b6064610c2184600661244e565b610d0f73a642830cce2e2741bb654b479dc1dc33e910ae556103e8610c2184605561244e565b610d3573ca7987dc570540f6045759e4207edad2d4f04f826103e8610c2184605561244e565b610d53733fd45f7fc6da24a360e75aff9de577ab5fbdcfe74761172e565b50565b610a2a83838360405180602001604052806000815250611331565b333b158015610d7f57503332145b610dc25760405162461bcd60e51b815260206004820152601460248201527318dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b60448201526064016109b8565b601254600160a81b900460ff16610e095760405162461bcd60e51b815260206004820152600b60248201526a1352539517d0d313d4d15160aa1b60448201526064016109b8565b600b5483601054610e1a9190612422565b1115610e5d5760405162461bcd60e51b81526020600482015260126024820152714558434545445f53414c455f535550504c5960701b60448201526064016109b8565b610e678282611847565b610ea75760405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b60448201526064016109b8565b336000908152601360205260409020548190610ec4908590612422565b1115610f065760405162461bcd60e51b8152602060048201526011602482015270115610d1515117d4115497d5d053131155607a1b60448201526064016109b8565b3483600d54610f15919061244e565b1115610f565760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b60448201526064016109b8565b8260106000828254610f689190612422565b909155505033600090815260136020526040902054610f88908490612422565b33600081815260136020526040902091909155610a2a90846115c7565b610fad61156d565b610a2a60098383611ea3565b60006107e4826116be565b610fcc61156d565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611017576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b61104561156d565b61104f60006118e6565b565b600a805461105e906124b0565b80601f016020809104026020016040519081016040528092919081815260200182805461108a906124b0565b80156110d75780601f106110ac576101008083540402835291602001916110d7565b820191906000526020600020905b8154815290600101906020018083116110ba57829003601f168201915b505050505081565b6060600380546107f9906124b0565b333b1580156110fc57503332145b61113f5760405162461bcd60e51b815260206004820152601460248201527318dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b60448201526064016109b8565b601254600160a01b900460ff166111865760405162461bcd60e51b815260206004820152600b60248201526a1352539517d0d313d4d15160aa1b60448201526064016109b8565b600b54816010546111979190612422565b11156111da5760405162461bcd60e51b81526020600482015260126024820152714558434545445f53414c455f535550504c5960701b60448201526064016109b8565b600f5481111561121c5760405162461bcd60e51b815260206004820152600d60248201526c08ab0868a8a88bea08aa4bea8b609b1b60448201526064016109b8565b3481600e5461122b919061244e565b111561126c5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b60448201526064016109b8565b806010600082825461127e9190612422565b90915550610d53905033826115c7565b61129661156d565b600d55565b6001600160a01b0382163314156112c55760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61133c848484610a3c565b6001600160a01b0383163b156113755761135884848484611938565b611375576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b61138361156d565b6012805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6113ac61156d565b600e55565b6113b961156d565b600f55565b60606113c982611538565b6114155760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064016109b8565b600961142083611a30565b6040516020016114319291906123ad565b6040516020818303038152906040529050919050565b61144f61156d565b600c55565b61145c61156d565b6001600160a01b0381166114c15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610d53816118e6565b6114d261156d565b600c54816011546114e39190612422565b11156115265760405162461bcd60e51b81526020600482015260126024820152714558434545445f5445414d5f535550504c5960701b60448201526064016109b8565b806011600082825461127e9190612422565b60008160011115801561154c575060005482105b80156107e4575050600090815260046020526040902054600160e01b161590565b6008546001600160a01b0316331461104f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b600054816115e85760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461169757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460010161165f565b50816116b557604051622e076360e81b815260040160405180910390fd5b60005550505050565b600081806001116117155760005481101561171557600081815260046020526040902054600160e01b8116611713575b8061170c5750600019016000818152600460205260409020546116ee565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b8047101561177e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109b8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146117cb576040519150601f19603f3d011682016040523d82523d6000602084013e6117d0565b606091505b5050905080610a2a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109b8565b60008033600a846040516020016118609392919061237b565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f19818403018152919052805160209091012090506118cd8185611b2e565b6012546001600160a01b03918216911614949350505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061196d9033908990889088906004016123d2565b602060405180830381600087803b15801561198757600080fd5b505af19250505080156119b7575060408051601f3d908101601f191682019092526119b4918101906121cf565b60015b611a12573d8080156119e5576040519150601f19603f3d011682016040523d82523d6000602084013e6119ea565b606091505b508051611a0a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081611a545750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a7e5780611a68816124eb565b9150611a779050600a8361243a565b9150611a58565b60008167ffffffffffffffff811115611a9957611a99612572565b6040519080825280601f01601f191660200182016040528015611ac3576020820181803683370190505b5090505b8415611a2857611ad860018361246d565b9150611ae5600a86612506565b611af0906030612422565b60f81b818381518110611b0557611b0561255c565b60200101906001600160f81b031916908160001a905350611b27600a8661243a565b9450611ac7565b6000806000611b3d8585611b52565b91509150611b4a81611bc2565b509392505050565b600080825160411415611b895760208301516040840151606085015160001a611b7d87828585611d7d565b94509450505050611bbb565b825160401415611bb35760208301516040840151611ba8868383611e6a565b935093505050611bbb565b506000905060025b9250929050565b6000816004811115611bd657611bd6612546565b1415611bdf5750565b6001816004811115611bf357611bf3612546565b1415611c415760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109b8565b6002816004811115611c5557611c55612546565b1415611ca35760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109b8565b6003816004811115611cb757611cb7612546565b1415611d105760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109b8565b6004816004811115611d2457611d24612546565b1415610d535760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109b8565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611db45750600090506003611e61565b8460ff16601b14158015611dcc57508460ff16601c14155b15611ddd5750600090506004611e61565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e31573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611e5a57600060019250925050611e61565b9150600090505b94509492505050565b6000806001600160ff1b03831681611e8760ff86901c601b612422565b9050611e9587828885611d7d565b935093505050935093915050565b828054611eaf906124b0565b90600052602060002090601f016020900481019282611ed15760008555611f17565b82601f10611eea5782800160ff19823516178555611f17565b82800160010185558215611f17579182015b82811115611f17578235825591602001919060010190611efc565b50611f23929150611f27565b5090565b5b80821115611f235760008155600101611f28565b80356001600160a01b0381168114611f5357600080fd5b919050565b600082601f830112611f6957600080fd5b813567ffffffffffffffff80821115611f8457611f84612572565b604051601f8301601f19908116603f01168101908282118183101715611fac57611fac612572565b81604052838152866020858801011115611fc557600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611ff757600080fd5b61170c82611f3c565b6000806040838503121561201357600080fd5b61201c83611f3c565b915061202a60208401611f3c565b90509250929050565b60008060006060848603121561204857600080fd5b61205184611f3c565b925061205f60208501611f3c565b9150604084013590509250925092565b6000806000806080858703121561208557600080fd5b61208e85611f3c565b935061209c60208601611f3c565b925060408501359150606085013567ffffffffffffffff8111156120bf57600080fd5b6120cb87828801611f58565b91505092959194509250565b600080604083850312156120ea57600080fd5b6120f383611f3c565b91506020830135801515811461210857600080fd5b809150509250929050565b6000806040838503121561212657600080fd5b61212f83611f3c565b946020939093013593505050565b6000806020838503121561215057600080fd5b823567ffffffffffffffff8082111561216857600080fd5b818501915085601f83011261217c57600080fd5b81358181111561218b57600080fd5b8660208260051b85010111156121a057600080fd5b60209290920196919550909350505050565b6000602082840312156121c457600080fd5b813561170c81612588565b6000602082840312156121e157600080fd5b815161170c81612588565b600080602083850312156121ff57600080fd5b823567ffffffffffffffff8082111561221757600080fd5b818501915085601f83011261222b57600080fd5b81358181111561223a57600080fd5b8660208285010111156121a057600080fd5b60006020828403121561225e57600080fd5b5035919050565b60008060006060848603121561227a57600080fd5b83359250602084013567ffffffffffffffff81111561229857600080fd5b6122a486828701611f58565b925050604084013590509250925092565b600081518084526122cd816020860160208601612484565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806122fb57607f831692505b602080841082141561231d57634e487b7160e01b600052602260045260246000fd5b81801561233157600181146123425761236f565b60ff1986168952848901965061236f565b60008881526020902060005b868110156123675781548b82015290850190830161234e565b505084890196505b50505050505092915050565b6bffffffffffffffffffffffff198460601b168152600061239f60148301856122e1565b928352505060200192915050565b60006123b982856122e1565b83516123c9818360208801612484565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612405908301846122b5565b9695505050505050565b60208152600061170c60208301846122b5565b600082198211156124355761243561251a565b500190565b60008261244957612449612530565b500490565b60008160001904831182151516156124685761246861251a565b500290565b60008282101561247f5761247f61251a565b500390565b60005b8381101561249f578181015183820152602001612487565b838111156113755750506000910152565b600181811c908216806124c457607f821691505b602082108114156124e557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124ff576124ff61251a565b5060010190565b60008261251557612515612530565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d5357600080fdfea2646970667358221220197e314334074c58b1753e518c7ee09de90709efdbb90ecdafd93dcc0fe1119a64736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5470386e7465374a6e76516d78624553644c6b33716863434c354e5669715a696a4b445869676472787276642f
Deployed Bytecode
0x6080604052600436106102605760003560e01c8063898f717211610144578063b88d4fde116100b6578063cbe116441161007a578063cbe11644146106b9578063d97d28d2146106d9578063dc30158b146106f9578063e985e9c51461070f578063f2fde38b14610758578063f42202e81461077857600080fd5b8063b88d4fde14610624578063c46eb68514610644578063c627525514610659578063c6f6f21614610679578063c87b56dd1461069957600080fd5b8063a0712d6811610108578063a0712d6814610584578063a10f151e14610597578063a22cb465146105b7578063a945bf80146105d7578063b29418d5146105ed578063b7f751d81461060357600080fd5b8063898f7172146104ee5780638da5cb5b1461050357806390edd6971461052157806395d89b411461054e57806397283d2f1461056357600080fd5b80633ccfd60b116101dd5780636352211e116101a15780636352211e1461044d5780636c19e7831461046d57806370a082311461048d578063715018a6146104ad57806379aee341146104c257806387c0568b146104d857600080fd5b80633ccfd60b146103cf57806342842e0e146103e457806343fbdefd146104045780634b2596c71461041757806355f804b31461042d57600080fd5b806318160ddd1161022457806318160ddd1461033d5780631ead3877146103645780631fe9eabc1461037a57806323b872dd1461039a57806333098c01146103ba57600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb578063163e1e611461031d57600080fd5b3661026757005b600080fd5b34801561027857600080fd5b5061028c6102873660046121b2565b610798565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b66107ea565b604051610298919061240f565b3480156102cf57600080fd5b506102e36102de36600461224c565b61087c565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b610316366004612113565b6108c0565b005b34801561032957600080fd5b5061031b61033836600461213d565b610960565b34801561034957600080fd5b5060015460005403600019015b604051908152602001610298565b34801561037057600080fd5b5061035660115481565b34801561038657600080fd5b5061031b61039536600461224c565b610a2f565b3480156103a657600080fd5b5061031b6103b5366004612033565b610a3c565b3480156103c657600080fd5b5061031b610bcd565b3480156103db57600080fd5b5061031b610bf6565b3480156103f057600080fd5b5061031b6103ff366004612033565b610d56565b61031b610412366004612265565b610d71565b34801561042357600080fd5b50610356600c5481565b34801561043957600080fd5b5061031b6104483660046121ec565b610fa5565b34801561045957600080fd5b506102e361046836600461224c565b610fb9565b34801561047957600080fd5b5061031b610488366004611fe5565b610fc4565b34801561049957600080fd5b506103566104a8366004611fe5565b610fee565b3480156104b957600080fd5b5061031b61103d565b3480156104ce57600080fd5b5061035660105481565b3480156104e457600080fd5b50610356600d5481565b3480156104fa57600080fd5b506102b6611051565b34801561050f57600080fd5b506008546001600160a01b03166102e3565b34801561052d57600080fd5b5061035661053c366004611fe5565b60136020526000908152604090205481565b34801561055a57600080fd5b506102b66110df565b34801561056f57600080fd5b5060125461028c90600160a81b900460ff1681565b61031b61059236600461224c565b6110ee565b3480156105a357600080fd5b5061031b6105b236600461224c565b61128e565b3480156105c357600080fd5b5061031b6105d23660046120d7565b61129b565b3480156105e357600080fd5b50610356600e5481565b3480156105f957600080fd5b50610356600b5481565b34801561060f57600080fd5b5060125461028c90600160a01b900460ff1681565b34801561063057600080fd5b5061031b61063f36600461206f565b611331565b34801561065057600080fd5b5061031b61137b565b34801561066557600080fd5b5061031b61067436600461224c565b6113a4565b34801561068557600080fd5b5061031b61069436600461224c565b6113b1565b3480156106a557600080fd5b506102b66106b436600461224c565b6113be565b3480156106c557600080fd5b5061031b6106d436600461224c565b611447565b3480156106e557600080fd5b506012546102e3906001600160a01b031681565b34801561070557600080fd5b50610356600f5481565b34801561071b57600080fd5b5061028c61072a366004612000565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561076457600080fd5b5061031b610773366004611fe5565b611454565b34801561078457600080fd5b5061031b61079336600461224c565b6114ca565b60006301ffc9a760e01b6001600160e01b0319831614806107c957506380ac58cd60e01b6001600160e01b03198316145b806107e45750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546107f9906124b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610825906124b0565b80156108725780601f1061084757610100808354040283529160200191610872565b820191906000526020600020905b81548152906001019060200180831161085557829003601f168201915b5050505050905090565b600061088782611538565b6108a4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108cb82610fb9565b9050336001600160a01b03821614610904576108e7813361072a565b610904576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61096861156d565b600c54601154610979908390612422565b11156109c15760405162461bcd60e51b81526020600482015260126024820152714558434545445f5445414d5f535550504c5960701b60448201526064015b60405180910390fd5b81819050601160008282546109d69190612422565b90915550600090505b81811015610a2a57610a188383838181106109fc576109fc61255c565b9050602002016020810190610a119190611fe5565b60016115c7565b80610a22816124eb565b9150506109df565b505050565b610a3761156d565b600b55565b6000610a47826116be565b9050836001600160a01b0316816001600160a01b031614610a7a5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610ac757610aaa863361072a565b610ac757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610aee57604051633a954ecd60e21b815260040160405180910390fd5b8015610af957600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610b845760018401600081815260046020526040902054610b82576000548114610b825760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b610bd561156d565b6012805460ff60a01b198116600160a01b9182900460ff1615909102179055565b610bfe61156d565b47610c307040f69b8e3382734491cbaa241b6a863ab36064610c2184600a61244e565b610c2b919061243a565b61172e565b610c5573773daacda9e4d7c7955bcef1fbf807d318501f446064610c2184600a61244e565b610c7a734c35286d99b5879c45538da5f59588a601359e346064610c2184600a61244e565b610c9f733a7d619d3ed6fb04799642f88bd3dfab63af0a836064610c2184600a61244e565b610cc473bf6c44be5ac250b30726e9405d4fd80bd16a1ae26064610c2184600861244e565b610ce9734d214c5ea3dde7e416e128e71a6a547e645e5d9b6064610c2184600661244e565b610d0f73a642830cce2e2741bb654b479dc1dc33e910ae556103e8610c2184605561244e565b610d3573ca7987dc570540f6045759e4207edad2d4f04f826103e8610c2184605561244e565b610d53733fd45f7fc6da24a360e75aff9de577ab5fbdcfe74761172e565b50565b610a2a83838360405180602001604052806000815250611331565b333b158015610d7f57503332145b610dc25760405162461bcd60e51b815260206004820152601460248201527318dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b60448201526064016109b8565b601254600160a81b900460ff16610e095760405162461bcd60e51b815260206004820152600b60248201526a1352539517d0d313d4d15160aa1b60448201526064016109b8565b600b5483601054610e1a9190612422565b1115610e5d5760405162461bcd60e51b81526020600482015260126024820152714558434545445f53414c455f535550504c5960701b60448201526064016109b8565b610e678282611847565b610ea75760405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b60448201526064016109b8565b336000908152601360205260409020548190610ec4908590612422565b1115610f065760405162461bcd60e51b8152602060048201526011602482015270115610d1515117d4115497d5d053131155607a1b60448201526064016109b8565b3483600d54610f15919061244e565b1115610f565760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b60448201526064016109b8565b8260106000828254610f689190612422565b909155505033600090815260136020526040902054610f88908490612422565b33600081815260136020526040902091909155610a2a90846115c7565b610fad61156d565b610a2a60098383611ea3565b60006107e4826116be565b610fcc61156d565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611017576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b61104561156d565b61104f60006118e6565b565b600a805461105e906124b0565b80601f016020809104026020016040519081016040528092919081815260200182805461108a906124b0565b80156110d75780601f106110ac576101008083540402835291602001916110d7565b820191906000526020600020905b8154815290600101906020018083116110ba57829003601f168201915b505050505081565b6060600380546107f9906124b0565b333b1580156110fc57503332145b61113f5760405162461bcd60e51b815260206004820152601460248201527318dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b60448201526064016109b8565b601254600160a01b900460ff166111865760405162461bcd60e51b815260206004820152600b60248201526a1352539517d0d313d4d15160aa1b60448201526064016109b8565b600b54816010546111979190612422565b11156111da5760405162461bcd60e51b81526020600482015260126024820152714558434545445f53414c455f535550504c5960701b60448201526064016109b8565b600f5481111561121c5760405162461bcd60e51b815260206004820152600d60248201526c08ab0868a8a88bea08aa4bea8b609b1b60448201526064016109b8565b3481600e5461122b919061244e565b111561126c5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b60448201526064016109b8565b806010600082825461127e9190612422565b90915550610d53905033826115c7565b61129661156d565b600d55565b6001600160a01b0382163314156112c55760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61133c848484610a3c565b6001600160a01b0383163b156113755761135884848484611938565b611375576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b61138361156d565b6012805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6113ac61156d565b600e55565b6113b961156d565b600f55565b60606113c982611538565b6114155760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064016109b8565b600961142083611a30565b6040516020016114319291906123ad565b6040516020818303038152906040529050919050565b61144f61156d565b600c55565b61145c61156d565b6001600160a01b0381166114c15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610d53816118e6565b6114d261156d565b600c54816011546114e39190612422565b11156115265760405162461bcd60e51b81526020600482015260126024820152714558434545445f5445414d5f535550504c5960701b60448201526064016109b8565b806011600082825461127e9190612422565b60008160011115801561154c575060005482105b80156107e4575050600090815260046020526040902054600160e01b161590565b6008546001600160a01b0316331461104f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b600054816115e85760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461169757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460010161165f565b50816116b557604051622e076360e81b815260040160405180910390fd5b60005550505050565b600081806001116117155760005481101561171557600081815260046020526040902054600160e01b8116611713575b8061170c5750600019016000818152600460205260409020546116ee565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b8047101561177e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109b8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146117cb576040519150601f19603f3d011682016040523d82523d6000602084013e6117d0565b606091505b5050905080610a2a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109b8565b60008033600a846040516020016118609392919061237b565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f19818403018152919052805160209091012090506118cd8185611b2e565b6012546001600160a01b03918216911614949350505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061196d9033908990889088906004016123d2565b602060405180830381600087803b15801561198757600080fd5b505af19250505080156119b7575060408051601f3d908101601f191682019092526119b4918101906121cf565b60015b611a12573d8080156119e5576040519150601f19603f3d011682016040523d82523d6000602084013e6119ea565b606091505b508051611a0a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081611a545750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a7e5780611a68816124eb565b9150611a779050600a8361243a565b9150611a58565b60008167ffffffffffffffff811115611a9957611a99612572565b6040519080825280601f01601f191660200182016040528015611ac3576020820181803683370190505b5090505b8415611a2857611ad860018361246d565b9150611ae5600a86612506565b611af0906030612422565b60f81b818381518110611b0557611b0561255c565b60200101906001600160f81b031916908160001a905350611b27600a8661243a565b9450611ac7565b6000806000611b3d8585611b52565b91509150611b4a81611bc2565b509392505050565b600080825160411415611b895760208301516040840151606085015160001a611b7d87828585611d7d565b94509450505050611bbb565b825160401415611bb35760208301516040840151611ba8868383611e6a565b935093505050611bbb565b506000905060025b9250929050565b6000816004811115611bd657611bd6612546565b1415611bdf5750565b6001816004811115611bf357611bf3612546565b1415611c415760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109b8565b6002816004811115611c5557611c55612546565b1415611ca35760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109b8565b6003816004811115611cb757611cb7612546565b1415611d105760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109b8565b6004816004811115611d2457611d24612546565b1415610d535760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109b8565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611db45750600090506003611e61565b8460ff16601b14158015611dcc57508460ff16601c14155b15611ddd5750600090506004611e61565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e31573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611e5a57600060019250925050611e61565b9150600090505b94509492505050565b6000806001600160ff1b03831681611e8760ff86901c601b612422565b9050611e9587828885611d7d565b935093505050935093915050565b828054611eaf906124b0565b90600052602060002090601f016020900481019282611ed15760008555611f17565b82601f10611eea5782800160ff19823516178555611f17565b82800160010185558215611f17579182015b82811115611f17578235825591602001919060010190611efc565b50611f23929150611f27565b5090565b5b80821115611f235760008155600101611f28565b80356001600160a01b0381168114611f5357600080fd5b919050565b600082601f830112611f6957600080fd5b813567ffffffffffffffff80821115611f8457611f84612572565b604051601f8301601f19908116603f01168101908282118183101715611fac57611fac612572565b81604052838152866020858801011115611fc557600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611ff757600080fd5b61170c82611f3c565b6000806040838503121561201357600080fd5b61201c83611f3c565b915061202a60208401611f3c565b90509250929050565b60008060006060848603121561204857600080fd5b61205184611f3c565b925061205f60208501611f3c565b9150604084013590509250925092565b6000806000806080858703121561208557600080fd5b61208e85611f3c565b935061209c60208601611f3c565b925060408501359150606085013567ffffffffffffffff8111156120bf57600080fd5b6120cb87828801611f58565b91505092959194509250565b600080604083850312156120ea57600080fd5b6120f383611f3c565b91506020830135801515811461210857600080fd5b809150509250929050565b6000806040838503121561212657600080fd5b61212f83611f3c565b946020939093013593505050565b6000806020838503121561215057600080fd5b823567ffffffffffffffff8082111561216857600080fd5b818501915085601f83011261217c57600080fd5b81358181111561218b57600080fd5b8660208260051b85010111156121a057600080fd5b60209290920196919550909350505050565b6000602082840312156121c457600080fd5b813561170c81612588565b6000602082840312156121e157600080fd5b815161170c81612588565b600080602083850312156121ff57600080fd5b823567ffffffffffffffff8082111561221757600080fd5b818501915085601f83011261222b57600080fd5b81358181111561223a57600080fd5b8660208285010111156121a057600080fd5b60006020828403121561225e57600080fd5b5035919050565b60008060006060848603121561227a57600080fd5b83359250602084013567ffffffffffffffff81111561229857600080fd5b6122a486828701611f58565b925050604084013590509250925092565b600081518084526122cd816020860160208601612484565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806122fb57607f831692505b602080841082141561231d57634e487b7160e01b600052602260045260246000fd5b81801561233157600181146123425761236f565b60ff1986168952848901965061236f565b60008881526020902060005b868110156123675781548b82015290850190830161234e565b505084890196505b50505050505092915050565b6bffffffffffffffffffffffff198460601b168152600061239f60148301856122e1565b928352505060200192915050565b60006123b982856122e1565b83516123c9818360208801612484565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612405908301846122b5565b9695505050505050565b60208152600061170c60208301846122b5565b600082198211156124355761243561251a565b500190565b60008261244957612449612530565b500490565b60008160001904831182151516156124685761246861251a565b500290565b60008282101561247f5761247f61251a565b500390565b60005b8381101561249f578181015183820152602001612487565b838111156113755750506000910152565b600181811c908216806124c457607f821691505b602082108114156124e557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124ff576124ff61251a565b5060010190565b60008261251557612515612530565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d5357600080fdfea2646970667358221220197e314334074c58b1753e518c7ee09de90709efdbb90ecdafd93dcc0fe1119a64736f6c63430008070033
Deployed Bytecode Sourcemap
75962:5858:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43098:639;;;;;;;;;;-1:-1:-1;43098:639:0;;;;;:::i;:::-;;:::i;:::-;;;8714:14:1;;8707:22;8689:41;;8677:2;8662:18;43098:639:0;;;;;;;;44000:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50483:218::-;;;;;;;;;;-1:-1:-1;50483:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8012:32:1;;;7994:51;;7982:2;7967:18;50483:218:0;7848:203:1;49924:400:0;;;;;;;;;;-1:-1:-1;49924:400:0;;;;;:::i;:::-;;:::i;:::-;;79118:330;;;;;;;;;;-1:-1:-1;79118:330:0;;;;;:::i;:::-;;:::i;39751:323::-;;;;;;;;;;-1:-1:-1;76891:1:0;40025:12;39812:7;40009:13;:28;-1:-1:-1;;40009:46:0;39751:323;;;15708:25:1;;;15696:2;15681:18;39751:323:0;15562:177:1;76498:32:0;;;;;;;;;;;;;;;;80142:96;;;;;;;;;;-1:-1:-1;80142:96:0;;;;;:::i;:::-;;:::i;54190:2817::-;;;;;;;;;;-1:-1:-1;54190:2817:0;;;;;:::i;:::-;;:::i;79717:92::-;;;;;;;;;;;;;:::i;80688:1092::-;;;;;;;;;;;;;:::i;57103:185::-;;;;;;;;;;-1:-1:-1;57103:185:0;;;;;:::i;:::-;;:::i;78068:679::-;;;;;;:::i;:::-;;:::i;76290:34::-;;;;;;;;;;;;;;;;80574:106;;;;;;;;;;-1:-1:-1;80574:106:0;;;;;:::i;:::-;;:::i;45393:152::-;;;;;;;;;;-1:-1:-1;45393:152:0;;;;;:::i;:::-;;:::i;80463:103::-;;;;;;;;;;-1:-1:-1;80463:103:0;;;;;:::i;:::-;;:::i;40935:233::-;;;;;;;;;;-1:-1:-1;40935:233:0;;;;;:::i;:::-;;:::i;23846:103::-;;;;;;;;;;;;;:::i;76463:28::-;;;;;;;;;;;;;;;;76331:40;;;;;;;;;;;;;;;;76192:49;;;;;;;;;;;;;:::i;23198:87::-;;;;;;;;;;-1:-1:-1;23271:6:0;;-1:-1:-1;;;;;23271:6:0;23198:87;;76678:49;;;;;;;;;;-1:-1:-1;76678:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;44176:104;;;;;;;;;;;;;:::i;76646:23::-;;;;;;;;;;-1:-1:-1;76646:23:0;;;;-1:-1:-1;;;76646:23:0;;;;;;77621:439;;;;;;:::i;:::-;;:::i;80030:104::-;;;;;;;;;;-1:-1:-1;80030:104:0;;;;;:::i;:::-;;:::i;51041:308::-;;;;;;;;;;-1:-1:-1;51041:308:0;;;;;:::i;:::-;;:::i;76378:39::-;;;;;;;;;;;;;;;;76248:35;;;;;;;;;;;;;;;;76617:22;;;;;;;;;;-1:-1:-1;76617:22:0;;;;-1:-1:-1;;;76617:22:0;;;;;;57886:399;;;;;;;;;;-1:-1:-1;57886:399:0;;;;;:::i;:::-;;:::i;79817:95::-;;;;;;;;;;;;;:::i;79920:102::-;;;;;;;;;;-1:-1:-1;79920:102:0;;;;;:::i;:::-;;:::i;80354:101::-;;;;;;;;;;-1:-1:-1;80354:101:0;;;;;:::i;:::-;;:::i;78755:239::-;;;;;;;;;;-1:-1:-1;78755:239:0;;;;;:::i;:::-;;:::i;80246:100::-;;;;;;;;;;-1:-1:-1;80246:100:0;;;;;:::i;:::-;;:::i;76537:73::-;;;;;;;;;;-1:-1:-1;76537:73:0;;;;-1:-1:-1;;;;;76537:73:0;;;76424:32;;;;;;;;;;;;;;;;51506:164;;;;;;;;;;-1:-1:-1;51506:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;51627:25:0;;;51603:4;51627:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;51506:164;24104:201;;;;;;;;;;-1:-1:-1;24104:201:0;;;;;:::i;:::-;;:::i;79456:253::-;;;;;;;;;;-1:-1:-1;79456:253:0;;;;;:::i;:::-;;:::i;43098:639::-;43183:4;-1:-1:-1;;;;;;;;;43507:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;43584:25:0;;;43507:102;:179;;;-1:-1:-1;;;;;;;;;;43661:25:0;;;43507:179;43487:199;43098:639;-1:-1:-1;;43098:639:0:o;44000:100::-;44054:13;44087:5;44080:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44000:100;:::o;50483:218::-;50559:7;50584:16;50592:7;50584;:16::i;:::-;50579:64;;50609:34;;-1:-1:-1;;;50609:34:0;;;;;;;;;;;50579:64;-1:-1:-1;50663:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;50663:30:0;;50483:218::o;49924:400::-;50005:13;50021:16;50029:7;50021;:16::i;:::-;50005:32;-1:-1:-1;73781:10:0;-1:-1:-1;;;;;50054:28:0;;;50050:175;;50102:44;50119:5;73781:10;51506:164;:::i;50102:44::-;50097:128;;50174:35;;-1:-1:-1;;;50174:35:0;;;;;;;;;;;50097:128;50237:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;50237:35:0;-1:-1:-1;;;;;50237:35:0;;;;;;;;;50288:28;;50237:24;;50288:28;;;;;;;49994:330;49924:400;;:::o;79118:330::-;23084:13;:11;:13::i;:::-;79240::::1;::::0;79200:17:::1;::::0;:36:::1;::::0;79220:9;;79200:36:::1;:::i;:::-;:53;;79192:84;;;::::0;-1:-1:-1;;;79192:84:0;;13314:2:1;79192:84:0::1;::::0;::::1;13296:21:1::0;13353:2;13333:18;;;13326:30;-1:-1:-1;;;13372:18:1;;;13365:48;13430:18;;79192:84:0::1;;;;;;;;;79318:9;;:16;;79297:17;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;79350:9:0::1;::::0;-1:-1:-1;79345:96:0::1;79365:20:::0;;::::1;79345:96;;;79407:22;79413:9;;79423:1;79413:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;79427:1;79407:5;:22::i;:::-;79387:3:::0;::::1;::::0;::::1;:::i;:::-;;;;79345:96;;;;79118:330:::0;;:::o;80142:96::-;23084:13;:11;:13::i;:::-;80206::::1;:24:::0;80142:96::o;54190:2817::-;54324:27;54354;54373:7;54354:18;:27::i;:::-;54324:57;;54439:4;-1:-1:-1;;;;;54398:45:0;54414:19;-1:-1:-1;;;;;54398:45:0;;54394:86;;54452:28;;-1:-1:-1;;;54452:28:0;;;;;;;;;;;54394:86;54494:27;53304:24;;;:15;:24;;;;;53526:26;;73781:10;52929:30;;;-1:-1:-1;;;;;52622:28:0;;52907:20;;;52904:56;54680:180;;54773:43;54790:4;73781:10;51506:164;:::i;54773:43::-;54768:92;;54825:35;;-1:-1:-1;;;54825:35:0;;;;;;;;;;;54768:92;-1:-1:-1;;;;;54877:16:0;;54873:52;;54902:23;;-1:-1:-1;;;54902:23:0;;;;;;;;;;;54873:52;55074:15;55071:160;;;55214:1;55193:19;55186:30;55071:160;-1:-1:-1;;;;;55611:24:0;;;;;;;:18;:24;;;;;;55609:26;;-1:-1:-1;;55609:26:0;;;55680:22;;;;;;;;;55678:24;;-1:-1:-1;55678:24:0;;;48782:11;48757:23;48753:41;48740:63;-1:-1:-1;;;48740:63:0;55973:26;;;;:17;:26;;;;;:175;-1:-1:-1;;;56268:47:0;;56264:627;;56373:1;56363:11;;56341:19;56496:30;;;:17;:30;;;;;;56492:384;;56634:13;;56619:11;:28;56615:242;;56781:30;;;;:17;:30;;;;;:52;;;56615:242;56322:569;56264:627;56938:7;56934:2;-1:-1:-1;;;;;56919:27:0;56928:4;-1:-1:-1;;;;;56919:27:0;;;;;;;;;;;54313:2694;;;54190:2817;;;:::o;79717:92::-;23084:13;:11;:13::i;:::-;79791:10:::1;::::0;;-1:-1:-1;;;;79777:24:0;::::1;-1:-1:-1::0;;;79791:10:0;;;::::1;;;79790:11;79777:24:::0;;::::1;;::::0;;79717:92::o;80688:1092::-;23084:13;:11;:13::i;:::-;80763:21:::1;80795:99;80821:42;80890:3;80867:19;80763:21:::0;80884:2:::1;80867:19;:::i;:::-;80866:27;;;;:::i;:::-;80795:17;:99::i;:::-;80905;80931:42;81000:3;80977:19;:14:::0;80994:2:::1;80977:19;:::i;80905:99::-;81015;81041:42;81110:3;81087:19;:14:::0;81104:2:::1;81087:19;:::i;81015:99::-;81125;81151:42;81220:3;81197:19;:14:::0;81214:2:::1;81197:19;:::i;81125:99::-;81235:98;81261:42;81329:3;81307:18;:14:::0;81324:1:::1;81307:18;:::i;81235:98::-;81344;81370:42;81438:3;81416:18;:14:::0;81433:1:::1;81416:18;:::i;81344:98::-;81453:100;81479:42;81548:4;81525:19;:14:::0;81542:2:::1;81525:19;:::i;81453:100::-;81564;81590:42;81659:4;81636:19;:14:::0;81653:2:::1;81636:19;:::i;81564:100::-;81675:93;81701:42;81746:21;81675:17;:93::i;:::-;80727:1053;80688:1092::o:0;57103:185::-;57241:39;57258:4;57264:2;57268:7;57241:39;;;;;;;;;;;;:16;:39::i;78068:679::-;76978:10;77225:17;77270:8;;;76964:55;;-1:-1:-1;76995:10:0;77009:9;76995:23;76964:55;76942:125;;;;-1:-1:-1;;;76942:125:0;;14022:2:1;76942:125:0;;;14004:21:1;14061:2;14041:18;;;14034:30;-1:-1:-1;;;14080:18:1;;;14073:50;14140:18;;76942:125:0;13820:344:1;76942:125:0;78202:11:::1;::::0;-1:-1:-1;;;78202:11:0;::::1;;;78194:35;;;::::0;-1:-1:-1;;;78194:35:0;;10690:2:1;78194:35:0::1;::::0;::::1;10672:21:1::0;10729:2;10709:18;;;10702:30;-1:-1:-1;;;10748:18:1;;;10741:41;10799:18;;78194:35:0::1;10488:335:1::0;78194:35:0::1;78281:13;;78264;78248;;:29;;;;:::i;:::-;:46;;78240:77;;;::::0;-1:-1:-1;;;78240:77:0;;12564:2:1;78240:77:0::1;::::0;::::1;12546:21:1::0;12603:2;12583:18;;;12576:30;-1:-1:-1;;;12622:18:1;;;12615:48;12680:18;;78240:77:0::1;12362:342:1::0;78240:77:0::1;78336:38;78354:9;78365:8;78336:17;:38::i;:::-;78328:68;;;::::0;-1:-1:-1;;;78328:68:0;;12218:2:1;78328:68:0::1;::::0;::::1;12200:21:1::0;12257:2;12237:18;;;12230:30;-1:-1:-1;;;12276:18:1;;;12269:47;12333:18;;78328:68:0::1;12016:341:1::0;78328:68:0::1;78430:10;78415:26;::::0;;;:14:::1;:26;::::0;;;;;78461:8;;78415:42:::1;::::0;78444:13;;78415:42:::1;:::i;:::-;:54;;78407:84;;;::::0;-1:-1:-1;;;78407:84:0;;14371:2:1;78407:84:0::1;::::0;::::1;14353:21:1::0;14410:2;14390:18;;;14383:30;-1:-1:-1;;;14429:18:1;;;14422:47;14486:18;;78407:84:0::1;14169:341:1::0;78407:84:0::1;78542:9;78525:13;78510:12;;:28;;;;:::i;:::-;:41;;78502:70;;;::::0;-1:-1:-1;;;78502:70:0;;15419:2:1;78502:70:0::1;::::0;::::1;15401:21:1::0;15458:2;15438:18;;;15431:30;-1:-1:-1;;;15477:18:1;;;15470:46;15533:18;;78502:70:0::1;15217:340:1::0;78502:70:0::1;78601:13;78585;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;78669:10:0::1;78654:26;::::0;;;:14:::1;:26;::::0;;;;;:42:::1;::::0;78683:13;;78654:42:::1;:::i;:::-;78640:10;78625:26;::::0;;;:14:::1;:26;::::0;;;;:71;;;;78707:32:::1;::::0;78725:13;78707:5:::1;:32::i;80574:106::-:0;23084:13;:11;:13::i;:::-;80652:20:::1;:7;80662:10:::0;;80652:20:::1;:::i;45393:152::-:0;45465:7;45508:27;45527:7;45508:18;:27::i;80463:103::-;23084:13;:11;:13::i;:::-;80532::::1;:26:::0;;-1:-1:-1;;;;;;80532:26:0::1;-1:-1:-1::0;;;;;80532:26:0;;;::::1;::::0;;;::::1;::::0;;80463:103::o;40935:233::-;41007:7;-1:-1:-1;;;;;41031:19:0;;41027:60;;41059:28;;-1:-1:-1;;;41059:28:0;;;;;;;;;;;41027:60;-1:-1:-1;;;;;;41105:25:0;;;;;:18;:25;;;;;;35094:13;41105:55;;40935:233::o;23846:103::-;23084:13;:11;:13::i;:::-;23911:30:::1;23938:1;23911:18;:30::i;:::-;23846:103::o:0;76192:49::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44176:104::-;44232:13;44265:7;44258:14;;;;;:::i;77621:439::-;76978:10;77225:17;77270:8;;;76964:55;;-1:-1:-1;76995:10:0;77009:9;76995:23;76964:55;76942:125;;;;-1:-1:-1;;;76942:125:0;;14022:2:1;76942:125:0;;;14004:21:1;14061:2;14041:18;;;14034:30;-1:-1:-1;;;14080:18:1;;;14073:50;14140:18;;76942:125:0;13820:344:1;76942:125:0;77706:10:::1;::::0;-1:-1:-1;;;77706:10:0;::::1;;;77698:34;;;::::0;-1:-1:-1;;;77698:34:0;;10690:2:1;77698:34:0::1;::::0;::::1;10672:21:1::0;10729:2;10709:18;;;10702:30;-1:-1:-1;;;10748:18:1;;;10741:41;10799:18;;77698:34:0::1;10488:335:1::0;77698:34:0::1;77784:13;;77767;77751;;:29;;;;:::i;:::-;:46;;77743:77;;;::::0;-1:-1:-1;;;77743:77:0;;12564:2:1;77743:77:0::1;::::0;::::1;12546:21:1::0;12603:2;12583:18;;;12576:30;-1:-1:-1;;;12622:18:1;;;12615:48;12680:18;;77743:77:0::1;12362:342:1::0;77743:77:0::1;77856:13;;77839;:30;;77831:56;;;::::0;-1:-1:-1;;;77831:56:0;;15077:2:1;77831:56:0::1;::::0;::::1;15059:21:1::0;15116:2;15096:18;;;15089:30;-1:-1:-1;;;15135:18:1;;;15128:43;15188:18;;77831:56:0::1;14875:337:1::0;77831:56:0::1;77937:9;77920:13;77906:11;;:27;;;;:::i;:::-;:40;;77898:69;;;::::0;-1:-1:-1;;;77898:69:0;;15419:2:1;77898:69:0::1;::::0;::::1;15401:21:1::0;15458:2;15438:18;;;15431:30;-1:-1:-1;;;15477:18:1;;;15470:46;15533:18;;77898:69:0::1;15217:340:1::0;77898:69:0::1;77996:13;77980;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;78020:32:0::1;::::0;-1:-1:-1;78026:10:0::1;78038:13:::0;78020:5:::1;:32::i;80030:104::-:0;23084:13;:11;:13::i;:::-;80103:12:::1;:23:::0;80030:104::o;51041:308::-;-1:-1:-1;;;;;51140:31:0;;73781:10;51140:31;51136:61;;;51180:17;;-1:-1:-1;;;51180:17:0;;;;;;;;;;;51136:61;73781:10;51210:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;51210:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;51210:60:0;;;;;;;;;;51286:55;;8689:41:1;;;51210:49:0;;73781:10;51286:55;;8662:18:1;51286:55:0;;;;;;;51041:308;;:::o;57886:399::-;58053:31;58066:4;58072:2;58076:7;58053:12;:31::i;:::-;-1:-1:-1;;;;;58099:14:0;;;:19;58095:183;;58138:56;58169:4;58175:2;58179:7;58188:5;58138:30;:56::i;:::-;58133:145;;58222:40;;-1:-1:-1;;;58222:40:0;;;;;;;;;;;58133:145;57886:399;;;;:::o;79817:95::-;23084:13;:11;:13::i;:::-;79893:11:::1;::::0;;-1:-1:-1;;;;79878:26:0;::::1;-1:-1:-1::0;;;79893:11:0;;;::::1;;;79892:12;79878:26:::0;;::::1;;::::0;;79817:95::o;79920:102::-;23084:13;:11;:13::i;:::-;79992:11:::1;:22:::0;79920:102::o;80354:101::-;23084:13;:11;:13::i;:::-;80423::::1;:24:::0;80354:101::o;78755:239::-;78829:13;78863:16;78871:7;78863;:16::i;:::-;78855:60;;;;-1:-1:-1;;;78855:60:0;;14717:2:1;78855:60:0;;;14699:21:1;14756:2;14736:18;;;14729:30;14795:33;14775:18;;;14768:61;14846:18;;78855:60:0;14515:355:1;78855:60:0;78957:7;78966:18;:7;:16;:18::i;:::-;78940:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78926:60;;78755:239;;;:::o;80246:100::-;23084:13;:11;:13::i;:::-;80314::::1;:24:::0;80246:100::o;24104:201::-;23084:13;:11;:13::i;:::-;-1:-1:-1;;;;;24193:22:0;::::1;24185:73;;;::::0;-1:-1:-1;;;24185:73:0;;10283:2:1;24185:73:0::1;::::0;::::1;10265:21:1::0;10322:2;10302:18;;;10295:30;10361:34;10341:18;;;10334:62;-1:-1:-1;;;10412:18:1;;;10405:36;10458:19;;24185:73:0::1;10081:402:1::0;24185:73:0::1;24269:28;24288:8;24269:18;:28::i;79456:253::-:0;23084:13;:11;:13::i;:::-;79575::::1;;79558;79538:17;;:33;;;;:::i;:::-;:50;;79530:81;;;::::0;-1:-1:-1;;;79530:81:0;;13314:2:1;79530:81:0::1;::::0;::::1;13296:21:1::0;13353:2;13333:18;;;13326:30;-1:-1:-1;;;13372:18:1;;;13365:48;13430:18;;79530:81:0::1;13112:342:1::0;79530:81:0::1;79645:13;79624:17;;:34;;;;;;;:::i;51928:282::-:0;51993:4;52049:7;76891:1;52030:26;;:66;;;;;52083:13;;52073:7;:23;52030:66;:153;;;;-1:-1:-1;;52134:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;52134:44:0;:49;;51928:282::o;23363:132::-;23271:6;;-1:-1:-1;;;;;23271:6:0;73781:10;23427:23;23419:68;;;;-1:-1:-1;;;23419:68:0;;13661:2:1;23419:68:0;;;13643:21:1;;;13680:18;;;13673:30;13739:34;13719:18;;;13712:62;13791:18;;23419:68:0;13459:356:1;61547:2454:0;61620:20;61643:13;61671;61667:44;;61693:18;;-1:-1:-1;;;61693:18:0;;;;;;;;;;;61667:44;-1:-1:-1;;;;;62199:22:0;;;;;;:18;:22;;;;35232:2;62199:22;;;:71;;62237:32;62225:45;;62199:71;;;62513:31;;;:17;:31;;;;;-1:-1:-1;49213:15:0;;49187:24;49183:46;48782:11;48757:23;48753:41;48750:52;48740:63;;62513:173;;62748:23;;;;62513:31;;62199:22;;63247:25;62199:22;;63100:335;63515:1;63501:12;63497:20;63455:346;63556:3;63547:7;63544:16;63455:346;;63774:7;63764:8;63761:1;63734:25;63731:1;63728;63723:59;63609:1;63596:15;63455:346;;;-1:-1:-1;63834:13:0;63830:45;;63856:19;;-1:-1:-1;;;63856:19:0;;;;;;;;;;;63830:45;63892:13;:19;-1:-1:-1;79345:96:0::1;79118:330:::0;;:::o;46548:1275::-;46615:7;46650;;76891:1;46699:23;46695:1061;;46752:13;;46745:4;:20;46741:1015;;;46790:14;46807:23;;;:17;:23;;;;;;-1:-1:-1;;;46896:24:0;;46892:845;;47561:113;47568:11;47561:113;;-1:-1:-1;;;47639:6:0;47621:25;;;;:17;:25;;;;;;47561:113;;;47707:6;46548:1275;-1:-1:-1;;;46548:1275:0:o;46892:845::-;46767:989;46741:1015;47784:31;;-1:-1:-1;;;47784:31:0;;;;;;;;;;;15011:317;15126:6;15101:21;:31;;15093:73;;;;-1:-1:-1;;;15093:73:0;;11860:2:1;15093:73:0;;;11842:21:1;11899:2;11879:18;;;11872:30;11938:31;11918:18;;;11911:59;11987:18;;15093:73:0;11658:353:1;15093:73:0;15180:12;15198:9;-1:-1:-1;;;;;15198:14:0;15220:6;15198:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15179:52;;;15250:7;15242:78;;;;-1:-1:-1;;;15242:78:0;;11030:2:1;15242:78:0;;;11012:21:1;11069:2;11049:18;;;11042:30;11108:34;11088:18;;;11081:62;11179:28;11159:18;;;11152:56;11225:19;;15242:78:0;10828:422:1;77294:319:0;77385:4;77402:12;77507:10;77519:14;77535:8;77490:54;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;77490:54:0;;;;;;;;;;77480:65;;77490:54;77480:65;;;;7495:66:1;77427:119:0;;;7483:79:1;;;;7578:12;;;7571:28;7615:12;;77427:119:0;;;-1:-1:-1;;77427:119:0;;;;;;;;;77417:130;;77427:119;77417:130;;;;;-1:-1:-1;77582:23:0;77417:130;77595:9;77582:12;:23::i;:::-;77565:13;;-1:-1:-1;;;;;77565:40:0;;;:13;;:40;;77294:319;-1:-1:-1;;;;77294:319:0:o;24465:191::-;24558:6;;;-1:-1:-1;;;;;24575:17:0;;;-1:-1:-1;;;;;;24575:17:0;;;;;;;24608:40;;24558:6;;;24575:17;24558:6;;24608:40;;24539:16;;24608:40;24528:128;24465:191;:::o;60369:716::-;60553:88;;-1:-1:-1;;;60553:88:0;;60532:4;;-1:-1:-1;;;;;60553:45:0;;;;;:88;;73781:10;;60620:4;;60626:7;;60635:5;;60553:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60553:88:0;;;;;;;;-1:-1:-1;;60553:88:0;;;;;;;;;;;;:::i;:::-;;;60549:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60836:13:0;;60832:235;;60882:40;;-1:-1:-1;;;60882:40:0;;;;;;;;;;;60832:235;61025:6;61019:13;61010:6;61006:2;61002:15;60995:38;60549:529;-1:-1:-1;;;;;;60712:64:0;-1:-1:-1;;;60712:64:0;;-1:-1:-1;60549:529:0;60369:716;;;;;;:::o;820:723::-;876:13;1097:10;1093:53;;-1:-1:-1;;1124:10:0;;;;;;;;;;;;-1:-1:-1;;;1124:10:0;;;;;820:723::o;1093:53::-;1171:5;1156:12;1212:78;1219:9;;1212:78;;1245:8;;;;:::i;:::-;;-1:-1:-1;1268:10:0;;-1:-1:-1;1276:2:0;1268:10;;:::i;:::-;;;1212:78;;;1300:19;1332:6;1322:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1322:17:0;;1300:39;;1350:154;1357:10;;1350:154;;1384:11;1394:1;1384:11;;:::i;:::-;;-1:-1:-1;1453:10:0;1461:2;1453:5;:10;:::i;:::-;1440:24;;:2;:24;:::i;:::-;1427:39;;1410:6;1417;1410:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1410:56:0;;;;;;;;-1:-1:-1;1481:11:0;1490:2;1481:11;;:::i;:::-;;;1350:154;;7400:231;7478:7;7499:17;7518:18;7540:27;7551:4;7557:9;7540:10;:27::i;:::-;7498:69;;;;7578:18;7590:5;7578:11;:18::i;:::-;-1:-1:-1;7614:9:0;7400:231;-1:-1:-1;;;7400:231:0:o;5194:1404::-;5275:7;5284:12;5509:9;:16;5529:2;5509:22;5505:1086;;;5853:4;5838:20;;5832:27;5903:4;5888:20;;5882:27;5961:4;5946:20;;5940:27;5548:9;5932:36;6004:25;6015:4;5932:36;5832:27;5882;6004:10;:25::i;:::-;5997:32;;;;;;;;;5505:1086;6051:9;:16;6071:2;6051:22;6047:544;;;6374:4;6359:20;;6353:27;6425:4;6410:20;;6404:27;6467:23;6478:4;6353:27;6404;6467:10;:23::i;:::-;6460:30;;;;;;;;6047:544;-1:-1:-1;6539:1:0;;-1:-1:-1;6543:35:0;6047:544;5194:1404;;;;;:::o;3465:643::-;3543:20;3534:5;:29;;;;;;;;:::i;:::-;;3530:571;;;3465:643;:::o;3530:571::-;3641:29;3632:5;:38;;;;;;;;:::i;:::-;;3628:473;;;3687:34;;-1:-1:-1;;;3687:34:0;;9570:2:1;3687:34:0;;;9552:21:1;9609:2;9589:18;;;9582:30;9648:26;9628:18;;;9621:54;9692:18;;3687:34:0;9368:348:1;3628:473:0;3752:35;3743:5;:44;;;;;;;;:::i;:::-;;3739:362;;;3804:41;;-1:-1:-1;;;3804:41:0;;9923:2:1;3804:41:0;;;9905:21:1;9962:2;9942:18;;;9935:30;10001:33;9981:18;;;9974:61;10052:18;;3804:41:0;9721:355:1;3739:362:0;3876:30;3867:5;:39;;;;;;;;:::i;:::-;;3863:238;;;3923:44;;-1:-1:-1;;;3923:44:0;;11457:2:1;3923:44:0;;;11439:21:1;11496:2;11476:18;;;11469:30;11535:34;11515:18;;;11508:62;-1:-1:-1;;;11586:18:1;;;11579:32;11628:19;;3923:44:0;11255:398:1;3863:238:0;3998:30;3989:5;:39;;;;;;;;:::i;:::-;;3985:116;;;4045:44;;-1:-1:-1;;;4045:44:0;;12911:2:1;4045:44:0;;;12893:21:1;12950:2;12930:18;;;12923:30;12989:34;12969:18;;;12962:62;-1:-1:-1;;;13040:18:1;;;13033:32;13082:19;;4045:44:0;12709:398:1;8852:1632:0;8983:7;;9917:66;9904:79;;9900:163;;;-1:-1:-1;10016:1:0;;-1:-1:-1;10020:30:0;10000:51;;9900:163;10077:1;:7;;10082:2;10077:7;;:18;;;;;10088:1;:7;;10093:2;10088:7;;10077:18;10073:102;;;-1:-1:-1;10128:1:0;;-1:-1:-1;10132:30:0;10112:51;;10073:102;10289:24;;;10272:14;10289:24;;;;;;;;;8968:25:1;;;9041:4;9029:17;;9009:18;;;9002:45;;;;9063:18;;;9056:34;;;9106:18;;;9099:34;;;10289:24:0;;8940:19:1;;10289:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10289:24:0;;-1:-1:-1;;10289:24:0;;;-1:-1:-1;;;;;;;10328:20:0;;10324:103;;10381:1;10385:29;10365:50;;;;;;;10324:103;10447:6;-1:-1:-1;10455:20:0;;-1:-1:-1;8852:1632:0;;;;;;;;:::o;7894:344::-;8008:7;;-1:-1:-1;;;;;8054:80:0;;8008:7;8161:25;8177:3;8162:18;;;8184:2;8161:25;:::i;:::-;8145:42;;8205:25;8216:4;8222:1;8225;8228;8205:10;:25::i;:::-;8198:32;;;;;;7894:344;;;;;;:::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;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:615::-;2943:6;2951;3004:2;2992:9;2983:7;2979:23;2975:32;2972:52;;;3020:1;3017;3010:12;2972:52;3060:9;3047:23;3089:18;3130:2;3122:6;3119:14;3116:34;;;3146:1;3143;3136:12;3116:34;3184:6;3173:9;3169:22;3159:32;;3229:7;3222:4;3218:2;3214:13;3210:27;3200:55;;3251:1;3248;3241:12;3200:55;3291:2;3278:16;3317:2;3309:6;3306:14;3303:34;;;3333:1;3330;3323:12;3303:34;3386:7;3381:2;3371:6;3368:1;3364:14;3360:2;3356:23;3352:32;3349:45;3346:65;;;3407:1;3404;3397:12;3346:65;3438:2;3430:11;;;;;3460:6;;-1:-1:-1;2857:615:1;;-1:-1:-1;;;;2857:615:1:o;3477:245::-;3535:6;3588:2;3576:9;3567:7;3563:23;3559:32;3556:52;;;3604:1;3601;3594:12;3556:52;3643:9;3630:23;3662:30;3686:5;3662:30;:::i;3727:249::-;3796:6;3849:2;3837:9;3828:7;3824:23;3820:32;3817:52;;;3865:1;3862;3855:12;3817:52;3897:9;3891:16;3916:30;3940:5;3916:30;:::i;3981:592::-;4052:6;4060;4113:2;4101:9;4092:7;4088:23;4084:32;4081:52;;;4129:1;4126;4119:12;4081:52;4169:9;4156:23;4198:18;4239:2;4231:6;4228:14;4225:34;;;4255:1;4252;4245:12;4225:34;4293:6;4282:9;4278:22;4268:32;;4338:7;4331:4;4327:2;4323:13;4319:27;4309:55;;4360:1;4357;4350:12;4309:55;4400:2;4387:16;4426:2;4418:6;4415:14;4412:34;;;4442:1;4439;4432:12;4412:34;4487:7;4482:2;4473:6;4469:2;4465:15;4461:24;4458:37;4455:57;;;4508:1;4505;4498:12;4578:180;4637:6;4690:2;4678:9;4669:7;4665:23;4661:32;4658:52;;;4706:1;4703;4696:12;4658:52;-1:-1:-1;4729:23:1;;4578:180;-1:-1:-1;4578:180:1:o;4763:456::-;4849:6;4857;4865;4918:2;4906:9;4897:7;4893:23;4889:32;4886:52;;;4934:1;4931;4924:12;4886:52;4970:9;4957:23;4947:33;;5031:2;5020:9;5016:18;5003:32;5058:18;5050:6;5047:30;5044:50;;;5090:1;5087;5080:12;5044:50;5113:49;5154:7;5145:6;5134:9;5130:22;5113:49;:::i;:::-;5103:59;;;5209:2;5198:9;5194:18;5181:32;5171:42;;4763:456;;;;;:::o;5224:257::-;5265:3;5303:5;5297:12;5330:6;5325:3;5318:19;5346:63;5402:6;5395:4;5390:3;5386:14;5379:4;5372:5;5368:16;5346:63;:::i;:::-;5463:2;5442:15;-1:-1:-1;;5438:29:1;5429:39;;;;5470:4;5425:50;;5224:257;-1:-1:-1;;5224:257:1:o;5486:973::-;5571:12;;5536:3;;5626:1;5646:18;;;;5699;;;;5726:61;;5780:4;5772:6;5768:17;5758:27;;5726:61;5806:2;5854;5846:6;5843:14;5823:18;5820:38;5817:161;;;5900:10;5895:3;5891:20;5888:1;5881:31;5935:4;5932:1;5925:15;5963:4;5960:1;5953:15;5817:161;5994:18;6021:104;;;;6139:1;6134:319;;;;5987:466;;6021:104;-1:-1:-1;;6054:24:1;;6042:37;;6099:16;;;;-1:-1:-1;6021:104:1;;6134:319;15817:1;15810:14;;;15854:4;15841:18;;6228:1;6242:165;6256:6;6253:1;6250:13;6242:165;;;6334:14;;6321:11;;;6314:35;6377:16;;;;6271:10;;6242:165;;;6246:3;;6436:6;6431:3;6427:16;6420:23;;5987:466;;;;;;;5486:973;;;;:::o;6464:403::-;6703:26;6699:31;6690:6;6686:2;6682:15;6678:53;6673:3;6666:66;6648:3;6754:47;6797:2;6792:3;6788:12;6780:6;6754:47;:::i;:::-;6810:21;;;-1:-1:-1;;6858:2:1;6847:14;;6464:403;-1:-1:-1;;6464:403:1:o;6872:376::-;7048:3;7076:38;7110:3;7102:6;7076:38;:::i;:::-;7143:6;7137:13;7159:52;7204:6;7200:2;7193:4;7185:6;7181:17;7159:52;:::i;:::-;7227:15;;6872:376;-1:-1:-1;;;;6872:376:1:o;8056:488::-;-1:-1:-1;;;;;8325:15:1;;;8307:34;;8377:15;;8372:2;8357:18;;8350:43;8424:2;8409:18;;8402:34;;;8472:3;8467:2;8452:18;;8445:31;;;8250:4;;8493:45;;8518:19;;8510:6;8493:45;:::i;:::-;8485:53;8056:488;-1:-1:-1;;;;;;8056:488:1:o;9144:219::-;9293:2;9282:9;9275:21;9256:4;9313:44;9353:2;9342:9;9338:18;9330:6;9313:44;:::i;15870:128::-;15910:3;15941:1;15937:6;15934:1;15931:13;15928:39;;;15947:18;;:::i;:::-;-1:-1:-1;15983:9:1;;15870:128::o;16003:120::-;16043:1;16069;16059:35;;16074:18;;:::i;:::-;-1:-1:-1;16108:9:1;;16003:120::o;16128:168::-;16168:7;16234:1;16230;16226:6;16222:14;16219:1;16216:21;16211:1;16204:9;16197:17;16193:45;16190:71;;;16241:18;;:::i;:::-;-1:-1:-1;16281:9:1;;16128:168::o;16301:125::-;16341:4;16369:1;16366;16363:8;16360:34;;;16374:18;;:::i;:::-;-1:-1:-1;16411:9:1;;16301:125::o;16431:258::-;16503:1;16513:113;16527:6;16524:1;16521:13;16513:113;;;16603:11;;;16597:18;16584:11;;;16577:39;16549:2;16542:10;16513:113;;;16644:6;16641:1;16638:13;16635:48;;;-1:-1:-1;;16679:1:1;16661:16;;16654:27;16431:258::o;16694:380::-;16773:1;16769:12;;;;16816;;;16837:61;;16891:4;16883:6;16879:17;16869:27;;16837:61;16944:2;16936:6;16933:14;16913:18;16910:38;16907:161;;;16990:10;16985:3;16981:20;16978:1;16971:31;17025:4;17022:1;17015:15;17053:4;17050:1;17043:15;16907:161;;16694:380;;;:::o;17079:135::-;17118:3;-1:-1:-1;;17139:17:1;;17136:43;;;17159:18;;:::i;:::-;-1:-1:-1;17206:1:1;17195:13;;17079:135::o;17219:112::-;17251:1;17277;17267:35;;17282:18;;:::i;:::-;-1:-1:-1;17316:9:1;;17219:112::o;17336:127::-;17397:10;17392:3;17388:20;17385:1;17378:31;17428:4;17425:1;17418:15;17452:4;17449:1;17442:15;17468:127;17529:10;17524:3;17520:20;17517:1;17510:31;17560:4;17557:1;17550:15;17584:4;17581:1;17574:15;17600:127;17661:10;17656:3;17652:20;17649:1;17642:31;17692:4;17689:1;17682:15;17716:4;17713:1;17706:15;17732:127;17793:10;17788:3;17784:20;17781:1;17774:31;17824:4;17821:1;17814:15;17848:4;17845:1;17838:15;17864:127;17925:10;17920:3;17916:20;17913:1;17906:31;17956:4;17953:1;17946:15;17980:4;17977:1;17970:15;17996:131;-1:-1:-1;;;;;;18070:32:1;;18060:43;;18050:71;;18117:1;18114;18107:12
Swarm Source
ipfs://197e314334074c58b1753e518c7ee09de90709efdbb90ecdafd93dcc0fe1119a
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.