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 39 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer From | 20253722 | 139 days ago | IN | 0 ETH | 0.00022747 | ||||
Transfer From | 19508916 | 243 days ago | IN | 0 ETH | 0.00067917 | ||||
Transfer From | 19508915 | 243 days ago | IN | 0 ETH | 0.0006227 | ||||
Transfer From | 19508915 | 243 days ago | IN | 0 ETH | 0.00091677 | ||||
Transfer From | 19508912 | 243 days ago | IN | 0 ETH | 0.00110662 | ||||
Transfer From | 19508911 | 243 days ago | IN | 0 ETH | 0.00115061 | ||||
Airdrop Mint | 19508890 | 243 days ago | IN | 0 ETH | 0.0012187 | ||||
Airdrop Mint | 19508889 | 243 days ago | IN | 0 ETH | 0.0009989 | ||||
Airdrop Mint | 19508888 | 243 days ago | IN | 0 ETH | 0.00126557 | ||||
Airdrop Mint | 19508887 | 243 days ago | IN | 0 ETH | 0.00124882 | ||||
Airdrop Mint | 19508885 | 243 days ago | IN | 0 ETH | 0.00116817 | ||||
Airdrop Mint | 19508880 | 243 days ago | IN | 0 ETH | 0.0009703 | ||||
Airdrop Mint | 19508866 | 243 days ago | IN | 0 ETH | 0.00141709 | ||||
Airdrop Mint | 19508856 | 243 days ago | IN | 0 ETH | 0.00117229 | ||||
Airdrop Mint | 19508856 | 243 days ago | IN | 0 ETH | 0.00107438 | ||||
Airdrop Mint | 19508853 | 243 days ago | IN | 0 ETH | 0.0012982 | ||||
Airdrop Mint | 19508852 | 243 days ago | IN | 0 ETH | 0.00110152 | ||||
Airdrop Mint | 19508850 | 243 days ago | IN | 0 ETH | 0.00133759 | ||||
Airdrop Mint | 19508849 | 243 days ago | IN | 0 ETH | 0.00116273 | ||||
Airdrop Mint | 19508847 | 243 days ago | IN | 0 ETH | 0.00114383 | ||||
Airdrop Mint | 19508841 | 243 days ago | IN | 0 ETH | 0.00104194 | ||||
Airdrop Mint | 19508839 | 243 days ago | IN | 0 ETH | 0.00123072 | ||||
Airdrop Mint | 19508838 | 243 days ago | IN | 0 ETH | 0.00115898 | ||||
Airdrop Mint | 19508835 | 243 days ago | IN | 0 ETH | 0.0010292 | ||||
Airdrop Mint | 19508832 | 243 days ago | IN | 0 ETH | 0.00126262 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CUFE_HKAA_POAP
Compiler Version
v0.8.22+commit.4fc1097e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./MerkleProof.sol"; import "./Ownable.sol"; import "./ERC721A.sol"; import "./BitMaps.sol"; contract CUFE_HKAA_POAP is Ownable, ERC721A { // BitMaps using BitMaps for BitMaps.BitMap; BitMaps.BitMap private _isConsumed; // OnChain memoey for the Season PassCard mapping(uint256 => uint256) session; mapping(address => mapping (uint256 => uint256)) private mint_limit_count; mapping(uint256 => uint256) session_whiteList_max_supply; // Total number of Session(season) uint256 public total_session; // Initial session_id uint256 public cur_session_id = 1; // baseUri mapping mapping(uint256 => string) base_uri; // Definition of status of the mint progress uint256 immutable ADMIN_SWITCH = 1; uint256 immutable AIRDROP_SWITCH = 2; uint256 immutable WHITELIST_SWITCH = 3; uint256 immutable PUBLIC_SWITCH = 4; uint256 public cur_switch; // Mint Price for public sale and whitelist uint256 public whitelist_price; uint256 public public_sale_price; // Limit of mint token per address in WhiteList & Public uint256 public max_whitelist_mint_no = 5; uint256 public max_public_mint_no = 10; // merkle tree for using whitelist address verfication bytes32 public merkle_root; // Requirement of modifier in the stage of mint modifier onlyAdminSwitchOpen() { require(cur_switch == ADMIN_SWITCH, "admin switch closed"); _; } modifier onlyAirdroopSwitchOpen() { require(cur_switch == AIRDROP_SWITCH, "airdrop switch closed"); _; } modifier onlyWhitelistSwitchOpen() { require(cur_switch == WHITELIST_SWITCH, "whitelist switch closed"); _; } modifier onlyPublicSwitchOpen() { require(cur_switch == PUBLIC_SWITCH, "public switch closed"); _; } // Setup name & symbol constructor( string memory _name, string memory _symbol ) ERC721A(_name, _symbol) {} // Setup session(season)-id baseUri function setBaseURI( string memory _base_uri, uint256 _session_id ) external onlyOwner { base_uri[_session_id] = _base_uri; } // AdminMint Stage which ADMIN_SWITCH = 1 function adminMint( address _to, uint256 _quantity ) external onlyAdminSwitchOpen onlyOwner { mint(_to, _quantity); } // AirDropMint stage which AIRDROP_SWITCH = 2 function airdropMint( address[] calldata _to, uint256[] calldata _quantity ) external onlyAirdroopSwitchOpen onlyOwner { uint256 len = _to.length; require(len == _quantity.length); for (uint256 i = 0; i < len; ) { mint(_to[i], _quantity[i]); ++i; } } // WhiteListMint stage which WHITELIST_SWITCH = 3 function whitelistMint( uint256 _quantity, bytes32[] calldata proof ) external payable onlyWhitelistSwitchOpen { address _account = msg.sender; // Check the mint limit require(_quantity <= max_whitelist_mint_no ,"Don't exceed the WhiteList Mint Maximum limit!"); require(_quantity + totalSupply() <= session_whiteList_max_supply[cur_session_id],"Don't exceed session whitelist supply!"); // When setup leaf from JS, need to packed as [address, cur_session_id] to generate the root bytes32 leaf = keccak256(abi.encodePacked(_account, cur_session_id)); // One address only redeem once at every session of WhiteList Regeristion and mint require(!_isConsumed.get(uint256(leaf)), "You have already redeemed the whitelist rights at this season! (consumed)"); _isConsumed.set(uint256(leaf)); // Merkle Proof require(MerkleProof.verify(proof, merkle_root, leaf), "Invalid proof"); // Send equivalent Ethereum to contract require(msg.value == _quantity * whitelist_price, "Please enter the enough ethereum to mint! (no enough ether)"); mint(_account, _quantity); } // PublicMint stage which PUBLIC_SWITCH = 4 function publictMint( uint256 _quantity ) external payable onlyPublicSwitchOpen { require(_quantity <= max_public_mint_no ,"Don't exceed the Public Mint Maximum limit!"); require(_quantity <= allowedMintLimitCount(msg.sender, cur_session_id),"You have reached the max mint limit for each address, Please mint Less!"); require(msg.value == _quantity * public_sale_price, "Please enter the enough ethereum to mint! (no enough ether)"); mint(msg.sender, _quantity); updateMintLimitCount(msg.sender, _quantity, cur_session_id); } // Internal calling _safemint function from 1-4 Mint function mint(address _to, uint256 _quantity) internal { require(totalSupply() + _quantity <= session[cur_session_id], "exceed the maximum supply!"); _safeMint(_to, _quantity); } // Read metadata function session_baseURI(uint256 session_id) external view virtual returns (string memory) { return base_uri[session_id]; } // Read Session supply function session_supply(uint256 session_id) external view returns (uint256) { return session[session_id]; } // Read Session Whitelist supply function session_whitelist_supply(uint256 session_id) external view returns(uint256){ return session_whiteList_max_supply[session_id]; } // Read tokenURI function tokenURI( uint256 tokenId ) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); uint256 i = 1; for (; i < total_session; ) { if (tokenId + 1 > session[i]) { ++i; } else { break; } } string memory baseURI = base_uri[i]; return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId),".json")) : ""; } // Input Season(Session) root , which constructed from [address, season(session)] // Input merkle tree root from a list of address function setMerkleRoot(bytes32 _merkle_root) external onlyOwner { merkle_root = _merkle_root; } // Update Public Sale Price function setPublicSalePrice(uint256 _public_sale_price) external onlyOwner { public_sale_price = _public_sale_price; } // Update WhiteList Price function setWhiteListPrice(uint256 _whitelist_price) external onlyOwner { whitelist_price = _whitelist_price; } // Setup max number of Public sale limit function setPublicMintNo(uint256 _max_public_mint_no)external onlyOwner{ max_public_mint_no = _max_public_mint_no; } // Setup max number of Public sale limit function setWhiteListMintNo(uint256 _max_whitelist_mint_no)external onlyOwner{ max_whitelist_mint_no = _max_whitelist_mint_no; } // Switch of based on what session(season) we are function setCurSession(uint256 _cur_session_id) external onlyOwner { cur_session_id = _cur_session_id; } // Switch of based on what mint stage we are function setCurSwitch(uint256 _cur_switch) external onlyOwner { cur_switch = _cur_switch; } // Swicth of Session Numbers function setTotalSession(uint256 _total_session)external onlyOwner { total_session = _total_session; } // Update the number of remaining limit can mint in public sale function allowedMintLimitCount(address minter_address, uint256 _session_id) public view returns(uint256){ return max_public_mint_no - mint_limit_count[minter_address][_session_id]; } // Update counters for public sale mint Max limit per address function updateMintLimitCount(address minter_address, uint256 count, uint256 _session_id)private{ mint_limit_count[minter_address][_session_id] += count; } // Set up for the each session(season)[id] have how many tokens function setSession( uint256 _session_id, uint256 _amount ) external onlyOwner { session[_session_id] = _session_id == 1 ? _amount : session[_session_id - 1] + _amount; } // Set up for the each session(season)[id] whitelist max mint number of tokens function setSession_whiteList_max_supply( uint256 _session_id, uint256 _whiteList_max_amount ) external onlyOwner{ session_whiteList_max_supply[_session_id] = _session_id ==1 ? _whiteList_max_amount : session[_session_id -1] + _whiteList_max_amount; } // Withdrawal function to onlyowner receive() external payable {} function withdraw(uint _amount) external onlyOwner { (bool success, ) = payable(msg.sender).call{value: _amount}(""); require(success, "Transfer failed."); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/BitMaps.sol) pragma solidity ^0.8.20; /** * @dev Library for managing uint256 to bool mapping in a compact and efficient way, provided the keys are sequential. * Largely inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor]. * * BitMaps pack 256 booleans across each bit of a single 256-bit slot of `uint256` type. * Hence booleans corresponding to 256 _sequential_ indices would only consume a single slot, * unlike the regular `bool` which would consume an entire slot for a single value. * * This results in gas savings in two ways: * * - Setting a zero value to non-zero only once every 256 times * - Accessing the same warm slot for every 256 _sequential_ indices */ library BitMaps { struct BitMap { mapping(uint256 bucket => uint256) _data; } /** * @dev Returns whether the bit at `index` is set. */ function get(BitMap storage bitmap, uint256 index) internal view returns (bool) { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); return bitmap._data[bucket] & mask != 0; } /** * @dev Sets the bit at `index` to the boolean `value`. */ function setTo(BitMap storage bitmap, uint256 index, bool value) internal { if (value) { set(bitmap, index); } else { unset(bitmap, index); } } /** * @dev Sets the bit at `index`. */ function set(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); bitmap._data[bucket] |= mask; } /** * @dev Unsets the bit at `index`. */ function unset(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); bitmap._data[bucket] &= ~mask; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @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.selector); 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.selector); 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 Returns whether the ownership slot at `index` is initialized. * An uninitialized slot does not necessarily mean that the slot has no owner. */ function _ownershipIsInitialized(uint256 index) internal view virtual returns (bool) { return _packedOwnerships[index] != 0; } /** * @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 packed) { if (_startTokenId() <= tokenId) { packed = _packedOwnerships[tokenId]; // If the data at the starting slot does not exist, start the scan. if (packed == 0) { if (tokenId >= _currentIndex) _revert(OwnerQueryForNonexistentToken.selector); // 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, `tokenId` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. for (;;) { unchecked { packed = _packedOwnerships[--tokenId]; } if (packed == 0) continue; if (packed & _BITMASK_BURNED == 0) return packed; // Otherwise, the token is burned, and we must revert. // This handles the case of batch burned tokens, where only the burned bit // of the starting slot is set, and remaining slots are left uninitialized. _revert(OwnerQueryForNonexistentToken.selector); } } // Otherwise, the data exists and we can skip the scan. // This is possible because we have already achieved the target condition. // This saves 2143 gas on transfers of initialized tokens. // If the token is not burned, return `packed`. Otherwise, revert. if (packed & _BITMASK_BURNED == 0) return packed; } _revert(OwnerQueryForNonexistentToken.selector); } /** * @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. See {ERC721A-_approve}. * * Requirements: * * - The caller must own the token or be an approved operator. */ function approve(address to, uint256 tokenId) public payable virtual override { _approve(to, tokenId, true); } /** * @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.selector); 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 result) { if (_startTokenId() <= tokenId) { if (tokenId < _currentIndex) { uint256 packed; while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId; result = packed & _BITMASK_BURNED == 0; } } } /** * @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); // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS)); if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector); (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.selector); _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; } } } } // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; assembly { // 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. from, // `from`. toMasked, // `to`. tokenId // `tokenId`. ) } if (toMasked == 0) _revert(TransferToZeroAddress.selector); _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.selector); } } /** * @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.selector); } 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.selector); _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: // - `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) ); // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; if (toMasked == 0) _revert(MintToZeroAddress.selector); uint256 end = startTokenId + quantity; uint256 tokenId = startTokenId; do { assembly { // 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`. tokenId // `tokenId`. ) } // The `!=` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. } while (++tokenId != end); _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.selector); if (quantity == 0) _revert(MintZeroQuantity.selector); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector); _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.selector); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) _revert(bytes4(0)); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Equivalent to `_approve(to, tokenId, false)`. */ function _approve(address to, uint256 tokenId) internal virtual { _approve(to, tokenId, false); } /** * @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: * * - `tokenId` must exist. * * Emits an {Approval} event. */ function _approve( address to, uint256 tokenId, bool approvalCheck ) internal virtual { address owner = ownerOf(tokenId); if (approvalCheck && _msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { _revert(ApprovalCallerNotOwnerNorApproved.selector); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } // ============================================================= // 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.selector); } _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.selector); 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) } } /** * @dev For more efficient reverts. */ function _revert(bytes4 errorSelector) internal pure { assembly { mstore(0x00, errorSelector) revert(0x00, 0x04) } } }
// SPDX-License-Identifier: MIT // 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.20; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** *@dev The multiproof provided is not valid. */ error MerkleProofInvalidMultiproof(); /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen - 1 != totalHashes) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen - 1 != totalHashes) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.20; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor() { _setOwner(_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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_quantity","type":"uint256[]"}],"name":"airdropMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_address","type":"address"},{"internalType":"uint256","name":"_session_id","type":"uint256"}],"name":"allowedMintLimitCount","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":"cur_session_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cur_switch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":"max_public_mint_no","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_whitelist_mint_no","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkle_root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"public_sale_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publictMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"uint256","name":"session_id","type":"uint256"}],"name":"session_baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"session_id","type":"uint256"}],"name":"session_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"session_id","type":"uint256"}],"name":"session_whitelist_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_base_uri","type":"string"},{"internalType":"uint256","name":"_session_id","type":"uint256"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cur_session_id","type":"uint256"}],"name":"setCurSession","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cur_switch","type":"uint256"}],"name":"setCurSwitch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkle_root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max_public_mint_no","type":"uint256"}],"name":"setPublicMintNo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_public_sale_price","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_session_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSession","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_session_id","type":"uint256"},{"internalType":"uint256","name":"_whiteList_max_amount","type":"uint256"}],"name":"setSession_whiteList_max_supply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_total_session","type":"uint256"}],"name":"setTotalSession","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max_whitelist_mint_no","type":"uint256"}],"name":"setWhiteListMintNo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelist_price","type":"uint256"}],"name":"setWhiteListPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_session","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":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelist_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101006040526001600e556001608090815250600260a090815250600360c090815250600460e0908152506005601355600a60145534801562000040575f80fd5b506040516200441d3803806200441d83398181016040528101906200006691906200031d565b8181620000886200007c620000cc60201b60201c565b620000d360201b60201c565b8160039081620000999190620005d7565b508060049081620000ab9190620005d7565b50620000bc6200019460201b60201c565b60018190555050505050620006bb565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f90565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001f982620001b1565b810181811067ffffffffffffffff821117156200021b576200021a620001c1565b5b80604052505050565b5f6200022f62000198565b90506200023d8282620001ee565b919050565b5f67ffffffffffffffff8211156200025f576200025e620001c1565b5b6200026a82620001b1565b9050602081019050919050565b5f5b838110156200029657808201518184015260208101905062000279565b5f8484015250505050565b5f620002b7620002b18462000242565b62000224565b905082815260208101848484011115620002d657620002d5620001ad565b5b620002e384828562000277565b509392505050565b5f82601f830112620003025762000301620001a9565b5b815162000314848260208601620002a1565b91505092915050565b5f8060408385031215620003365762000335620001a1565b5b5f83015167ffffffffffffffff811115620003565762000355620001a5565b5b6200036485828601620002eb565b925050602083015167ffffffffffffffff811115620003885762000387620001a5565b5b6200039685828601620002eb565b9150509250929050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003ef57607f821691505b602082108103620004055762000404620003aa565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200042c565b6200047586836200042c565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004bf620004b9620004b3846200048d565b62000496565b6200048d565b9050919050565b5f819050919050565b620004da836200049f565b620004f2620004e982620004c6565b84845462000438565b825550505050565b5f90565b62000508620004fa565b62000515818484620004cf565b505050565b5b818110156200053c57620005305f82620004fe565b6001810190506200051b565b5050565b601f8211156200058b5762000555816200040b565b62000560846200041d565b8101602085101562000570578190505b620005886200057f856200041d565b8301826200051a565b50505b505050565b5f82821c905092915050565b5f620005ad5f198460080262000590565b1980831691505092915050565b5f620005c783836200059c565b9150826002028217905092915050565b620005e282620003a0565b67ffffffffffffffff811115620005fe57620005fd620001c1565b5b6200060a8254620003d7565b6200061782828562000540565b5f60209050601f8311600181146200064d575f841562000638578287015190505b620006448582620005ba565b865550620006b3565b601f1984166200065d866200040b565b5f5b8281101562000686578489015182556001820191506020850194506020810190506200065f565b86831015620006a65784890151620006a2601f8916826200059c565b8355505b6001600288020188555050505b505050505050565b60805160a05160c05160e051613d2e620006ef5f395f61150601525f61185d01525f610eaa01525f611afe0152613d2e5ff3fe608060405260043610610274575f3560e01c806379b985aa1161014e578063c46bb4c6116100c0578063e985e9c511610079578063e985e9c514610905578063ea37cbec14610941578063ebfa3f4c14610969578063ec454af714610993578063f2fde38b146109bb578063fd5e8efe146109e35761027b565b8063c46bb4c614610809578063c87b56dd14610831578063c9fc669a1461086d578063d2cab05614610897578063ddd8a74d146108b3578063e58306f9146108dd5761027b565b806395d89b411161011257806395d89b411461071b57806396821a7514610745578063a22cb46514610781578063a3aee1e3146107a9578063b88d4fde146107c5578063beafc89b146107e15761027b565b806379b985aa146106295780637cb647591461066557806389800e721461068d5780638cccfb1f146106b55780638da5cb5b146106f15761027b565b8063279a669e116101e75780636352211e116101ab5780636352211e1461052357806370a082311461055f578063715018a61461059b578063731ead5f146105b1578063791a2519146105d9578063792c1966146106015761027b565b8063279a669e146104515780632e1a7d4d1461047957806342842e0e146104a157806352f8ad55146104bd5780635fa538a2146104f95761027b565b806308ae6de91161023957806308ae6de914610371578063095ea7b31461039b5780630ac8f501146103b75780631053795b146103e157806318160ddd1461040b57806323b872dd146104355761027b565b80629f25ff1461027f57806301ffc9a7146102a75780630275d647146102e357806306fdde031461030b578063081812fc146103355761027b565b3661027b57005b5f80fd5b34801561028a575f80fd5b506102a560048036038101906102a0919061284b565b610a0d565b005b3480156102b2575f80fd5b506102cd60048036038101906102c891906128fa565b610a38565b6040516102da919061293f565b60405180910390f35b3480156102ee575f80fd5b5061030960048036038101906103049190612958565b610ac9565b005b348015610316575f80fd5b5061031f610adb565b60405161032c91906129fd565b60405180910390f35b348015610340575f80fd5b5061035b60048036038101906103569190612958565b610b6b565b6040516103689190612a5c565b60405180910390f35b34801561037c575f80fd5b50610385610bc4565b6040516103929190612a84565b60405180910390f35b6103b560048036038101906103b09190612ac7565b610bca565b005b3480156103c2575f80fd5b506103cb610bda565b6040516103d89190612a84565b60405180910390f35b3480156103ec575f80fd5b506103f5610be0565b6040516104029190612a84565b60405180910390f35b348015610416575f80fd5b5061041f610be6565b60405161042c9190612a84565b60405180910390f35b61044f600480360381019061044a9190612b05565b610bfc565b005b34801561045c575f80fd5b5061047760048036038101906104729190612c07565b610ea8565b005b348015610484575f80fd5b5061049f600480360381019061049a9190612958565b610f96565b005b6104bb60048036038101906104b69190612b05565b61104a565b005b3480156104c8575f80fd5b506104e360048036038101906104de9190612958565b611069565b6040516104f09190612a84565b60405180910390f35b348015610504575f80fd5b5061050d611083565b60405161051a9190612a84565b60405180910390f35b34801561052e575f80fd5b5061054960048036038101906105449190612958565b611089565b6040516105569190612a5c565b60405180910390f35b34801561056a575f80fd5b5061058560048036038101906105809190612c85565b61109a565b6040516105929190612a84565b60405180910390f35b3480156105a6575f80fd5b506105af61112e565b005b3480156105bc575f80fd5b506105d760048036038101906105d29190612958565b611141565b005b3480156105e4575f80fd5b506105ff60048036038101906105fa9190612958565b611153565b005b34801561060c575f80fd5b5061062760048036038101906106229190612cb0565b611165565b005b348015610634575f80fd5b5061064f600480360381019061064a9190612ac7565b6111be565b60405161065c9190612a84565b60405180910390f35b348015610670575f80fd5b5061068b60048036038101906106869190612d21565b611221565b005b348015610698575f80fd5b506106b360048036038101906106ae9190612cb0565b611233565b005b3480156106c0575f80fd5b506106db60048036038101906106d69190612958565b61128c565b6040516106e89190612a84565b60405180910390f35b3480156106fc575f80fd5b506107056112a6565b6040516107129190612a5c565b60405180910390f35b348015610726575f80fd5b5061072f6112cd565b60405161073c91906129fd565b60405180910390f35b348015610750575f80fd5b5061076b60048036038101906107669190612958565b61135d565b60405161077891906129fd565b60405180910390f35b34801561078c575f80fd5b506107a760048036038101906107a29190612d76565b6113fe565b005b6107c360048036038101906107be9190612958565b611504565b005b6107df60048036038101906107da9190612e52565b611664565b005b3480156107ec575f80fd5b5061080760048036038101906108029190612958565b6116b5565b005b348015610814575f80fd5b5061082f600480360381019061082a9190612958565b6116c7565b005b34801561083c575f80fd5b5061085760048036038101906108529190612958565b6116d9565b60405161086491906129fd565b60405180910390f35b348015610878575f80fd5b50610881611855565b60405161088e9190612a84565b60405180910390f35b6108b160048036038101906108ac9190612f27565b61185b565b005b3480156108be575f80fd5b506108c7611af6565b6040516108d49190612a84565b60405180910390f35b3480156108e8575f80fd5b5061090360048036038101906108fe9190612ac7565b611afc565b005b348015610910575f80fd5b5061092b60048036038101906109269190612f84565b611b76565b604051610938919061293f565b60405180910390f35b34801561094c575f80fd5b5061096760048036038101906109629190612958565b611c04565b005b348015610974575f80fd5b5061097d611c16565b60405161098a9190612a84565b60405180910390f35b34801561099e575f80fd5b506109b960048036038101906109b49190612958565b611c1c565b005b3480156109c6575f80fd5b506109e160048036038101906109dc9190612c85565b611c2e565b005b3480156109ee575f80fd5b506109f7611cb2565b604051610a049190612fd1565b60405180910390f35b610a15611cb8565b81600f5f8381526020019081526020015f209081610a3391906131e4565b505050565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a9257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac25750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610ad1611cb8565b8060138190555050565b606060038054610aea90613017565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1690613017565b8015610b615780601f10610b3857610100808354040283529160200191610b61565b820191905f5260205f20905b815481529060010190602001808311610b4457829003601f168201915b5050505050905090565b5f610b7582611d3f565b610b8a57610b8963cf4700e460e01b611db2565b5b60075f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d5481565b610bd682826001611dba565b5050565b600e5481565b60125481565b5f610bef611ee4565b6002546001540303905090565b5f610c0682611ee8565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c7b57610c7a63a114810060e01b611db2565b5b5f80610c8684611fcb565b91509150610c9c8187610c97611fee565b611ff5565b610cc757610cb186610cac611fee565b611b76565b610cc657610cc56359c896be60e01b611db2565b5b5b610cd48686866001612038565b8015610cde575f82555b60065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550610da685610d8288888761203e565b7c020000000000000000000000000000000000000000000000000000000017612065565b60055f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603610e23575f6001850190505f60055f8381526020019081526020015f205403610e21576001548114610e20578360055f8381526020019081526020015f20819055505b5b505b5f73ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a45f8103610e9257610e9163ea553b3460e01b611db2565b5b610e9f878787600161208f565b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000060105414610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f03906132fd565b60405180910390fd5b610f14611cb8565b5f848490509050828290508114610f29575f80fd5b5f5b81811015610f8e57610f7d868683818110610f4957610f4861331b565b5b9050602002016020810190610f5e9190612c85565b858584818110610f7157610f7061331b565b5b90506020020135612095565b80610f8790613375565b9050610f2b565b505050505050565b610f9e611cb8565b5f3373ffffffffffffffffffffffffffffffffffffffff1682604051610fc3906133e9565b5f6040518083038185875af1925050503d805f8114610ffd576040519150601f19603f3d011682016040523d82523d5f602084013e611002565b606091505b5050905080611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d90613447565b60405180910390fd5b5050565b61106483838360405180602001604052805f815250611664565b505050565b5f600c5f8381526020019081526020015f20549050919050565b60105481565b5f61109382611ee8565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110df576110de638f4eb60460e01b611db2565b5b67ffffffffffffffff60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b611136611cb8565b61113f5f61210b565b565b611149611cb8565b80600d8190555050565b61115b611cb8565b8060128190555050565b61116d611cb8565b600182146111a35780600a5f6001856111869190613465565b81526020019081526020015f205461119e9190613498565b6111a5565b805b600c5f8481526020019081526020015f20819055505050565b5f600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20546014546112199190613465565b905092915050565b611229611cb8565b8060158190555050565b61123b611cb8565b600182146112715780600a5f6001856112549190613465565b81526020019081526020015f205461126c9190613498565b611273565b805b600a5f8481526020019081526020015f20819055505050565b5f600a5f8381526020019081526020015f20549050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112dc90613017565b80601f016020809104026020016040519081016040528092919081815260200182805461130890613017565b80156113535780601f1061132a57610100808354040283529160200191611353565b820191905f5260205f20905b81548152906001019060200180831161133657829003601f168201915b5050505050905090565b6060600f5f8381526020019081526020015f20805461137b90613017565b80601f01602080910402602001604051908101604052809291908181526020018280546113a790613017565b80156113f25780601f106113c9576101008083540402835291602001916113f2565b820191905f5260205f20905b8154815290600101906020018083116113d557829003601f168201915b50505050509050919050565b8060085f61140a611fee565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114b3611fee565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114f8919061293f565b60405180910390a35050565b7f000000000000000000000000000000000000000000000000000000000000000060105414611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f90613515565b60405180910390fd5b6014548111156115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a4906135a3565b60405180910390fd5b6115b933600e546111be565b8111156115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f290613657565b60405180910390fd5b601254816116099190613675565b341461164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190613726565b60405180910390fd5b6116543382612095565b6116613382600e546121cc565b50565b61166f848484610bfc565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146116af5761169984848484612233565b6116ae576116ad63d1a57ed660e01b611db2565b5b5b50505050565b6116bd611cb8565b8060118190555050565b6116cf611cb8565b80600e8190555050565b60606116e482611d3f565b61171a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600190505b600d5481101561176a57600a5f8281526020019081526020015f20546001846117499190613498565b1115611760578061175990613375565b9050611765565b61176a565b611720565b5f600f5f8381526020019081526020015f20805461178790613017565b80601f01602080910402602001604051908101604052809291908181526020018280546117b390613017565b80156117fe5780601f106117d5576101008083540402835291602001916117fe565b820191905f5260205f20905b8154815290600101906020018083116117e157829003601f168201915b505050505090505f8151036118215760405180602001604052805f81525061184c565b8061182b8561235d565b60405160200161183c9291906137c8565b6040516020818303038152906040525b92505050919050565b60135481565b7f0000000000000000000000000000000000000000000000000000000000000000601054146118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690613840565b60405180910390fd5b5f339050601354841115611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff906138ce565b60405180910390fd5b600c5f600e5481526020019081526020015f2054611924610be6565b8561192f9190613498565b1115611970576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119679061395c565b60405180910390fd5b5f81600e546040516020016119869291906139df565b6040516020818303038152906040528051906020012090506119b4815f1c60096123ac90919063ffffffff16565b156119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb90613aa0565b60405180910390fd5b611a0a815f1c60096123e290919063ffffffff16565b611a578484808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050506015548361241a565b611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90613b08565b60405180910390fd5b60115485611aa49190613675565b3414611ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adc90613726565b60405180910390fd5b611aef8286612095565b5050505050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000060105414611b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5790613b70565b60405180910390fd5b611b68611cb8565b611b728282612095565b5050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611c0c611cb8565b8060108190555050565b60145481565b611c24611cb8565b8060148190555050565b611c36611cb8565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ca6575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611c9d9190612a5c565b60405180910390fd5b611caf8161210b565b50565b60155481565b611cc0612430565b73ffffffffffffffffffffffffffffffffffffffff16611cde6112a6565b73ffffffffffffffffffffffffffffffffffffffff1614611d3d57611d01612430565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611d349190612a5c565b60405180910390fd5b565b5f81611d49611ee4565b11611dad57600154821015611dac575f5b5f60055f8581526020019081526020015f205491508103611d865782611d7f90613b8e565b9250611d5a565b5f7c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b805f5260045ffd5b5f611dc483611089565b9050818015611e0657508073ffffffffffffffffffffffffffffffffffffffff16611ded611fee565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611e3257611e1c81611e17611fee565b611b76565b611e3157611e3063cfb3b94260e01b611db2565b5b5b8360075f8581526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b5f90565b5f81611ef2611ee4565b11611fb55760055f8381526020019081526020015f205490505f8103611f8d576001548210611f2c57611f2b63df2d9b4260e01b611db2565b5b5b60055f836001900393508381526020019081526020015f205490505f810315611f88575f7c010000000000000000000000000000000000000000000000000000000082160315611fc657611f8763df2d9b4260e01b611db2565b5b611f2d565b5f7c010000000000000000000000000000000000000000000000000000000082160315611fc6575b611fc563df2d9b4260e01b611db2565b5b919050565b5f805f60075f8581526020019081526020015f2090508092508254915050915091565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8612054868684612437565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600a5f600e5481526020019081526020015f2054816120b2610be6565b6120bc9190613498565b11156120fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f490613bff565b60405180910390fd5b612107828261243f565b5050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b81600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f8282546122279190613498565b92505081905550505050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612258611fee565b8786866040518563ffffffff1660e01b815260040161227a9493929190613c6f565b6020604051808303815f875af19250505080156122b557506040513d601f19601f820116820180604052508101906122b29190613ccd565b60015b61230a573d805f81146122e3576040519150601f19603f3d011682016040523d82523d5f602084013e6122e8565b606091505b505f8151036123025761230163d1a57ed660e01b611db2565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060a060405101806040526020810391505f825281835b60011561239757600184039350600a81066030018453600a8104905080612375575b50828103602084039350808452505050919050565b5f80600883901c90505f60ff84166001901b90505f81865f015f8581526020019081526020015f20541614159250505092915050565b5f600882901c90505f60ff83166001901b905080845f015f8481526020019081526020015f205f828254179250508190555050505050565b5f82612426858461245c565b1490509392505050565b5f33905090565b5f9392505050565b612458828260405180602001604052805f8152506124aa565b5050565b5f808290505f5b845181101561249f57612490828683815181106124835761248261331b565b5b602002602001015161252b565b91508080600101915050612463565b508091505092915050565b6124b48383612555565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14612526575f60015490505f83820390505b6124f15f868380600101945086612233565b6125065761250563d1a57ed660e01b611db2565b5b8181106124df578160015414612523576125225f60e01b611db2565b5b50505b505050565b5f8183106125425761253d82846126a8565b61254d565b61254c83836126a8565b5b905092915050565b5f60015490505f82036125735761257263b562e8dd60e01b611db2565b5b61257f5f848385612038565b61259d8361258e5f865f61203e565b612597856126bc565b17612065565b60055f8381526020019081526020015f2081905550600160406001901b17820260065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505f73ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161690505f810361264e5761264d632e07630060e01b611db2565b5b5f83830190505f8390505b80835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a481816001019150810361265957816001819055505050506126a35f84838561208f565b505050565b5f825f528160205260405f20905092915050565b5f6001821460e11b9050919050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61272a826126e4565b810181811067ffffffffffffffff82111715612749576127486126f4565b5b80604052505050565b5f61275b6126cb565b90506127678282612721565b919050565b5f67ffffffffffffffff821115612786576127856126f4565b5b61278f826126e4565b9050602081019050919050565b828183375f83830152505050565b5f6127bc6127b78461276c565b612752565b9050828152602081018484840111156127d8576127d76126e0565b5b6127e384828561279c565b509392505050565b5f82601f8301126127ff576127fe6126dc565b5b813561280f8482602086016127aa565b91505092915050565b5f819050919050565b61282a81612818565b8114612834575f80fd5b50565b5f8135905061284581612821565b92915050565b5f8060408385031215612861576128606126d4565b5b5f83013567ffffffffffffffff81111561287e5761287d6126d8565b5b61288a858286016127eb565b925050602061289b85828601612837565b9150509250929050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6128d9816128a5565b81146128e3575f80fd5b50565b5f813590506128f4816128d0565b92915050565b5f6020828403121561290f5761290e6126d4565b5b5f61291c848285016128e6565b91505092915050565b5f8115159050919050565b61293981612925565b82525050565b5f6020820190506129525f830184612930565b92915050565b5f6020828403121561296d5761296c6126d4565b5b5f61297a84828501612837565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156129ba57808201518184015260208101905061299f565b5f8484015250505050565b5f6129cf82612983565b6129d9818561298d565b93506129e981856020860161299d565b6129f2816126e4565b840191505092915050565b5f6020820190508181035f830152612a1581846129c5565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a4682612a1d565b9050919050565b612a5681612a3c565b82525050565b5f602082019050612a6f5f830184612a4d565b92915050565b612a7e81612818565b82525050565b5f602082019050612a975f830184612a75565b92915050565b612aa681612a3c565b8114612ab0575f80fd5b50565b5f81359050612ac181612a9d565b92915050565b5f8060408385031215612add57612adc6126d4565b5b5f612aea85828601612ab3565b9250506020612afb85828601612837565b9150509250929050565b5f805f60608486031215612b1c57612b1b6126d4565b5b5f612b2986828701612ab3565b9350506020612b3a86828701612ab3565b9250506040612b4b86828701612837565b9150509250925092565b5f80fd5b5f80fd5b5f8083601f840112612b7257612b716126dc565b5b8235905067ffffffffffffffff811115612b8f57612b8e612b55565b5b602083019150836020820283011115612bab57612baa612b59565b5b9250929050565b5f8083601f840112612bc757612bc66126dc565b5b8235905067ffffffffffffffff811115612be457612be3612b55565b5b602083019150836020820283011115612c0057612bff612b59565b5b9250929050565b5f805f8060408587031215612c1f57612c1e6126d4565b5b5f85013567ffffffffffffffff811115612c3c57612c3b6126d8565b5b612c4887828801612b5d565b9450945050602085013567ffffffffffffffff811115612c6b57612c6a6126d8565b5b612c7787828801612bb2565b925092505092959194509250565b5f60208284031215612c9a57612c996126d4565b5b5f612ca784828501612ab3565b91505092915050565b5f8060408385031215612cc657612cc56126d4565b5b5f612cd385828601612837565b9250506020612ce485828601612837565b9150509250929050565b5f819050919050565b612d0081612cee565b8114612d0a575f80fd5b50565b5f81359050612d1b81612cf7565b92915050565b5f60208284031215612d3657612d356126d4565b5b5f612d4384828501612d0d565b91505092915050565b612d5581612925565b8114612d5f575f80fd5b50565b5f81359050612d7081612d4c565b92915050565b5f8060408385031215612d8c57612d8b6126d4565b5b5f612d9985828601612ab3565b9250506020612daa85828601612d62565b9150509250929050565b5f67ffffffffffffffff821115612dce57612dcd6126f4565b5b612dd7826126e4565b9050602081019050919050565b5f612df6612df184612db4565b612752565b905082815260208101848484011115612e1257612e116126e0565b5b612e1d84828561279c565b509392505050565b5f82601f830112612e3957612e386126dc565b5b8135612e49848260208601612de4565b91505092915050565b5f805f8060808587031215612e6a57612e696126d4565b5b5f612e7787828801612ab3565b9450506020612e8887828801612ab3565b9350506040612e9987828801612837565b925050606085013567ffffffffffffffff811115612eba57612eb96126d8565b5b612ec687828801612e25565b91505092959194509250565b5f8083601f840112612ee757612ee66126dc565b5b8235905067ffffffffffffffff811115612f0457612f03612b55565b5b602083019150836020820283011115612f2057612f1f612b59565b5b9250929050565b5f805f60408486031215612f3e57612f3d6126d4565b5b5f612f4b86828701612837565b935050602084013567ffffffffffffffff811115612f6c57612f6b6126d8565b5b612f7886828701612ed2565b92509250509250925092565b5f8060408385031215612f9a57612f996126d4565b5b5f612fa785828601612ab3565b9250506020612fb885828601612ab3565b9150509250929050565b612fcb81612cee565b82525050565b5f602082019050612fe45f830184612fc2565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061302e57607f821691505b60208210810361304157613040612fea565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026130a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613068565b6130ad8683613068565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6130e86130e36130de84612818565b6130c5565b612818565b9050919050565b5f819050919050565b613101836130ce565b61311561310d826130ef565b848454613074565b825550505050565b5f90565b61312961311d565b6131348184846130f8565b505050565b5b818110156131575761314c5f82613121565b60018101905061313a565b5050565b601f82111561319c5761316d81613047565b61317684613059565b81016020851015613185578190505b61319961319185613059565b830182613139565b50505b505050565b5f82821c905092915050565b5f6131bc5f19846008026131a1565b1980831691505092915050565b5f6131d483836131ad565b9150826002028217905092915050565b6131ed82612983565b67ffffffffffffffff811115613206576132056126f4565b5b6132108254613017565b61321b82828561315b565b5f60209050601f83116001811461324c575f841561323a578287015190505b61324485826131c9565b8655506132ab565b601f19841661325a86613047565b5f5b828110156132815784890151825560018201915060208501945060208101905061325c565b8683101561329e578489015161329a601f8916826131ad565b8355505b6001600288020188555050505b505050505050565b7f61697264726f702073776974636820636c6f73656400000000000000000000005f82015250565b5f6132e760158361298d565b91506132f2826132b3565b602082019050919050565b5f6020820190508181035f830152613314816132db565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61337f82612818565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133b1576133b0613348565b5b600182019050919050565b5f81905092915050565b50565b5f6133d45f836133bc565b91506133df826133c6565b5f82019050919050565b5f6133f3826133c9565b9150819050919050565b7f5472616e73666572206661696c65642e000000000000000000000000000000005f82015250565b5f61343160108361298d565b915061343c826133fd565b602082019050919050565b5f6020820190508181035f83015261345e81613425565b9050919050565b5f61346f82612818565b915061347a83612818565b925082820390508181111561349257613491613348565b5b92915050565b5f6134a282612818565b91506134ad83612818565b92508282019050808211156134c5576134c4613348565b5b92915050565b7f7075626c69632073776974636820636c6f7365640000000000000000000000005f82015250565b5f6134ff60148361298d565b915061350a826134cb565b602082019050919050565b5f6020820190508181035f83015261352c816134f3565b9050919050565b7f446f6e27742065786365656420746865205075626c6963204d696e74204d61785f8201527f696d756d206c696d697421000000000000000000000000000000000000000000602082015250565b5f61358d602b8361298d565b915061359882613533565b604082019050919050565b5f6020820190508181035f8301526135ba81613581565b9050919050565b7f596f752068617665207265616368656420746865206d6178206d696e74206c695f8201527f6d697420666f72206561636820616464726573732c20506c65617365206d696e60208201527f74204c6573732100000000000000000000000000000000000000000000000000604082015250565b5f61364160478361298d565b915061364c826135c1565b606082019050919050565b5f6020820190508181035f83015261366e81613635565b9050919050565b5f61367f82612818565b915061368a83612818565b925082820261369881612818565b915082820484148315176136af576136ae613348565b5b5092915050565b7f506c6561736520656e7465722074686520656e6f75676820657468657265756d5f8201527f20746f206d696e742120286e6f20656e6f756768206574686572290000000000602082015250565b5f613710603b8361298d565b915061371b826136b6565b604082019050919050565b5f6020820190508181035f83015261373d81613704565b9050919050565b5f81905092915050565b5f61375882612983565b6137628185613744565b935061377281856020860161299d565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f6137b2600583613744565b91506137bd8261377e565b600582019050919050565b5f6137d3828561374e565b91506137df828461374e565b91506137ea826137a6565b91508190509392505050565b7f77686974656c6973742073776974636820636c6f7365640000000000000000005f82015250565b5f61382a60178361298d565b9150613835826137f6565b602082019050919050565b5f6020820190508181035f8301526138578161381e565b9050919050565b7f446f6e277420657863656564207468652057686974654c697374204d696e74205f8201527f4d6178696d756d206c696d697421000000000000000000000000000000000000602082015250565b5f6138b8602e8361298d565b91506138c38261385e565b604082019050919050565b5f6020820190508181035f8301526138e5816138ac565b9050919050565b7f446f6e2774206578636565642073657373696f6e2077686974656c69737420735f8201527f7570706c79210000000000000000000000000000000000000000000000000000602082015250565b5f61394660268361298d565b9150613951826138ec565b604082019050919050565b5f6020820190508181035f8301526139738161393a565b9050919050565b5f8160601b9050919050565b5f6139908261397a565b9050919050565b5f6139a182613986565b9050919050565b6139b96139b482612a3c565b613997565b82525050565b5f819050919050565b6139d96139d482612818565b6139bf565b82525050565b5f6139ea82856139a8565b6014820191506139fa82846139c8565b6020820191508190509392505050565b7f596f75206861766520616c72656164792072656465656d6564207468652077685f8201527f6974656c69737420726967687473206174207468697320736561736f6e21202860208201527f636f6e73756d6564290000000000000000000000000000000000000000000000604082015250565b5f613a8a60498361298d565b9150613a9582613a0a565b606082019050919050565b5f6020820190508181035f830152613ab781613a7e565b9050919050565b7f496e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f613af2600d8361298d565b9150613afd82613abe565b602082019050919050565b5f6020820190508181035f830152613b1f81613ae6565b9050919050565b7f61646d696e2073776974636820636c6f736564000000000000000000000000005f82015250565b5f613b5a60138361298d565b9150613b6582613b26565b602082019050919050565b5f6020820190508181035f830152613b8781613b4e565b9050919050565b5f613b9882612818565b91505f8203613baa57613ba9613348565b5b600182039050919050565b7f65786365656420746865206d6178696d756d20737570706c79210000000000005f82015250565b5f613be9601a8361298d565b9150613bf482613bb5565b602082019050919050565b5f6020820190508181035f830152613c1681613bdd565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f613c4182613c1d565b613c4b8185613c27565b9350613c5b81856020860161299d565b613c64816126e4565b840191505092915050565b5f608082019050613c825f830187612a4d565b613c8f6020830186612a4d565b613c9c6040830185612a75565b8181036060830152613cae8184613c37565b905095945050505050565b5f81519050613cc7816128d0565b92915050565b5f60208284031215613ce257613ce16126d4565b5b5f613cef84828501613cb9565b9150509291505056fea2646970667358221220b23880b6f4d8c50133fee870a402c2b40cb6ac2867e414ac5a3c991705d6b74964736f6c6343000816003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001f4355464520484b20416c756d6e69204173736f63696174696f6e20504f41500000000000000000000000000000000000000000000000000000000000000000094355464520484b41410000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405260043610610274575f3560e01c806379b985aa1161014e578063c46bb4c6116100c0578063e985e9c511610079578063e985e9c514610905578063ea37cbec14610941578063ebfa3f4c14610969578063ec454af714610993578063f2fde38b146109bb578063fd5e8efe146109e35761027b565b8063c46bb4c614610809578063c87b56dd14610831578063c9fc669a1461086d578063d2cab05614610897578063ddd8a74d146108b3578063e58306f9146108dd5761027b565b806395d89b411161011257806395d89b411461071b57806396821a7514610745578063a22cb46514610781578063a3aee1e3146107a9578063b88d4fde146107c5578063beafc89b146107e15761027b565b806379b985aa146106295780637cb647591461066557806389800e721461068d5780638cccfb1f146106b55780638da5cb5b146106f15761027b565b8063279a669e116101e75780636352211e116101ab5780636352211e1461052357806370a082311461055f578063715018a61461059b578063731ead5f146105b1578063791a2519146105d9578063792c1966146106015761027b565b8063279a669e146104515780632e1a7d4d1461047957806342842e0e146104a157806352f8ad55146104bd5780635fa538a2146104f95761027b565b806308ae6de91161023957806308ae6de914610371578063095ea7b31461039b5780630ac8f501146103b75780631053795b146103e157806318160ddd1461040b57806323b872dd146104355761027b565b80629f25ff1461027f57806301ffc9a7146102a75780630275d647146102e357806306fdde031461030b578063081812fc146103355761027b565b3661027b57005b5f80fd5b34801561028a575f80fd5b506102a560048036038101906102a0919061284b565b610a0d565b005b3480156102b2575f80fd5b506102cd60048036038101906102c891906128fa565b610a38565b6040516102da919061293f565b60405180910390f35b3480156102ee575f80fd5b5061030960048036038101906103049190612958565b610ac9565b005b348015610316575f80fd5b5061031f610adb565b60405161032c91906129fd565b60405180910390f35b348015610340575f80fd5b5061035b60048036038101906103569190612958565b610b6b565b6040516103689190612a5c565b60405180910390f35b34801561037c575f80fd5b50610385610bc4565b6040516103929190612a84565b60405180910390f35b6103b560048036038101906103b09190612ac7565b610bca565b005b3480156103c2575f80fd5b506103cb610bda565b6040516103d89190612a84565b60405180910390f35b3480156103ec575f80fd5b506103f5610be0565b6040516104029190612a84565b60405180910390f35b348015610416575f80fd5b5061041f610be6565b60405161042c9190612a84565b60405180910390f35b61044f600480360381019061044a9190612b05565b610bfc565b005b34801561045c575f80fd5b5061047760048036038101906104729190612c07565b610ea8565b005b348015610484575f80fd5b5061049f600480360381019061049a9190612958565b610f96565b005b6104bb60048036038101906104b69190612b05565b61104a565b005b3480156104c8575f80fd5b506104e360048036038101906104de9190612958565b611069565b6040516104f09190612a84565b60405180910390f35b348015610504575f80fd5b5061050d611083565b60405161051a9190612a84565b60405180910390f35b34801561052e575f80fd5b5061054960048036038101906105449190612958565b611089565b6040516105569190612a5c565b60405180910390f35b34801561056a575f80fd5b5061058560048036038101906105809190612c85565b61109a565b6040516105929190612a84565b60405180910390f35b3480156105a6575f80fd5b506105af61112e565b005b3480156105bc575f80fd5b506105d760048036038101906105d29190612958565b611141565b005b3480156105e4575f80fd5b506105ff60048036038101906105fa9190612958565b611153565b005b34801561060c575f80fd5b5061062760048036038101906106229190612cb0565b611165565b005b348015610634575f80fd5b5061064f600480360381019061064a9190612ac7565b6111be565b60405161065c9190612a84565b60405180910390f35b348015610670575f80fd5b5061068b60048036038101906106869190612d21565b611221565b005b348015610698575f80fd5b506106b360048036038101906106ae9190612cb0565b611233565b005b3480156106c0575f80fd5b506106db60048036038101906106d69190612958565b61128c565b6040516106e89190612a84565b60405180910390f35b3480156106fc575f80fd5b506107056112a6565b6040516107129190612a5c565b60405180910390f35b348015610726575f80fd5b5061072f6112cd565b60405161073c91906129fd565b60405180910390f35b348015610750575f80fd5b5061076b60048036038101906107669190612958565b61135d565b60405161077891906129fd565b60405180910390f35b34801561078c575f80fd5b506107a760048036038101906107a29190612d76565b6113fe565b005b6107c360048036038101906107be9190612958565b611504565b005b6107df60048036038101906107da9190612e52565b611664565b005b3480156107ec575f80fd5b5061080760048036038101906108029190612958565b6116b5565b005b348015610814575f80fd5b5061082f600480360381019061082a9190612958565b6116c7565b005b34801561083c575f80fd5b5061085760048036038101906108529190612958565b6116d9565b60405161086491906129fd565b60405180910390f35b348015610878575f80fd5b50610881611855565b60405161088e9190612a84565b60405180910390f35b6108b160048036038101906108ac9190612f27565b61185b565b005b3480156108be575f80fd5b506108c7611af6565b6040516108d49190612a84565b60405180910390f35b3480156108e8575f80fd5b5061090360048036038101906108fe9190612ac7565b611afc565b005b348015610910575f80fd5b5061092b60048036038101906109269190612f84565b611b76565b604051610938919061293f565b60405180910390f35b34801561094c575f80fd5b5061096760048036038101906109629190612958565b611c04565b005b348015610974575f80fd5b5061097d611c16565b60405161098a9190612a84565b60405180910390f35b34801561099e575f80fd5b506109b960048036038101906109b49190612958565b611c1c565b005b3480156109c6575f80fd5b506109e160048036038101906109dc9190612c85565b611c2e565b005b3480156109ee575f80fd5b506109f7611cb2565b604051610a049190612fd1565b60405180910390f35b610a15611cb8565b81600f5f8381526020019081526020015f209081610a3391906131e4565b505050565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a9257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac25750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610ad1611cb8565b8060138190555050565b606060038054610aea90613017565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1690613017565b8015610b615780601f10610b3857610100808354040283529160200191610b61565b820191905f5260205f20905b815481529060010190602001808311610b4457829003601f168201915b5050505050905090565b5f610b7582611d3f565b610b8a57610b8963cf4700e460e01b611db2565b5b60075f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d5481565b610bd682826001611dba565b5050565b600e5481565b60125481565b5f610bef611ee4565b6002546001540303905090565b5f610c0682611ee8565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c7b57610c7a63a114810060e01b611db2565b5b5f80610c8684611fcb565b91509150610c9c8187610c97611fee565b611ff5565b610cc757610cb186610cac611fee565b611b76565b610cc657610cc56359c896be60e01b611db2565b5b5b610cd48686866001612038565b8015610cde575f82555b60065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550610da685610d8288888761203e565b7c020000000000000000000000000000000000000000000000000000000017612065565b60055f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603610e23575f6001850190505f60055f8381526020019081526020015f205403610e21576001548114610e20578360055f8381526020019081526020015f20819055505b5b505b5f73ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a45f8103610e9257610e9163ea553b3460e01b611db2565b5b610e9f878787600161208f565b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000260105414610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f03906132fd565b60405180910390fd5b610f14611cb8565b5f848490509050828290508114610f29575f80fd5b5f5b81811015610f8e57610f7d868683818110610f4957610f4861331b565b5b9050602002016020810190610f5e9190612c85565b858584818110610f7157610f7061331b565b5b90506020020135612095565b80610f8790613375565b9050610f2b565b505050505050565b610f9e611cb8565b5f3373ffffffffffffffffffffffffffffffffffffffff1682604051610fc3906133e9565b5f6040518083038185875af1925050503d805f8114610ffd576040519150601f19603f3d011682016040523d82523d5f602084013e611002565b606091505b5050905080611046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103d90613447565b60405180910390fd5b5050565b61106483838360405180602001604052805f815250611664565b505050565b5f600c5f8381526020019081526020015f20549050919050565b60105481565b5f61109382611ee8565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110df576110de638f4eb60460e01b611db2565b5b67ffffffffffffffff60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b611136611cb8565b61113f5f61210b565b565b611149611cb8565b80600d8190555050565b61115b611cb8565b8060128190555050565b61116d611cb8565b600182146111a35780600a5f6001856111869190613465565b81526020019081526020015f205461119e9190613498565b6111a5565b805b600c5f8481526020019081526020015f20819055505050565b5f600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20546014546112199190613465565b905092915050565b611229611cb8565b8060158190555050565b61123b611cb8565b600182146112715780600a5f6001856112549190613465565b81526020019081526020015f205461126c9190613498565b611273565b805b600a5f8481526020019081526020015f20819055505050565b5f600a5f8381526020019081526020015f20549050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112dc90613017565b80601f016020809104026020016040519081016040528092919081815260200182805461130890613017565b80156113535780601f1061132a57610100808354040283529160200191611353565b820191905f5260205f20905b81548152906001019060200180831161133657829003601f168201915b5050505050905090565b6060600f5f8381526020019081526020015f20805461137b90613017565b80601f01602080910402602001604051908101604052809291908181526020018280546113a790613017565b80156113f25780601f106113c9576101008083540402835291602001916113f2565b820191905f5260205f20905b8154815290600101906020018083116113d557829003601f168201915b50505050509050919050565b8060085f61140a611fee565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114b3611fee565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114f8919061293f565b60405180910390a35050565b7f000000000000000000000000000000000000000000000000000000000000000460105414611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f90613515565b60405180910390fd5b6014548111156115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a4906135a3565b60405180910390fd5b6115b933600e546111be565b8111156115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f290613657565b60405180910390fd5b601254816116099190613675565b341461164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190613726565b60405180910390fd5b6116543382612095565b6116613382600e546121cc565b50565b61166f848484610bfc565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146116af5761169984848484612233565b6116ae576116ad63d1a57ed660e01b611db2565b5b5b50505050565b6116bd611cb8565b8060118190555050565b6116cf611cb8565b80600e8190555050565b60606116e482611d3f565b61171a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600190505b600d5481101561176a57600a5f8281526020019081526020015f20546001846117499190613498565b1115611760578061175990613375565b9050611765565b61176a565b611720565b5f600f5f8381526020019081526020015f20805461178790613017565b80601f01602080910402602001604051908101604052809291908181526020018280546117b390613017565b80156117fe5780601f106117d5576101008083540402835291602001916117fe565b820191905f5260205f20905b8154815290600101906020018083116117e157829003601f168201915b505050505090505f8151036118215760405180602001604052805f81525061184c565b8061182b8561235d565b60405160200161183c9291906137c8565b6040516020818303038152906040525b92505050919050565b60135481565b7f0000000000000000000000000000000000000000000000000000000000000003601054146118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690613840565b60405180910390fd5b5f339050601354841115611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff906138ce565b60405180910390fd5b600c5f600e5481526020019081526020015f2054611924610be6565b8561192f9190613498565b1115611970576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119679061395c565b60405180910390fd5b5f81600e546040516020016119869291906139df565b6040516020818303038152906040528051906020012090506119b4815f1c60096123ac90919063ffffffff16565b156119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb90613aa0565b60405180910390fd5b611a0a815f1c60096123e290919063ffffffff16565b611a578484808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050506015548361241a565b611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90613b08565b60405180910390fd5b60115485611aa49190613675565b3414611ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adc90613726565b60405180910390fd5b611aef8286612095565b5050505050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000160105414611b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5790613b70565b60405180910390fd5b611b68611cb8565b611b728282612095565b5050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611c0c611cb8565b8060108190555050565b60145481565b611c24611cb8565b8060148190555050565b611c36611cb8565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ca6575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611c9d9190612a5c565b60405180910390fd5b611caf8161210b565b50565b60155481565b611cc0612430565b73ffffffffffffffffffffffffffffffffffffffff16611cde6112a6565b73ffffffffffffffffffffffffffffffffffffffff1614611d3d57611d01612430565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611d349190612a5c565b60405180910390fd5b565b5f81611d49611ee4565b11611dad57600154821015611dac575f5b5f60055f8581526020019081526020015f205491508103611d865782611d7f90613b8e565b9250611d5a565b5f7c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b805f5260045ffd5b5f611dc483611089565b9050818015611e0657508073ffffffffffffffffffffffffffffffffffffffff16611ded611fee565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611e3257611e1c81611e17611fee565b611b76565b611e3157611e3063cfb3b94260e01b611db2565b5b5b8360075f8581526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b5f90565b5f81611ef2611ee4565b11611fb55760055f8381526020019081526020015f205490505f8103611f8d576001548210611f2c57611f2b63df2d9b4260e01b611db2565b5b5b60055f836001900393508381526020019081526020015f205490505f810315611f88575f7c010000000000000000000000000000000000000000000000000000000082160315611fc657611f8763df2d9b4260e01b611db2565b5b611f2d565b5f7c010000000000000000000000000000000000000000000000000000000082160315611fc6575b611fc563df2d9b4260e01b611db2565b5b919050565b5f805f60075f8581526020019081526020015f2090508092508254915050915091565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8612054868684612437565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600a5f600e5481526020019081526020015f2054816120b2610be6565b6120bc9190613498565b11156120fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f490613bff565b60405180910390fd5b612107828261243f565b5050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b81600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f8282546122279190613498565b92505081905550505050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612258611fee565b8786866040518563ffffffff1660e01b815260040161227a9493929190613c6f565b6020604051808303815f875af19250505080156122b557506040513d601f19601f820116820180604052508101906122b29190613ccd565b60015b61230a573d805f81146122e3576040519150601f19603f3d011682016040523d82523d5f602084013e6122e8565b606091505b505f8151036123025761230163d1a57ed660e01b611db2565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060a060405101806040526020810391505f825281835b60011561239757600184039350600a81066030018453600a8104905080612375575b50828103602084039350808452505050919050565b5f80600883901c90505f60ff84166001901b90505f81865f015f8581526020019081526020015f20541614159250505092915050565b5f600882901c90505f60ff83166001901b905080845f015f8481526020019081526020015f205f828254179250508190555050505050565b5f82612426858461245c565b1490509392505050565b5f33905090565b5f9392505050565b612458828260405180602001604052805f8152506124aa565b5050565b5f808290505f5b845181101561249f57612490828683815181106124835761248261331b565b5b602002602001015161252b565b91508080600101915050612463565b508091505092915050565b6124b48383612555565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14612526575f60015490505f83820390505b6124f15f868380600101945086612233565b6125065761250563d1a57ed660e01b611db2565b5b8181106124df578160015414612523576125225f60e01b611db2565b5b50505b505050565b5f8183106125425761253d82846126a8565b61254d565b61254c83836126a8565b5b905092915050565b5f60015490505f82036125735761257263b562e8dd60e01b611db2565b5b61257f5f848385612038565b61259d8361258e5f865f61203e565b612597856126bc565b17612065565b60055f8381526020019081526020015f2081905550600160406001901b17820260065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505f73ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161690505f810361264e5761264d632e07630060e01b611db2565b5b5f83830190505f8390505b80835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a481816001019150810361265957816001819055505050506126a35f84838561208f565b505050565b5f825f528160205260405f20905092915050565b5f6001821460e11b9050919050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61272a826126e4565b810181811067ffffffffffffffff82111715612749576127486126f4565b5b80604052505050565b5f61275b6126cb565b90506127678282612721565b919050565b5f67ffffffffffffffff821115612786576127856126f4565b5b61278f826126e4565b9050602081019050919050565b828183375f83830152505050565b5f6127bc6127b78461276c565b612752565b9050828152602081018484840111156127d8576127d76126e0565b5b6127e384828561279c565b509392505050565b5f82601f8301126127ff576127fe6126dc565b5b813561280f8482602086016127aa565b91505092915050565b5f819050919050565b61282a81612818565b8114612834575f80fd5b50565b5f8135905061284581612821565b92915050565b5f8060408385031215612861576128606126d4565b5b5f83013567ffffffffffffffff81111561287e5761287d6126d8565b5b61288a858286016127eb565b925050602061289b85828601612837565b9150509250929050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6128d9816128a5565b81146128e3575f80fd5b50565b5f813590506128f4816128d0565b92915050565b5f6020828403121561290f5761290e6126d4565b5b5f61291c848285016128e6565b91505092915050565b5f8115159050919050565b61293981612925565b82525050565b5f6020820190506129525f830184612930565b92915050565b5f6020828403121561296d5761296c6126d4565b5b5f61297a84828501612837565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156129ba57808201518184015260208101905061299f565b5f8484015250505050565b5f6129cf82612983565b6129d9818561298d565b93506129e981856020860161299d565b6129f2816126e4565b840191505092915050565b5f6020820190508181035f830152612a1581846129c5565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a4682612a1d565b9050919050565b612a5681612a3c565b82525050565b5f602082019050612a6f5f830184612a4d565b92915050565b612a7e81612818565b82525050565b5f602082019050612a975f830184612a75565b92915050565b612aa681612a3c565b8114612ab0575f80fd5b50565b5f81359050612ac181612a9d565b92915050565b5f8060408385031215612add57612adc6126d4565b5b5f612aea85828601612ab3565b9250506020612afb85828601612837565b9150509250929050565b5f805f60608486031215612b1c57612b1b6126d4565b5b5f612b2986828701612ab3565b9350506020612b3a86828701612ab3565b9250506040612b4b86828701612837565b9150509250925092565b5f80fd5b5f80fd5b5f8083601f840112612b7257612b716126dc565b5b8235905067ffffffffffffffff811115612b8f57612b8e612b55565b5b602083019150836020820283011115612bab57612baa612b59565b5b9250929050565b5f8083601f840112612bc757612bc66126dc565b5b8235905067ffffffffffffffff811115612be457612be3612b55565b5b602083019150836020820283011115612c0057612bff612b59565b5b9250929050565b5f805f8060408587031215612c1f57612c1e6126d4565b5b5f85013567ffffffffffffffff811115612c3c57612c3b6126d8565b5b612c4887828801612b5d565b9450945050602085013567ffffffffffffffff811115612c6b57612c6a6126d8565b5b612c7787828801612bb2565b925092505092959194509250565b5f60208284031215612c9a57612c996126d4565b5b5f612ca784828501612ab3565b91505092915050565b5f8060408385031215612cc657612cc56126d4565b5b5f612cd385828601612837565b9250506020612ce485828601612837565b9150509250929050565b5f819050919050565b612d0081612cee565b8114612d0a575f80fd5b50565b5f81359050612d1b81612cf7565b92915050565b5f60208284031215612d3657612d356126d4565b5b5f612d4384828501612d0d565b91505092915050565b612d5581612925565b8114612d5f575f80fd5b50565b5f81359050612d7081612d4c565b92915050565b5f8060408385031215612d8c57612d8b6126d4565b5b5f612d9985828601612ab3565b9250506020612daa85828601612d62565b9150509250929050565b5f67ffffffffffffffff821115612dce57612dcd6126f4565b5b612dd7826126e4565b9050602081019050919050565b5f612df6612df184612db4565b612752565b905082815260208101848484011115612e1257612e116126e0565b5b612e1d84828561279c565b509392505050565b5f82601f830112612e3957612e386126dc565b5b8135612e49848260208601612de4565b91505092915050565b5f805f8060808587031215612e6a57612e696126d4565b5b5f612e7787828801612ab3565b9450506020612e8887828801612ab3565b9350506040612e9987828801612837565b925050606085013567ffffffffffffffff811115612eba57612eb96126d8565b5b612ec687828801612e25565b91505092959194509250565b5f8083601f840112612ee757612ee66126dc565b5b8235905067ffffffffffffffff811115612f0457612f03612b55565b5b602083019150836020820283011115612f2057612f1f612b59565b5b9250929050565b5f805f60408486031215612f3e57612f3d6126d4565b5b5f612f4b86828701612837565b935050602084013567ffffffffffffffff811115612f6c57612f6b6126d8565b5b612f7886828701612ed2565b92509250509250925092565b5f8060408385031215612f9a57612f996126d4565b5b5f612fa785828601612ab3565b9250506020612fb885828601612ab3565b9150509250929050565b612fcb81612cee565b82525050565b5f602082019050612fe45f830184612fc2565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061302e57607f821691505b60208210810361304157613040612fea565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026130a37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613068565b6130ad8683613068565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6130e86130e36130de84612818565b6130c5565b612818565b9050919050565b5f819050919050565b613101836130ce565b61311561310d826130ef565b848454613074565b825550505050565b5f90565b61312961311d565b6131348184846130f8565b505050565b5b818110156131575761314c5f82613121565b60018101905061313a565b5050565b601f82111561319c5761316d81613047565b61317684613059565b81016020851015613185578190505b61319961319185613059565b830182613139565b50505b505050565b5f82821c905092915050565b5f6131bc5f19846008026131a1565b1980831691505092915050565b5f6131d483836131ad565b9150826002028217905092915050565b6131ed82612983565b67ffffffffffffffff811115613206576132056126f4565b5b6132108254613017565b61321b82828561315b565b5f60209050601f83116001811461324c575f841561323a578287015190505b61324485826131c9565b8655506132ab565b601f19841661325a86613047565b5f5b828110156132815784890151825560018201915060208501945060208101905061325c565b8683101561329e578489015161329a601f8916826131ad565b8355505b6001600288020188555050505b505050505050565b7f61697264726f702073776974636820636c6f73656400000000000000000000005f82015250565b5f6132e760158361298d565b91506132f2826132b3565b602082019050919050565b5f6020820190508181035f830152613314816132db565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61337f82612818565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133b1576133b0613348565b5b600182019050919050565b5f81905092915050565b50565b5f6133d45f836133bc565b91506133df826133c6565b5f82019050919050565b5f6133f3826133c9565b9150819050919050565b7f5472616e73666572206661696c65642e000000000000000000000000000000005f82015250565b5f61343160108361298d565b915061343c826133fd565b602082019050919050565b5f6020820190508181035f83015261345e81613425565b9050919050565b5f61346f82612818565b915061347a83612818565b925082820390508181111561349257613491613348565b5b92915050565b5f6134a282612818565b91506134ad83612818565b92508282019050808211156134c5576134c4613348565b5b92915050565b7f7075626c69632073776974636820636c6f7365640000000000000000000000005f82015250565b5f6134ff60148361298d565b915061350a826134cb565b602082019050919050565b5f6020820190508181035f83015261352c816134f3565b9050919050565b7f446f6e27742065786365656420746865205075626c6963204d696e74204d61785f8201527f696d756d206c696d697421000000000000000000000000000000000000000000602082015250565b5f61358d602b8361298d565b915061359882613533565b604082019050919050565b5f6020820190508181035f8301526135ba81613581565b9050919050565b7f596f752068617665207265616368656420746865206d6178206d696e74206c695f8201527f6d697420666f72206561636820616464726573732c20506c65617365206d696e60208201527f74204c6573732100000000000000000000000000000000000000000000000000604082015250565b5f61364160478361298d565b915061364c826135c1565b606082019050919050565b5f6020820190508181035f83015261366e81613635565b9050919050565b5f61367f82612818565b915061368a83612818565b925082820261369881612818565b915082820484148315176136af576136ae613348565b5b5092915050565b7f506c6561736520656e7465722074686520656e6f75676820657468657265756d5f8201527f20746f206d696e742120286e6f20656e6f756768206574686572290000000000602082015250565b5f613710603b8361298d565b915061371b826136b6565b604082019050919050565b5f6020820190508181035f83015261373d81613704565b9050919050565b5f81905092915050565b5f61375882612983565b6137628185613744565b935061377281856020860161299d565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f6137b2600583613744565b91506137bd8261377e565b600582019050919050565b5f6137d3828561374e565b91506137df828461374e565b91506137ea826137a6565b91508190509392505050565b7f77686974656c6973742073776974636820636c6f7365640000000000000000005f82015250565b5f61382a60178361298d565b9150613835826137f6565b602082019050919050565b5f6020820190508181035f8301526138578161381e565b9050919050565b7f446f6e277420657863656564207468652057686974654c697374204d696e74205f8201527f4d6178696d756d206c696d697421000000000000000000000000000000000000602082015250565b5f6138b8602e8361298d565b91506138c38261385e565b604082019050919050565b5f6020820190508181035f8301526138e5816138ac565b9050919050565b7f446f6e2774206578636565642073657373696f6e2077686974656c69737420735f8201527f7570706c79210000000000000000000000000000000000000000000000000000602082015250565b5f61394660268361298d565b9150613951826138ec565b604082019050919050565b5f6020820190508181035f8301526139738161393a565b9050919050565b5f8160601b9050919050565b5f6139908261397a565b9050919050565b5f6139a182613986565b9050919050565b6139b96139b482612a3c565b613997565b82525050565b5f819050919050565b6139d96139d482612818565b6139bf565b82525050565b5f6139ea82856139a8565b6014820191506139fa82846139c8565b6020820191508190509392505050565b7f596f75206861766520616c72656164792072656465656d6564207468652077685f8201527f6974656c69737420726967687473206174207468697320736561736f6e21202860208201527f636f6e73756d6564290000000000000000000000000000000000000000000000604082015250565b5f613a8a60498361298d565b9150613a9582613a0a565b606082019050919050565b5f6020820190508181035f830152613ab781613a7e565b9050919050565b7f496e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f613af2600d8361298d565b9150613afd82613abe565b602082019050919050565b5f6020820190508181035f830152613b1f81613ae6565b9050919050565b7f61646d696e2073776974636820636c6f736564000000000000000000000000005f82015250565b5f613b5a60138361298d565b9150613b6582613b26565b602082019050919050565b5f6020820190508181035f830152613b8781613b4e565b9050919050565b5f613b9882612818565b91505f8203613baa57613ba9613348565b5b600182039050919050565b7f65786365656420746865206d6178696d756d20737570706c79210000000000005f82015250565b5f613be9601a8361298d565b9150613bf482613bb5565b602082019050919050565b5f6020820190508181035f830152613c1681613bdd565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f613c4182613c1d565b613c4b8185613c27565b9350613c5b81856020860161299d565b613c64816126e4565b840191505092915050565b5f608082019050613c825f830187612a4d565b613c8f6020830186612a4d565b613c9c6040830185612a75565b8181036060830152613cae8184613c37565b905095945050505050565b5f81519050613cc7816128d0565b92915050565b5f60208284031215613ce257613ce16126d4565b5b5f613cef84828501613cb9565b9150509291505056fea2646970667358221220b23880b6f4d8c50133fee870a402c2b40cb6ac2867e414ac5a3c991705d6b74964736f6c63430008160033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001f4355464520484b20416c756d6e69204173736f63696174696f6e20504f41500000000000000000000000000000000000000000000000000000000000000000094355464520484b41410000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): CUFE HK Alumni Association POAP
Arg [1] : _symbol (string): CUFE HKAA
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [3] : 4355464520484b20416c756d6e69204173736f63696174696f6e20504f415000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 4355464520484b41410000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
159:8848:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2107:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9164:630:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6915:140:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10048:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16911:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;574:28:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16639:122:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;635:33:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1071:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5894:317:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20546:3447;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2521:331:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8827:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24084:187:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5355:148:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;955:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11409:150:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7045:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2137:101:6;;;;;;;;;;;;;:::i;:::-;;7429:114:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6395:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8439:307;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7617:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6250:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8124:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5189:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1482:85:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10217:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5030:129:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17461:231:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4164:581:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24852:405:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6562:123:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7116:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5530:575;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1175:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2912:1198;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1035:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2316:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17842:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7287:103:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1221:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6736:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2387:215:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1329:26:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2107:157;1375:13:6;:11;:13::i;:::-;2248:9:1::1;2224:8;:21;2233:11;2224:21;;;;;;;;;;;:33;;;;;;:::i;:::-;;2107:157:::0;;:::o;9164:630:3:-;9249:4;9582:10;9567:25;;:11;:25;;;;:101;;;;9658:10;9643:25;;:11;:25;;;;9567:101;:177;;;;9734:10;9719:25;;:11;:25;;;;9567:177;9548:196;;9164:630;;;:::o;6915:140:1:-;1375:13:6;:11;:13::i;:::-;7026:22:1::1;7002:21;:46;;;;6915:140:::0;:::o;10048:98:3:-;10102:13;10134:5;10127:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10048:98;:::o;16911:223::-;16987:7;17011:16;17019:7;17011;:16::i;:::-;17006:73;;17029:50;17037:41;;;17029:7;:50::i;:::-;17006:73;17097:15;:24;17113:7;17097:24;;;;;;;;;;;:30;;;;;;;;;;;;17090:37;;16911:223;;;:::o;574:28:1:-;;;;:::o;16639:122:3:-;16727:27;16736:2;16740:7;16749:4;16727:8;:27::i;:::-;16639:122;;:::o;635:33:1:-;;;;:::o;1071:32::-;;;;:::o;5894:317:3:-;5955:7;6179:15;:13;:15::i;:::-;6164:12;;6148:13;;:28;:46;6141:53;;5894:317;:::o;20546:3447::-;20683:27;20713;20732:7;20713:18;:27::i;:::-;20683:57;;2785:14;20881:4;20865:22;;:41;20842:66;;20964:4;20923:45;;20939:19;20923:45;;;20919:95;;20970:44;20978:35;;;20970:7;:44::i;:::-;20919:95;21026:27;21055:23;21082:35;21109:7;21082:26;:35::i;:::-;21025:92;;;;21214:68;21239:15;21256:4;21262:19;:17;:19::i;:::-;21214:24;:68::i;:::-;21209:188;;21301:43;21318:4;21324:19;:17;:19::i;:::-;21301:16;:43::i;:::-;21296:101;;21346:51;21354:42;;;21346:7;:51::i;:::-;21296:101;21209:188;21408:43;21430:4;21436:2;21440:7;21449:1;21408:21;:43::i;:::-;21540:15;21537:157;;;21678:1;21657:19;21650:30;21537:157;22066:18;:24;22085:4;22066:24;;;;;;;;;;;;;;;;22064:26;;;;;;;;;;;;22134:18;:22;22153:2;22134:22;;;;;;;;;;;;;;;;22132:24;;;;;;;;;;;22449:143;22485:2;22533:45;22548:4;22554:2;22558:19;22533:14;:45::i;:::-;2392:8;22505:73;22449:18;:143::i;:::-;22420:17;:26;22438:7;22420:26;;;;;;;;;;;:172;;;;22760:1;2392:8;22709:19;:47;:52;22705:617;;22781:19;22813:1;22803:7;:11;22781:33;;22968:1;22934:17;:30;22952:11;22934:30;;;;;;;;;;;;:35;22930:378;;23070:13;;23055:11;:28;23051:239;;23248:19;23215:17;:30;23233:11;23215:30;;;;;;;;;;;:52;;;;23051:239;22930:378;22763:559;22705:617;23431:16;2785:14;23466:2;23450:20;;:39;23431:58;;23821:7;23786:8;23753:4;23696:25;23642:1;23586;23564:292;23891:1;23879:8;:13;23875:58;;23894:39;23902:30;;;23894:7;:39::i;:::-;23875:58;23944:42;23965:4;23971:2;23975:7;23984:1;23944:20;:42::i;:::-;20673:3320;;;;20546:3447;;;:::o;2521:331:1:-;1604:14;1590:10;;:28;1582:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;1375:13:6::1;:11;:13::i;:::-;2670:11:1::2;2684:3;;:10;;2670:24;;2719:9;;:16;;2712:3;:23;2704:32;;;::::0;::::2;;2752:9;2747:99;2771:3;2767:1;:7;2747:99;;;2792:26;2797:3;;2801:1;2797:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2805:9;;2815:1;2805:12;;;;;;;:::i;:::-;;;;;;;;2792:4;:26::i;:::-;2832:3;;;;:::i;:::-;;;2747:99;;;;2660:192;2521:331:::0;;;;:::o;8827:177::-;1375:13:6;:11;:13::i;:::-;8889:12:1::1;8915:10;8907:24;;8939:7;8907:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8888:63;;;8969:7;8961:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;8878:126;8827:177:::0;:::o;24084:187:3:-;24225:39;24242:4;24248:2;24252:7;24225:39;;;;;;;;;;;;:16;:39::i;:::-;24084:187;;;:::o;5355:148:1:-;5431:7;5456:28;:40;5485:10;5456:40;;;;;;;;;;;;5449:47;;5355:148;;;:::o;955:25::-;;;;:::o;11409:150:3:-;11481:7;11523:27;11542:7;11523:18;:27::i;:::-;11500:52;;11409:150;;;:::o;7045:239::-;7117:7;7157:1;7140:19;;:5;:19;;;7136:69;;7161:44;7169:35;;;7161:7;:44::i;:::-;7136:69;1360:13;7222:18;:25;7241:5;7222:25;;;;;;;;;;;;;;;;:55;7215:62;;7045:239;;;:::o;2137:101:6:-;1375:13;:11;:13::i;:::-;2201:30:::1;2228:1;2201:18;:30::i;:::-;2137:101::o:0;7429:114:1:-;1375:13:6;:11;:13::i;:::-;7522:14:1::1;7506:13;:30;;;;7429:114:::0;:::o;6395:130::-;1375:13:6;:11;:13::i;:::-;6500:18:1::1;6480:17;:38;;;;6395:130:::0;:::o;8439:307::-;1375:13:6;:11;:13::i;:::-;8640:1:1::1;8626:11;:15;:113;;8718:21;8692:7;:23;8713:1;8700:11;:14;;;;:::i;:::-;8692:23;;;;;;;;;;;;:47;;;;:::i;:::-;8626:113;;;8656:21;8626:113;8582:28;:41;8611:11;8582:41;;;;;;;;;;;:157;;;;8439:307:::0;;:::o;7617:194::-;7713:7;7759:16;:32;7776:14;7759:32;;;;;;;;;;;;;;;:45;7792:11;7759:45;;;;;;;;;;;;7738:18;;:66;;;;:::i;:::-;7731:73;;7617:194;;;;:::o;6250:107::-;1375:13:6;:11;:13::i;:::-;6338:12:1::1;6324:11;:26;;;;6250:107:::0;:::o;8124:226::-;1375:13:6;:11;:13::i;:::-;8271:1:1::1;8256:11;:16;:87;;8336:7;8309;:24;8331:1;8317:11;:15;;;;:::i;:::-;8309:24;;;;;;;;;;;;:34;;;;:::i;:::-;8256:87;;;8287:7;8256:87;8233:7;:20;8241:11;8233:20;;;;;;;;;;;:110;;;;8124:226:::0;;:::o;5189:119::-;5256:7;5282;:19;5290:10;5282:19;;;;;;;;;;;;5275:26;;5189:119;;;:::o;1482:85:6:-;1528:7;1554:6;;;;;;;;;;;1547:13;;1482:85;:::o;10217:102:3:-;10273:13;10305:7;10298:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10217:102;:::o;5030:129:1:-;5106:13;5132:8;:20;5141:10;5132:20;;;;;;;;;;;5125:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5030:129;;;:::o;17461:231:3:-;17607:8;17555:18;:39;17574:19;:17;:19::i;:::-;17555:39;;;;;;;;;;;;;;;:49;17595:8;17555:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17666:8;17630:55;;17645:19;:17;:19::i;:::-;17630:55;;;17676:8;17630:55;;;;;;:::i;:::-;;;;;;;;17461:231;;:::o;4164:581:1:-;1867:13;1853:10;;:27;1845:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;4287:18:::1;;4274:9;:31;;4266:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;4384:49;4406:10;4418:14;;4384:21;:49::i;:::-;4371:9;:62;;4363:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;4551:17;;4539:9;:29;;;;:::i;:::-;4526:9;:42;4518:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;4642:27;4647:10;4659:9;4642:4;:27::i;:::-;4679:59;4700:10;4712:9;4723:14;;4679:20;:59::i;:::-;4164:581:::0;:::o;24852:405:3:-;25021:31;25034:4;25040:2;25044:7;25021:12;:31::i;:::-;25084:1;25066:2;:14;;;:19;25062:189;;25104:56;25135:4;25141:2;25145:7;25154:5;25104:30;:56::i;:::-;25099:152;;25180:56;25188:47;;;25180:7;:56::i;:::-;25099:152;25062:189;24852:405;;;;:::o;6562:123:1:-;1375:13:6;:11;:13::i;:::-;6662:16:1::1;6644:15;:34;;;;6562:123:::0;:::o;7116:116::-;1375:13:6;:11;:13::i;:::-;7210:15:1::1;7193:14;:32;;;;7116:116:::0;:::o;5530:575::-;5617:13;5647:16;5655:7;5647;:16::i;:::-;5642:59;;5672:29;;;;;;;;;;;;;;5642:59;5712:9;5724:1;5712:13;;5735:162;5746:13;;5742:1;:17;5735:162;;;5795:7;:10;5803:1;5795:10;;;;;;;;;;;;5791:1;5781:7;:11;;;;:::i;:::-;:24;5777:110;;;5825:3;;;;:::i;:::-;;;5777:110;;;5867:5;;5777:110;5735:162;;;5906:21;5930:8;:11;5939:1;5930:11;;;;;;;;;;;5906:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5996:1;5977:7;5971:21;:26;:127;;;;;;;;;;;;;;;;;6040:7;6049:18;6059:7;6049:9;:18::i;:::-;6023:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5971:127;5952:146;;;;5530:575;;;:::o;1175:40::-;;;;:::o;2912:1198::-;1735:16;1721:10;;:30;1713:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;3053:16:::1;3072:10;3053:29;;3146:21;;3133:9;:34;;3125:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;3266:28;:44;3295:14;;3266:44;;;;;;;;;;;;3249:13;:11;:13::i;:::-;3237:9;:25;;;;:::i;:::-;:73;;3229:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;3464:12;3506:8;3516:14;;3489:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3479:53;;;;;;3464:68;;3643:30;3667:4;3659:13;;3643:11;:15;;:30;;;;:::i;:::-;3642:31;3634:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;3761:30;3785:4;3777:13;;3761:11;:15;;:30;;;;:::i;:::-;3834:44;3853:5;;3834:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3860:11;;3873:4;3834:18;:44::i;:::-;3826:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;3989:15;;3977:9;:27;;;;:::i;:::-;3964:9;:40;3956:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;4078:25;4083:8;4093:9;4078:4;:25::i;:::-;3043:1067;;2912:1198:::0;;;:::o;1035:30::-;;;;:::o;2316:149::-;1478:12;1464:10;;:26;1456:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1375:13:6::1;:11;:13::i;:::-;2438:20:1::2;2443:3;2448:9;2438:4;:20::i;:::-;2316:149:::0;;:::o;17842:162:3:-;17939:4;17962:18;:25;17981:5;17962:25;;;;;;;;;;;;;;;:35;17988:8;17962:35;;;;;;;;;;;;;;;;;;;;;;;;;17955:42;;17842:162;;;;:::o;7287:103:1:-;1375:13:6;:11;:13::i;:::-;7372:11:1::1;7359:10;:24;;;;7287:103:::0;:::o;1221:38::-;;;;:::o;6736:128::-;1375:13:6;:11;:13::i;:::-;6838:19:1::1;6817:18;:40;;;;6736:128:::0;:::o;2387:215:6:-;1375:13;:11;:13::i;:::-;2491:1:::1;2471:22;;:8;:22;;::::0;2467:91:::1;;2544:1;2516:31;;;;;;;;;;;:::i;:::-;;;;;;;;2467:91;2567:28;2586:8;2567:18;:28::i;:::-;2387:215:::0;:::o;1329:26:1:-;;;;:::o;1640:162:6:-;1710:12;:10;:12::i;:::-;1699:23;;:7;:5;:7::i;:::-;:23;;;1695:101;;1772:12;:10;:12::i;:::-;1745:40;;;;;;;;;;;:::i;:::-;;;;;;;;1695:101;1640:162::o;18253:360:3:-;18318:11;18364:7;18345:15;:13;:15::i;:::-;:26;18341:266;;18401:13;;18391:7;:23;18387:210;;;18434:14;18466:60;18514:1;18483:17;:26;18501:7;18483:26;;;;;;;;;;;;18474:35;;;18473:42;18466:60;;18517:9;;;;:::i;:::-;;;18466:60;;;18581:1;2118:8;18553:6;:24;:29;18544:38;;18416:181;18387:210;18341:266;18253:360;;;:::o;43371:160::-;43470:13;43464:4;43457:27;43510:4;43504;43497:18;35019:460;35143:13;35159:16;35167:7;35159;:16::i;:::-;35143:32;;35190:13;:45;;;;;35230:5;35207:28;;:19;:17;:19::i;:::-;:28;;;;35190:45;35186:198;;;35254:44;35271:5;35278:19;:17;:19::i;:::-;35254:16;:44::i;:::-;35249:135;;35318:51;35326:42;;;35318:7;:51::i;:::-;35249:135;35186:198;35427:2;35394:15;:24;35410:7;35394:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;35464:7;35460:2;35444:28;;35453:5;35444:28;;;;;;;;;;;;35133:346;35019:460;;;:::o;5426:90::-;5482:7;5426:90;:::o;12850:1978::-;12917:14;12966:7;12947:15;:13;:15::i;:::-;:26;12943:1822;;12998:17;:26;13016:7;12998:26;;;;;;;;;;;;12989:35;;13132:1;13122:6;:11;13118:1270;;13168:13;;13157:7;:24;13153:77;;13183:47;13191:38;;;13183:7;:47::i;:::-;13153:77;13777:597;13853:17;:28;13871:9;;;;;;;13853:28;;;;;;;;;;;;13844:37;;13939:1;13929:6;:11;13925:25;13942:8;13925:25;14004:1;2118:8;13976:6;:24;:29;13972:48;14007:13;13972:48;14308:47;14316:38;;;14308:7;:47::i;:::-;13777:597;;;13118:1270;14738:1;2118:8;14710:6;:24;:29;14706:48;14741:13;14706:48;12943:1822;14774:47;14782:38;;;14774:7;:47::i;:::-;12850:1978;;;;:::o;19471:474::-;19570:27;19599:23;19638:38;19679:15;:24;19695:7;19679:24;;;;;;;;;;;19638:65;;19853:18;19830:41;;19909:19;19903:26;19884:45;;19816:123;19471:474;;;:::o;41401:103::-;41461:7;41487:10;41480:17;;41401:103;:::o;18717:646::-;18862:11;19024:16;19017:5;19013:28;19004:37;;19182:16;19171:9;19167:32;19154:45;;19330:15;19319:9;19316:30;19308:5;19297:9;19294:20;19291:56;19281:66;;18717:646;;;;;:::o;25901:154::-;;;;;:::o;40728:304::-;40859:7;40878:16;2513:3;40904:19;:41;;40878:68;;2513:3;40971:31;40982:4;40988:2;40992:9;40971:10;:31::i;:::-;40963:40;;:62;;40956:69;;;40728:304;;;;;:::o;15361:443::-;15441:14;15606:16;15599:5;15595:28;15586:37;;15781:5;15767:11;15742:23;15738:41;15735:52;15728:5;15725:63;15715:73;;15361:443;;;;:::o;26702:153::-;;;;;:::o;4808:198:1:-;4910:7;:23;4918:14;;4910:23;;;;;;;;;;;;4897:9;4881:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:52;;4873:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;4974:25;4984:3;4989:9;4974;:25::i;:::-;4808:198;;:::o;2756:187:6:-;2829:16;2848:6;;;;;;;;;;;2829:25;;2873:8;2864:6;;:17;;;;;;;;;;;;;;;;;;2927:8;2896:40;;2917:8;2896:40;;;;;;;;;;;;2819:124;2756:187;:::o;7883:167:1:-;8038:5;7989:16;:32;8006:14;7989:32;;;;;;;;;;;;;;;:45;8022:11;7989:45;;;;;;;;;;;;:54;;;;;;;:::i;:::-;;;;;;;;7883:167;;;:::o;27283:673:3:-;27441:4;27486:2;27461:45;;;27507:19;:17;:19::i;:::-;27528:4;27534:7;27543:5;27461:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;27457:493;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27756:1;27739:6;:13;:18;27735:113;;27777:56;27785:47;;;27777:7;:56::i;:::-;27735:113;27918:6;27912:13;27903:6;27899:2;27895:15;27888:38;27457:493;27627:54;;;27617:64;;;:6;:64;;;;27610:71;;;27283:673;;;;;;:::o;41601:1708::-;41666:17;42094:4;42087;42081:11;42077:22;42184:1;42178:4;42171:15;42257:4;42254:1;42250:12;42243:19;;42337:1;42332:3;42325:14;42438:3;42672:5;42654:419;42680:1;42654:419;;;42719:1;42714:3;42710:11;42703:18;;42887:2;42881:4;42877:13;42873:2;42869:22;42864:3;42856:36;42979:2;42973:4;42969:13;42961:21;;43044:4;42654:419;43034:25;42654:419;42658:21;43110:3;43105;43101:13;43223:4;43218:3;43214:14;43207:21;;43286:6;43281:3;43274:19;41704:1599;;;41601:1708;;;:::o;1028:217:0:-;1102:4;1118:14;1144:1;1135:5;:10;;1118:27;;1155:12;1184:4;1176:5;:12;1170:1;:19;;1155:34;;1237:1;1229:4;1206:6;:12;;:20;1219:6;1206:20;;;;;;;;;;;;:27;:32;;1199:39;;;;1028:217;;;;:::o;1581:186::-;1651:14;1677:1;1668:5;:10;;1651:27;;1688:12;1717:4;1709:5;:12;1703:1;:19;;1688:34;;1756:4;1732:6;:12;;:20;1745:6;1732:20;;;;;;;;;;;;:28;;;;;;;;;;;1641:126;;1581:186;;:::o;1265:154:5:-;1356:4;1408;1379:25;1392:5;1399:4;1379:12;:25::i;:::-;:33;1372:40;;1265:154;;;;;:::o;641:96:2:-;694:7;720:10;713:17;;641:96;:::o;40439:143:3:-;40572:6;40439:143;;;;;:::o;34129:110::-;34205:27;34215:2;34219:8;34205:27;;;;;;;;;;;;:9;:27::i;:::-;34129:110;;:::o;1967:290:5:-;2050:7;2069:20;2092:4;2069:27;;2111:9;2106:116;2130:5;:12;2126:1;:16;2106:116;;;2178:33;2188:12;2202:5;2208:1;2202:8;;;;;;;;:::i;:::-;;;;;;;;2178:9;:33::i;:::-;2163:48;;2144:3;;;;;;;2106:116;;;;2238:12;2231:19;;;1967:290;;;;:::o;33362:688:3:-;33488:19;33494:2;33498:8;33488:5;:19::i;:::-;33564:1;33546:2;:14;;;:19;33542:492;;33585:11;33599:13;;33585:27;;33630:13;33652:8;33646:3;:14;33630:30;;33678:238;33708:62;33747:1;33751:2;33755:7;;;;;;33764:5;33708:30;:62::i;:::-;33703:174;;33798:56;33806:47;;;33798:7;:56::i;:::-;33703:174;33911:3;33903:5;:11;33678:238;;33996:3;33979:13;;:20;33975:44;;34001:18;34016:1;34009:9;;34001:7;:18::i;:::-;33975:44;33567:467;;33542:492;33362:688;;;:::o;9156:147:5:-;9219:7;9249:1;9245;:5;:51;;9276:20;9291:1;9294;9276:14;:20::i;:::-;9245:51;;;9253:20;9268:1;9271;9253:14;:20::i;:::-;9245:51;9238:58;;9156:147;;;;:::o;28402:2251:3:-;28474:20;28497:13;;28474:36;;28536:1;28524:8;:13;28520:53;;28539:34;28547:25;;;28539:7;:34::i;:::-;28520:53;28584:61;28614:1;28618:2;28622:12;28636:8;28584:21;:61::i;:::-;29107:136;29143:2;29196:33;29219:1;29223:2;29227:1;29196:14;:33::i;:::-;29163:30;29184:8;29163:20;:30::i;:::-;:66;29107:18;:136::i;:::-;29073:17;:31;29091:12;29073:31;;;;;;;;;;;:170;;;;29523:1;1495:2;29493:1;:26;;29492:32;29480:8;:45;29454:18;:22;29473:2;29454:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;29633:16;2785:14;29668:2;29652:20;;:39;29633:58;;29722:1;29710:8;:13;29706:54;;29725:35;29733:26;;;29725:7;:35::i;:::-;29706:54;29775:11;29804:8;29789:12;:23;29775:37;;29826:15;29844:12;29826:30;;29871:662;30281:7;30238:8;30194:1;30129:25;30067:1;30003;29973:351;30528:3;30515:9;;;;;;:16;29871:662;;30563:3;30547:13;:19;;;;28828:1749;;;30586:60;30615:1;30619:2;30623:12;30637:8;30586:20;:60::i;:::-;28464:2189;28402:2251;;:::o;9309:261:5:-;9377:13;9481:1;9475:4;9468:15;9509:1;9503:4;9496:15;9549:4;9543;9533:21;9524:30;;9309:261;;;;:::o;15901:318:3:-;15971:14;16200:1;16190:8;16187:15;16161:24;16157:46;16147:56;;15901:318;;;:::o;7:75:7:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:102;621:6;672:2;668:7;663:2;656:5;652:14;648:28;638:38;;580:102;;;:::o;688:180::-;736:77;733:1;726:88;833:4;830:1;823:15;857:4;854:1;847:15;874:281;957:27;979:4;957:27;:::i;:::-;949:6;945:40;1087:6;1075:10;1072:22;1051:18;1039:10;1036:34;1033:62;1030:88;;;1098:18;;:::i;:::-;1030:88;1138:10;1134:2;1127:22;917:238;874:281;;:::o;1161:129::-;1195:6;1222:20;;:::i;:::-;1212:30;;1251:33;1279:4;1271:6;1251:33;:::i;:::-;1161:129;;;:::o;1296:308::-;1358:4;1448:18;1440:6;1437:30;1434:56;;;1470:18;;:::i;:::-;1434:56;1508:29;1530:6;1508:29;:::i;:::-;1500:37;;1592:4;1586;1582:15;1574:23;;1296:308;;;:::o;1610:146::-;1707:6;1702:3;1697;1684:30;1748:1;1739:6;1734:3;1730:16;1723:27;1610:146;;;:::o;1762:425::-;1840:5;1865:66;1881:49;1923:6;1881:49;:::i;:::-;1865:66;:::i;:::-;1856:75;;1954:6;1947:5;1940:21;1992:4;1985:5;1981:16;2030:3;2021:6;2016:3;2012:16;2009:25;2006:112;;;2037:79;;:::i;:::-;2006:112;2127:54;2174:6;2169:3;2164;2127:54;:::i;:::-;1846:341;1762:425;;;;;:::o;2207:340::-;2263:5;2312:3;2305:4;2297:6;2293:17;2289:27;2279:122;;2320:79;;:::i;:::-;2279:122;2437:6;2424:20;2462:79;2537:3;2529:6;2522:4;2514:6;2510:17;2462:79;:::i;:::-;2453:88;;2269:278;2207:340;;;;:::o;2553:77::-;2590:7;2619:5;2608:16;;2553:77;;;:::o;2636:122::-;2709:24;2727:5;2709:24;:::i;:::-;2702:5;2699:35;2689:63;;2748:1;2745;2738:12;2689:63;2636:122;:::o;2764:139::-;2810:5;2848:6;2835:20;2826:29;;2864:33;2891:5;2864:33;:::i;:::-;2764:139;;;;:::o;2909:654::-;2987:6;2995;3044:2;3032:9;3023:7;3019:23;3015:32;3012:119;;;3050:79;;:::i;:::-;3012:119;3198:1;3187:9;3183:17;3170:31;3228:18;3220:6;3217:30;3214:117;;;3250:79;;:::i;:::-;3214:117;3355:63;3410:7;3401:6;3390:9;3386:22;3355:63;:::i;:::-;3345:73;;3141:287;3467:2;3493:53;3538:7;3529:6;3518:9;3514:22;3493:53;:::i;:::-;3483:63;;3438:118;2909:654;;;;;:::o;3569:149::-;3605:7;3645:66;3638:5;3634:78;3623:89;;3569:149;;;:::o;3724:120::-;3796:23;3813:5;3796:23;:::i;:::-;3789:5;3786:34;3776:62;;3834:1;3831;3824:12;3776:62;3724:120;:::o;3850:137::-;3895:5;3933:6;3920:20;3911:29;;3949:32;3975:5;3949:32;:::i;:::-;3850:137;;;;:::o;3993:327::-;4051:6;4100:2;4088:9;4079:7;4075:23;4071:32;4068:119;;;4106:79;;:::i;:::-;4068:119;4226:1;4251:52;4295:7;4286:6;4275:9;4271:22;4251:52;:::i;:::-;4241:62;;4197:116;3993:327;;;;:::o;4326:90::-;4360:7;4403:5;4396:13;4389:21;4378:32;;4326:90;;;:::o;4422:109::-;4503:21;4518:5;4503:21;:::i;:::-;4498:3;4491:34;4422:109;;:::o;4537:210::-;4624:4;4662:2;4651:9;4647:18;4639:26;;4675:65;4737:1;4726:9;4722:17;4713:6;4675:65;:::i;:::-;4537:210;;;;:::o;4753:329::-;4812:6;4861:2;4849:9;4840:7;4836:23;4832:32;4829:119;;;4867:79;;:::i;:::-;4829:119;4987:1;5012:53;5057:7;5048:6;5037:9;5033:22;5012:53;:::i;:::-;5002:63;;4958:117;4753:329;;;;:::o;5088:99::-;5140:6;5174:5;5168:12;5158:22;;5088:99;;;:::o;5193:169::-;5277:11;5311:6;5306:3;5299:19;5351:4;5346:3;5342:14;5327:29;;5193:169;;;;:::o;5368:246::-;5449:1;5459:113;5473:6;5470:1;5467:13;5459:113;;;5558:1;5553:3;5549:11;5543:18;5539:1;5534:3;5530:11;5523:39;5495:2;5492:1;5488:10;5483:15;;5459:113;;;5606:1;5597:6;5592:3;5588:16;5581:27;5430:184;5368:246;;;:::o;5620:377::-;5708:3;5736:39;5769:5;5736:39;:::i;:::-;5791:71;5855:6;5850:3;5791:71;:::i;:::-;5784:78;;5871:65;5929:6;5924:3;5917:4;5910:5;5906:16;5871:65;:::i;:::-;5961:29;5983:6;5961:29;:::i;:::-;5956:3;5952:39;5945:46;;5712:285;5620:377;;;;:::o;6003:313::-;6116:4;6154:2;6143:9;6139:18;6131:26;;6203:9;6197:4;6193:20;6189:1;6178:9;6174:17;6167:47;6231:78;6304:4;6295:6;6231:78;:::i;:::-;6223:86;;6003:313;;;;:::o;6322:126::-;6359:7;6399:42;6392:5;6388:54;6377:65;;6322:126;;;:::o;6454:96::-;6491:7;6520:24;6538:5;6520:24;:::i;:::-;6509:35;;6454:96;;;:::o;6556:118::-;6643:24;6661:5;6643:24;:::i;:::-;6638:3;6631:37;6556:118;;:::o;6680:222::-;6773:4;6811:2;6800:9;6796:18;6788:26;;6824:71;6892:1;6881:9;6877:17;6868:6;6824:71;:::i;:::-;6680:222;;;;:::o;6908:118::-;6995:24;7013:5;6995:24;:::i;:::-;6990:3;6983:37;6908:118;;:::o;7032:222::-;7125:4;7163:2;7152:9;7148:18;7140:26;;7176:71;7244:1;7233:9;7229:17;7220:6;7176:71;:::i;:::-;7032:222;;;;:::o;7260:122::-;7333:24;7351:5;7333:24;:::i;:::-;7326:5;7323:35;7313:63;;7372:1;7369;7362:12;7313:63;7260:122;:::o;7388:139::-;7434:5;7472:6;7459:20;7450:29;;7488:33;7515:5;7488:33;:::i;:::-;7388:139;;;;:::o;7533:474::-;7601:6;7609;7658:2;7646:9;7637:7;7633:23;7629:32;7626:119;;;7664:79;;:::i;:::-;7626:119;7784:1;7809:53;7854:7;7845:6;7834:9;7830:22;7809:53;:::i;:::-;7799:63;;7755:117;7911:2;7937:53;7982:7;7973:6;7962:9;7958:22;7937:53;:::i;:::-;7927:63;;7882:118;7533:474;;;;;:::o;8013:619::-;8090:6;8098;8106;8155:2;8143:9;8134:7;8130:23;8126:32;8123:119;;;8161:79;;:::i;:::-;8123:119;8281:1;8306:53;8351:7;8342:6;8331:9;8327:22;8306:53;:::i;:::-;8296:63;;8252:117;8408:2;8434:53;8479:7;8470:6;8459:9;8455:22;8434:53;:::i;:::-;8424:63;;8379:118;8536:2;8562:53;8607:7;8598:6;8587:9;8583:22;8562:53;:::i;:::-;8552:63;;8507:118;8013:619;;;;;:::o;8638:117::-;8747:1;8744;8737:12;8761:117;8870:1;8867;8860:12;8901:568;8974:8;8984:6;9034:3;9027:4;9019:6;9015:17;9011:27;9001:122;;9042:79;;:::i;:::-;9001:122;9155:6;9142:20;9132:30;;9185:18;9177:6;9174:30;9171:117;;;9207:79;;:::i;:::-;9171:117;9321:4;9313:6;9309:17;9297:29;;9375:3;9367:4;9359:6;9355:17;9345:8;9341:32;9338:41;9335:128;;;9382:79;;:::i;:::-;9335:128;8901:568;;;;;:::o;9492:::-;9565:8;9575:6;9625:3;9618:4;9610:6;9606:17;9602:27;9592:122;;9633:79;;:::i;:::-;9592:122;9746:6;9733:20;9723:30;;9776:18;9768:6;9765:30;9762:117;;;9798:79;;:::i;:::-;9762:117;9912:4;9904:6;9900:17;9888:29;;9966:3;9958:4;9950:6;9946:17;9936:8;9932:32;9929:41;9926:128;;;9973:79;;:::i;:::-;9926:128;9492:568;;;;;:::o;10066:934::-;10188:6;10196;10204;10212;10261:2;10249:9;10240:7;10236:23;10232:32;10229:119;;;10267:79;;:::i;:::-;10229:119;10415:1;10404:9;10400:17;10387:31;10445:18;10437:6;10434:30;10431:117;;;10467:79;;:::i;:::-;10431:117;10580:80;10652:7;10643:6;10632:9;10628:22;10580:80;:::i;:::-;10562:98;;;;10358:312;10737:2;10726:9;10722:18;10709:32;10768:18;10760:6;10757:30;10754:117;;;10790:79;;:::i;:::-;10754:117;10903:80;10975:7;10966:6;10955:9;10951:22;10903:80;:::i;:::-;10885:98;;;;10680:313;10066:934;;;;;;;:::o;11006:329::-;11065:6;11114:2;11102:9;11093:7;11089:23;11085:32;11082:119;;;11120:79;;:::i;:::-;11082:119;11240:1;11265:53;11310:7;11301:6;11290:9;11286:22;11265:53;:::i;:::-;11255:63;;11211:117;11006:329;;;;:::o;11341:474::-;11409:6;11417;11466:2;11454:9;11445:7;11441:23;11437:32;11434:119;;;11472:79;;:::i;:::-;11434:119;11592:1;11617:53;11662:7;11653:6;11642:9;11638:22;11617:53;:::i;:::-;11607:63;;11563:117;11719:2;11745:53;11790:7;11781:6;11770:9;11766:22;11745:53;:::i;:::-;11735:63;;11690:118;11341:474;;;;;:::o;11821:77::-;11858:7;11887:5;11876:16;;11821:77;;;:::o;11904:122::-;11977:24;11995:5;11977:24;:::i;:::-;11970:5;11967:35;11957:63;;12016:1;12013;12006:12;11957:63;11904:122;:::o;12032:139::-;12078:5;12116:6;12103:20;12094:29;;12132:33;12159:5;12132:33;:::i;:::-;12032:139;;;;:::o;12177:329::-;12236:6;12285:2;12273:9;12264:7;12260:23;12256:32;12253:119;;;12291:79;;:::i;:::-;12253:119;12411:1;12436:53;12481:7;12472:6;12461:9;12457:22;12436:53;:::i;:::-;12426:63;;12382:117;12177:329;;;;:::o;12512:116::-;12582:21;12597:5;12582:21;:::i;:::-;12575:5;12572:32;12562:60;;12618:1;12615;12608:12;12562:60;12512:116;:::o;12634:133::-;12677:5;12715:6;12702:20;12693:29;;12731:30;12755:5;12731:30;:::i;:::-;12634:133;;;;:::o;12773:468::-;12838:6;12846;12895:2;12883:9;12874:7;12870:23;12866:32;12863:119;;;12901:79;;:::i;:::-;12863:119;13021:1;13046:53;13091:7;13082:6;13071:9;13067:22;13046:53;:::i;:::-;13036:63;;12992:117;13148:2;13174:50;13216:7;13207:6;13196:9;13192:22;13174:50;:::i;:::-;13164:60;;13119:115;12773:468;;;;;:::o;13247:307::-;13308:4;13398:18;13390:6;13387:30;13384:56;;;13420:18;;:::i;:::-;13384:56;13458:29;13480:6;13458:29;:::i;:::-;13450:37;;13542:4;13536;13532:15;13524:23;;13247:307;;;:::o;13560:423::-;13637:5;13662:65;13678:48;13719:6;13678:48;:::i;:::-;13662:65;:::i;:::-;13653:74;;13750:6;13743:5;13736:21;13788:4;13781:5;13777:16;13826:3;13817:6;13812:3;13808:16;13805:25;13802:112;;;13833:79;;:::i;:::-;13802:112;13923:54;13970:6;13965:3;13960;13923:54;:::i;:::-;13643:340;13560:423;;;;;:::o;14002:338::-;14057:5;14106:3;14099:4;14091:6;14087:17;14083:27;14073:122;;14114:79;;:::i;:::-;14073:122;14231:6;14218:20;14256:78;14330:3;14322:6;14315:4;14307:6;14303:17;14256:78;:::i;:::-;14247:87;;14063:277;14002:338;;;;:::o;14346:943::-;14441:6;14449;14457;14465;14514:3;14502:9;14493:7;14489:23;14485:33;14482:120;;;14521:79;;:::i;:::-;14482:120;14641:1;14666:53;14711:7;14702:6;14691:9;14687:22;14666:53;:::i;:::-;14656:63;;14612:117;14768:2;14794:53;14839:7;14830:6;14819:9;14815:22;14794:53;:::i;:::-;14784:63;;14739:118;14896:2;14922:53;14967:7;14958:6;14947:9;14943:22;14922:53;:::i;:::-;14912:63;;14867:118;15052:2;15041:9;15037:18;15024:32;15083:18;15075:6;15072:30;15069:117;;;15105:79;;:::i;:::-;15069:117;15210:62;15264:7;15255:6;15244:9;15240:22;15210:62;:::i;:::-;15200:72;;14995:287;14346:943;;;;;;;:::o;15312:568::-;15385:8;15395:6;15445:3;15438:4;15430:6;15426:17;15422:27;15412:122;;15453:79;;:::i;:::-;15412:122;15566:6;15553:20;15543:30;;15596:18;15588:6;15585:30;15582:117;;;15618:79;;:::i;:::-;15582:117;15732:4;15724:6;15720:17;15708:29;;15786:3;15778:4;15770:6;15766:17;15756:8;15752:32;15749:41;15746:128;;;15793:79;;:::i;:::-;15746:128;15312:568;;;;;:::o;15886:704::-;15981:6;15989;15997;16046:2;16034:9;16025:7;16021:23;16017:32;16014:119;;;16052:79;;:::i;:::-;16014:119;16172:1;16197:53;16242:7;16233:6;16222:9;16218:22;16197:53;:::i;:::-;16187:63;;16143:117;16327:2;16316:9;16312:18;16299:32;16358:18;16350:6;16347:30;16344:117;;;16380:79;;:::i;:::-;16344:117;16493:80;16565:7;16556:6;16545:9;16541:22;16493:80;:::i;:::-;16475:98;;;;16270:313;15886:704;;;;;:::o;16596:474::-;16664:6;16672;16721:2;16709:9;16700:7;16696:23;16692:32;16689:119;;;16727:79;;:::i;:::-;16689:119;16847:1;16872:53;16917:7;16908:6;16897:9;16893:22;16872:53;:::i;:::-;16862:63;;16818:117;16974:2;17000:53;17045:7;17036:6;17025:9;17021:22;17000:53;:::i;:::-;16990:63;;16945:118;16596:474;;;;;:::o;17076:118::-;17163:24;17181:5;17163:24;:::i;:::-;17158:3;17151:37;17076:118;;:::o;17200:222::-;17293:4;17331:2;17320:9;17316:18;17308:26;;17344:71;17412:1;17401:9;17397:17;17388:6;17344:71;:::i;:::-;17200:222;;;;:::o;17428:180::-;17476:77;17473:1;17466:88;17573:4;17570:1;17563:15;17597:4;17594:1;17587:15;17614:320;17658:6;17695:1;17689:4;17685:12;17675:22;;17742:1;17736:4;17732:12;17763:18;17753:81;;17819:4;17811:6;17807:17;17797:27;;17753:81;17881:2;17873:6;17870:14;17850:18;17847:38;17844:84;;17900:18;;:::i;:::-;17844:84;17665:269;17614:320;;;:::o;17940:141::-;17989:4;18012:3;18004:11;;18035:3;18032:1;18025:14;18069:4;18066:1;18056:18;18048:26;;17940:141;;;:::o;18087:93::-;18124:6;18171:2;18166;18159:5;18155:14;18151:23;18141:33;;18087:93;;;:::o;18186:107::-;18230:8;18280:5;18274:4;18270:16;18249:37;;18186:107;;;;:::o;18299:393::-;18368:6;18418:1;18406:10;18402:18;18441:97;18471:66;18460:9;18441:97;:::i;:::-;18559:39;18589:8;18578:9;18559:39;:::i;:::-;18547:51;;18631:4;18627:9;18620:5;18616:21;18607:30;;18680:4;18670:8;18666:19;18659:5;18656:30;18646:40;;18375:317;;18299:393;;;;;:::o;18698:60::-;18726:3;18747:5;18740:12;;18698:60;;;:::o;18764:142::-;18814:9;18847:53;18865:34;18874:24;18892:5;18874:24;:::i;:::-;18865:34;:::i;:::-;18847:53;:::i;:::-;18834:66;;18764:142;;;:::o;18912:75::-;18955:3;18976:5;18969:12;;18912:75;;;:::o;18993:269::-;19103:39;19134:7;19103:39;:::i;:::-;19164:91;19213:41;19237:16;19213:41;:::i;:::-;19205:6;19198:4;19192:11;19164:91;:::i;:::-;19158:4;19151:105;19069:193;18993:269;;;:::o;19268:73::-;19313:3;19268:73;:::o;19347:189::-;19424:32;;:::i;:::-;19465:65;19523:6;19515;19509:4;19465:65;:::i;:::-;19400:136;19347:189;;:::o;19542:186::-;19602:120;19619:3;19612:5;19609:14;19602:120;;;19673:39;19710:1;19703:5;19673:39;:::i;:::-;19646:1;19639:5;19635:13;19626:22;;19602:120;;;19542:186;;:::o;19734:543::-;19835:2;19830:3;19827:11;19824:446;;;19869:38;19901:5;19869:38;:::i;:::-;19953:29;19971:10;19953:29;:::i;:::-;19943:8;19939:44;20136:2;20124:10;20121:18;20118:49;;;20157:8;20142:23;;20118:49;20180:80;20236:22;20254:3;20236:22;:::i;:::-;20226:8;20222:37;20209:11;20180:80;:::i;:::-;19839:431;;19824:446;19734:543;;;:::o;20283:117::-;20337:8;20387:5;20381:4;20377:16;20356:37;;20283:117;;;;:::o;20406:169::-;20450:6;20483:51;20531:1;20527:6;20519:5;20516:1;20512:13;20483:51;:::i;:::-;20479:56;20564:4;20558;20554:15;20544:25;;20457:118;20406:169;;;;:::o;20580:295::-;20656:4;20802:29;20827:3;20821:4;20802:29;:::i;:::-;20794:37;;20864:3;20861:1;20857:11;20851:4;20848:21;20840:29;;20580:295;;;;:::o;20880:1395::-;20997:37;21030:3;20997:37;:::i;:::-;21099:18;21091:6;21088:30;21085:56;;;21121:18;;:::i;:::-;21085:56;21165:38;21197:4;21191:11;21165:38;:::i;:::-;21250:67;21310:6;21302;21296:4;21250:67;:::i;:::-;21344:1;21368:4;21355:17;;21400:2;21392:6;21389:14;21417:1;21412:618;;;;22074:1;22091:6;22088:77;;;22140:9;22135:3;22131:19;22125:26;22116:35;;22088:77;22191:67;22251:6;22244:5;22191:67;:::i;:::-;22185:4;22178:81;22047:222;21382:887;;21412:618;21464:4;21460:9;21452:6;21448:22;21498:37;21530:4;21498:37;:::i;:::-;21557:1;21571:208;21585:7;21582:1;21579:14;21571:208;;;21664:9;21659:3;21655:19;21649:26;21641:6;21634:42;21715:1;21707:6;21703:14;21693:24;;21762:2;21751:9;21747:18;21734:31;;21608:4;21605:1;21601:12;21596:17;;21571:208;;;21807:6;21798:7;21795:19;21792:179;;;21865:9;21860:3;21856:19;21850:26;21908:48;21950:4;21942:6;21938:17;21927:9;21908:48;:::i;:::-;21900:6;21893:64;21815:156;21792:179;22017:1;22013;22005:6;22001:14;21997:22;21991:4;21984:36;21419:611;;;21382:887;;20972:1303;;;20880:1395;;:::o;22281:171::-;22421:23;22417:1;22409:6;22405:14;22398:47;22281:171;:::o;22458:366::-;22600:3;22621:67;22685:2;22680:3;22621:67;:::i;:::-;22614:74;;22697:93;22786:3;22697:93;:::i;:::-;22815:2;22810:3;22806:12;22799:19;;22458:366;;;:::o;22830:419::-;22996:4;23034:2;23023:9;23019:18;23011:26;;23083:9;23077:4;23073:20;23069:1;23058:9;23054:17;23047:47;23111:131;23237:4;23111:131;:::i;:::-;23103:139;;22830:419;;;:::o;23255:180::-;23303:77;23300:1;23293:88;23400:4;23397:1;23390:15;23424:4;23421:1;23414:15;23441:180;23489:77;23486:1;23479:88;23586:4;23583:1;23576:15;23610:4;23607:1;23600:15;23627:233;23666:3;23689:24;23707:5;23689:24;:::i;:::-;23680:33;;23735:66;23728:5;23725:77;23722:103;;23805:18;;:::i;:::-;23722:103;23852:1;23845:5;23841:13;23834:20;;23627:233;;;:::o;23866:147::-;23967:11;24004:3;23989:18;;23866:147;;;;:::o;24019:114::-;;:::o;24139:398::-;24298:3;24319:83;24400:1;24395:3;24319:83;:::i;:::-;24312:90;;24411:93;24500:3;24411:93;:::i;:::-;24529:1;24524:3;24520:11;24513:18;;24139:398;;;:::o;24543:379::-;24727:3;24749:147;24892:3;24749:147;:::i;:::-;24742:154;;24913:3;24906:10;;24543:379;;;:::o;24928:166::-;25068:18;25064:1;25056:6;25052:14;25045:42;24928:166;:::o;25100:366::-;25242:3;25263:67;25327:2;25322:3;25263:67;:::i;:::-;25256:74;;25339:93;25428:3;25339:93;:::i;:::-;25457:2;25452:3;25448:12;25441:19;;25100:366;;;:::o;25472:419::-;25638:4;25676:2;25665:9;25661:18;25653:26;;25725:9;25719:4;25715:20;25711:1;25700:9;25696:17;25689:47;25753:131;25879:4;25753:131;:::i;:::-;25745:139;;25472:419;;;:::o;25897:194::-;25937:4;25957:20;25975:1;25957:20;:::i;:::-;25952:25;;25991:20;26009:1;25991:20;:::i;:::-;25986:25;;26035:1;26032;26028:9;26020:17;;26059:1;26053:4;26050:11;26047:37;;;26064:18;;:::i;:::-;26047:37;25897:194;;;;:::o;26097:191::-;26137:3;26156:20;26174:1;26156:20;:::i;:::-;26151:25;;26190:20;26208:1;26190:20;:::i;:::-;26185:25;;26233:1;26230;26226:9;26219:16;;26254:3;26251:1;26248:10;26245:36;;;26261:18;;:::i;:::-;26245:36;26097:191;;;;:::o;26294:170::-;26434:22;26430:1;26422:6;26418:14;26411:46;26294:170;:::o;26470:366::-;26612:3;26633:67;26697:2;26692:3;26633:67;:::i;:::-;26626:74;;26709:93;26798:3;26709:93;:::i;:::-;26827:2;26822:3;26818:12;26811:19;;26470:366;;;:::o;26842:419::-;27008:4;27046:2;27035:9;27031:18;27023:26;;27095:9;27089:4;27085:20;27081:1;27070:9;27066:17;27059:47;27123:131;27249:4;27123:131;:::i;:::-;27115:139;;26842:419;;;:::o;27267:230::-;27407:34;27403:1;27395:6;27391:14;27384:58;27476:13;27471:2;27463:6;27459:15;27452:38;27267:230;:::o;27503:366::-;27645:3;27666:67;27730:2;27725:3;27666:67;:::i;:::-;27659:74;;27742:93;27831:3;27742:93;:::i;:::-;27860:2;27855:3;27851:12;27844:19;;27503:366;;;:::o;27875:419::-;28041:4;28079:2;28068:9;28064:18;28056:26;;28128:9;28122:4;28118:20;28114:1;28103:9;28099:17;28092:47;28156:131;28282:4;28156:131;:::i;:::-;28148:139;;27875:419;;;:::o;28300:295::-;28440:34;28436:1;28428:6;28424:14;28417:58;28509:34;28504:2;28496:6;28492:15;28485:59;28578:9;28573:2;28565:6;28561:15;28554:34;28300:295;:::o;28601:366::-;28743:3;28764:67;28828:2;28823:3;28764:67;:::i;:::-;28757:74;;28840:93;28929:3;28840:93;:::i;:::-;28958:2;28953:3;28949:12;28942:19;;28601:366;;;:::o;28973:419::-;29139:4;29177:2;29166:9;29162:18;29154:26;;29226:9;29220:4;29216:20;29212:1;29201:9;29197:17;29190:47;29254:131;29380:4;29254:131;:::i;:::-;29246:139;;28973:419;;;:::o;29398:410::-;29438:7;29461:20;29479:1;29461:20;:::i;:::-;29456:25;;29495:20;29513:1;29495:20;:::i;:::-;29490:25;;29550:1;29547;29543:9;29572:30;29590:11;29572:30;:::i;:::-;29561:41;;29751:1;29742:7;29738:15;29735:1;29732:22;29712:1;29705:9;29685:83;29662:139;;29781:18;;:::i;:::-;29662:139;29446:362;29398:410;;;;:::o;29814:246::-;29954:34;29950:1;29942:6;29938:14;29931:58;30023:29;30018:2;30010:6;30006:15;29999:54;29814:246;:::o;30066:366::-;30208:3;30229:67;30293:2;30288:3;30229:67;:::i;:::-;30222:74;;30305:93;30394:3;30305:93;:::i;:::-;30423:2;30418:3;30414:12;30407:19;;30066:366;;;:::o;30438:419::-;30604:4;30642:2;30631:9;30627:18;30619:26;;30691:9;30685:4;30681:20;30677:1;30666:9;30662:17;30655:47;30719:131;30845:4;30719:131;:::i;:::-;30711:139;;30438:419;;;:::o;30863:148::-;30965:11;31002:3;30987:18;;30863:148;;;;:::o;31017:390::-;31123:3;31151:39;31184:5;31151:39;:::i;:::-;31206:89;31288:6;31283:3;31206:89;:::i;:::-;31199:96;;31304:65;31362:6;31357:3;31350:4;31343:5;31339:16;31304:65;:::i;:::-;31394:6;31389:3;31385:16;31378:23;;31127:280;31017:390;;;;:::o;31413:155::-;31553:7;31549:1;31541:6;31537:14;31530:31;31413:155;:::o;31574:400::-;31734:3;31755:84;31837:1;31832:3;31755:84;:::i;:::-;31748:91;;31848:93;31937:3;31848:93;:::i;:::-;31966:1;31961:3;31957:11;31950:18;;31574:400;;;:::o;31980:701::-;32261:3;32283:95;32374:3;32365:6;32283:95;:::i;:::-;32276:102;;32395:95;32486:3;32477:6;32395:95;:::i;:::-;32388:102;;32507:148;32651:3;32507:148;:::i;:::-;32500:155;;32672:3;32665:10;;31980:701;;;;;:::o;32687:173::-;32827:25;32823:1;32815:6;32811:14;32804:49;32687:173;:::o;32866:366::-;33008:3;33029:67;33093:2;33088:3;33029:67;:::i;:::-;33022:74;;33105:93;33194:3;33105:93;:::i;:::-;33223:2;33218:3;33214:12;33207:19;;32866:366;;;:::o;33238:419::-;33404:4;33442:2;33431:9;33427:18;33419:26;;33491:9;33485:4;33481:20;33477:1;33466:9;33462:17;33455:47;33519:131;33645:4;33519:131;:::i;:::-;33511:139;;33238:419;;;:::o;33663:233::-;33803:34;33799:1;33791:6;33787:14;33780:58;33872:16;33867:2;33859:6;33855:15;33848:41;33663:233;:::o;33902:366::-;34044:3;34065:67;34129:2;34124:3;34065:67;:::i;:::-;34058:74;;34141:93;34230:3;34141:93;:::i;:::-;34259:2;34254:3;34250:12;34243:19;;33902:366;;;:::o;34274:419::-;34440:4;34478:2;34467:9;34463:18;34455:26;;34527:9;34521:4;34517:20;34513:1;34502:9;34498:17;34491:47;34555:131;34681:4;34555:131;:::i;:::-;34547:139;;34274:419;;;:::o;34699:225::-;34839:34;34835:1;34827:6;34823:14;34816:58;34908:8;34903:2;34895:6;34891:15;34884:33;34699:225;:::o;34930:366::-;35072:3;35093:67;35157:2;35152:3;35093:67;:::i;:::-;35086:74;;35169:93;35258:3;35169:93;:::i;:::-;35287:2;35282:3;35278:12;35271:19;;34930:366;;;:::o;35302:419::-;35468:4;35506:2;35495:9;35491:18;35483:26;;35555:9;35549:4;35545:20;35541:1;35530:9;35526:17;35519:47;35583:131;35709:4;35583:131;:::i;:::-;35575:139;;35302:419;;;:::o;35727:94::-;35760:8;35808:5;35804:2;35800:14;35779:35;;35727:94;;;:::o;35827:::-;35866:7;35895:20;35909:5;35895:20;:::i;:::-;35884:31;;35827:94;;;:::o;35927:100::-;35966:7;35995:26;36015:5;35995:26;:::i;:::-;35984:37;;35927:100;;;:::o;36033:157::-;36138:45;36158:24;36176:5;36158:24;:::i;:::-;36138:45;:::i;:::-;36133:3;36126:58;36033:157;;:::o;36196:79::-;36235:7;36264:5;36253:16;;36196:79;;;:::o;36281:157::-;36386:45;36406:24;36424:5;36406:24;:::i;:::-;36386:45;:::i;:::-;36381:3;36374:58;36281:157;;:::o;36444:397::-;36584:3;36599:75;36670:3;36661:6;36599:75;:::i;:::-;36699:2;36694:3;36690:12;36683:19;;36712:75;36783:3;36774:6;36712:75;:::i;:::-;36812:2;36807:3;36803:12;36796:19;;36832:3;36825:10;;36444:397;;;;;:::o;36847:297::-;36987:34;36983:1;36975:6;36971:14;36964:58;37056:34;37051:2;37043:6;37039:15;37032:59;37125:11;37120:2;37112:6;37108:15;37101:36;36847:297;:::o;37150:366::-;37292:3;37313:67;37377:2;37372:3;37313:67;:::i;:::-;37306:74;;37389:93;37478:3;37389:93;:::i;:::-;37507:2;37502:3;37498:12;37491:19;;37150:366;;;:::o;37522:419::-;37688:4;37726:2;37715:9;37711:18;37703:26;;37775:9;37769:4;37765:20;37761:1;37750:9;37746:17;37739:47;37803:131;37929:4;37803:131;:::i;:::-;37795:139;;37522:419;;;:::o;37947:163::-;38087:15;38083:1;38075:6;38071:14;38064:39;37947:163;:::o;38116:366::-;38258:3;38279:67;38343:2;38338:3;38279:67;:::i;:::-;38272:74;;38355:93;38444:3;38355:93;:::i;:::-;38473:2;38468:3;38464:12;38457:19;;38116:366;;;:::o;38488:419::-;38654:4;38692:2;38681:9;38677:18;38669:26;;38741:9;38735:4;38731:20;38727:1;38716:9;38712:17;38705:47;38769:131;38895:4;38769:131;:::i;:::-;38761:139;;38488:419;;;:::o;38913:169::-;39053:21;39049:1;39041:6;39037:14;39030:45;38913:169;:::o;39088:366::-;39230:3;39251:67;39315:2;39310:3;39251:67;:::i;:::-;39244:74;;39327:93;39416:3;39327:93;:::i;:::-;39445:2;39440:3;39436:12;39429:19;;39088:366;;;:::o;39460:419::-;39626:4;39664:2;39653:9;39649:18;39641:26;;39713:9;39707:4;39703:20;39699:1;39688:9;39684:17;39677:47;39741:131;39867:4;39741:131;:::i;:::-;39733:139;;39460:419;;;:::o;39885:171::-;39924:3;39947:24;39965:5;39947:24;:::i;:::-;39938:33;;39993:4;39986:5;39983:15;39980:41;;40001:18;;:::i;:::-;39980:41;40048:1;40041:5;40037:13;40030:20;;39885:171;;;:::o;40062:176::-;40202:28;40198:1;40190:6;40186:14;40179:52;40062:176;:::o;40244:366::-;40386:3;40407:67;40471:2;40466:3;40407:67;:::i;:::-;40400:74;;40483:93;40572:3;40483:93;:::i;:::-;40601:2;40596:3;40592:12;40585:19;;40244:366;;;:::o;40616:419::-;40782:4;40820:2;40809:9;40805:18;40797:26;;40869:9;40863:4;40859:20;40855:1;40844:9;40840:17;40833:47;40897:131;41023:4;40897:131;:::i;:::-;40889:139;;40616:419;;;:::o;41041:98::-;41092:6;41126:5;41120:12;41110:22;;41041:98;;;:::o;41145:168::-;41228:11;41262:6;41257:3;41250:19;41302:4;41297:3;41293:14;41278:29;;41145:168;;;;:::o;41319:373::-;41405:3;41433:38;41465:5;41433:38;:::i;:::-;41487:70;41550:6;41545:3;41487:70;:::i;:::-;41480:77;;41566:65;41624:6;41619:3;41612:4;41605:5;41601:16;41566:65;:::i;:::-;41656:29;41678:6;41656:29;:::i;:::-;41651:3;41647:39;41640:46;;41409:283;41319:373;;;;:::o;41698:640::-;41893:4;41931:3;41920:9;41916:19;41908:27;;41945:71;42013:1;42002:9;41998:17;41989:6;41945:71;:::i;:::-;42026:72;42094:2;42083:9;42079:18;42070:6;42026:72;:::i;:::-;42108;42176:2;42165:9;42161:18;42152:6;42108:72;:::i;:::-;42227:9;42221:4;42217:20;42212:2;42201:9;42197:18;42190:48;42255:76;42326:4;42317:6;42255:76;:::i;:::-;42247:84;;41698:640;;;;;;;:::o;42344:141::-;42400:5;42431:6;42425:13;42416:22;;42447:32;42473:5;42447:32;:::i;:::-;42344:141;;;;:::o;42491:349::-;42560:6;42609:2;42597:9;42588:7;42584:23;42580:32;42577:119;;;42615:79;;:::i;:::-;42577:119;42735:1;42760:63;42815:7;42806:6;42795:9;42791:22;42760:63;:::i;:::-;42750:73;;42706:127;42491:349;;;;:::o
Swarm Source
ipfs://b23880b6f4d8c50133fee870a402c2b40cb6ac2867e414ac5a3c991705d6b749
Loading...
Loading
Loading...
Loading
Multichain 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.