Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 112 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 21286310 | 36 days ago | IN | 0 ETH | 0.00045617 | ||||
Set Approval For... | 18190042 | 470 days ago | IN | 0 ETH | 0.00025137 | ||||
Claim | 18069622 | 486 days ago | IN | 0 ETH | 0.0015906 | ||||
Claim | 18049196 | 489 days ago | IN | 0 ETH | 0.00269002 | ||||
Claim | 17887017 | 512 days ago | IN | 0 ETH | 0.0028575 | ||||
Set Approval For... | 17825483 | 521 days ago | IN | 0 ETH | 0.0006929 | ||||
Claim | 17773452 | 528 days ago | IN | 0 ETH | 0.0026425 | ||||
Claim | 17759820 | 530 days ago | IN | 0 ETH | 0.00452737 | ||||
Claim | 17649450 | 545 days ago | IN | 0 ETH | 0.00418049 | ||||
Claim | 17647493 | 546 days ago | IN | 0 ETH | 0.00194826 | ||||
Claim | 17647493 | 546 days ago | IN | 0 ETH | 0.00350847 | ||||
Claim | 17646095 | 546 days ago | IN | 0 ETH | 0.00236161 | ||||
Claim | 17645623 | 546 days ago | IN | 0 ETH | 0.00254869 | ||||
Claim | 17641813 | 546 days ago | IN | 0 ETH | 0.0040852 | ||||
Claim | 17620795 | 549 days ago | IN | 0 ETH | 0.00312634 | ||||
Claim | 17619334 | 550 days ago | IN | 0 ETH | 0.00231284 | ||||
Set Melted Dudz ... | 17618355 | 550 days ago | IN | 0 ETH | 0.00044113 | ||||
Claim | 17594492 | 553 days ago | IN | 0 ETH | 0.00561623 | ||||
Claim | 17580973 | 555 days ago | IN | 0 ETH | 0.00237555 | ||||
Set Melted Dudz ... | 17575424 | 556 days ago | IN | 0 ETH | 0.00065352 | ||||
Claim | 17569841 | 556 days ago | IN | 0 ETH | 0.00204991 | ||||
Claim | 17533751 | 562 days ago | IN | 0 ETH | 0.0016971 | ||||
Claim | 17523353 | 563 days ago | IN | 0 ETH | 0.00464519 | ||||
Claim | 17519445 | 564 days ago | IN | 0 ETH | 0.00176255 | ||||
Claim | 17512540 | 565 days ago | IN | 0 ETH | 0.00225103 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Sparq
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-06 */ // SPDX-License-Identifier: MIT // 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/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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.3 // 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(); /** * 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 payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @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 payable; /** * @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 payable; /** * @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.3 // 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 { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). 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 payable 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 { _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].value`. 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 payable 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 payable 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 payable 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. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. 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`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. 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 str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: contracts/Sparq.sol pragma solidity ^0.8.19; interface DudelzInterface { function ownerOf(uint256 tokenId) external view returns (address owner); } pragma solidity ^0.8.19; contract Sparq is ERC721A, Ownable, ReentrancyGuard, ERC2981 { using Strings for uint256; // STATE VARIABLES // address public dudelzContract; address public melteddudzContract; mapping(uint256 => bool) public hasClaimedAgainstDudelzTokenId; mapping(uint256 => uint256) private _batteryTypeIdOfTokenId; string public baseURI; uint256 public constant MAX_TYPE1_BATTERY_COUNT = 4000; uint256 public constant MAX_TYPE2_BATTERY_COUNT = 1546; uint256 public constant MAX_TYPE3_BATTERY_COUNT = 9; uint256 public batteryType1Claimed; uint256 public batteryType2Claimed; uint256 public batteryType3Claimed; // EVENTS // event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); // CONSTRUCTOR // constructor(string memory name, string memory symbol, string memory newBaseURI) ERC721A(name, symbol) { updateBaseUri(newBaseURI); } // ETH RECEIVE FUNCTION // receive() external payable virtual {} // PUBLIC FUNCTIONS, WRITE CONTRACT FUNCTIONS // function burnBatteryForAddress(uint256 tokenId) external { require(msg.sender == melteddudzContract, "Caller not melted dudz contract"); _burn(tokenId); } function claim(uint256[] calldata tokenIds) external nonReentrant { require(tokenIds.length > 0, "Empty array"); uint256 startId = _totalMinted() + 1; for (uint256 i = 0; i < tokenIds.length; ++i) { DudelzInterface dudelzNFT = DudelzInterface(dudelzContract); require(msg.sender == dudelzNFT.ownerOf(tokenIds[i]), "You are not the owner of this dudelz tokenId"); require(hasClaimedAgainstDudelzTokenId[tokenIds[i]] == false, "Already claimed for this dudelz tokenId"); hasClaimedAgainstDudelzTokenId[tokenIds[i]] = true; uint256 randomNumber = uint256(keccak256(abi.encodePacked(block.timestamp + startId + i, block.prevrandao + startId + i))) % (MAX_TYPE1_BATTERY_COUNT + MAX_TYPE2_BATTERY_COUNT + MAX_TYPE3_BATTERY_COUNT); if (randomNumber < MAX_TYPE1_BATTERY_COUNT && batteryType1Claimed < MAX_TYPE1_BATTERY_COUNT) { batteryType1Claimed++; _batteryTypeIdOfTokenId[startId + i] = 1; } else if (randomNumber < MAX_TYPE1_BATTERY_COUNT + MAX_TYPE2_BATTERY_COUNT && batteryType2Claimed < MAX_TYPE2_BATTERY_COUNT) { batteryType2Claimed++; _batteryTypeIdOfTokenId[startId + i] = 2; } else if (randomNumber < MAX_TYPE1_BATTERY_COUNT + MAX_TYPE2_BATTERY_COUNT + MAX_TYPE3_BATTERY_COUNT && batteryType3Claimed < MAX_TYPE3_BATTERY_COUNT) { batteryType3Claimed++; _batteryTypeIdOfTokenId[startId + i] = 3; } else if (batteryType2Claimed < MAX_TYPE2_BATTERY_COUNT) { batteryType2Claimed++; _batteryTypeIdOfTokenId[startId + i] = 2; } else if (batteryType1Claimed < MAX_TYPE1_BATTERY_COUNT) { batteryType1Claimed++; _batteryTypeIdOfTokenId[startId + i] = 1; } else { revert("BatteriesSupplyExhausted"); } } _mint(msg.sender, tokenIds.length); } // SMART CONTRACT OWNER ONLY FUNCTIONS, WRITE CONTRACT FUNCTIONS // function updateBaseUri(string memory newbaseURI) public onlyOwner { baseURI = newbaseURI; emit BatchMetadataUpdate(1, 5555); } function setMeltedDudzContractAddress(address melteddudzContractAddress) external onlyOwner { melteddudzContract = melteddudzContractAddress; } function setDudelzContractAddress(address dudelzContractAddress) external onlyOwner { dudelzContract = dudelzContractAddress; } function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); } function deleteDefaultRoyalty() external onlyOwner { _deleteDefaultRoyalty(); } function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external onlyOwner { _setTokenRoyalty(tokenId, receiver, feeNumerator); } function resetTokenRoyalty(uint256 tokenId) external onlyOwner { _resetTokenRoyalty(tokenId); } function withdraw() public onlyOwner { (bool success, ) = payable(owner()).call{value: address(this).balance}(""); require(success); } // GETTER FUNCTIONS, READ CONTRACT FUNCTIONS // function batteryTypeIdOfTokenId(uint256 tokenId) external view returns (uint256) { uint256 id = _batteryTypeIdOfTokenId[tokenId]; require(id > 0, "No battery type associated with this dudlzbt tokenId"); return id; } function getClaimedData(uint256[] calldata tokenIds) external view returns (bool[] memory) { bool[] memory data = new bool[](tokenIds.length); for (uint256 i = 0; i < tokenIds.length; ++i) { data[i] = hasClaimedAgainstDudelzTokenId[tokenIds[i]]; } return data; } function supportsInterface(bytes4 interfaceId) public view virtual override (ERC721A, ERC2981) returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f || // ERC165 interface ID for ERC721Metadata. interfaceId == 0x49064906 || // ERC165 interface ID for ERC4906 super.supportsInterface(interfaceId); } function tokensOfOwner(address owner) public view returns (uint256[] memory) { uint256[] memory ownedTokenIds = new uint256[](balanceOf(owner)); uint256 currentTokenId = 1; uint256 currentTokenIndex = 0; while (currentTokenIndex < _totalMinted() && currentTokenId <= _totalMinted()) { if (_exists(currentTokenId) && ownerOf(currentTokenId) == owner) { ownedTokenIds[currentTokenIndex] = currentTokenId; currentTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _batteryTypeIdOfTokenId[tokenId].toString(), ".json")) : ""; } // INTERNAL FUNCTIONS // function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"newBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","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":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","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":[],"name":"MAX_TYPE1_BATTERY_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TYPE2_BATTERY_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TYPE3_BATTERY_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batteryType1Claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batteryType2Claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batteryType3Claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"batteryTypeIdOfTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnBatteryForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dudelzContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getClaimedData","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hasClaimedAgainstDudelzTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"melteddudzContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resetTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dudelzContractAddress","type":"address"}],"name":"setDudelzContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"melteddudzContractAddress","type":"address"}],"name":"setMeltedDudzContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newbaseURI","type":"string"}],"name":"updateBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002b0b38038062002b0b83398101604081905262000034916200024e565b828260026200004483826200036e565b5060036200005382826200036e565b505060016000555062000066336200007f565b60016009556200007681620000d1565b5050506200043a565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620000db62000128565b6010620000e982826200036e565b5060408051600181526115b360208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910160405180910390a150565b6008546001600160a01b03163314620001875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001b157600080fd5b81516001600160401b0380821115620001ce57620001ce62000189565b604051601f8301601f19908116603f01168101908282118183101715620001f957620001f962000189565b816040528381526020925086838588010111156200021657600080fd5b600091505b838210156200023a57858201830151818301840152908201906200021b565b600093810190920192909252949350505050565b6000806000606084860312156200026457600080fd5b83516001600160401b03808211156200027c57600080fd5b6200028a878388016200019f565b94506020860151915080821115620002a157600080fd5b620002af878388016200019f565b93506040860151915080821115620002c657600080fd5b50620002d5868287016200019f565b9150509250925092565b600181811c90821680620002f457607f821691505b6020821081036200031557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200036957600081815260208120601f850160051c81016020861015620003445750805b601f850160051c820191505b81811015620003655782815560010162000350565b5050505b505050565b81516001600160401b038111156200038a576200038a62000189565b620003a2816200039b8454620002df565b846200031b565b602080601f831160018114620003da5760008415620003c15750858301515b600019600386901b1c1916600185901b17855562000365565b600085815260208120601f198616915b828110156200040b57888601518255948401946001909101908401620003ea565b50858210156200042a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6126c1806200044a6000396000f3fe60806040526004361061024a5760003560e01c80636352211e1161013957806395d89b41116100b6578063cc5bf4441161007a578063cc5bf44414610695578063d4b28f62146106ab578063d62d7ec9146106cb578063dc09efb4146106fb578063e985e9c514610711578063f2fde38b1461075a57600080fd5b806395d89b4114610618578063a22cb4651461062d578063aa1b103f1461064d578063b88d4fde14610662578063c87b56dd1461067557600080fd5b806380abe8c5116100fd57806380abe8c5146105775780638462151c1461058d5780638a616bc0146105ba5780638da5cb5b146105da57806395b11261146105f857600080fd5b80636352211e146104ed5780636ba4c1381461050d5780636c0360eb1461052d57806370a0823114610542578063715018a61461056257600080fd5b80633a22dbde116101c757806345c68a0a1161018b57806345c68a0a1461045457806354a6f4e41461046a57806354fed3d4146104975780635663322c146104ad5780635944c753146104cd57600080fd5b80633a22dbde146103cc5780633bd53394146103ec5780633ccfd60b1461040c57806342466d241461042157806342842e0e1461044157600080fd5b80631184fc731161020e5780631184fc731461031a57806318160ddd1461033d57806323b872dd1461035a5780632a55205a1461036d57806339f7e37f146103ac57600080fd5b806301ffc9a71461025657806304634d8d1461028b57806306fdde03146102ad578063081812fc146102cf578063095ea7b31461030757600080fd5b3661025157005b600080fd5b34801561026257600080fd5b50610276610271366004611ece565b61077a565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004611f1c565b6107f6565b005b3480156102b957600080fd5b506102c261080c565b6040516102829190611fa1565b3480156102db57600080fd5b506102ef6102ea366004611fb4565b61089e565b6040516001600160a01b039091168152602001610282565b6102ab610315366004611fcd565b6108e2565b34801561032657600080fd5b5061032f600981565b604051908152602001610282565b34801561034957600080fd5b50600154600054036000190161032f565b6102ab610368366004611ff9565b610982565b34801561037957600080fd5b5061038d61038836600461203a565b610b13565b604080516001600160a01b039093168352602083019190915201610282565b3480156103b857600080fd5b506102ab6103c73660046120e8565b610bbf565b3480156103d857600080fd5b50600d546102ef906001600160a01b031681565b3480156103f857600080fd5b5061032f610407366004611fb4565b610c12565b34801561041857600080fd5b506102ab610c90565b34801561042d57600080fd5b506102ab61043c366004611fb4565b610d0c565b6102ab61044f366004611ff9565b610d6f565b34801561046057600080fd5b5061032f610fa081565b34801561047657600080fd5b5061048a610485366004612131565b610d8f565b60405161028291906121a6565b3480156104a357600080fd5b5061032f60125481565b3480156104b957600080fd5b506102ab6104c83660046121ec565b610e56565b3480156104d957600080fd5b506102ab6104e8366004612209565b610e80565b3480156104f957600080fd5b506102ef610508366004611fb4565b610e93565b34801561051957600080fd5b506102ab610528366004612131565b610e9e565b34801561053957600080fd5b506102c26112f0565b34801561054e57600080fd5b5061032f61055d3660046121ec565b61137e565b34801561056e57600080fd5b506102ab6113cd565b34801561058357600080fd5b5061032f60115481565b34801561059957600080fd5b506105ad6105a83660046121ec565b6113e1565b6040516102829190612247565b3480156105c657600080fd5b506102ab6105d5366004611fb4565b6114d1565b3480156105e657600080fd5b506008546001600160a01b03166102ef565b34801561060457600080fd5b506102ab6106133660046121ec565b6114ea565b34801561062457600080fd5b506102c2611514565b34801561063957600080fd5b506102ab61064836600461227f565b611523565b34801561065957600080fd5b506102ab61158f565b6102ab6106703660046122bd565b6115a1565b34801561068157600080fd5b506102c2610690366004611fb4565b6115eb565b3480156106a157600080fd5b5061032f60135481565b3480156106b757600080fd5b50600c546102ef906001600160a01b031681565b3480156106d757600080fd5b506102766106e6366004611fb4565b600e6020526000908152604090205460ff1681565b34801561070757600080fd5b5061032f61060a81565b34801561071d57600080fd5b5061027661072c36600461233d565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561076657600080fd5b506102ab6107753660046121ec565b6116c6565b60006301ffc9a760e01b6001600160e01b0319831614806107ab57506380ac58cd60e01b6001600160e01b03198316145b806107c65750635b5e139f60e01b6001600160e01b03198316145b806107e15750632483248360e11b6001600160e01b03198316145b806107f057506107f08261173c565b92915050565b6107fe611771565b61080882826117cb565b5050565b60606002805461081b9061236b565b80601f01602080910402602001604051908101604052809291908181526020018280546108479061236b565b80156108945780601f1061086957610100808354040283529160200191610894565b820191906000526020600020905b81548152906001019060200180831161087757829003601f168201915b5050505050905090565b60006108a982611885565b6108c6576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108ed82610e93565b9050336001600160a01b0382161461092657610909813361072c565b610926576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061098d826118ba565b9050836001600160a01b0316816001600160a01b0316146109c05760405162a1148160e81b815260040160405180910390fd5b600082815260066020526040902080546109ec8187335b6001600160a01b039081169116811491141790565b610a17576109fa863361072c565b610a1757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610a3e57604051633a954ecd60e21b815260040160405180910390fd5b8015610a4957600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610adb57600184016000818152600460205260408120549003610ad9576000548114610ad95760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b031660008051602061266c83398151915260405160405180910390a45b505050505050565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b88575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610ba7906001600160601b0316876123bb565b610bb191906123e8565b915196919550909350505050565b610bc7611771565b6010610bd38282612442565b5060408051600181526115b360208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910160405180910390a150565b6000818152600f6020526040812054806107f05760405162461bcd60e51b815260206004820152603460248201527f4e6f20626174746572792074797065206173736f6369617465642077697468206044820152731d1a1a5cc8191d591b1e989d081d1bdad95b925960621b60648201526084015b60405180910390fd5b610c98611771565b6000610cac6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610cf6576040519150601f19603f3d011682016040523d82523d6000602084013e610cfb565b606091505b5050905080610d0957600080fd5b50565b600d546001600160a01b03163314610d665760405162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206e6f74206d656c746564206475647a20636f6e7472616374006044820152606401610c87565b610d0981611929565b610d8a838383604051806020016040528060008152506115a1565b505050565b606060008267ffffffffffffffff811115610dac57610dac61205c565b604051908082528060200260200182016040528015610dd5578160200160208202803683370190505b50905060005b83811015610e4e57600e6000868684818110610df957610df9612502565b90506020020135815260200190815260200160002060009054906101000a900460ff16828281518110610e2e57610e2e612502565b91151560209283029190910190910152610e4781612518565b9050610ddb565b509392505050565b610e5e611771565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b610e88611771565b610d8a838383611934565b60006107f0826118ba565b610ea66119ff565b80610ee15760405162461bcd60e51b815260206004820152600b60248201526a456d70747920617272617960a81b6044820152606401610c87565b6000805460001901610ef4906001612531565b905060005b828110156112da57600c546001600160a01b031680636352211e868685818110610f2557610f25612502565b905060200201356040518263ffffffff1660e01b8152600401610f4a91815260200190565b602060405180830381865afa158015610f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8b9190612544565b6001600160a01b0316336001600160a01b0316146110005760405162461bcd60e51b815260206004820152602c60248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320647560448201526b19195b1e881d1bdad95b925960a21b6064820152608401610c87565b600e600086868581811061101657611016612502565b602090810292909201358352508101919091526040016000205460ff16156110905760405162461bcd60e51b815260206004820152602760248201527f416c726561647920636c61696d656420666f72207468697320647564656c7a206044820152661d1bdad95b925960ca1b6064820152608401610c87565b6001600e60008787868181106110a8576110a8612502565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600961060a610fa06110e89190612531565b6110f29190612531565b836110fd8642612531565b6111079190612531565b846111128744612531565b61111c9190612531565b6040805160208101939093528201526060016040516020818303038152906040528051906020012060001c6111519190612561565b9050610fa0811080156111675750610fa0601154105b156111a8576011805490600061117c83612518565b9091555060019050600f60006111928688612531565b81526020810191909152604001600020556112c7565b6111b661060a610fa0612531565b811080156111c7575061060a601254105b156111f257601280549060006111dc83612518565b9091555060029050600f60006111928688612531565b600961120261060a610fa0612531565b61120c9190612531565b8110801561121c57506009601354105b15611247576013805490600061123183612518565b9091555060039050600f60006111928688612531565b61060a601254101561126357601280549060006111dc83612518565b610fa0601154101561127f576011805490600061117c83612518565b60405162461bcd60e51b815260206004820152601860248201527f426174746572696573537570706c7945786861757374656400000000000000006044820152606401610c87565b5050806112d390612518565b9050610ef9565b506112e53383611a58565b506108086001600955565b601080546112fd9061236b565b80601f01602080910402602001604051908101604052809291908181526020018280546113299061236b565b80156113765780601f1061134b57610100808354040283529160200191611376565b820191906000526020600020905b81548152906001019060200180831161135957829003601f168201915b505050505081565b60006001600160a01b0382166113a7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6113d5611771565b6113df6000611b32565b565b606060006113ee8361137e565b67ffffffffffffffff8111156114065761140661205c565b60405190808252806020026020018201604052801561142f578160200160208202803683370190505b509050600160005b60005460001901811080156114525750600054600019018211155b156114c85761146082611885565b80156114855750846001600160a01b031661147a83610e93565b6001600160a01b0316145b156114b6578183828151811061149d5761149d612502565b6020908102919091010152806114b281612518565b9150505b816114c081612518565b925050611437565b50909392505050565b6114d9611771565b6000908152600b6020526040812055565b6114f2611771565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60606003805461081b9061236b565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611597611771565b6113df6000600a55565b6115ac848484610982565b6001600160a01b0383163b156115e5576115c884848484611b84565b6115e5576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606115f682611885565b61165a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c87565b6000611664611c70565b9050600081511161168457604051806020016040528060008152506116bf565b6000838152600f6020526040902054819061169e90611c7f565b6040516020016116af929190612575565b6040516020818303038152906040525b9392505050565b6116ce611771565b6001600160a01b0381166117335760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c87565b610d0981611b32565b60006001600160e01b0319821663152a902d60e11b14806107f057506301ffc9a760e01b6001600160e01b03198316146107f0565b6008546001600160a01b031633146113df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c87565b6127106001600160601b03821611156117f65760405162461bcd60e51b8152600401610c87906125b4565b6001600160a01b03821661184c5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610c87565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b600081600111158015611899575060005482105b80156107f0575050600090815260046020526040902054600160e01b161590565b60008180600111611910576000548110156119105760008181526004602052604081205490600160e01b8216900361190e575b806000036116bf5750600019016000818152600460205260409020546118ed565b505b604051636f96cda160e11b815260040160405180910390fd5b610d09816000611d80565b6127106001600160601b038216111561195f5760405162461bcd60e51b8152600401610c87906125b4565b6001600160a01b0382166119b55760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610c87565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182526000968752600b90529190942093519051909116600160a01b029116179055565b600260095403611a515760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c87565b6002600955565b6000805490829003611a7d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b1783179055828401908390839060008051602061266c8339815191528180a4600183015b818114611b08578083600060008051602061266c833981519152600080a4600101611ae2565b5081600003611b2957604051622e076360e81b815260040160405180910390fd5b60005550505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611bb99033908990889088906004016125fe565b6020604051808303816000875af1925050508015611bf4575060408051601f3d908101601f19168201909252611bf19181019061263b565b60015b611c52573d808015611c22576040519150601f19603f3d011682016040523d82523d6000602084013e611c27565b606091505b508051600003611c4a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606010805461081b9061236b565b606081600003611ca65750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cd05780611cba81612518565b9150611cc99050600a836123e8565b9150611caa565b60008167ffffffffffffffff811115611ceb57611ceb61205c565b6040519080825280601f01601f191660200182016040528015611d15576020820181803683370190505b5090505b8415611c6857611d2a600183612658565b9150611d37600a86612561565b611d42906030612531565b60f81b818381518110611d5757611d57612502565b60200101906001600160f81b031916908160001a905350611d79600a866123e8565b9450611d19565b6000611d8b836118ba565b905080600080611da986600090815260066020526040902080549091565b915091508415611de957611dbe8184336109d7565b611de957611dcc833361072c565b611de957604051632ce44b5f60e11b815260040160405180910390fd5b8015611df457600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260046020526040812091909155600160e11b85169003611e8257600186016000818152600460205260408120549003611e80576000548114611e805760008181526004602052604090208590555b505b60405186906000906001600160a01b0386169060008051602061266c833981519152908390a45050600180548101905550505050565b6001600160e01b031981168114610d0957600080fd5b600060208284031215611ee057600080fd5b81356116bf81611eb8565b6001600160a01b0381168114610d0957600080fd5b80356001600160601b0381168114611f1757600080fd5b919050565b60008060408385031215611f2f57600080fd5b8235611f3a81611eeb565b9150611f4860208401611f00565b90509250929050565b60005b83811015611f6c578181015183820152602001611f54565b50506000910152565b60008151808452611f8d816020860160208601611f51565b601f01601f19169290920160200192915050565b6020815260006116bf6020830184611f75565b600060208284031215611fc657600080fd5b5035919050565b60008060408385031215611fe057600080fd5b8235611feb81611eeb565b946020939093013593505050565b60008060006060848603121561200e57600080fd5b833561201981611eeb565b9250602084013561202981611eeb565b929592945050506040919091013590565b6000806040838503121561204d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561208d5761208d61205c565b604051601f8501601f19908116603f011681019082821181831017156120b5576120b561205c565b816040528093508581528686860111156120ce57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156120fa57600080fd5b813567ffffffffffffffff81111561211157600080fd5b8201601f8101841361212257600080fd5b611c6884823560208401612072565b6000806020838503121561214457600080fd5b823567ffffffffffffffff8082111561215c57600080fd5b818501915085601f83011261217057600080fd5b81358181111561217f57600080fd5b8660208260051b850101111561219457600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b818110156121e05783511515835292840192918401916001016121c2565b50909695505050505050565b6000602082840312156121fe57600080fd5b81356116bf81611eeb565b60008060006060848603121561221e57600080fd5b83359250602084013561223081611eeb565b915061223e60408501611f00565b90509250925092565b6020808252825182820181905260009190848201906040850190845b818110156121e057835183529284019291840191600101612263565b6000806040838503121561229257600080fd5b823561229d81611eeb565b9150602083013580151581146122b257600080fd5b809150509250929050565b600080600080608085870312156122d357600080fd5b84356122de81611eeb565b935060208501356122ee81611eeb565b925060408501359150606085013567ffffffffffffffff81111561231157600080fd5b8501601f8101871361232257600080fd5b61233187823560208401612072565b91505092959194509250565b6000806040838503121561235057600080fd5b823561235b81611eeb565b915060208301356122b281611eeb565b600181811c9082168061237f57607f821691505b60208210810361239f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176107f0576107f06123a5565b634e487b7160e01b600052601260045260246000fd5b6000826123f7576123f76123d2565b500490565b601f821115610d8a57600081815260208120601f850160051c810160208610156124235750805b601f850160051c820191505b81811015610b0b5782815560010161242f565b815167ffffffffffffffff81111561245c5761245c61205c565b6124708161246a845461236b565b846123fc565b602080601f8311600181146124a5576000841561248d5750858301515b600019600386901b1c1916600185901b178555610b0b565b600085815260208120601f198616915b828110156124d4578886015182559484019460019091019084016124b5565b50858210156124f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b60006001820161252a5761252a6123a5565b5060010190565b808201808211156107f0576107f06123a5565b60006020828403121561255657600080fd5b81516116bf81611eeb565b600082612570576125706123d2565b500690565b60008351612587818460208801611f51565b83519083019061259b818360208801611f51565b64173539b7b760d91b9101908152600501949350505050565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061263190830184611f75565b9695505050505050565b60006020828403121561264d57600080fd5b81516116bf81611eb8565b818103818111156107f0576107f06123a556feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122033c02de386f7fa4ceb3b858bc11810f12300bee5d493e65624d7a6460ce2553264736f6c63430008130033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000055350415251000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000553504152510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d617237455554316b7672626363516f4464554e6f6f4a5963377975797452514a6e46515778614c4e324a475a2f00000000000000000000
Deployed Bytecode
0x60806040526004361061024a5760003560e01c80636352211e1161013957806395d89b41116100b6578063cc5bf4441161007a578063cc5bf44414610695578063d4b28f62146106ab578063d62d7ec9146106cb578063dc09efb4146106fb578063e985e9c514610711578063f2fde38b1461075a57600080fd5b806395d89b4114610618578063a22cb4651461062d578063aa1b103f1461064d578063b88d4fde14610662578063c87b56dd1461067557600080fd5b806380abe8c5116100fd57806380abe8c5146105775780638462151c1461058d5780638a616bc0146105ba5780638da5cb5b146105da57806395b11261146105f857600080fd5b80636352211e146104ed5780636ba4c1381461050d5780636c0360eb1461052d57806370a0823114610542578063715018a61461056257600080fd5b80633a22dbde116101c757806345c68a0a1161018b57806345c68a0a1461045457806354a6f4e41461046a57806354fed3d4146104975780635663322c146104ad5780635944c753146104cd57600080fd5b80633a22dbde146103cc5780633bd53394146103ec5780633ccfd60b1461040c57806342466d241461042157806342842e0e1461044157600080fd5b80631184fc731161020e5780631184fc731461031a57806318160ddd1461033d57806323b872dd1461035a5780632a55205a1461036d57806339f7e37f146103ac57600080fd5b806301ffc9a71461025657806304634d8d1461028b57806306fdde03146102ad578063081812fc146102cf578063095ea7b31461030757600080fd5b3661025157005b600080fd5b34801561026257600080fd5b50610276610271366004611ece565b61077a565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004611f1c565b6107f6565b005b3480156102b957600080fd5b506102c261080c565b6040516102829190611fa1565b3480156102db57600080fd5b506102ef6102ea366004611fb4565b61089e565b6040516001600160a01b039091168152602001610282565b6102ab610315366004611fcd565b6108e2565b34801561032657600080fd5b5061032f600981565b604051908152602001610282565b34801561034957600080fd5b50600154600054036000190161032f565b6102ab610368366004611ff9565b610982565b34801561037957600080fd5b5061038d61038836600461203a565b610b13565b604080516001600160a01b039093168352602083019190915201610282565b3480156103b857600080fd5b506102ab6103c73660046120e8565b610bbf565b3480156103d857600080fd5b50600d546102ef906001600160a01b031681565b3480156103f857600080fd5b5061032f610407366004611fb4565b610c12565b34801561041857600080fd5b506102ab610c90565b34801561042d57600080fd5b506102ab61043c366004611fb4565b610d0c565b6102ab61044f366004611ff9565b610d6f565b34801561046057600080fd5b5061032f610fa081565b34801561047657600080fd5b5061048a610485366004612131565b610d8f565b60405161028291906121a6565b3480156104a357600080fd5b5061032f60125481565b3480156104b957600080fd5b506102ab6104c83660046121ec565b610e56565b3480156104d957600080fd5b506102ab6104e8366004612209565b610e80565b3480156104f957600080fd5b506102ef610508366004611fb4565b610e93565b34801561051957600080fd5b506102ab610528366004612131565b610e9e565b34801561053957600080fd5b506102c26112f0565b34801561054e57600080fd5b5061032f61055d3660046121ec565b61137e565b34801561056e57600080fd5b506102ab6113cd565b34801561058357600080fd5b5061032f60115481565b34801561059957600080fd5b506105ad6105a83660046121ec565b6113e1565b6040516102829190612247565b3480156105c657600080fd5b506102ab6105d5366004611fb4565b6114d1565b3480156105e657600080fd5b506008546001600160a01b03166102ef565b34801561060457600080fd5b506102ab6106133660046121ec565b6114ea565b34801561062457600080fd5b506102c2611514565b34801561063957600080fd5b506102ab61064836600461227f565b611523565b34801561065957600080fd5b506102ab61158f565b6102ab6106703660046122bd565b6115a1565b34801561068157600080fd5b506102c2610690366004611fb4565b6115eb565b3480156106a157600080fd5b5061032f60135481565b3480156106b757600080fd5b50600c546102ef906001600160a01b031681565b3480156106d757600080fd5b506102766106e6366004611fb4565b600e6020526000908152604090205460ff1681565b34801561070757600080fd5b5061032f61060a81565b34801561071d57600080fd5b5061027661072c36600461233d565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561076657600080fd5b506102ab6107753660046121ec565b6116c6565b60006301ffc9a760e01b6001600160e01b0319831614806107ab57506380ac58cd60e01b6001600160e01b03198316145b806107c65750635b5e139f60e01b6001600160e01b03198316145b806107e15750632483248360e11b6001600160e01b03198316145b806107f057506107f08261173c565b92915050565b6107fe611771565b61080882826117cb565b5050565b60606002805461081b9061236b565b80601f01602080910402602001604051908101604052809291908181526020018280546108479061236b565b80156108945780601f1061086957610100808354040283529160200191610894565b820191906000526020600020905b81548152906001019060200180831161087757829003601f168201915b5050505050905090565b60006108a982611885565b6108c6576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108ed82610e93565b9050336001600160a01b0382161461092657610909813361072c565b610926576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061098d826118ba565b9050836001600160a01b0316816001600160a01b0316146109c05760405162a1148160e81b815260040160405180910390fd5b600082815260066020526040902080546109ec8187335b6001600160a01b039081169116811491141790565b610a17576109fa863361072c565b610a1757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610a3e57604051633a954ecd60e21b815260040160405180910390fd5b8015610a4957600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610adb57600184016000818152600460205260408120549003610ad9576000548114610ad95760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b031660008051602061266c83398151915260405160405180910390a45b505050505050565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b88575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610ba7906001600160601b0316876123bb565b610bb191906123e8565b915196919550909350505050565b610bc7611771565b6010610bd38282612442565b5060408051600181526115b360208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910160405180910390a150565b6000818152600f6020526040812054806107f05760405162461bcd60e51b815260206004820152603460248201527f4e6f20626174746572792074797065206173736f6369617465642077697468206044820152731d1a1a5cc8191d591b1e989d081d1bdad95b925960621b60648201526084015b60405180910390fd5b610c98611771565b6000610cac6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610cf6576040519150601f19603f3d011682016040523d82523d6000602084013e610cfb565b606091505b5050905080610d0957600080fd5b50565b600d546001600160a01b03163314610d665760405162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206e6f74206d656c746564206475647a20636f6e7472616374006044820152606401610c87565b610d0981611929565b610d8a838383604051806020016040528060008152506115a1565b505050565b606060008267ffffffffffffffff811115610dac57610dac61205c565b604051908082528060200260200182016040528015610dd5578160200160208202803683370190505b50905060005b83811015610e4e57600e6000868684818110610df957610df9612502565b90506020020135815260200190815260200160002060009054906101000a900460ff16828281518110610e2e57610e2e612502565b91151560209283029190910190910152610e4781612518565b9050610ddb565b509392505050565b610e5e611771565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b610e88611771565b610d8a838383611934565b60006107f0826118ba565b610ea66119ff565b80610ee15760405162461bcd60e51b815260206004820152600b60248201526a456d70747920617272617960a81b6044820152606401610c87565b6000805460001901610ef4906001612531565b905060005b828110156112da57600c546001600160a01b031680636352211e868685818110610f2557610f25612502565b905060200201356040518263ffffffff1660e01b8152600401610f4a91815260200190565b602060405180830381865afa158015610f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8b9190612544565b6001600160a01b0316336001600160a01b0316146110005760405162461bcd60e51b815260206004820152602c60248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320647560448201526b19195b1e881d1bdad95b925960a21b6064820152608401610c87565b600e600086868581811061101657611016612502565b602090810292909201358352508101919091526040016000205460ff16156110905760405162461bcd60e51b815260206004820152602760248201527f416c726561647920636c61696d656420666f72207468697320647564656c7a206044820152661d1bdad95b925960ca1b6064820152608401610c87565b6001600e60008787868181106110a8576110a8612502565b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600961060a610fa06110e89190612531565b6110f29190612531565b836110fd8642612531565b6111079190612531565b846111128744612531565b61111c9190612531565b6040805160208101939093528201526060016040516020818303038152906040528051906020012060001c6111519190612561565b9050610fa0811080156111675750610fa0601154105b156111a8576011805490600061117c83612518565b9091555060019050600f60006111928688612531565b81526020810191909152604001600020556112c7565b6111b661060a610fa0612531565b811080156111c7575061060a601254105b156111f257601280549060006111dc83612518565b9091555060029050600f60006111928688612531565b600961120261060a610fa0612531565b61120c9190612531565b8110801561121c57506009601354105b15611247576013805490600061123183612518565b9091555060039050600f60006111928688612531565b61060a601254101561126357601280549060006111dc83612518565b610fa0601154101561127f576011805490600061117c83612518565b60405162461bcd60e51b815260206004820152601860248201527f426174746572696573537570706c7945786861757374656400000000000000006044820152606401610c87565b5050806112d390612518565b9050610ef9565b506112e53383611a58565b506108086001600955565b601080546112fd9061236b565b80601f01602080910402602001604051908101604052809291908181526020018280546113299061236b565b80156113765780601f1061134b57610100808354040283529160200191611376565b820191906000526020600020905b81548152906001019060200180831161135957829003601f168201915b505050505081565b60006001600160a01b0382166113a7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6113d5611771565b6113df6000611b32565b565b606060006113ee8361137e565b67ffffffffffffffff8111156114065761140661205c565b60405190808252806020026020018201604052801561142f578160200160208202803683370190505b509050600160005b60005460001901811080156114525750600054600019018211155b156114c85761146082611885565b80156114855750846001600160a01b031661147a83610e93565b6001600160a01b0316145b156114b6578183828151811061149d5761149d612502565b6020908102919091010152806114b281612518565b9150505b816114c081612518565b925050611437565b50909392505050565b6114d9611771565b6000908152600b6020526040812055565b6114f2611771565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60606003805461081b9061236b565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611597611771565b6113df6000600a55565b6115ac848484610982565b6001600160a01b0383163b156115e5576115c884848484611b84565b6115e5576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606115f682611885565b61165a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c87565b6000611664611c70565b9050600081511161168457604051806020016040528060008152506116bf565b6000838152600f6020526040902054819061169e90611c7f565b6040516020016116af929190612575565b6040516020818303038152906040525b9392505050565b6116ce611771565b6001600160a01b0381166117335760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c87565b610d0981611b32565b60006001600160e01b0319821663152a902d60e11b14806107f057506301ffc9a760e01b6001600160e01b03198316146107f0565b6008546001600160a01b031633146113df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c87565b6127106001600160601b03821611156117f65760405162461bcd60e51b8152600401610c87906125b4565b6001600160a01b03821661184c5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610c87565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b600081600111158015611899575060005482105b80156107f0575050600090815260046020526040902054600160e01b161590565b60008180600111611910576000548110156119105760008181526004602052604081205490600160e01b8216900361190e575b806000036116bf5750600019016000818152600460205260409020546118ed565b505b604051636f96cda160e11b815260040160405180910390fd5b610d09816000611d80565b6127106001600160601b038216111561195f5760405162461bcd60e51b8152600401610c87906125b4565b6001600160a01b0382166119b55760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610c87565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182526000968752600b90529190942093519051909116600160a01b029116179055565b600260095403611a515760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c87565b6002600955565b6000805490829003611a7d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b1783179055828401908390839060008051602061266c8339815191528180a4600183015b818114611b08578083600060008051602061266c833981519152600080a4600101611ae2565b5081600003611b2957604051622e076360e81b815260040160405180910390fd5b60005550505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611bb99033908990889088906004016125fe565b6020604051808303816000875af1925050508015611bf4575060408051601f3d908101601f19168201909252611bf19181019061263b565b60015b611c52573d808015611c22576040519150601f19603f3d011682016040523d82523d6000602084013e611c27565b606091505b508051600003611c4a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606010805461081b9061236b565b606081600003611ca65750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cd05780611cba81612518565b9150611cc99050600a836123e8565b9150611caa565b60008167ffffffffffffffff811115611ceb57611ceb61205c565b6040519080825280601f01601f191660200182016040528015611d15576020820181803683370190505b5090505b8415611c6857611d2a600183612658565b9150611d37600a86612561565b611d42906030612531565b60f81b818381518110611d5757611d57612502565b60200101906001600160f81b031916908160001a905350611d79600a866123e8565b9450611d19565b6000611d8b836118ba565b905080600080611da986600090815260066020526040902080549091565b915091508415611de957611dbe8184336109d7565b611de957611dcc833361072c565b611de957604051632ce44b5f60e11b815260040160405180910390fd5b8015611df457600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260046020526040812091909155600160e11b85169003611e8257600186016000818152600460205260408120549003611e80576000548114611e805760008181526004602052604090208590555b505b60405186906000906001600160a01b0386169060008051602061266c833981519152908390a45050600180548101905550505050565b6001600160e01b031981168114610d0957600080fd5b600060208284031215611ee057600080fd5b81356116bf81611eb8565b6001600160a01b0381168114610d0957600080fd5b80356001600160601b0381168114611f1757600080fd5b919050565b60008060408385031215611f2f57600080fd5b8235611f3a81611eeb565b9150611f4860208401611f00565b90509250929050565b60005b83811015611f6c578181015183820152602001611f54565b50506000910152565b60008151808452611f8d816020860160208601611f51565b601f01601f19169290920160200192915050565b6020815260006116bf6020830184611f75565b600060208284031215611fc657600080fd5b5035919050565b60008060408385031215611fe057600080fd5b8235611feb81611eeb565b946020939093013593505050565b60008060006060848603121561200e57600080fd5b833561201981611eeb565b9250602084013561202981611eeb565b929592945050506040919091013590565b6000806040838503121561204d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561208d5761208d61205c565b604051601f8501601f19908116603f011681019082821181831017156120b5576120b561205c565b816040528093508581528686860111156120ce57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156120fa57600080fd5b813567ffffffffffffffff81111561211157600080fd5b8201601f8101841361212257600080fd5b611c6884823560208401612072565b6000806020838503121561214457600080fd5b823567ffffffffffffffff8082111561215c57600080fd5b818501915085601f83011261217057600080fd5b81358181111561217f57600080fd5b8660208260051b850101111561219457600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b818110156121e05783511515835292840192918401916001016121c2565b50909695505050505050565b6000602082840312156121fe57600080fd5b81356116bf81611eeb565b60008060006060848603121561221e57600080fd5b83359250602084013561223081611eeb565b915061223e60408501611f00565b90509250925092565b6020808252825182820181905260009190848201906040850190845b818110156121e057835183529284019291840191600101612263565b6000806040838503121561229257600080fd5b823561229d81611eeb565b9150602083013580151581146122b257600080fd5b809150509250929050565b600080600080608085870312156122d357600080fd5b84356122de81611eeb565b935060208501356122ee81611eeb565b925060408501359150606085013567ffffffffffffffff81111561231157600080fd5b8501601f8101871361232257600080fd5b61233187823560208401612072565b91505092959194509250565b6000806040838503121561235057600080fd5b823561235b81611eeb565b915060208301356122b281611eeb565b600181811c9082168061237f57607f821691505b60208210810361239f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176107f0576107f06123a5565b634e487b7160e01b600052601260045260246000fd5b6000826123f7576123f76123d2565b500490565b601f821115610d8a57600081815260208120601f850160051c810160208610156124235750805b601f850160051c820191505b81811015610b0b5782815560010161242f565b815167ffffffffffffffff81111561245c5761245c61205c565b6124708161246a845461236b565b846123fc565b602080601f8311600181146124a5576000841561248d5750858301515b600019600386901b1c1916600185901b178555610b0b565b600085815260208120601f198616915b828110156124d4578886015182559484019460019091019084016124b5565b50858210156124f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b60006001820161252a5761252a6123a5565b5060010190565b808201808211156107f0576107f06123a5565b60006020828403121561255657600080fd5b81516116bf81611eeb565b600082612570576125706123d2565b500690565b60008351612587818460208801611f51565b83519083019061259b818360208801611f51565b64173539b7b760d91b9101908152600501949350505050565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061263190830184611f75565b9695505050505050565b60006020828403121561264d57600080fd5b81516116bf81611eb8565b818103818111156107f0576107f06123a556feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122033c02de386f7fa4ceb3b858bc11810f12300bee5d493e65624d7a6460ce2553264736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000055350415251000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000553504152510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d617237455554316b7672626363516f4464554e6f6f4a5963377975797452514a6e46515778614c4e324a475a2f00000000000000000000
-----Decoded View---------------
Arg [0] : name (string): SPARQ
Arg [1] : symbol (string): SPARQ
Arg [2] : newBaseURI (string): ipfs://Qmar7EUT1kvrbccQoDdUNooJYc7yuytRQJnFQWxaLN2JGZ/
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 5350415251000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 5350415251000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [8] : 697066733a2f2f516d617237455554316b7672626363516f4464554e6f6f4a59
Arg [9] : 63377975797452514a6e46515778614c4e324a475a2f00000000000000000000
Deployed Bytecode Sourcemap
67719:6972:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72936:475;;;;;;;;;;-1:-1:-1;72936:475:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;72936:475:0;;;;;;;;71589:146;;;;;;;;;;-1:-1:-1;71589:146:0;;;;;:::i;:::-;;:::i;:::-;;35372:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41863:218::-;;;;;;;;;;-1:-1:-1;41863:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2341:32:1;;;2323:51;;2311:2;2296:18;41863:218:0;2177:203:1;41296:408:0;;;;;;:::i;:::-;;:::i;68223:51::-;;;;;;;;;;;;68273:1;68223:51;;;;;2851:25:1;;;2839:2;2824:18;68223:51:0;2705:177:1;31123:323:0;;;;;;;;;;-1:-1:-1;74679:1:0;31397:12;31184:7;31381:13;:28;-1:-1:-1;;31381:46:0;31123:323;;45502:2825;;;;;;:::i;:::-;;:::i;7030:442::-;;;;;;;;;;-1:-1:-1;7030:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3793:32:1;;;3775:51;;3857:2;3842:18;;3835:34;;;;3748:18;7030:442:0;3601:274:1;71118:149:0;;;;;;;;;;-1:-1:-1;71118:149:0;;;;;:::i;:::-;;:::i;67892:33::-;;;;;;;;;;-1:-1:-1;67892:33:0;;;;-1:-1:-1;;;;;67892:33:0;;;72357:247;;;;;;;;;;-1:-1:-1;72357:247:0;;;;;:::i;:::-;;:::i;72137:157::-;;;;;;;;;;;;;:::i;68824:177::-;;;;;;;;;;-1:-1:-1;68824:177:0;;;;;:::i;:::-;;:::i;48423:193::-;;;;;;:::i;:::-;;:::i;68101:54::-;;;;;;;;;;;;68151:4;68101:54;;72612:316;;;;;;;;;;-1:-1:-1;72612:316:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;68322:34::-;;;;;;;;;;;;;;;;71440:141;;;;;;;;;;-1:-1:-1;71440:141:0;;;;;:::i;:::-;;:::i;71844:168::-;;;;;;;;;;-1:-1:-1;71844:168:0;;;;;:::i;:::-;;:::i;36765:152::-;;;;;;;;;;-1:-1:-1;36765:152:0;;;;;:::i;:::-;;:::i;69009:2026::-;;;;;;;;;;-1:-1:-1;69009:2026:0;;;;;:::i;:::-;;:::i;68071:21::-;;;;;;;;;;;;;:::i;32307:233::-;;;;;;;;;;-1:-1:-1;32307:233:0;;;;;:::i;:::-;;:::i;15249:103::-;;;;;;;;;;;;;:::i;68281:34::-;;;;;;;;;;;;;;;;73419:599;;;;;;;;;;-1:-1:-1;73419:599:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;72020:109::-;;;;;;;;;;-1:-1:-1;72020:109:0;;;;;:::i;:::-;;:::i;14601:87::-;;;;;;;;;;-1:-1:-1;14674:6:0;;-1:-1:-1;;;;;14674:6:0;14601:87;;71275:157;;;;;;;;;;-1:-1:-1;71275:157:0;;;;;:::i;:::-;;:::i;35548:104::-;;;;;;;;;;;;;:::i;42421:234::-;;;;;;;;;;-1:-1:-1;42421:234:0;;;;;:::i;:::-;;:::i;71743:93::-;;;;;;;;;;;;;:::i;49214:407::-;;;;;;:::i;:::-;;:::i;74026:405::-;;;;;;;;;;-1:-1:-1;74026:405:0;;;;;:::i;:::-;;:::i;68363:34::-;;;;;;;;;;;;;;;;67856:29;;;;;;;;;;-1:-1:-1;67856:29:0;;;;-1:-1:-1;;;;;67856:29:0;;;67934:62;;;;;;;;;;-1:-1:-1;67934:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;68162:54;;;;;;;;;;;;68212:4;68162:54;;42812:164;;;;;;;;;;-1:-1:-1;42812:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;42933:25:0;;;42909:4;42933:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42812:164;15507:201;;;;;;;;;;-1:-1:-1;15507:201:0;;;;;:::i;:::-;;:::i;72936:475::-;73040:4;-1:-1:-1;;;;;;;;;73064:25:0;;;;:98;;-1:-1:-1;;;;;;;;;;73137:25:0;;;73064:98;:171;;;-1:-1:-1;;;;;;;;;;73210:25:0;;;73064:171;:252;;;-1:-1:-1;;;;;;;;;;73291:25:0;;;73064:252;:339;;;;73367:36;73391:11;73367:23;:36::i;:::-;73057:346;72936:475;-1:-1:-1;;72936:475:0:o;71589:146::-;14487:13;:11;:13::i;:::-;71685:42:::1;71704:8;71714:12;71685:18;:42::i;:::-;71589:146:::0;;:::o;35372:100::-;35426:13;35459:5;35452:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35372:100;:::o;41863:218::-;41939:7;41964:16;41972:7;41964;:16::i;:::-;41959:64;;41989:34;;-1:-1:-1;;;41989:34:0;;;;;;;;;;;41959:64;-1:-1:-1;42043:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;42043:30:0;;41863:218::o;41296:408::-;41385:13;41401:16;41409:7;41401;:16::i;:::-;41385:32;-1:-1:-1;65629:10:0;-1:-1:-1;;;;;41434:28:0;;;41430:175;;41482:44;41499:5;65629:10;42812:164;:::i;41482:44::-;41477:128;;41554:35;;-1:-1:-1;;;41554:35:0;;;;;;;;;;;41477:128;41617:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;41617:35:0;-1:-1:-1;;;;;41617:35:0;;;;;;;;;41668:28;;41617:24;;41668:28;;;;;;;41374:330;41296:408;;:::o;45502:2825::-;45644:27;45674;45693:7;45674:18;:27::i;:::-;45644:57;;45759:4;-1:-1:-1;;;;;45718:45:0;45734:19;-1:-1:-1;;;;;45718:45:0;;45714:86;;45772:28;;-1:-1:-1;;;45772:28:0;;;;;;;;;;;45714:86;45814:27;44610:24;;;:15;:24;;;;;44838:26;;46005:68;44838:26;46047:4;65629:10;46053:19;-1:-1:-1;;;;;44084:32:0;;;43928:28;;44213:20;;44235:30;;44210:56;;43625:659;46005:68;46000:180;;46093:43;46110:4;65629:10;42812:164;:::i;46093:43::-;46088:92;;46145:35;;-1:-1:-1;;;46145:35:0;;;;;;;;;;;46088:92;-1:-1:-1;;;;;46197:16:0;;46193:52;;46222:23;;-1:-1:-1;;;46222:23:0;;;;;;;;;;;46193:52;46394:15;46391:160;;;46534:1;46513:19;46506:30;46391:160;-1:-1:-1;;;;;46931:24:0;;;;;;;:18;:24;;;;;;46929:26;;-1:-1:-1;;46929:26:0;;;47000:22;;;;;;;;;46998:24;;-1:-1:-1;46998:24:0;;;40154:11;40129:23;40125:41;40112:63;-1:-1:-1;;;40112:63:0;47293:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;47588:47:0;;:52;;47584:627;;47693:1;47683:11;;47661:19;47816:30;;;:17;:30;;;;;;:35;;47812:384;;47954:13;;47939:11;:28;47935:242;;48101:30;;;;:17;:30;;;;;:52;;;47935:242;47642:569;47584:627;48258:7;48254:2;-1:-1:-1;;;;;48239:27:0;48248:4;-1:-1:-1;;;;;48239:27:0;-1:-1:-1;;;;;;;;;;;48239:27:0;;;;;;;;;48277:42;45633:2694;;;45502:2825;;;:::o;7030:442::-;7127:7;7185:27;;;:17;:27;;;;;;;;7156:56;;;;;;;;;-1:-1:-1;;;;;7156:56:0;;;;;-1:-1:-1;;;7156:56:0;;;-1:-1:-1;;;;;7156:56:0;;;;;;;;7127:7;;7225:92;;-1:-1:-1;7276:29:0;;;;;;;;;7286:19;7276:29;-1:-1:-1;;;;;7276:29:0;;;;-1:-1:-1;;;7276:29:0;;-1:-1:-1;;;;;7276:29:0;;;;;7225:92;7367:23;;;;7329:21;;7838:5;;7354:36;;-1:-1:-1;;;;;7354:36:0;:10;:36;:::i;:::-;7353:58;;;;:::i;:::-;7432:16;;;;;-1:-1:-1;7030:442:0;;-1:-1:-1;;;;7030:442:0:o;71118:149::-;14487:13;:11;:13::i;:::-;71195:7:::1;:20;71205:10:::0;71195:7;:20:::1;:::i;:::-;-1:-1:-1::0;71231:28:0::1;::::0;;71251:1:::1;12611:25:1::0;;71254:4:0::1;12667:2:1::0;12652:18;;12645:34;71231:28:0::1;::::0;12584:18:1;71231:28:0::1;;;;;;;71118:149:::0;:::o;72357:247::-;72429:7;72462:32;;;:23;:32;;;;;;72513:6;72505:71;;;;-1:-1:-1;;;72505:71:0;;12892:2:1;72505:71:0;;;12874:21:1;12931:2;12911:18;;;12904:30;12970:34;12950:18;;;12943:62;-1:-1:-1;;;13021:18:1;;;13014:50;13081:19;;72505:71:0;;;;;;;;72137:157;14487:13;:11;:13::i;:::-;72186:12:::1;72212:7;14674:6:::0;;-1:-1:-1;;;;;14674:6:0;;14601:87;72212:7:::1;-1:-1:-1::0;;;;;72204:21:0::1;72233;72204:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72185:74;;;72278:7;72270:16;;;::::0;::::1;;72174:120;72137:157::o:0;68824:177::-;68914:18;;-1:-1:-1;;;;;68914:18:0;68900:10;:32;68892:76;;;;-1:-1:-1;;;68892:76:0;;13523:2:1;68892:76:0;;;13505:21:1;13562:2;13542:18;;;13535:30;13601:33;13581:18;;;13574:61;13652:18;;68892:76:0;13321:355:1;68892:76:0;68979:14;68985:7;68979:5;:14::i;48423:193::-;48569:39;48586:4;48592:2;48596:7;48569:39;;;;;;;;;;;;:16;:39::i;:::-;48423:193;;;:::o;72612:316::-;72688:13;72714:18;72746:8;72735:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72735:27:0;;72714:48;;72778:9;72773:126;72793:19;;;72773:126;;;72844:30;:43;72875:8;;72884:1;72875:11;;;;;;;:::i;:::-;;;;;;;72844:43;;;;;;;;;;;;;;;;;;;;;72834:4;72839:1;72834:7;;;;;;;;:::i;:::-;:53;;;:7;;;;;;;;;;;:53;72814:3;;;:::i;:::-;;;72773:126;;;-1:-1:-1;72916:4:0;72612:316;-1:-1:-1;;;72612:316:0:o;71440:141::-;14487:13;:11;:13::i;:::-;71535:14:::1;:38:::0;;-1:-1:-1;;;;;;71535:38:0::1;-1:-1:-1::0;;;;;71535:38:0;;;::::1;::::0;;;::::1;::::0;;71440:141::o;71844:168::-;14487:13;:11;:13::i;:::-;71955:49:::1;71972:7;71981:8;71991:12;71955:16;:49::i;36765:152::-:0;36837:7;36880:27;36899:7;36880:18;:27::i;69009:2026::-;11872:21;:19;:21::i;:::-;69094:19;69086:43:::1;;;::::0;-1:-1:-1;;;69086:43:0;;14155:2:1;69086:43:0::1;::::0;::::1;14137:21:1::0;14194:2;14174:18;;;14167:30;-1:-1:-1;;;14213:18:1;;;14206:41;14264:18;;69086:43:0::1;13953:335:1::0;69086:43:0::1;69140:15;31790:13:::0;;-1:-1:-1;;31790:31:0;69158:18:::1;::::0;69175:1:::1;69158:18;:::i;:::-;69140:36;;69192:9;69187:1796;69207:19:::0;;::::1;69187:1796;;;69292:14;::::0;-1:-1:-1;;;;;69292:14:0::1;::::0;69344:17:::1;69362:8:::0;;69371:1;69362:11;;::::1;;;;;:::i;:::-;;;;;;;69344:30;;;;;;;;;;;;;2851:25:1::0;;2839:2;2824:18;;2705:177;69344:30:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;69330:44:0::1;:10;-1:-1:-1::0;;;;;69330:44:0::1;;69322:101;;;::::0;-1:-1:-1;;;69322:101:0;;14881:2:1;69322:101:0::1;::::0;::::1;14863:21:1::0;14920:2;14900:18;;;14893:30;14959:34;14939:18;;;14932:62;-1:-1:-1;;;15010:18:1;;;15003:42;15062:19;;69322:101:0::1;14679:408:1::0;69322:101:0::1;69446:30;:43;69477:8;;69486:1;69477:11;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;69446:43:::0;;-1:-1:-1;69446:43:0;::::1;::::0;;;;;;-1:-1:-1;69446:43:0;;::::1;;:52;69438:104;;;::::0;-1:-1:-1;;;69438:104:0;;15294:2:1;69438:104:0::1;::::0;::::1;15276:21:1::0;15333:2;15313:18;;;15306:30;15372:34;15352:18;;;15345:62;-1:-1:-1;;;15423:18:1;;;15416:37;15470:19;;69438:104:0::1;15092:403:1::0;69438:104:0::1;69603:4;69557:30;:43;69588:8;;69597:1;69588:11;;;;;;;:::i;:::-;;;;;;;69557:43;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;69622:20;68273:1;68212:4;68151;69748:49;;;;:::i;:::-;:75;;;;:::i;:::-;69708:1:::0;69680:25:::1;69698:7:::0;69680:15:::1;:25;:::i;:::-;:29;;;;:::i;:::-;69740:1:::0;69711:26:::1;69730:7:::0;69711:16:::1;:26;:::i;:::-;:30;;;;:::i;:::-;69663:79;::::0;;::::1;::::0;::::1;15657:19:1::0;;;;15692:12;;15685:28;15729:12;;69663:79:0::1;;;;;;;;;;;;69653:90;;;;;;69645:99;;:179;;;;:::i;:::-;69622:202;;68151:4;69843:12;:38;:87;;;;;68151:4;69885:19;;:45;69843:87;69839:1133;;;69951:19;:21:::0;;;:19:::1;:21;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;70030:1:0::1;::::0;-1:-1:-1;69991:23:0::1;:36;70015:11;70025:1:::0;70015:7;:11:::1;:::i;:::-;69991:36:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;69991:36:0;:40;69839:1133:::1;;;70072:49;68212:4;68151;70072:49;:::i;:::-;70057:12;:64;:113;;;;;68212:4;70125:19;;:45;70057:113;70053:919;;;70191:19;:21:::0;;;:19:::1;:21;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;70270:1:0::1;::::0;-1:-1:-1;70231:23:0::1;:36;70255:11;70265:1:::0;70255:7;:11:::1;:::i;70053:919::-;68273:1;70312:49;68212:4;68151;70312:49;:::i;:::-;:75;;;;:::i;:::-;70297:12;:90;:139;;;;;68273:1;70391:19;;:45;70297:139;70293:679;;;70457:19;:21:::0;;;:19:::1;:21;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;70536:1:0::1;::::0;-1:-1:-1;70497:23:0::1;:36;70521:11;70531:1:::0;70521:7;:11:::1;:::i;70293:679::-;68212:4;70563:19;;:45;70559:413;;;70629:19;:21:::0;;;:19:::1;:21;::::0;::::1;:::i;70559:413::-;68151:4;70735:19;;:45;70731:241;;;70801:19;:21:::0;;;:19:::1;:21;::::0;::::1;:::i;70731:241::-;70922:34;::::0;-1:-1:-1;;;70922:34:0;;16071:2:1;70922:34:0::1;::::0;::::1;16053:21:1::0;16110:2;16090:18;;;16083:30;16149:26;16129:18;;;16122:54;16193:18;;70922:34:0::1;15869:348:1::0;70731:241:0::1;69233:1750;;69228:3;;;;:::i;:::-;;;69187:1796;;;-1:-1:-1::0;70993:34:0::1;70999:10;71011:8:::0;70993:5:::1;:34::i;:::-;69075:1960;11916:20:::0;11310:1;12436:7;:22;12253:213;68071:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32307:233::-;32379:7;-1:-1:-1;;;;;32403:19:0;;32399:60;;32431:28;;-1:-1:-1;;;32431:28:0;;;;;;;;;;;32399:60;-1:-1:-1;;;;;;32477:25:0;;;;;:18;:25;;;;;;26466:13;32477:55;;32307:233::o;15249:103::-;14487:13;:11;:13::i;:::-;15314:30:::1;15341:1;15314:18;:30::i;:::-;15249:103::o:0;73419:599::-;73478:16;73507:30;73554:16;73564:5;73554:9;:16::i;:::-;73540:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73540:31:0;-1:-1:-1;73507:64:0;-1:-1:-1;73607:1:0;73582:22;73659:321;31599:7;31790:13;-1:-1:-1;;31790:31:0;73666:17;:34;:70;;;;-1:-1:-1;31599:7:0;31790:13;-1:-1:-1;;31790:31:0;73704:14;:32;;73666:70;73659:321;;;73757:23;73765:14;73757:7;:23::i;:::-;:59;;;;;73811:5;-1:-1:-1;;;;;73784:32:0;:23;73792:14;73784:7;:23::i;:::-;-1:-1:-1;;;;;73784:32:0;;73757:59;73753:185;;;73871:14;73836:13;73850:17;73836:32;;;;;;;;:::i;:::-;;;;;;;;;;:49;73903:19;;;;:::i;:::-;;;;73753:185;73952:16;;;;:::i;:::-;;;;73659:321;;;-1:-1:-1;73997:13:0;;73419:599;-1:-1:-1;;;73419:599:0:o;72020:109::-;14487:13;:11;:13::i;:::-;9486:26;;;;:17;:26;;;;;9479:33;72137:157::o;71275:::-;14487:13;:11;:13::i;:::-;71378:18:::1;:46:::0;;-1:-1:-1;;;;;;71378:46:0::1;-1:-1:-1::0;;;;;71378:46:0;;;::::1;::::0;;;::::1;::::0;;71275:157::o;35548:104::-;35604:13;35637:7;35630:14;;;;;:::i;42421:234::-;65629:10;42516:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;42516:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;42516:60:0;;;;;;;;;;42592:55;;540:41:1;;;42516:49:0;;65629:10;42592:55;;513:18:1;42592:55:0;;;;;;;42421:234;;:::o;71743:93::-;14487:13;:11;:13::i;:::-;71805:23:::1;8598:19:::0;;8591:26;8530:95;49214:407;49389:31;49402:4;49408:2;49412:7;49389:12;:31::i;:::-;-1:-1:-1;;;;;49435:14:0;;;:19;49431:183;;49474:56;49505:4;49511:2;49515:7;49524:5;49474:30;:56::i;:::-;49469:145;;49558:40;;-1:-1:-1;;;49558:40:0;;;;;;;;;;;49469:145;49214:407;;;;:::o;74026:405::-;74099:13;74133:16;74141:7;74133;:16::i;:::-;74125:76;;;;-1:-1:-1;;;74125:76:0;;16424:2:1;74125:76:0;;;16406:21:1;16463:2;16443:18;;;16436:30;16502:34;16482:18;;;16475:62;-1:-1:-1;;;16553:18:1;;;16546:45;16608:19;;74125:76:0;16222:411:1;74125:76:0;74212:28;74243:10;:8;:10::i;:::-;74212:41;;74302:1;74277:14;74271:28;:32;:152;;;;;;;;;;;;;;;;;74355:32;;;;:23;:32;;;;;;74339:14;;74355:43;;:41;:43::i;:::-;74322:86;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74271:152;74264:159;74026:405;-1:-1:-1;;;74026:405:0:o;15507:201::-;14487:13;:11;:13::i;:::-;-1:-1:-1;;;;;15596:22:0;::::1;15588:73;;;::::0;-1:-1:-1;;;15588:73:0;;17508:2:1;15588:73:0::1;::::0;::::1;17490:21:1::0;17547:2;17527:18;;;17520:30;17586:34;17566:18;;;17559:62;-1:-1:-1;;;17637:18:1;;;17630:36;17683:19;;15588:73:0::1;17306:402:1::0;15588:73:0::1;15672:28;15691:8;15672:18;:28::i;6760:215::-:0;6862:4;-1:-1:-1;;;;;;6886:41:0;;-1:-1:-1;;;6886:41:0;;:81;;-1:-1:-1;;;;;;;;;;4421:40:0;;;6931:36;4312:157;14766:132;14674:6;;-1:-1:-1;;;;;14674:6:0;65629:10;14830:23;14822:68;;;;-1:-1:-1;;;14822:68:0;;17915:2:1;14822:68:0;;;17897:21:1;;;17934:18;;;17927:30;17993:34;17973:18;;;17966:62;18045:18;;14822:68:0;17713:356:1;8122:332:0;7838:5;-1:-1:-1;;;;;8225:33:0;;;;8217:88;;;;-1:-1:-1;;;8217:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8324:22:0;;8316:60;;;;-1:-1:-1;;;8316:60:0;;18687:2:1;8316:60:0;;;18669:21:1;18726:2;18706:18;;;18699:30;18765:27;18745:18;;;18738:55;18810:18;;8316:60:0;18485:349:1;8316:60:0;8411:35;;;;;;;;;-1:-1:-1;;;;;8411:35:0;;;;;;-1:-1:-1;;;;;8411:35:0;;;;;;;;;;-1:-1:-1;;;8389:57:0;;;;:19;:57;8122:332::o;43234:282::-;43299:4;43355:7;74679:1;43336:26;;:66;;;;;43389:13;;43379:7;:23;43336:66;:153;;;;-1:-1:-1;;43440:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;43440:44:0;:49;;43234:282::o;37920:1275::-;37987:7;38022;;74679:1;38071:23;38067:1061;;38124:13;;38117:4;:20;38113:1015;;;38162:14;38179:23;;;:17;:23;;;;;;;-1:-1:-1;;;38268:24:0;;:29;;38264:845;;38933:113;38940:6;38950:1;38940:11;38933:113;;-1:-1:-1;;;39011:6:0;38993:25;;;;:17;:25;;;;;;38933:113;;38264:845;38139:989;38113:1015;39156:31;;-1:-1:-1;;;39156:31:0;;;;;;;;;;;59753:89;59813:21;59819:7;59828:5;59813;:21::i;8905:390::-;7838:5;-1:-1:-1;;;;;9057:33:0;;;;9049:88;;;;-1:-1:-1;;;9049:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9156:22:0;;9148:62;;;;-1:-1:-1;;;9148:62:0;;19041:2:1;9148:62:0;;;19023:21:1;19080:2;19060:18;;;19053:30;19119:29;19099:18;;;19092:57;19166:18;;9148:62:0;18839:351:1;9148:62:0;9252:35;;;;;;;;-1:-1:-1;;;;;9252:35:0;;;;;-1:-1:-1;;;;;9252:35:0;;;;;;;;;;-1:-1:-1;9223:26:0;;;:17;:26;;;;;;:64;;;;;;;-1:-1:-1;;;9223:64:0;;;;;;8905:390::o;11952:293::-;11354:1;12086:7;;:19;12078:63;;;;-1:-1:-1;;;12078:63:0;;19397:2:1;12078:63:0;;;19379:21:1;19436:2;19416:18;;;19409:30;19475:33;19455:18;;;19448:61;19526:18;;12078:63:0;19195:355:1;12078:63:0;11354:1;12219:7;:18;11952:293::o;52883:2966::-;52956:20;52979:13;;;53007;;;53003:44;;53029:18;;-1:-1:-1;;;53029:18:0;;;;;;;;;;;53003:44;-1:-1:-1;;;;;53535:22:0;;;;;;:18;:22;;;;26604:2;53535:22;;;:71;;53573:32;53561:45;;53535:71;;;53849:31;;;:17;:31;;;;;-1:-1:-1;40585:15:0;;40559:24;40555:46;40154:11;40129:23;40125:41;40122:52;40112:63;;53849:173;;54084:23;;;;53849:31;;53535:22;;-1:-1:-1;;;;;;;;;;;53535:22:0;;54702:335;55363:1;55349:12;55345:20;55303:346;55404:3;55395:7;55392:16;55303:346;;55622:7;55612:8;55609:1;-1:-1:-1;;;;;;;;;;;55579:1:0;55576;55571:59;55457:1;55444:15;55303:346;;;55307:77;55682:8;55694:1;55682:13;55678:45;;55704:19;;-1:-1:-1;;;55704:19:0;;;;;;;;;;;55678:45;55740:13;:19;-1:-1:-1;48423:193:0;;;:::o;15868:191::-;15961:6;;;-1:-1:-1;;;;;15978:17:0;;;-1:-1:-1;;;;;;15978:17:0;;;;;;;16011:40;;15961:6;;;15978:17;15961:6;;16011:40;;15942:16;;16011:40;15931:128;15868:191;:::o;51705:716::-;51889:88;;-1:-1:-1;;;51889:88:0;;51868:4;;-1:-1:-1;;;;;51889:45:0;;;;;:88;;65629:10;;51956:4;;51962:7;;51971:5;;51889:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51889:88:0;;;;;;;;-1:-1:-1;;51889:88:0;;;;;;;;;;;;:::i;:::-;;;51885:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52172:6;:13;52189:1;52172:18;52168:235;;52218:40;;-1:-1:-1;;;52218:40:0;;;;;;;;;;;52168:235;52361:6;52355:13;52346:6;52342:2;52338:15;52331:38;51885:529;-1:-1:-1;;;;;;52048:64:0;-1:-1:-1;;;52048:64:0;;-1:-1:-1;51885:529:0;51705:716;;;;;;:::o;74471:108::-;74531:13;74564:7;74557:14;;;;;:::i;463:723::-;519:13;740:5;749:1;740:10;736:53;;-1:-1:-1;;767:10:0;;;;;;;;;;;;-1:-1:-1;;;767:10:0;;;;;463:723::o;736:53::-;814:5;799:12;855:78;862:9;;855:78;;888:8;;;;:::i;:::-;;-1:-1:-1;911:10:0;;-1:-1:-1;919:2:0;911:10;;:::i;:::-;;;855:78;;;943:19;975:6;965:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;965:17:0;;943:39;;993:154;1000:10;;993:154;;1027:11;1037:1;1027:11;;:::i;:::-;;-1:-1:-1;1096:10:0;1104:2;1096:5;:10;:::i;:::-;1083:24;;:2;:24;:::i;:::-;1070:39;;1053:6;1060;1053:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1053:56:0;;;;;;;;-1:-1:-1;1124:11:0;1133:2;1124:11;;:::i;:::-;;;993:154;;60071:3081;60151:27;60181;60200:7;60181:18;:27::i;:::-;60151:57;-1:-1:-1;60151:57:0;60221:12;;60343:35;60370:7;44499:27;44610:24;;;:15;:24;;;;;44838:26;;44610:24;;44397:485;60343:35;60286:92;;;;60395:13;60391:316;;;60516:68;60541:15;60558:4;65629:10;60564:19;65542:105;60516:68;60511:184;;60608:43;60625:4;65629:10;42812:164;:::i;60608:43::-;60603:92;;60660:35;;-1:-1:-1;;;60660:35:0;;;;;;;;;;;60603:92;60863:15;60860:160;;;61003:1;60982:19;60975:30;60860:160;-1:-1:-1;;;;;61622:24:0;;;;;;:18;:24;;;;;:60;;61650:32;61622:60;;;40154:11;40129:23;40125:41;40112:63;-1:-1:-1;;;40112:63:0;61920:26;;;;:17;:26;;;;;:205;;;;-1:-1:-1;;;62245:47:0;;:52;;62241:627;;62350:1;62340:11;;62318:19;62473:30;;;:17;:30;;;;;;:35;;62469:384;;62611:13;;62596:11;:28;62592:242;;62758:30;;;;:17;:30;;;;;:52;;;62592:242;62299:569;62241:627;62896:35;;62923:7;;62919:1;;-1:-1:-1;;;;;62896:35:0;;;-1:-1:-1;;;;;;;;;;;62896:35:0;62919:1;;62896:35;-1:-1:-1;;63119:12:0;:14;;;;;;-1:-1:-1;;;;60071:3081:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:131::-;-1:-1:-1;;;;;667:31:1;;657:42;;647:70;;713:1;710;703:12;728:179;795:20;;-1:-1:-1;;;;;844:38:1;;834:49;;824:77;;897:1;894;887:12;824:77;728:179;;;:::o;912:319::-;979:6;987;1040:2;1028:9;1019:7;1015:23;1011:32;1008:52;;;1056:1;1053;1046:12;1008:52;1095:9;1082:23;1114:31;1139:5;1114:31;:::i;:::-;1164:5;-1:-1:-1;1188:37:1;1221:2;1206:18;;1188:37;:::i;:::-;1178:47;;912:319;;;;;:::o;1236:250::-;1321:1;1331:113;1345:6;1342:1;1339:13;1331:113;;;1421:11;;;1415:18;1402:11;;;1395:39;1367:2;1360:10;1331:113;;;-1:-1:-1;;1478:1:1;1460:16;;1453:27;1236:250::o;1491:271::-;1533:3;1571:5;1565:12;1598:6;1593:3;1586:19;1614:76;1683:6;1676:4;1671:3;1667:14;1660:4;1653:5;1649:16;1614:76;:::i;:::-;1744:2;1723:15;-1:-1:-1;;1719:29:1;1710:39;;;;1751:4;1706:50;;1491:271;-1:-1:-1;;1491:271:1:o;1767:220::-;1916:2;1905:9;1898:21;1879:4;1936:45;1977:2;1966:9;1962:18;1954:6;1936:45;:::i;1992:180::-;2051:6;2104:2;2092:9;2083:7;2079:23;2075:32;2072:52;;;2120:1;2117;2110:12;2072:52;-1:-1:-1;2143:23:1;;1992:180;-1:-1:-1;1992:180:1:o;2385:315::-;2453:6;2461;2514:2;2502:9;2493:7;2489:23;2485:32;2482:52;;;2530:1;2527;2520:12;2482:52;2569:9;2556:23;2588:31;2613:5;2588:31;:::i;:::-;2638:5;2690:2;2675:18;;;;2662:32;;-1:-1:-1;;;2385:315:1:o;2887:456::-;2964:6;2972;2980;3033:2;3021:9;3012:7;3008:23;3004:32;3001:52;;;3049:1;3046;3039:12;3001:52;3088:9;3075:23;3107:31;3132:5;3107:31;:::i;:::-;3157:5;-1:-1:-1;3214:2:1;3199:18;;3186:32;3227:33;3186:32;3227:33;:::i;:::-;2887:456;;3279:7;;-1:-1:-1;;;3333:2:1;3318:18;;;;3305:32;;2887:456::o;3348:248::-;3416:6;3424;3477:2;3465:9;3456:7;3452:23;3448:32;3445:52;;;3493:1;3490;3483:12;3445:52;-1:-1:-1;;3516:23:1;;;3586:2;3571:18;;;3558:32;;-1:-1:-1;3348:248:1:o;3880:127::-;3941:10;3936:3;3932:20;3929:1;3922:31;3972:4;3969:1;3962:15;3996:4;3993:1;3986:15;4012:632;4077:5;4107:18;4148:2;4140:6;4137:14;4134:40;;;4154:18;;:::i;:::-;4229:2;4223:9;4197:2;4283:15;;-1:-1:-1;;4279:24:1;;;4305:2;4275:33;4271:42;4259:55;;;4329:18;;;4349:22;;;4326:46;4323:72;;;4375:18;;:::i;:::-;4415:10;4411:2;4404:22;4444:6;4435:15;;4474:6;4466;4459:22;4514:3;4505:6;4500:3;4496:16;4493:25;4490:45;;;4531:1;4528;4521:12;4490:45;4581:6;4576:3;4569:4;4561:6;4557:17;4544:44;4636:1;4629:4;4620:6;4612;4608:19;4604:30;4597:41;;;;4012:632;;;;;:::o;4649:451::-;4718:6;4771:2;4759:9;4750:7;4746:23;4742:32;4739:52;;;4787:1;4784;4777:12;4739:52;4827:9;4814:23;4860:18;4852:6;4849:30;4846:50;;;4892:1;4889;4882:12;4846:50;4915:22;;4968:4;4960:13;;4956:27;-1:-1:-1;4946:55:1;;4997:1;4994;4987:12;4946:55;5020:74;5086:7;5081:2;5068:16;5063:2;5059;5055:11;5020:74;:::i;5105:615::-;5191:6;5199;5252:2;5240:9;5231:7;5227:23;5223:32;5220:52;;;5268:1;5265;5258:12;5220:52;5308:9;5295:23;5337:18;5378:2;5370:6;5367:14;5364:34;;;5394:1;5391;5384:12;5364:34;5432:6;5421:9;5417:22;5407:32;;5477:7;5470:4;5466:2;5462:13;5458:27;5448:55;;5499:1;5496;5489:12;5448:55;5539:2;5526:16;5565:2;5557:6;5554:14;5551:34;;;5581:1;5578;5571:12;5551:34;5634:7;5629:2;5619:6;5616:1;5612:14;5608:2;5604:23;5600:32;5597:45;5594:65;;;5655:1;5652;5645:12;5594:65;5686:2;5678:11;;;;;5708:6;;-1:-1:-1;5105:615:1;;-1:-1:-1;;;;5105:615:1:o;5725:642::-;5890:2;5942:21;;;6012:13;;5915:18;;;6034:22;;;5861:4;;5890:2;6113:15;;;;6087:2;6072:18;;;5861:4;6156:185;6170:6;6167:1;6164:13;6156:185;;;6245:13;;6238:21;6231:29;6219:42;;6316:15;;;;6281:12;;;;6192:1;6185:9;6156:185;;;-1:-1:-1;6358:3:1;;5725:642;-1:-1:-1;;;;;;5725:642:1:o;6372:247::-;6431:6;6484:2;6472:9;6463:7;6459:23;6455:32;6452:52;;;6500:1;6497;6490:12;6452:52;6539:9;6526:23;6558:31;6583:5;6558:31;:::i;6624:387::-;6700:6;6708;6716;6769:2;6757:9;6748:7;6744:23;6740:32;6737:52;;;6785:1;6782;6775:12;6737:52;6821:9;6808:23;6798:33;;6881:2;6870:9;6866:18;6853:32;6894:31;6919:5;6894:31;:::i;:::-;6944:5;-1:-1:-1;6968:37:1;7001:2;6986:18;;6968:37;:::i;:::-;6958:47;;6624:387;;;;;:::o;7016:632::-;7187:2;7239:21;;;7309:13;;7212:18;;;7331:22;;;7158:4;;7187:2;7410:15;;;;7384:2;7369:18;;;7158:4;7453:169;7467:6;7464:1;7461:13;7453:169;;;7528:13;;7516:26;;7597:15;;;;7562:12;;;;7489:1;7482:9;7453:169;;7653:416;7718:6;7726;7779:2;7767:9;7758:7;7754:23;7750:32;7747:52;;;7795:1;7792;7785:12;7747:52;7834:9;7821:23;7853:31;7878:5;7853:31;:::i;:::-;7903:5;-1:-1:-1;7960:2:1;7945:18;;7932:32;8002:15;;7995:23;7983:36;;7973:64;;8033:1;8030;8023:12;7973:64;8056:7;8046:17;;;7653:416;;;;;:::o;8074:795::-;8169:6;8177;8185;8193;8246:3;8234:9;8225:7;8221:23;8217:33;8214:53;;;8263:1;8260;8253:12;8214:53;8302:9;8289:23;8321:31;8346:5;8321:31;:::i;:::-;8371:5;-1:-1:-1;8428:2:1;8413:18;;8400:32;8441:33;8400:32;8441:33;:::i;:::-;8493:7;-1:-1:-1;8547:2:1;8532:18;;8519:32;;-1:-1:-1;8602:2:1;8587:18;;8574:32;8629:18;8618:30;;8615:50;;;8661:1;8658;8651:12;8615:50;8684:22;;8737:4;8729:13;;8725:27;-1:-1:-1;8715:55:1;;8766:1;8763;8756:12;8715:55;8789:74;8855:7;8850:2;8837:16;8832:2;8828;8824:11;8789:74;:::i;:::-;8779:84;;;8074:795;;;;;;;:::o;8874:388::-;8942:6;8950;9003:2;8991:9;8982:7;8978:23;8974:32;8971:52;;;9019:1;9016;9009:12;8971:52;9058:9;9045:23;9077:31;9102:5;9077:31;:::i;:::-;9127:5;-1:-1:-1;9184:2:1;9169:18;;9156:32;9197:33;9156:32;9197:33;:::i;9267:380::-;9346:1;9342:12;;;;9389;;;9410:61;;9464:4;9456:6;9452:17;9442:27;;9410:61;9517:2;9509:6;9506:14;9486:18;9483:38;9480:161;;9563:10;9558:3;9554:20;9551:1;9544:31;9598:4;9595:1;9588:15;9626:4;9623:1;9616:15;9480:161;;9267:380;;;:::o;9652:127::-;9713:10;9708:3;9704:20;9701:1;9694:31;9744:4;9741:1;9734:15;9768:4;9765:1;9758:15;9784:168;9857:9;;;9888;;9905:15;;;9899:22;;9885:37;9875:71;;9926:18;;:::i;9957:127::-;10018:10;10013:3;10009:20;10006:1;9999:31;10049:4;10046:1;10039:15;10073:4;10070:1;10063:15;10089:120;10129:1;10155;10145:35;;10160:18;;:::i;:::-;-1:-1:-1;10194:9:1;;10089:120::o;10340:545::-;10442:2;10437:3;10434:11;10431:448;;;10478:1;10503:5;10499:2;10492:17;10548:4;10544:2;10534:19;10618:2;10606:10;10602:19;10599:1;10595:27;10589:4;10585:38;10654:4;10642:10;10639:20;10636:47;;;-1:-1:-1;10677:4:1;10636:47;10732:2;10727:3;10723:12;10720:1;10716:20;10710:4;10706:31;10696:41;;10787:82;10805:2;10798:5;10795:13;10787:82;;;10850:17;;;10831:1;10820:13;10787:82;;11061:1352;11187:3;11181:10;11214:18;11206:6;11203:30;11200:56;;;11236:18;;:::i;:::-;11265:97;11355:6;11315:38;11347:4;11341:11;11315:38;:::i;:::-;11309:4;11265:97;:::i;:::-;11417:4;;11481:2;11470:14;;11498:1;11493:663;;;;12200:1;12217:6;12214:89;;;-1:-1:-1;12269:19:1;;;12263:26;12214:89;-1:-1:-1;;11018:1:1;11014:11;;;11010:24;11006:29;10996:40;11042:1;11038:11;;;10993:57;12316:81;;11463:944;;11493:663;10287:1;10280:14;;;10324:4;10311:18;;-1:-1:-1;;11529:20:1;;;11647:236;11661:7;11658:1;11655:14;11647:236;;;11750:19;;;11744:26;11729:42;;11842:27;;;;11810:1;11798:14;;;;11677:19;;11647:236;;;11651:3;11911:6;11902:7;11899:19;11896:201;;;11972:19;;;11966:26;-1:-1:-1;;12055:1:1;12051:14;;;12067:3;12047:24;12043:37;12039:42;12024:58;12009:74;;11896:201;-1:-1:-1;;;;;12143:1:1;12127:14;;;12123:22;12110:36;;-1:-1:-1;11061:1352:1:o;13681:127::-;13742:10;13737:3;13733:20;13730:1;13723:31;13773:4;13770:1;13763:15;13797:4;13794:1;13787:15;13813:135;13852:3;13873:17;;;13870:43;;13893:18;;:::i;:::-;-1:-1:-1;13940:1:1;13929:13;;13813:135::o;14293:125::-;14358:9;;;14379:10;;;14376:36;;;14392:18;;:::i;14423:251::-;14493:6;14546:2;14534:9;14525:7;14521:23;14517:32;14514:52;;;14562:1;14559;14552:12;14514:52;14594:9;14588:16;14613:31;14638:5;14613:31;:::i;15752:112::-;15784:1;15810;15800:35;;15815:18;;:::i;:::-;-1:-1:-1;15849:9:1;;15752:112::o;16638:663::-;16918:3;16956:6;16950:13;16972:66;17031:6;17026:3;17019:4;17011:6;17007:17;16972:66;:::i;:::-;17101:13;;17060:16;;;;17123:70;17101:13;17060:16;17170:4;17158:17;;17123:70;:::i;:::-;-1:-1:-1;;;17215:20:1;;17244:22;;;17293:1;17282:13;;16638:663;-1:-1:-1;;;;16638:663:1:o;18074:406::-;18276:2;18258:21;;;18315:2;18295:18;;;18288:30;18354:34;18349:2;18334:18;;18327:62;-1:-1:-1;;;18420:2:1;18405:18;;18398:40;18470:3;18455:19;;18074:406::o;19555:489::-;-1:-1:-1;;;;;19824:15:1;;;19806:34;;19876:15;;19871:2;19856:18;;19849:43;19923:2;19908:18;;19901:34;;;19971:3;19966:2;19951:18;;19944:31;;;19749:4;;19992:46;;20018:19;;20010:6;19992:46;:::i;:::-;19984:54;19555:489;-1:-1:-1;;;;;;19555:489:1:o;20049:249::-;20118:6;20171:2;20159:9;20150:7;20146:23;20142:32;20139:52;;;20187:1;20184;20177:12;20139:52;20219:9;20213:16;20238:30;20262:5;20238:30;:::i;20303:128::-;20370:9;;;20391:11;;;20388:37;;;20405:18;;:::i
Swarm Source
ipfs://33c02de386f7fa4ceb3b858bc11810f12300bee5d493e65624d7a6460ce25532
Loading...
Loading
Loading...
Loading
OVERVIEW
SPARQ Cells are part of the Melted Dudz collection and are a reward for Dudelz holders which allows them to create a whole new melted variation of their Dudelz for free!Check out https://www.dudelz.com/ for more infoMultichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.