Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
420 1337CRITTER
Holders
298
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 1337CRITTERLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LeetCritter
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "@0xsequence/sstore2/contracts/SSTORE2.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "solady/src/utils/LibString.sol"; import "solady/src/utils/Base64.sol"; import {ERC721A, IERC721A} from "erc721a/contracts/ERC721A.sol"; import {ERC721AQueryable} from "erc721a/contracts/extensions/ERC721AQueryable.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; /** * @title 1337 critters are pure 1/1 handcrafted animals living onchain * @author hoanh.eth & snjolfur.eth */ struct Critter { string variety; uint16 ctype; uint16 background; address image; } contract LeetCritter is ERC721A, ERC721AQueryable, Ownable { uint256 public immutable supply; bool public isOpen = false; bytes32 private merkleRoot = 0; mapping(address => bool) minted; string[] public backgroundsOptions; string[] public typesOptions; Critter[] private critters; uint16[] private remapIDs; uint16[] private shuffleIDs; uint256 private shuffleIndex; error MintClosed(); error NotEqualLength(); error NotEnoughLeft(); error NotOnWhitelist(); error MaxMint(); error TokenDoesntExist(); error ZeroBalance(); error InvalidTraits(); constructor( string memory name, string memory symbol, uint256 _supply, string[] memory _backgroundsOptions, string[] memory _typesOptions ) ERC721A(name, symbol) { supply = _supply; shuffleIDs = new uint16[](_supply); remapIDs = new uint16[](_supply); shuffleIndex = _supply; backgroundsOptions = _backgroundsOptions; typesOptions = _typesOptions; } /** * @notice Set minting status */ function setMintStatus(bool state) external onlyOwner { isOpen = state; } /** * @notice Check if an address is on whitelist */ function checkWhitelist(address addr, bytes32[] calldata merkleProof) public view returns (bool) { return MerkleProof.verify(merkleProof, merkleRoot, keccak256(abi.encodePacked(addr))); } /** * @notice Set whitelist using merkle proof */ function setWhitelist(bytes32 newMerkleRoot) external onlyOwner { merkleRoot = newMerkleRoot; } /** * @notice Whilelist mint */ function whitelistMint(bytes32[] calldata merkleProof) public { if (!checkWhitelist(msg.sender, merkleProof)) revert NotOnWhitelist(); if (minted[msg.sender]) revert MaxMint(); helperMint(1); } /** * @notice Owner mint */ function ownerMint(uint256 amount) public onlyOwner { helperMint(amount); } /** * @notice Add critters traits */ function addCritters( string[] calldata _varieties, uint16[] calldata _types, uint16[] calldata _backgrounds, string[] calldata _traits ) public onlyOwner { if (_varieties.length != _types.length) revert NotEqualLength(); if (_varieties.length != _backgrounds.length) revert NotEqualLength(); if (_varieties.length != _traits.length) revert NotEqualLength(); uint256 i = 0; Critter memory critter; do { critter.variety = _varieties[i]; critter.ctype = _types[i]; critter.background = _backgrounds[i]; critter.image = SSTORE2.write(bytes(_traits[i])); critters.push(critter); unchecked { ++i; } } while (i < _varieties.length); } /** * @notice Build trait image */ function buildImage(Critter memory critter) internal view returns (string memory image) { return Base64.encode( abi.encodePacked( '<svg id="critter" width="100%" height="100%" viewBox="0 0 20000 20000" xmlns="http://www.w3.org/2000/svg">', "<style>#critter{background-color:", backgroundsOptions[critter.background], ";background-image:url(data:image/png;base64,", string(SSTORE2.read(critter.image)), ");background-repeat:no-repeat;background-size:contain;background-position:center;image-rendering:-webkit-optimize-contrast;-ms-interpolation-mode:nearest-neighbor;image-rendering:-moz-crisp-edges;image-rendering:pixelated;}</style></svg>" ) ); } /** * @notice Build trait metadata */ function buildMetadata(string memory key, string memory value) internal pure returns (string memory trait) { return string.concat('{"trait_type":"', key, '","value": "', value, '"}'); } /** * @notice Build trait name */ function buildName(string memory _type, string memory _variety) internal pure returns (string memory name) { if (keccak256(abi.encodePacked(_type)) == keccak256(abi.encodePacked("Unique"))) { return _variety; } return string.concat(_type, " ", _variety); } /** * @notice Build metadata and assemble the corresponding token info */ function tokenURI(uint256 tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory metadata) { if (!_exists(tokenId)) revert TokenDoesntExist(); Critter memory critter = critters[remapIDs[tokenId]]; string memory critterType = typesOptions[critter.ctype]; bytes memory json = abi.encodePacked( '{"name": "', buildName(critterType, critter.variety), '", "description":"', "1337 critters are pure 1/1 handcrafted animals living onchain", '","image":"data:image/svg+xml;base64,', buildImage(critter), '",', '"attributes": [', buildMetadata("variety", critter.variety), ",", buildMetadata("type", critterType), ",", buildMetadata("background", backgroundsOptions[critter.background]), "]}" ); return string(abi.encodePacked("data:application/json,", json)); } /** * @notice Helper mint function */ function helperMint(uint256 amount) internal { if (!isOpen) revert MintClosed(); uint256 current = _totalMinted(); unchecked { if ((current + amount) > supply) revert NotEnoughLeft(); } uint256 random = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender))); for (uint8 i = 0; i < amount; i++) { remapIDs[current] = shuffle(random); ++current; } if (msg.sender != owner()) { minted[msg.sender] = true; } _safeMint(msg.sender, amount, ""); } /** * @notice Shuffle random IDs from fixed population * Based on 0xDoubleSharp's algorithm * https://www.justinsilver.com/technology/programming/nft-mint-random-token-id/ */ function shuffle(uint256 random) internal returns (uint16 id) { if (shuffleIndex == 0) revert NotEnoughLeft(); unchecked { uint256 lastIndex = --shuffleIndex; uint256 randomIndex = random % (lastIndex + 1); id = shuffleIDs[randomIndex] != 0 ? uint16(shuffleIDs[randomIndex]) : uint16(randomIndex); shuffleIDs[randomIndex] = shuffleIDs[lastIndex] == 0 ? uint16(lastIndex) : shuffleIDs[lastIndex]; shuffleIDs[lastIndex] = 0; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./utils/Bytecode.sol"; /** @title A key-value storage with auto-generated keys for storing chunks of data with a lower write & read cost. @author Agustin Aguilar <[email protected]> Readme: https://github.com/0xsequence/sstore2#readme */ library SSTORE2 { error WriteError(); /** @notice Stores `_data` and returns `pointer` as key for later retrieval @dev The pointer is a contract address with `_data` as code @param _data to be written @return pointer Pointer to the written `_data` */ function write(bytes memory _data) internal returns (address pointer) { // Append 00 to _data so contract can't be called // Build init code bytes memory code = Bytecode.creationCodeFor( abi.encodePacked( hex'00', _data ) ); // Deploy contract using create assembly { pointer := create(0, add(code, 32), mload(code)) } // Address MUST be non-zero if (pointer == address(0)) revert WriteError(); } /** @notice Reads the contents of the `_pointer` code as data, skips the first byte @dev The function is intended for reading pointers generated by `write` @param _pointer to be read @return data read from `_pointer` contract */ function read(address _pointer) internal view returns (bytes memory) { return Bytecode.codeAt(_pointer, 1, type(uint256).max); } /** @notice Reads the contents of the `_pointer` code as data, skips the first byte @dev The function is intended for reading pointers generated by `write` @param _pointer to be read @param _start number of bytes to skip @return data read from `_pointer` contract */ function read(address _pointer, uint256 _start) internal view returns (bytes memory) { return Bytecode.codeAt(_pointer, _start + 1, type(uint256).max); } /** @notice Reads the contents of the `_pointer` code as data, skips the first byte @dev The function is intended for reading pointers generated by `write` @param _pointer to be read @param _start number of bytes to skip @param _end index before which to end extraction @return data read from `_pointer` contract */ function read(address _pointer, uint256 _start, uint256 _end) internal view returns (bytes memory) { return Bytecode.codeAt(_pointer, _start + 1, _end + 1); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library Bytecode { error InvalidCodeAtRange(uint256 _size, uint256 _start, uint256 _end); /** @notice Generate a creation code that results on a contract with `_code` as bytecode @param _code The returning value of the resulting `creationCode` @return creationCode (constructor) for new contract */ function creationCodeFor(bytes memory _code) internal pure returns (bytes memory) { /* 0x00 0x63 0x63XXXXXX PUSH4 _code.length size 0x01 0x80 0x80 DUP1 size size 0x02 0x60 0x600e PUSH1 14 14 size size 0x03 0x60 0x6000 PUSH1 00 0 14 size size 0x04 0x39 0x39 CODECOPY size 0x05 0x60 0x6000 PUSH1 00 0 size 0x06 0xf3 0xf3 RETURN <CODE> */ return abi.encodePacked( hex"63", uint32(_code.length), hex"80_60_0E_60_00_39_60_00_F3", _code ); } /** @notice Returns the size of the code on a given address @param _addr Address that may or may not contain code @return size of the code on the given `_addr` */ function codeSize(address _addr) internal view returns (uint256 size) { assembly { size := extcodesize(_addr) } } /** @notice Returns the code of a given address @dev It will fail if `_end < _start` @param _addr Address that may or may not contain code @param _start number of bytes of code to skip on read @param _end index before which to end extraction @return oCode read from `_addr` deployed bytecode Forked from: https://gist.github.com/KardanovIR/fe98661df9338c842b4a30306d507fbd */ function codeAt(address _addr, uint256 _start, uint256 _end) internal view returns (bytes memory oCode) { uint256 csize = codeSize(_addr); if (csize == 0) return bytes(""); if (_start > csize) return bytes(""); if (_end < _start) revert InvalidCodeAtRange(csize, _start, _end); unchecked { uint256 reqSize = _end - _start; uint256 maxSize = csize - _start; uint256 size = maxSize < reqSize ? maxSize : reqSize; assembly { // allocate output byte array - this could also be done without assembly // by using o_code = new bytes(size) oCode := mload(0x40) // new "memory end" including padding mstore(0x40, add(oCode, and(add(add(size, 0x20), 0x1f), not(0x1f)))) // store length in memory mstore(oCode, size) // actually retrieve the code, this needs assembly extcodecopy(_addr, add(oCode, 0x20), _start, size) } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/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. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. 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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @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 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} * * _Available since v4.7._ */ 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. * * _Available since v4.4._ */ 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} * * _Available since v4.7._ */ 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. * * _Available since v4.7._ */ 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. * * _Available since v4.7._ */ 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). * * _Available since v4.7._ */ 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 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // 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) { 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. * * _Available since v4.7._ */ 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 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // 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) { 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 // 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(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721AQueryable.sol'; import '../ERC721A.sol'; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; import '../IERC721A.sol'; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); }
// 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 pragma solidity ^0.8.4; /// @notice Library to encode strings in Base64. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/Base64.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/Base64.sol) /// @author Modified from (https://github.com/Brechtpd/base64/blob/main/base64.sol) by Brecht Devos - <[email protected]>. library Base64 { /// @dev Encodes `data` using the base64 encoding described in RFC 4648. /// See: https://datatracker.ietf.org/doc/html/rfc4648 /// @param fileSafe Whether to replace '+' with '-' and '/' with '_'. /// @param noPadding Whether to strip away the padding. function encode(bytes memory data, bool fileSafe, bool noPadding) internal pure returns (string memory result) { /// @solidity memory-safe-assembly assembly { let dataLength := mload(data) if dataLength { // Multiply by 4/3 rounded up. // The `shl(2, ...)` is equivalent to multiplying by 4. let encodedLength := shl(2, div(add(dataLength, 2), 3)) // Set `result` to point to the start of the free memory. result := mload(0x40) // Store the table into the scratch space. // Offsetted by -1 byte so that the `mload` will load the character. // We will rewrite the free memory pointer at `0x40` later with // the allocated size. // The magic constant 0x0230 will translate "-_" + "+/". mstore(0x1f, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef") mstore(0x3f, sub("ghijklmnopqrstuvwxyz0123456789-_", mul(iszero(fileSafe), 0x0230))) // Skip the first slot, which stores the length. let ptr := add(result, 0x20) let end := add(ptr, encodedLength) // Run over the input, 3 bytes at a time. for {} 1 {} { data := add(data, 3) // Advance 3 bytes. let input := mload(data) // Write 4 bytes. Optimized for fewer stack operations. mstore8(0, mload(and(shr(18, input), 0x3F))) mstore8(1, mload(and(shr(12, input), 0x3F))) mstore8(2, mload(and(shr(6, input), 0x3F))) mstore8(3, mload(and(input, 0x3F))) mstore(ptr, mload(0x00)) ptr := add(ptr, 4) // Advance 4 bytes. if iszero(lt(ptr, end)) { break } } mstore(0x40, add(end, 0x20)) // Allocate the memory. // Equivalent to `o = [0, 2, 1][dataLength % 3]`. let o := div(2, mod(dataLength, 3)) // Offset `ptr` and pad with '='. We can simply write over the end. mstore(sub(ptr, o), shl(240, 0x3d3d)) // Set `o` to zero if there is padding. o := mul(iszero(iszero(noPadding)), o) mstore(sub(ptr, o), 0) // Zeroize the slot after the string. mstore(result, sub(encodedLength, o)) // Store the length. } } } /// @dev Encodes `data` using the base64 encoding described in RFC 4648. /// Equivalent to `encode(data, false, false)`. function encode(bytes memory data) internal pure returns (string memory result) { result = encode(data, false, false); } /// @dev Encodes `data` using the base64 encoding described in RFC 4648. /// Equivalent to `encode(data, fileSafe, false)`. function encode(bytes memory data, bool fileSafe) internal pure returns (string memory result) { result = encode(data, fileSafe, false); } /// @dev Decodes base64 encoded `data`. /// /// Supports: /// - RFC 4648 (both standard and file-safe mode). /// - RFC 3501 (63: ','). /// /// Does not support: /// - Line breaks. /// /// Note: For performance reasons, /// this function will NOT revert on invalid `data` inputs. /// Outputs for invalid inputs will simply be undefined behaviour. /// It is the user's responsibility to ensure that the `data` /// is a valid base64 encoded string. function decode(string memory data) internal pure returns (bytes memory result) { /// @solidity memory-safe-assembly assembly { let dataLength := mload(data) if dataLength { let decodedLength := mul(shr(2, dataLength), 3) for {} 1 {} { // If padded. if iszero(and(dataLength, 3)) { let t := xor(mload(add(data, dataLength)), 0x3d3d) // forgefmt: disable-next-item decodedLength := sub( decodedLength, add(iszero(byte(30, t)), iszero(byte(31, t))) ) break } // If non-padded. decodedLength := add(decodedLength, sub(and(dataLength, 3), 1)) break } result := mload(0x40) // Write the length of the bytes. mstore(result, decodedLength) // Skip the first slot, which stores the length. let ptr := add(result, 0x20) let end := add(ptr, decodedLength) // Load the table into the scratch space. // Constants are optimized for smaller bytecode with zero gas overhead. // `m` also doubles as the mask of the upper 6 bits. let m := 0xfc000000fc00686c7074787c8084888c9094989ca0a4a8acb0b4b8bcc0c4c8cc mstore(0x5b, m) mstore(0x3b, 0x04080c1014181c2024282c3034383c4044484c5054585c6064) mstore(0x1a, 0xf8fcf800fcd0d4d8dce0e4e8ecf0f4) for {} 1 {} { // Read 4 bytes. data := add(data, 4) let input := mload(data) // Write 3 bytes. // forgefmt: disable-next-item mstore(ptr, or( and(m, mload(byte(28, input))), shr(6, or( and(m, mload(byte(29, input))), shr(6, or( and(m, mload(byte(30, input))), shr(6, mload(byte(31, input))) )) )) )) ptr := add(ptr, 3) if iszero(lt(ptr, end)) { break } } mstore(0x40, add(end, 0x20)) // Allocate the memory. mstore(end, 0) // Zeroize the slot after the bytes. mstore(0x60, 0) // Restore the zero slot. } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Library for converting numbers into strings and other string operations. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol) library LibString { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The `length` of the output is too small to contain all the hex digits. error HexLengthInsufficient(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTANTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The constant returned when the `search` is not found in the string. uint256 internal constant NOT_FOUND = type(uint256).max; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* DECIMAL OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the base 10 decimal representation of `value`. function toString(uint256 value) internal pure returns (string memory str) { /// @solidity memory-safe-assembly 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. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, add(str, 0x20)) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str let w := not(0) // Tsk. // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. for { let temp := value } 1 {} { str := add(str, w) // `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) 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 Returns the base 10 decimal representation of `value`. function toString(int256 value) internal pure returns (string memory str) { if (value >= 0) { return toString(uint256(value)); } unchecked { str = toString(uint256(-value)); } /// @solidity memory-safe-assembly assembly { // We still have some spare memory space on the left, // as we have allocated 3 words (96 bytes) for up to 78 digits. let length := mload(str) // Load the string length. mstore(str, 0x2d) // Store the '-' character. str := sub(str, 1) // Move back the string pointer by a byte. mstore(str, add(length, 1)) // Update the string length. } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* HEXADECIMAL OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the hexadecimal representation of `value`, /// left-padded to an input length of `length` bytes. /// The output is prefixed with "0x" encoded using 2 hexadecimal digits per byte, /// giving a total length of `length * 2 + 2` bytes. /// Reverts if `length` is too small for the output to contain all the digits. function toHexString(uint256 value, uint256 length) internal pure returns (string memory str) { str = toHexStringNoPrefix(value, length); /// @solidity memory-safe-assembly assembly { let strLength := add(mload(str), 2) // Compute the length. mstore(str, 0x3078) // Write the "0x" prefix. str := sub(str, 2) // Move the pointer. mstore(str, strLength) // Write the length. } } /// @dev Returns the hexadecimal representation of `value`, /// left-padded to an input length of `length` bytes. /// The output is prefixed with "0x" encoded using 2 hexadecimal digits per byte, /// giving a total length of `length * 2` bytes. /// Reverts if `length` is too small for the output to contain all the digits. function toHexStringNoPrefix(uint256 value, uint256 length) internal pure returns (string memory str) { /// @solidity memory-safe-assembly assembly { // We need 0x20 bytes for the trailing zeros padding, `length * 2` bytes // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length. // We add 0x20 to the total and round down to a multiple of 0x20. // (0x20 + 0x20 + 0x02 + 0x20) = 0x62. str := add(mload(0x40), and(add(shl(1, length), 0x42), not(0x1f))) // Allocate the memory. mstore(0x40, add(str, 0x20)) // Zeroize the slot after the string. mstore(str, 0) // Cache the end to calculate the length later. let end := str // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let start := sub(str, add(length, length)) let w := not(1) // Tsk. let temp := value // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. for {} 1 {} { str := add(str, w) // `sub(str, 2)`. mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) if iszero(xor(str, start)) { break } } if temp { // Store the function selector of `HexLengthInsufficient()`. mstore(0x00, 0x2194895a) // Revert with (offset, size). revert(0x1c, 0x04) } // Compute the string's length. let strLength := sub(end, str) // Move the pointer and write the length. str := sub(str, 0x20) mstore(str, strLength) } } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. /// As address are 20 bytes long, the output will left-padded to have /// a length of `20 * 2 + 2` bytes. function toHexString(uint256 value) internal pure returns (string memory str) { str = toHexStringNoPrefix(value); /// @solidity memory-safe-assembly assembly { let strLength := add(mload(str), 2) // Compute the length. mstore(str, 0x3078) // Write the "0x" prefix. str := sub(str, 2) // Move the pointer. mstore(str, strLength) // Write the length. } } /// @dev Returns the hexadecimal representation of `value`. /// The output is encoded using 2 hexadecimal digits per byte. /// As address are 20 bytes long, the output will left-padded to have /// a length of `20 * 2` bytes. function toHexStringNoPrefix(uint256 value) internal pure returns (string memory str) { /// @solidity memory-safe-assembly assembly { // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length, // 0x02 bytes for the prefix, and 0x40 bytes for the digits. // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0. str := add(mload(0x40), 0x80) // Allocate the memory. mstore(0x40, add(str, 0x20)) // Zeroize the slot after the string. mstore(str, 0) // Cache the end to calculate the length later. let end := str // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let w := not(1) // Tsk. // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. for { let temp := value } 1 {} { str := add(str, w) // `sub(str, 2)`. mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) if iszero(temp) { break } } // Compute the string's length. let strLength := sub(end, str) // Move the pointer and write the length. str := sub(str, 0x20) mstore(str, strLength) } } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x", encoded using 2 hexadecimal digits per byte, /// and the alphabets are capitalized conditionally according to /// https://eips.ethereum.org/EIPS/eip-55 function toHexStringChecksummed(address value) internal pure returns (string memory str) { str = toHexString(value); /// @solidity memory-safe-assembly assembly { let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...` let o := add(str, 0x22) let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... ` let t := shl(240, 136) // `0b10001000 << 240` for { let i := 0 } 1 {} { mstore(add(i, i), mul(t, byte(i, hashed))) i := add(i, 1) if eq(i, 20) { break } } mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask))))) o := add(o, 0x20) mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask))))) } } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. function toHexString(address value) internal pure returns (string memory str) { str = toHexStringNoPrefix(value); /// @solidity memory-safe-assembly assembly { let strLength := add(mload(str), 2) // Compute the length. mstore(str, 0x3078) // Write the "0x" prefix. str := sub(str, 2) // Move the pointer. mstore(str, strLength) // Write the length. } } /// @dev Returns the hexadecimal representation of `value`. /// The output is encoded using 2 hexadecimal digits per byte. function toHexStringNoPrefix(address value) internal pure returns (string memory str) { /// @solidity memory-safe-assembly assembly { str := mload(0x40) // Allocate the memory. // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length, // 0x02 bytes for the prefix, and 0x28 bytes for the digits. // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80. mstore(0x40, add(str, 0x80)) // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) str := add(str, 2) mstore(str, 40) let o := add(str, 0x20) mstore(add(o, 40), 0) value := shl(96, value) // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. for { let i := 0 } 1 {} { let p := add(o, add(i, i)) let temp := byte(i, value) mstore8(add(p, 1), mload(and(temp, 15))) mstore8(p, mload(shr(4, temp))) i := add(i, 1) if eq(i, 20) { break } } } } /// @dev Returns the hex encoded string from the raw bytes. /// The output is encoded using 2 hexadecimal digits per byte. function toHexString(bytes memory raw) internal pure returns (string memory str) { str = toHexStringNoPrefix(raw); /// @solidity memory-safe-assembly assembly { let strLength := add(mload(str), 2) // Compute the length. mstore(str, 0x3078) // Write the "0x" prefix. str := sub(str, 2) // Move the pointer. mstore(str, strLength) // Write the length. } } /// @dev Returns the hex encoded string from the raw bytes. /// The output is encoded using 2 hexadecimal digits per byte. function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory str) { /// @solidity memory-safe-assembly assembly { let length := mload(raw) str := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix. mstore(str, add(length, length)) // Store the length of the output. // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let o := add(str, 0x20) let end := add(raw, length) for {} iszero(eq(raw, end)) {} { raw := add(raw, 1) mstore8(add(o, 1), mload(and(mload(raw), 15))) mstore8(o, mload(and(shr(4, mload(raw)), 15))) o := add(o, 2) } mstore(o, 0) // Zeroize the slot after the string. mstore(0x40, add(o, 0x20)) // Allocate the memory. } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* RUNE STRING OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the number of UTF characters in the string. function runeCount(string memory s) internal pure returns (uint256 result) { /// @solidity memory-safe-assembly assembly { if mload(s) { mstore(0x00, div(not(0), 255)) mstore(0x20, 0x0202020202020202020202020202020202020202020202020303030304040506) let o := add(s, 0x20) let end := add(o, mload(s)) for { result := 1 } 1 { result := add(result, 1) } { o := add(o, byte(0, mload(shr(250, mload(o))))) if iszero(lt(o, end)) { break } } } } } /// @dev Returns if this string is a 7-bit ASCII string. /// (i.e. all characters codes are in [0..127]) function is7BitASCII(string memory s) internal pure returns (bool result) { /// @solidity memory-safe-assembly assembly { let mask := shl(7, div(not(0), 255)) result := 1 let n := mload(s) if n { let o := add(s, 0x20) let end := add(o, n) let last := mload(end) mstore(end, 0) for {} 1 {} { if and(mask, mload(o)) { result := 0 break } o := add(o, 0x20) if iszero(lt(o, end)) { break } } mstore(end, last) } } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* BYTE STRING OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ // For performance and bytecode compactness, all indices of the following operations // are byte (ASCII) offsets, not UTF character offsets. /// @dev Returns `subject` all occurrences of `search` replaced with `replacement`. function replace(string memory subject, string memory search, string memory replacement) internal pure returns (string memory result) { /// @solidity memory-safe-assembly assembly { let subjectLength := mload(subject) let searchLength := mload(search) let replacementLength := mload(replacement) subject := add(subject, 0x20) search := add(search, 0x20) replacement := add(replacement, 0x20) result := add(mload(0x40), 0x20) let subjectEnd := add(subject, subjectLength) if iszero(gt(searchLength, subjectLength)) { let subjectSearchEnd := add(sub(subjectEnd, searchLength), 1) let h := 0 if iszero(lt(searchLength, 0x20)) { h := keccak256(search, searchLength) } let m := shl(3, sub(0x20, and(searchLength, 0x1f))) let s := mload(search) for {} 1 {} { let t := mload(subject) // Whether the first `searchLength % 32` bytes of // `subject` and `search` matches. if iszero(shr(m, xor(t, s))) { if h { if iszero(eq(keccak256(subject, searchLength), h)) { mstore(result, t) result := add(result, 1) subject := add(subject, 1) if iszero(lt(subject, subjectSearchEnd)) { break } continue } } // Copy the `replacement` one word at a time. for { let o := 0 } 1 {} { mstore(add(result, o), mload(add(replacement, o))) o := add(o, 0x20) if iszero(lt(o, replacementLength)) { break } } result := add(result, replacementLength) subject := add(subject, searchLength) if searchLength { if iszero(lt(subject, subjectSearchEnd)) { break } continue } } mstore(result, t) result := add(result, 1) subject := add(subject, 1) if iszero(lt(subject, subjectSearchEnd)) { break } } } let resultRemainder := result result := add(mload(0x40), 0x20) let k := add(sub(resultRemainder, result), sub(subjectEnd, subject)) // Copy the rest of the string one word at a time. for {} lt(subject, subjectEnd) {} { mstore(resultRemainder, mload(subject)) resultRemainder := add(resultRemainder, 0x20) subject := add(subject, 0x20) } result := sub(result, 0x20) let last := add(add(result, 0x20), k) // Zeroize the slot after the string. mstore(last, 0) mstore(0x40, add(last, 0x20)) // Allocate the memory. mstore(result, k) // Store the length. } } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from left to right, starting from `from`. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function indexOf(string memory subject, string memory search, uint256 from) internal pure returns (uint256 result) { /// @solidity memory-safe-assembly assembly { for { let subjectLength := mload(subject) } 1 {} { if iszero(mload(search)) { if iszero(gt(from, subjectLength)) { result := from break } result := subjectLength break } let searchLength := mload(search) let subjectStart := add(subject, 0x20) result := not(0) // Initialize to `NOT_FOUND`. subject := add(subjectStart, from) let end := add(sub(add(subjectStart, subjectLength), searchLength), 1) let m := shl(3, sub(0x20, and(searchLength, 0x1f))) let s := mload(add(search, 0x20)) if iszero(and(lt(subject, end), lt(from, subjectLength))) { break } if iszero(lt(searchLength, 0x20)) { for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} { if iszero(shr(m, xor(mload(subject), s))) { if eq(keccak256(subject, searchLength), h) { result := sub(subject, subjectStart) break } } subject := add(subject, 1) if iszero(lt(subject, end)) { break } } break } for {} 1 {} { if iszero(shr(m, xor(mload(subject), s))) { result := sub(subject, subjectStart) break } subject := add(subject, 1) if iszero(lt(subject, end)) { break } } break } } } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from left to right. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function indexOf(string memory subject, string memory search) internal pure returns (uint256 result) { result = indexOf(subject, search, 0); } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from right to left, starting from `from`. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function lastIndexOf(string memory subject, string memory search, uint256 from) internal pure returns (uint256 result) { /// @solidity memory-safe-assembly assembly { for {} 1 {} { result := not(0) // Initialize to `NOT_FOUND`. let searchLength := mload(search) if gt(searchLength, mload(subject)) { break } let w := result let fromMax := sub(mload(subject), searchLength) if iszero(gt(fromMax, from)) { from := fromMax } let end := add(add(subject, 0x20), w) subject := add(add(subject, 0x20), from) if iszero(gt(subject, end)) { break } // As this function is not too often used, // we shall simply use keccak256 for smaller bytecode size. for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} { if eq(keccak256(subject, searchLength), h) { result := sub(subject, add(end, 1)) break } subject := add(subject, w) // `sub(subject, 1)`. if iszero(gt(subject, end)) { break } } break } } } /// @dev Returns the byte index of the first location of `search` in `subject`, /// searching from right to left. /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found. function lastIndexOf(string memory subject, string memory search) internal pure returns (uint256 result) { result = lastIndexOf(subject, search, uint256(int256(-1))); } /// @dev Returns whether `subject` starts with `search`. function startsWith(string memory subject, string memory search) internal pure returns (bool result) { /// @solidity memory-safe-assembly assembly { let searchLength := mload(search) // Just using keccak256 directly is actually cheaper. // forgefmt: disable-next-item result := and( iszero(gt(searchLength, mload(subject))), eq( keccak256(add(subject, 0x20), searchLength), keccak256(add(search, 0x20), searchLength) ) ) } } /// @dev Returns whether `subject` ends with `search`. function endsWith(string memory subject, string memory search) internal pure returns (bool result) { /// @solidity memory-safe-assembly assembly { let searchLength := mload(search) let subjectLength := mload(subject) // Whether `search` is not longer than `subject`. let withinRange := iszero(gt(searchLength, subjectLength)) // Just using keccak256 directly is actually cheaper. // forgefmt: disable-next-item result := and( withinRange, eq( keccak256( // `subject + 0x20 + max(subjectLength - searchLength, 0)`. add(add(subject, 0x20), mul(withinRange, sub(subjectLength, searchLength))), searchLength ), keccak256(add(search, 0x20), searchLength) ) ) } } /// @dev Returns `subject` repeated `times`. function repeat(string memory subject, uint256 times) internal pure returns (string memory result) { /// @solidity memory-safe-assembly assembly { let subjectLength := mload(subject) if iszero(or(iszero(times), iszero(subjectLength))) { subject := add(subject, 0x20) result := mload(0x40) let output := add(result, 0x20) for {} 1 {} { // Copy the `subject` one word at a time. for { let o := 0 } 1 {} { mstore(add(output, o), mload(add(subject, o))) o := add(o, 0x20) if iszero(lt(o, subjectLength)) { break } } output := add(output, subjectLength) times := sub(times, 1) if iszero(times) { break } } mstore(output, 0) // Zeroize the slot after the string. let resultLength := sub(output, add(result, 0x20)) mstore(result, resultLength) // Store the length. // Allocate the memory. mstore(0x40, add(result, add(resultLength, 0x20))) } } } /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive). /// `start` and `end` are byte offsets. function slice(string memory subject, uint256 start, uint256 end) internal pure returns (string memory result) { /// @solidity memory-safe-assembly assembly { let subjectLength := mload(subject) if iszero(gt(subjectLength, end)) { end := subjectLength } if iszero(gt(subjectLength, start)) { start := subjectLength } if lt(start, end) { result := mload(0x40) let resultLength := sub(end, start) mstore(result, resultLength) subject := add(subject, start) let w := not(0x1f) // Copy the `subject` one word at a time, backwards. for { let o := and(add(resultLength, 0x1f), w) } 1 {} { mstore(add(result, o), mload(add(subject, o))) o := add(o, w) // `sub(o, 0x20)`. if iszero(o) { break } } // Zeroize the slot after the string. mstore(add(add(result, 0x20), resultLength), 0) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, add(result, and(add(resultLength, 0x3f), w))) } } } /// @dev Returns a copy of `subject` sliced from `start` to the end of the string. /// `start` is a byte offset. function slice(string memory subject, uint256 start) internal pure returns (string memory result) { result = slice(subject, start, uint256(int256(-1))); } /// @dev Returns all the indices of `search` in `subject`. /// The indices are byte offsets. function indicesOf(string memory subject, string memory search) internal pure returns (uint256[] memory result) { /// @solidity memory-safe-assembly assembly { let subjectLength := mload(subject) let searchLength := mload(search) if iszero(gt(searchLength, subjectLength)) { subject := add(subject, 0x20) search := add(search, 0x20) result := add(mload(0x40), 0x20) let subjectStart := subject let subjectSearchEnd := add(sub(add(subject, subjectLength), searchLength), 1) let h := 0 if iszero(lt(searchLength, 0x20)) { h := keccak256(search, searchLength) } let m := shl(3, sub(0x20, and(searchLength, 0x1f))) let s := mload(search) for {} 1 {} { let t := mload(subject) // Whether the first `searchLength % 32` bytes of // `subject` and `search` matches. if iszero(shr(m, xor(t, s))) { if h { if iszero(eq(keccak256(subject, searchLength), h)) { subject := add(subject, 1) if iszero(lt(subject, subjectSearchEnd)) { break } continue } } // Append to `result`. mstore(result, sub(subject, subjectStart)) result := add(result, 0x20) // Advance `subject` by `searchLength`. subject := add(subject, searchLength) if searchLength { if iszero(lt(subject, subjectSearchEnd)) { break } continue } } subject := add(subject, 1) if iszero(lt(subject, subjectSearchEnd)) { break } } let resultEnd := result // Assign `result` to the free memory pointer. result := mload(0x40) // Store the length of `result`. mstore(result, shr(5, sub(resultEnd, add(result, 0x20)))) // Allocate memory for result. // We allocate one more word, so this array can be recycled for {split}. mstore(0x40, add(resultEnd, 0x20)) } } } /// @dev Returns a arrays of strings based on the `delimiter` inside of the `subject` string. function split(string memory subject, string memory delimiter) internal pure returns (string[] memory result) { uint256[] memory indices = indicesOf(subject, delimiter); /// @solidity memory-safe-assembly assembly { let w := not(0x1f) let indexPtr := add(indices, 0x20) let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1))) mstore(add(indicesEnd, w), mload(subject)) mstore(indices, add(mload(indices), 1)) let prevIndex := 0 for {} 1 {} { let index := mload(indexPtr) mstore(indexPtr, 0x60) if iszero(eq(index, prevIndex)) { let element := mload(0x40) let elementLength := sub(index, prevIndex) mstore(element, elementLength) // Copy the `subject` one word at a time, backwards. for { let o := and(add(elementLength, 0x1f), w) } 1 {} { mstore(add(element, o), mload(add(add(subject, prevIndex), o))) o := add(o, w) // `sub(o, 0x20)`. if iszero(o) { break } } // Zeroize the slot after the string. mstore(add(add(element, 0x20), elementLength), 0) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, add(element, and(add(elementLength, 0x3f), w))) // Store the `element` into the array. mstore(indexPtr, element) } prevIndex := add(index, mload(delimiter)) indexPtr := add(indexPtr, 0x20) if iszero(lt(indexPtr, indicesEnd)) { break } } result := indices if iszero(mload(delimiter)) { result := add(indices, 0x20) mstore(result, sub(mload(indices), 2)) } } } /// @dev Returns a concatenated string of `a` and `b`. /// Cheaper than `string.concat()` and does not de-align the free memory pointer. function concat(string memory a, string memory b) internal pure returns (string memory result) { /// @solidity memory-safe-assembly assembly { let w := not(0x1f) result := mload(0x40) let aLength := mload(a) // Copy `a` one word at a time, backwards. for { let o := and(add(mload(a), 0x20), w) } 1 {} { mstore(add(result, o), mload(add(a, o))) o := add(o, w) // `sub(o, 0x20)`. if iszero(o) { break } } let bLength := mload(b) let output := add(result, mload(a)) // Copy `b` one word at a time, backwards. for { let o := and(add(bLength, 0x20), w) } 1 {} { mstore(add(output, o), mload(add(b, o))) o := add(o, w) // `sub(o, 0x20)`. if iszero(o) { break } } let totalLength := add(aLength, bLength) let last := add(add(result, 0x20), totalLength) // Zeroize the slot after the string. mstore(last, 0) // Stores the length. mstore(result, totalLength) // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, and(add(last, 0x1f), w)) } } /// @dev Returns a copy of the string in either lowercase or UPPERCASE. /// WARNING! This function is only compatible with 7-bit ASCII strings. function toCase(string memory subject, bool toUpper) internal pure returns (string memory result) { /// @solidity memory-safe-assembly assembly { let length := mload(subject) if length { result := add(mload(0x40), 0x20) subject := add(subject, 1) let flags := shl(add(70, shl(5, toUpper)), 0x3ffffff) let w := not(0) for { let o := length } 1 {} { o := add(o, w) let b := and(0xff, mload(add(subject, o))) mstore8(add(result, o), xor(b, and(shr(b, flags), 0x20))) if iszero(o) { break } } result := mload(0x40) mstore(result, length) // Store the length. let last := add(add(result, 0x20), length) mstore(last, 0) // Zeroize the slot after the string. mstore(0x40, add(last, 0x20)) // Allocate the memory. } } } /// @dev Returns a lowercased copy of the string. /// WARNING! This function is only compatible with 7-bit ASCII strings. function lower(string memory subject) internal pure returns (string memory result) { result = toCase(subject, false); } /// @dev Returns an UPPERCASED copy of the string. /// WARNING! This function is only compatible with 7-bit ASCII strings. function upper(string memory subject) internal pure returns (string memory result) { result = toCase(subject, true); } /// @dev Escapes the string to be used within HTML tags. function escapeHTML(string memory s) internal pure returns (string memory result) { /// @solidity memory-safe-assembly assembly { for { let end := add(s, mload(s)) result := add(mload(0x40), 0x20) // Store the bytes of the packed offsets and strides into the scratch space. // `packed = (stride << 5) | offset`. Max offset is 20. Max stride is 6. mstore(0x1f, 0x900094) mstore(0x08, 0xc0000000a6ab) // Store ""&'<>" into the scratch space. mstore(0x00, shl(64, 0x2671756f743b26616d703b262333393b266c743b2667743b)) } iszero(eq(s, end)) {} { s := add(s, 1) let c := and(mload(s), 0xff) // Not in `["\"","'","&","<",">"]`. if iszero(and(shl(c, 1), 0x500000c400000000)) { mstore8(result, c) result := add(result, 1) continue } let t := shr(248, mload(c)) mstore(result, mload(and(t, 0x1f))) result := add(result, shr(5, t)) } let last := result mstore(last, 0) // Zeroize the slot after the string. result := mload(0x40) mstore(result, sub(last, add(result, 0x20))) // Store the length. mstore(0x40, add(last, 0x20)) // Allocate the memory. } } /// @dev Escapes the string to be used within double-quotes in a JSON. function escapeJSON(string memory s) internal pure returns (string memory result) { /// @solidity memory-safe-assembly assembly { for { let end := add(s, mload(s)) result := add(mload(0x40), 0x20) // Store "\\u0000" in scratch space. // Store "0123456789abcdef" in scratch space. // Also, store `{0x08:"b", 0x09:"t", 0x0a:"n", 0x0c:"f", 0x0d:"r"}`. // into the scratch space. mstore(0x15, 0x5c75303030303031323334353637383961626364656662746e006672) // Bitmask for detecting `["\"","\\"]`. let e := or(shl(0x22, 1), shl(0x5c, 1)) } iszero(eq(s, end)) {} { s := add(s, 1) let c := and(mload(s), 0xff) if iszero(lt(c, 0x20)) { if iszero(and(shl(c, 1), e)) { // Not in `["\"","\\"]`. mstore8(result, c) result := add(result, 1) continue } mstore8(result, 0x5c) // "\\". mstore8(add(result, 1), c) result := add(result, 2) continue } if iszero(and(shl(c, 1), 0x3700)) { // Not in `["\b","\t","\n","\f","\d"]`. mstore8(0x1d, mload(shr(4, c))) // Hex value. mstore8(0x1e, mload(and(c, 15))) // Hex value. mstore(result, mload(0x19)) // "\\u00XX". result := add(result, 6) continue } mstore8(result, 0x5c) // "\\". mstore8(add(result, 1), mload(add(c, 8))) result := add(result, 2) } let last := result mstore(last, 0) // Zeroize the slot after the string. result := mload(0x40) mstore(result, sub(last, add(result, 0x20))) // Store the length. mstore(0x40, add(last, 0x20)) // Allocate the memory. } } /// @dev Returns whether `a` equals `b`. function eq(string memory a, string memory b) internal pure returns (bool result) { assembly { result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b))) } } /// @dev Packs a single string with its length into a single word. /// Returns `bytes32(0)` if the length is zero or greater than 31. function packOne(string memory a) internal pure returns (bytes32 result) { /// @solidity memory-safe-assembly assembly { // We don't need to zero right pad the string, // since this is our own custom non-standard packing scheme. result := mul( // Load the length and the bytes. mload(add(a, 0x1f)), // `length != 0 && length < 32`. Abuses underflow. // Assumes that the length is valid and within the block gas limit. lt(sub(mload(a), 1), 0x1f) ) } } /// @dev Unpacks a string packed using {packOne}. /// Returns the empty string if `packed` is `bytes32(0)`. /// If `packed` is not an output of {packOne}, the output behaviour is undefined. function unpackOne(bytes32 packed) internal pure returns (string memory result) { /// @solidity memory-safe-assembly assembly { // Grab the free memory pointer. result := mload(0x40) // Allocate 2 words (1 for the length, 1 for the bytes). mstore(0x40, add(result, 0x40)) // Zeroize the length slot. mstore(result, 0) // Store the length and bytes. mstore(add(result, 0x1f), packed) // Right pad with zeroes. mstore(add(add(result, 0x20), mload(result)), 0) } } /// @dev Packs two strings with their lengths into a single word. /// Returns `bytes32(0)` if combined length is zero or greater than 30. function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) { /// @solidity memory-safe-assembly assembly { let aLength := mload(a) // We don't need to zero right pad the strings, // since this is our own custom non-standard packing scheme. result := mul( // Load the length and the bytes of `a` and `b`. or( shl(shl(3, sub(0x1f, aLength)), mload(add(a, aLength))), mload(sub(add(b, 0x1e), aLength)) ), // `totalLength != 0 && totalLength < 31`. Abuses underflow. // Assumes that the lengths are valid and within the block gas limit. lt(sub(add(aLength, mload(b)), 1), 0x1e) ) } } /// @dev Unpacks strings packed using {packTwo}. /// Returns the empty strings if `packed` is `bytes32(0)`. /// If `packed` is not an output of {packTwo}, the output behaviour is undefined. function unpackTwo(bytes32 packed) internal pure returns (string memory resultA, string memory resultB) { /// @solidity memory-safe-assembly assembly { // Grab the free memory pointer. resultA := mload(0x40) resultB := add(resultA, 0x40) // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words. mstore(0x40, add(resultB, 0x40)) // Zeroize the length slots. mstore(resultA, 0) mstore(resultB, 0) // Store the lengths and bytes. mstore(add(resultA, 0x1f), packed) mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA)))) // Right pad with zeroes. mstore(add(add(resultA, 0x20), mload(resultA)), 0) mstore(add(add(resultB, 0x20), mload(resultB)), 0) } } /// @dev Directly returns `a` without copying. function directReturn(string memory a) internal pure { assembly { // Assumes that the string does not start from the scratch space. let retStart := sub(a, 0x20) let retSize := add(mload(a), 0x40) // Right pad with zeroes. Just in case the string is produced // by a method that doesn't zero right pad. mstore(add(retStart, retSize), 0) // Store the return offset. mstore(retStart, 0x20) // End the transaction, returning the string. return(retStart, retSize) } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"string[]","name":"_backgroundsOptions","type":"string[]"},{"internalType":"string[]","name":"_typesOptions","type":"string[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"InvalidCodeAtRange","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"InvalidTraits","type":"error"},{"inputs":[],"name":"MaxMint","type":"error"},{"inputs":[],"name":"MintClosed","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NotEnoughLeft","type":"error"},{"inputs":[],"name":"NotEqualLength","type":"error"},{"inputs":[],"name":"NotOnWhitelist","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TokenDoesntExist","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"},{"inputs":[],"name":"WriteError","type":"error"},{"inputs":[],"name":"ZeroBalance","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":"string[]","name":"_varieties","type":"string[]"},{"internalType":"uint16[]","name":"_types","type":"uint16[]"},{"internalType":"uint16[]","name":"_backgrounds","type":"uint16[]"},{"internalType":"string[]","name":"_traits","type":"string[]"}],"name":"addCritters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"backgroundsOptions","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"checkWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"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":"isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"metadata","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typesOptions","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526008805460ff60a01b1916905560006009553480156200002357600080fd5b50604051620036fb380380620036fb8339810160408190526200004691620004c7565b8484600262000056838262000619565b50600362000065828262000619565b50506000805550620000773362000172565b6080839052826001600160401b0381111562000097576200009762000347565b604051908082528060200260200182016040528015620000c1578160200160208202803683370190505b508051620000d891600f91602090910190620001c4565b50826001600160401b03811115620000f457620000f462000347565b6040519080825280602002602001820160405280156200011e578160200160208202803683370190505b5080516200013591600e91602090910190620001c4565b50601083905581516200015090600b90602085019062000274565b5080516200016690600c90602084019062000274565b505050505050620006e5565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090600f01601090048101928215620002625791602002820160005b838211156200023057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302620001ee565b8015620002605782816101000a81549061ffff021916905560020160208160010104928301926001030262000230565b505b5062000270929150620002cd565b5090565b828054828255906000526020600020908101928215620002bf579160200282015b82811115620002bf5782518290620002ae908262000619565b509160200191906001019062000295565b5062000270929150620002e4565b5b80821115620002705760008155600101620002ce565b8082111562000270576000620002fb828262000305565b50600101620002e4565b50805462000313906200058a565b6000825580601f1062000324575050565b601f016020900490600052602060002090810190620003449190620002cd565b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000388576200038862000347565b604052919050565b600082601f830112620003a257600080fd5b81516001600160401b03811115620003be57620003be62000347565b6020620003d4601f8301601f191682016200035d565b8281528582848701011115620003e957600080fd5b60005b8381101562000409578581018301518282018401528201620003ec565b506000928101909101919091529392505050565b600082601f8301126200042f57600080fd5b815160206001600160401b03808311156200044e576200044e62000347565b8260051b6200045f8382016200035d565b93845285810183019383810190888611156200047a57600080fd5b84880192505b85831015620004bb578251848111156200049a5760008081fd5b620004aa8a87838c010162000390565b835250918401919084019062000480565b98975050505050505050565b600080600080600060a08688031215620004e057600080fd5b85516001600160401b0380821115620004f857600080fd5b6200050689838a0162000390565b965060208801519150808211156200051d57600080fd5b6200052b89838a0162000390565b95506040880151945060608801519150808211156200054957600080fd5b6200055789838a016200041d565b935060808801519150808211156200056e57600080fd5b506200057d888289016200041d565b9150509295509295909350565b600181811c908216806200059f57607f821691505b602082108103620005c057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200061457600081815260208120601f850160051c81016020861015620005ef5750805b601f850160051c820191505b818110156200061057828155600101620005fb565b5050505b505050565b81516001600160401b0381111562000635576200063562000347565b6200064d816200064684546200058a565b84620005c6565b602080601f8311600181146200068557600084156200066c5750858301515b600019600386901b1c1916600185901b17855562000610565b600085815260208120601f198616915b82811015620006b65788860151825594840194600190910190840162000695565b5085821015620006d55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051612ff3620007086000396000818161022401526118320152612ff36000f3fe6080604052600436106101d85760003560e01c80636352211e1161010257806399a2557a11610095578063c87b56dd11610064578063c87b56dd14610565578063e985e9c514610585578063f19e75d4146105ce578063f2fde38b146105ee57600080fd5b806399a2557a146104e5578063a22cb46514610505578063b88d4fde14610525578063c23dc68f1461053857600080fd5b8063715018a6116100d1578063715018a6146104705780638462151c146104855780638da5cb5b146104b257806395d89b41146104d057600080fd5b80636352211e146103f0578063690944d61461041057806369a030341461043057806370a082311461045057600080fd5b80631f85e3ca1161017a578063440bc7f311610149578063440bc7f31461036257806347535d7b146103825780635bbb2177146103a35780635d67aedb146103d057600080fd5b80631f85e3ca146102fc57806323b872dd1461031c578063372f657c1461032f57806342842e0e1461034f57600080fd5b8063081812fc116101b6578063081812fc14610276578063095ea7b3146102ae5780631649a8a9146102c357806318160ddd146102e357600080fd5b806301ffc9a7146101dd578063047fc9aa1461021257806306fdde0314610254575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612278565b61060e565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b506102467f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610209565b34801561026057600080fd5b50610269610660565b60405161020991906122e5565b34801561028257600080fd5b506102966102913660046122f8565b6106f2565b6040516001600160a01b039091168152602001610209565b6102c16102bc36600461232d565b610736565b005b3480156102cf57600080fd5b506101fd6102de3660046123a2565b6107d6565b3480156102ef57600080fd5b5060015460005403610246565b34801561030857600080fd5b506102c1610317366004612404565b610858565b6102c161032a36600461241f565b61087e565b34801561033b57600080fd5b506102c161034a36600461245b565b610a17565b6102c161035d36600461241f565b610a7e565b34801561036e57600080fd5b506102c161037d3660046122f8565b610a9e565b34801561038e57600080fd5b506008546101fd90600160a01b900460ff1681565b3480156103af57600080fd5b506103c36103be36600461245b565b610aab565b60405161020991906124d8565b3480156103dc57600080fd5b506102c16103eb36600461251a565b610b76565b3480156103fc57600080fd5b5061029661040b3660046122f8565b610de7565b34801561041c57600080fd5b5061026961042b3660046122f8565b610df2565b34801561043c57600080fd5b5061026961044b3660046122f8565b610e9e565b34801561045c57600080fd5b5061024661046b3660046125dd565b610eae565b34801561047c57600080fd5b506102c1610efc565b34801561049157600080fd5b506104a56104a03660046125dd565b610f10565b60405161020991906125f8565b3480156104be57600080fd5b506008546001600160a01b0316610296565b3480156104dc57600080fd5b50610269611018565b3480156104f157600080fd5b506104a5610500366004612630565b611027565b34801561051157600080fd5b506102c1610520366004612663565b61119e565b6102c16105333660046126ac565b61120a565b34801561054457600080fd5b506105586105533660046122f8565b611254565b6040516102099190612787565b34801561057157600080fd5b506102696105803660046122f8565b6112cc565b34801561059157600080fd5b506101fd6105a0366004612795565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156105da57600080fd5b506102c16105e93660046122f8565b611676565b3480156105fa57600080fd5b506102c16106093660046125dd565b61168a565b60006301ffc9a760e01b6001600160e01b03198316148061063f57506380ac58cd60e01b6001600160e01b03198316145b8061065a5750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461066f906127bf565b80601f016020809104026020016040519081016040528092919081815260200182805461069b906127bf565b80156106e85780601f106106bd576101008083540402835291602001916106e8565b820191906000526020600020905b8154815290600101906020018083116106cb57829003601f168201915b5050505050905090565b60006106fd82611705565b61071a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061074182610de7565b9050336001600160a01b0382161461077a5761075d81336105a0565b61077a576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061084e838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506009546040516bffffffffffffffffffffffff1960608b901b16602082015290925060340190506040516020818303038152906040528051906020012061172c565b90505b9392505050565b610860611742565b60088054911515600160a01b0260ff60a01b19909216919091179055565b60006108898261179c565b9050836001600160a01b0316816001600160a01b0316146108bc5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610909576108ec86336105a0565b61090957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661093057604051633a954ecd60e21b815260040160405180910390fd5b801561093b57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036109cd576001840160008181526004602052604081205490036109cb5760005481146109cb5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610a223383836107d6565b610a3f5760405163522fc3bd60e01b815260040160405180910390fd5b336000908152600a602052604090205460ff1615610a7057604051634a7ba1cb60e11b815260040160405180910390fd5b610a7a6001611803565b5050565b610a998383836040518060200160405280600081525061120a565b505050565b610aa6611742565b600955565b6060816000816001600160401b03811115610ac857610ac8612696565b604051908082528060200260200182016040528015610b1a57816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610ae65790505b50905060005b828114610b6d57610b48868683818110610b3c57610b3c6127f3565b90506020020135611254565b828281518110610b5a57610b5a6127f3565b6020908102919091010152600101610b20565b50949350505050565b610b7e611742565b868514610b9e57604051630cf0bdb360e21b815260040160405180910390fd5b868314610bbe57604051630cf0bdb360e21b815260040160405180910390fd5b868114610bde57604051630cf0bdb360e21b815260040160405180910390fd5b60408051608081018252606080825260006020830181905292820183905281018290525b898983818110610c1457610c146127f3565b9050602002810190610c269190612809565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250878783818110610c6f57610c6f6127f3565b9050602002016020810190610c84919061284f565b61ffff166020820152858583818110610c9f57610c9f6127f3565b9050602002016020810190610cb4919061284f565b61ffff166040820152610d1e848484818110610cd257610cd26127f3565b9050602002810190610ce49190612809565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061197d92505050565b6001600160a01b03166060820152600d8054600181018255600091909152815182916002027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501908190610d7290826128b9565b5060208201516001918201805460408501516060909501516001600160a01b031664010000000002640100000000600160c01b031961ffff968716620100000263ffffffff1990931696909416959095171791909116929092179091559190910190888210610c025750505050505050505050565b600061065a8261179c565b600b8181548110610e0257600080fd5b906000526020600020016000915090508054610e1d906127bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e49906127bf565b8015610e965780601f10610e6b57610100808354040283529160200191610e96565b820191906000526020600020905b815481529060010190602001808311610e7957829003601f168201915b505050505081565b600c8181548110610e0257600080fd5b60006001600160a01b038216610ed7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610f04611742565b610f0e60006119e2565b565b60606000806000610f2085610eae565b90506000816001600160401b03811115610f3c57610f3c612696565b604051908082528060200260200182016040528015610f65578160200160208202803683370190505b509050610f9260408051608081018252600080825260208201819052918101829052606081019190915290565b60005b83861461100c57610fa581611a34565b915081604001516110045781516001600160a01b031615610fc557815194505b876001600160a01b0316856001600160a01b0316036110045780838780600101985081518110610ff757610ff76127f3565b6020026020010181815250505b600101610f95565b50909695505050505050565b60606003805461066f906127bf565b606081831061104957604051631960ccad60e11b815260040160405180910390fd5b60008061105560005490565b905080841115611063578093505b600061106e87610eae565b90508486101561108d5785850381811015611087578091505b50611091565b5060005b6000816001600160401b038111156110ab576110ab612696565b6040519080825280602002602001820160405280156110d4578160200160208202803683370190505b509050816000036110ea57935061085192505050565b60006110f588611254565b905060008160400151611106575080515b885b8881141580156111185750848714155b1561118d5761112681611a34565b925082604001516111855782516001600160a01b03161561114657825191505b8a6001600160a01b0316826001600160a01b0316036111855780848880600101995081518110611178576111786127f3565b6020026020010181815250505b600101611108565b505050928352509095945050505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61121584848461087e565b6001600160a01b0383163b1561124e5761123184848484611a70565b61124e576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845290830182905293820181905292810183905290915060005483106112a85792915050565b6112b183611a34565b90508060400151156112c35792915050565b61085183611b5b565b60606112d782611705565b6112f457604051631d6fa32560e31b815260040160405180910390fd5b6000600d600e848154811061130b5761130b6127f3565b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff1681548110611343576113436127f3565b906000526020600020906002020160405180608001604052908160008201805461136c906127bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611398906127bf565b80156113e55780601f106113ba576101008083540402835291602001916113e5565b820191906000526020600020905b8154815290600101906020018083116113c857829003601f168201915b50505091835250506001919091015461ffff808216602080850191909152620100008304821660408501526401000000009092046001600160a01b0316606090930192909252820151600c805493945060009390929190911690811061144d5761144d6127f3565b906000526020600020018054611462906127bf565b80601f016020809104026020016040519081016040528092919081815260200182805461148e906127bf565b80156114db5780601f106114b0576101008083540402835291602001916114db565b820191906000526020600020905b8154815290600101906020018083116114be57829003601f168201915b5050505050905060006114f2828460000151611b90565b6114fb84611c1b565b611528604051806040016040528060078152602001667661726965747960c81b8152508660000151611c77565b61154e604051806040016040528060048152602001637479706560e01b81525086611c77565b6116276040518060400160405280600a815260200169189858dad9dc9bdd5b9960b21b815250600b896040015161ffff168154811061158f5761158f6127f3565b9060005260206000200180546115a4906127bf565b80601f01602080910402602001604051908101604052809291908181526020018280546115d0906127bf565b801561161d5780601f106115f25761010080835404028352916020019161161d565b820191906000526020600020905b81548152906001019060200180831161160057829003601f168201915b5050505050611c77565b60405160200161163b959493929190612994565b60405160208183030381529060405290508060405160200161165d9190612ae1565b6040516020818303038152906040529350505050919050565b61167e611742565b61168781611803565b50565b611692611742565b6001600160a01b0381166116fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b611687816119e2565b600080548210801561065a575050600090815260046020526040902054600160e01b161590565b6000826117398584611c8c565b14949350505050565b6008546001600160a01b03163314610f0e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016116f3565b6000816000548110156117ea5760008181526004602052604081205490600160e01b821690036117e8575b806000036108515750600019016000818152600460205260409020546117c7565b505b604051636f96cda160e11b815260040160405180910390fd5b600854600160a01b900460ff1661182d5760405163589ed34b60e01b815260040160405180910390fd5b6000547f0000000000000000000000000000000000000000000000000000000000000000828201111561187357604051631a11574b60e01b815260040160405180910390fd5b600042336040516020016118a392919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b6040516020818303038152906040528051906020012060001c905060005b838160ff161015611935576118d582611cd9565b600e84815481106118e8576118e86127f3565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508261192190612b35565b92508061192d81612b4e565b9150506118c1565b506008546001600160a01b0316331461196357336000908152600a60205260409020805460ff191660011790555b610a99338460405180602001604052806000815250611e9e565b6000806119a8836040516020016119949190612b6d565b604051602081830303815290604052611f0b565b90508051602082016000f091506001600160a01b0382166119dc5760405163046a55db60e11b815260040160405180910390fd5b50919050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051608081018252600080825260208201819052918101829052606081019190915260008281526004602052604090205461065a90611f37565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611aa5903390899088908890600401612b93565b6020604051808303816000875af1925050508015611ae0575060408051601f3d908101601f19168201909252611add91810190612bd0565b60015b611b3e573d808015611b0e576040519150601f19603f3d011682016040523d82523d6000602084013e611b13565b606091505b508051600003611b36576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60408051608081018252600080825260208201819052918101829052606081019190915261065a611b8b8361179c565b611f37565b60405165556e6971756560d01b60208201526060906026016040516020818303038152906040528051906020012083604051602001611bcf9190612bed565b6040516020818303038152906040528051906020012003611bf157508061065a565b8282604051602001611c04929190612c09565b604051602081830303815290604052905092915050565b606061065a600b836040015161ffff1681548110611c3b57611c3b6127f3565b90600052602060002001611c528460600151611f7e565b604051602001611c63929190612c45565b604051602081830303815290604052611f8e565b60608282604051602001611c04929190612ee4565b600081815b8451811015611cd157611cbd82868381518110611cb057611cb06127f3565b6020026020010151611f9c565b915080611cc981612b35565b915050611c91565b509392505050565b6000601054600003611cfe57604051631a11574b60e01b815260040160405180910390fd5b601080546000198101918290556000908481611d1c57611d1c612f56565b069050600f8181548110611d3257611d326127f3565b600091825260208220601082040154600f9091166002026101000a900461ffff169003611d5f5780611d97565b600f8181548110611d7257611d726127f3565b90600052602060002090601091828204019190066002029054906101000a900461ffff165b9250600f8281548110611dac57611dac6127f3565b60009182526020909120601082040154600f9091166002026101000a900461ffff1615611e0f57600f8281548110611de657611de66127f3565b90600052602060002090601091828204019190066002029054906101000a900461ffff16611e11565b815b600f8281548110611e2457611e246127f3565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506000600f8381548110611e6857611e686127f3565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050919050565b611ea88383611fc8565b6001600160a01b0383163b15610a99576000548281035b611ed26000868380600101945086611a70565b611eef576040516368d2bf6b60e11b815260040160405180910390fd5b818110611ebf578160005414611f0457600080fd5b5050505050565b6060815182604051602001611f21929190612f6c565b6040516020818303038152906040529050919050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b606061065a8260016000196120c6565b606061065a8260008061217b565b6000818310611fb8576000828152602084905260409020610851565b5060009182526020526040902090565b6000805490829003611fed5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461209c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612064565b50816000036120bd57604051622e076360e81b815260040160405180910390fd5b60005550505050565b6060833b60008190036120e9575050604080516020810190915260008152610851565b80841115612107575050604080516020810190915260008152610851565b838310156121395760405163162544fd60e11b81526004810182905260248101859052604481018490526064016116f3565b838303848203600082821061214e5782612150565b815b60408051603f8301601f19168101909152818152955090508087602087018a3c505050509392505050565b606083518015611cd1576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c1651600053603f81600c1c1651600153603f8160061c1651600253603f8116516003535060005182526004820191508082106121eb57602001604052613d3d60f01b60038406600204808303919091526000861515909102918290035290038252509392505050565b6001600160e01b03198116811461168757600080fd5b60006020828403121561228a57600080fd5b813561085181612262565b60005b838110156122b0578181015183820152602001612298565b50506000910152565b600081518084526122d1816020860160208601612295565b601f01601f19169290920160200192915050565b60208152600061085160208301846122b9565b60006020828403121561230a57600080fd5b5035919050565b80356001600160a01b038116811461232857600080fd5b919050565b6000806040838503121561234057600080fd5b61234983612311565b946020939093013593505050565b60008083601f84011261236957600080fd5b5081356001600160401b0381111561238057600080fd5b6020830191508360208260051b850101111561239b57600080fd5b9250929050565b6000806000604084860312156123b757600080fd5b6123c084612311565b925060208401356001600160401b038111156123db57600080fd5b6123e786828701612357565b9497909650939450505050565b8035801515811461232857600080fd5b60006020828403121561241657600080fd5b610851826123f4565b60008060006060848603121561243457600080fd5b61243d84612311565b925061244b60208501612311565b9150604084013590509250925092565b6000806020838503121561246e57600080fd5b82356001600160401b0381111561248457600080fd5b61249085828601612357565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b8181101561100c5761250783855161249c565b92840192608092909201916001016124f4565b6000806000806000806000806080898b03121561253657600080fd5b88356001600160401b038082111561254d57600080fd5b6125598c838d01612357565b909a50985060208b013591508082111561257257600080fd5b61257e8c838d01612357565b909850965060408b013591508082111561259757600080fd5b6125a38c838d01612357565b909650945060608b01359150808211156125bc57600080fd5b506125c98b828c01612357565b999c989b5096995094979396929594505050565b6000602082840312156125ef57600080fd5b61085182612311565b6020808252825182820181905260009190848201906040850190845b8181101561100c57835183529284019291840191600101612614565b60008060006060848603121561264557600080fd5b61264e84612311565b95602085013595506040909401359392505050565b6000806040838503121561267657600080fd5b61267f83612311565b915061268d602084016123f4565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156126c257600080fd5b6126cb85612311565b93506126d960208601612311565b92506040850135915060608501356001600160401b03808211156126fc57600080fd5b818701915087601f83011261271057600080fd5b81358181111561272257612722612696565b604051601f8201601f19908116603f0116810190838211818310171561274a5761274a612696565b816040528281528a602084870101111561276357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6080810161065a828461249c565b600080604083850312156127a857600080fd5b6127b183612311565b915061268d60208401612311565b600181811c908216806127d357607f821691505b6020821081036119dc57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261282057600080fd5b8301803591506001600160401b0382111561283a57600080fd5b60200191503681900382131561239b57600080fd5b60006020828403121561286157600080fd5b813561ffff8116811461085157600080fd5b601f821115610a9957600081815260208120601f850160051c8101602086101561289a5750805b601f850160051c820191505b81811015610a0f578281556001016128a6565b81516001600160401b038111156128d2576128d2612696565b6128e6816128e084546127bf565b84612873565b602080601f83116001811461291b57600084156129035750858301515b600019600386901b1c1916600185901b178555610a0f565b600085815260208120601f198616915b8281101561294a5788860151825594840194600190910190840161292b565b50858210156129685787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815161298a818560208601612295565b9290920192915050565b693d913730b6b2911d101160b11b815285516000906129ba81600a850160208b01612295565b71111610113232b9b1b934b83a34b7b7111d1160711b600a918401918201527f3133333720637269747465727320617265207075726520312f312068616e6463601c8201527f72616674656420616e696d616c73206c6976696e67206f6e636861696e000000603c8201527f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b62616059820152641cd94d8d0b60da1b60798201528651612a6c81607e840160208b01612295565b61088b60f21b9101607e8101919091526e2261747472696275746573223a205b60881b6080820152612ad5612ac7612ac1612aae612abb81608f87018c612978565b600b60fa1b815260010190565b89612978565b86612978565b615d7d60f01b815260020190565b98975050505050505050565b7519185d184e985c1c1b1a58d85d1a5bdb8bda9cdbdb8b60521b815260008251612b12816016850160208701612295565b9190910160160192915050565b634e487b7160e01b600052601160045260246000fd5b600060018201612b4757612b47612b1f565b5060010190565b600060ff821660ff8103612b6457612b64612b1f565b60010192915050565b6000815260008251612b86816001850160208701612295565b9190910160010192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bc6908301846122b9565b9695505050505050565b600060208284031215612be257600080fd5b815161085181612262565b60008251612bff818460208701612295565b9190910192915050565b60008351612c1b818460208801612295565b600160fd1b9083019081528351612c39816001840160208801612295565b01600101949350505050565b7f3c7376672069643d2263726974746572222077696474683d22313030252220688152600060207f65696768743d2231303025222076696577426f783d2230203020323030303020818401527f32303030302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f6040840152691918181817b9bb33911f60b11b60608401527f3c7374796c653e23637269747465727b6261636b67726f756e642d636f6c6f72606a840152601d60f91b608a840152608b60008654612d09816127bf565b60018281168015612d215760018114612d3a57612d6a565b60ff198416898701528215158302890186019450612d6a565b8a6000528660002060005b84811015612d605781548b8201890152908301908801612d45565b505085838a010194505b50507f3b6261636b67726f756e642d696d6167653a75726c28646174613a696d616765835250506b0bdc1b99ced8985cd94d8d0b60a21b6020820152612ed9612db6602c830188612978565b7f293b6261636b67726f756e642d7265706561743a6e6f2d7265706561743b626181527f636b67726f756e642d73697a653a636f6e7461696e3b6261636b67726f756e6460208201527f2d706f736974696f6e3a63656e7465723b696d6167652d72656e646572696e6760408201527f3a2d7765626b69742d6f7074696d697a652d636f6e74726173743b2d6d732d6960608201527f6e746572706f6c6174696f6e2d6d6f64653a6e6561726573742d6e656967686260808201527f6f723b696d6167652d72656e646572696e673a2d6d6f7a2d63726973702d656460a08201527f6765733b696d6167652d72656e646572696e673a706978656c617465643b7d3c60c08201526c17b9ba3cb6329f1e17b9bb339f60991b60e082015260ed0190565b979650505050505050565b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090612f0f81600f850160208801612295565b6b1116113b30b63ab2911d101160a11b600f918401918201528351612f3b81601b840160208801612295565b61227d60f01b601b9290910191820152601d01949350505050565b634e487b7160e01b600052601260045260246000fd5b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201528151600090612faf81600e850160208701612295565b91909101600e01939250505056fea2646970667358221220346e1c9ab24d93e4308de2858d95f74d29eff28fbc9501fbe821ed0047d1114364736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000007280000000000000000000000000000000000000000000000000000000000000000d3133333720437269747465727300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3133333743524954544552000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012e00000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002640000000000000000000000000000000000000000000000000000000000000268000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000002740000000000000000000000000000000000000000000000000000000000000278000000000000000000000000000000000000000000000000000000000000027c000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002840000000000000000000000000000000000000000000000000000000000000288000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002940000000000000000000000000000000000000000000000000000000000000298000000000000000000000000000000000000000000000000000000000000029c00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b800000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f800000000000000000000000000000000000000000000000000000000000002fc000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003040000000000000000000000000000000000000000000000000000000000000308000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000003140000000000000000000000000000000000000000000000000000000000000318000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003240000000000000000000000000000000000000000000000000000000000000328000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003340000000000000000000000000000000000000000000000000000000000000338000000000000000000000000000000000000000000000000000000000000033c000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003440000000000000000000000000000000000000000000000000000000000000348000000000000000000000000000000000000000000000000000000000000034c000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000003540000000000000000000000000000000000000000000000000000000000000358000000000000000000000000000000000000000000000000000000000000035c000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003640000000000000000000000000000000000000000000000000000000000000368000000000000000000000000000000000000000000000000000000000000036c000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000003740000000000000000000000000000000000000000000000000000000000000378000000000000000000000000000000000000000000000000000000000000037c000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003840000000000000000000000000000000000000000000000000000000000000388000000000000000000000000000000000000000000000000000000000000038c000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003940000000000000000000000000000000000000000000000000000000000000398000000000000000000000000000000000000000000000000000000000000039c00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a400000000000000000000000000000000000000000000000000000000000003a800000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003b400000000000000000000000000000000000000000000000000000000000003b800000000000000000000000000000000000000000000000000000000000003bc00000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c400000000000000000000000000000000000000000000000000000000000003c800000000000000000000000000000000000000000000000000000000000003cc00000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d400000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003ec00000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f400000000000000000000000000000000000000000000000000000000000003f800000000000000000000000000000000000000000000000000000000000003fc000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004040000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000040c000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000004140000000000000000000000000000000000000000000000000000000000000418000000000000000000000000000000000000000000000000000000000000041c000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000004240000000000000000000000000000000000000000000000000000000000000428000000000000000000000000000000000000000000000000000000000000042c000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000004340000000000000000000000000000000000000000000000000000000000000438000000000000000000000000000000000000000000000000000000000000043c000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004440000000000000000000000000000000000000000000000000000000000000448000000000000000000000000000000000000000000000000000000000000044c000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000004540000000000000000000000000000000000000000000000000000000000000458000000000000000000000000000000000000000000000000000000000000045c000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004640000000000000000000000000000000000000000000000000000000000000468000000000000000000000000000000000000000000000000000000000000046c000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000004740000000000000000000000000000000000000000000000000000000000000478000000000000000000000000000000000000000000000000000000000000047c000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000004840000000000000000000000000000000000000000000000000000000000000488000000000000000000000000000000000000000000000000000000000000048c000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004940000000000000000000000000000000000000000000000000000000000000498000000000000000000000000000000000000000000000000000000000000049c00000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004a400000000000000000000000000000000000000000000000000000000000004a800000000000000000000000000000000000000000000000000000000000004ac00000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000004b400000000000000000000000000000000000000000000000000000000000004b800000000000000000000000000000000000000000000000000000000000004bc00000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004c400000000000000000000000000000000000000000000000000000000000004c800000000000000000000000000000000000000000000000000000000000004cc00000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000004d400000000000000000000000000000000000000000000000000000000000004d800000000000000000000000000000000000000000000000000000000000004dc00000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000004e400000000000000000000000000000000000000000000000000000000000004e800000000000000000000000000000000000000000000000000000000000004ec00000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000004f400000000000000000000000000000000000000000000000000000000000004f800000000000000000000000000000000000000000000000000000000000004fc000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005040000000000000000000000000000000000000000000000000000000000000508000000000000000000000000000000000000000000000000000000000000050c000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000005140000000000000000000000000000000000000000000000000000000000000518000000000000000000000000000000000000000000000000000000000000051c000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000005240000000000000000000000000000000000000000000000000000000000000528000000000000000000000000000000000000000000000000000000000000052c000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000005340000000000000000000000000000000000000000000000000000000000000538000000000000000000000000000000000000000000000000000000000000053c000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000005440000000000000000000000000000000000000000000000000000000000000548000000000000000000000000000000000000000000000000000000000000054c000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000005540000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000055c000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005640000000000000000000000000000000000000000000000000000000000000568000000000000000000000000000000000000000000000000000000000000056c000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000005740000000000000000000000000000000000000000000000000000000000000578000000000000000000000000000000000000000000000000000000000000057c000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000005840000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000058c000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000005940000000000000000000000000000000000000000000000000000000000000598000000000000000000000000000000000000000000000000000000000000059c00000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005a400000000000000000000000000000000000000000000000000000000000005a800000000000000000000000000000000000000000000000000000000000005ac00000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005b400000000000000000000000000000000000000000000000000000000000005b800000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005c800000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005e400000000000000000000000000000000000000000000000000000000000005e800000000000000000000000000000000000000000000000000000000000005ec00000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000005f400000000000000000000000000000000000000000000000000000000000005f800000000000000000000000000000000000000000000000000000000000005fc000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006040000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000060c000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006140000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000061c000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006240000000000000000000000000000000000000000000000000000000000000628000000000000000000000000000000000000000000000000000000000000062c000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006340000000000000000000000000000000000000000000000000000000000000638000000000000000000000000000000000000000000000000000000000000063c000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006440000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000064c000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006540000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000065c000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006640000000000000000000000000000000000000000000000000000000000000668000000000000000000000000000000000000000000000000000000000000066c000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000006740000000000000000000000000000000000000000000000000000000000000678000000000000000000000000000000000000000000000000000000000000067c000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006840000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000068c000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006940000000000000000000000000000000000000000000000000000000000000698000000000000000000000000000000000000000000000000000000000000069c00000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000006a800000000000000000000000000000000000000000000000000000000000006ac00000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006b400000000000000000000000000000000000000000000000000000000000006b800000000000000000000000000000000000000000000000000000000000006bc00000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006c800000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006dc00000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006e400000000000000000000000000000000000000000000000000000000000006e800000000000000000000000000000000000000000000000000000000000006ec00000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006f400000000000000000000000000000000000000000000000000000000000006f800000000000000000000000000000000000000000000000000000000000006fc000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000007040000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000070c000000000000000000000000000000000000000000000000000000000000071000000000000000000000000000000000000000000000000000000000000000007233030393330360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330306165643200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323232323633000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233239323435610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333663366373400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343563313866000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233436373163310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335333730393100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353361346131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233535356534620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335663632326200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363033383330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233633396266660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336363264393100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723376364646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233836323638310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338393330366400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386639373461000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233930366334660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339363234326500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723396336373963000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236230376135360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364373663666200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723646363656233000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236537303034660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365386431303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723656563333961000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236632303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366663637303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666639353366000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666396138650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330303030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303066666138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233031363530310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330393030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723306233613635000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233232323033340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333333439356400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333933393339000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233438333965360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334383936613600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356236656531000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233564326266350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335643738376100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363237373861000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233635376236660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336383030663900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723366261356534000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233666333139610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337653565616100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386635363362000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233939653535300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072363626462666300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723643138663765000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236435313531350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364373762626100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666266323336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666613430300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330303030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316232663061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233330633333310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333333633623800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343134313431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233539326432360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335393536353200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363330633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233636333933310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336393661366100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723373262653036000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233939396139390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072361303965396500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723623237333031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236232636264620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362333030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723646637313236000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236534646366660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366393734363900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723663962663830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366663030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303036623034000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233030666630300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330313837306600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316130393536000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233162316233620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332343166623100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333032373633000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233336333235390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335323462323400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356535646665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233731356139660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337373932373200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723383939396131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236165643466300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362363636363600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723626330306530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236530636538310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366666666303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303032366666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233035303066350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332353539613200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356333373565000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233631346164300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336623639353000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723383038303830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236239303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364633335333500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666163663135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666333730340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330303333303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723306130306666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233165313436390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332343132323700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723326134346131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233332336333390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333333333333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333734363664000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233361306530650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333623366356400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343934303732000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233538363034610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335643364666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356438353836000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233565366535610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335663838613500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363331363632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233634386535370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337313764623500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723376237643066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233864633666660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339626164623700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723616261336666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236332613133330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072363356335633500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723643537656231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236439613036360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365623165616100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723656431633234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236564383537320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366353030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666662376134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666653130330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366666666666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313030303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233130323430310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333313430396100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333932633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233833653966660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339356137636400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323135383030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233335353830300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333373732373500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333832666331000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233434303134650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334663536343100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363435626634000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233638383637610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362373962623500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303036653639000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233030626266650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330323339613100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303737383866000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233061353734620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330633034303500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723306431313135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233064363630300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330653835373400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313130623131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233131356233340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331353164326300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313630623062000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233139323966340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331393333366500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316131613161000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233162316231620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331633738363200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316562643433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233166316631660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331663432303700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323233666133000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233233326261620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332353962323400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323632333466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233236333532360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332366461666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323836633430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233239323833350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332393961633500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723326133366231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233330333533300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333303630383200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333131393535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233331333061640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333336134616400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333430306666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233334333932660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333346137653500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333664376535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233363313531380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333643365396200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723336662646163000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233431353833620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334323334316400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343262643431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233433363239360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334366666663300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343730313632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233437346235380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334383034323700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343838343438000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233439666666660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334623232323200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723346236393266000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233463616465390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334663462333200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353232643131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233534336530620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335363738396600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353639616262000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233537363833320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335376364666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356663646534000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233630336531340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336306533306400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363166616135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233633643736310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336363230333800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363735643662000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233639383238330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336616265333000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723366536643530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233733616564650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337343731636200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723373634323861000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233738346337360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337383937613300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723373937343939000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233739393263350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337633330303700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723383032323061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233835386562340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338396430623700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386239376336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233862623361630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338636332653000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386438386234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233864633638660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338653236626100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723393338666264000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233936343163660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339366365356500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723393862376433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233939643965610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339623763356600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723396562396434000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236162333032370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072361633332333200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723616665393363000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236231646238380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362333131616600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723623866663132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236239633964660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362636265656600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723626431656263000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236331666637610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364306132373000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723643364336433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236435616361340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364396666303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723653138643264000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236533313364330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365386333386400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723653961386138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236561656331360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365663663303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723663166656336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236637616266320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366393738363900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723663966346632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236662663235300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366643631333600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666437633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666303031300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366663038643600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666637633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666623830390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366666536303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303034626430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233030373664620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330383531613400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313364366666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233134636365350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333353766316600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723336134363661000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233432386436370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335663437363800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723366237343030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233735393237350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072361383839623300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353936623735000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233766376637660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366636539636200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000000442697262000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006447275646973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084865646765686f67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000850656e6775696e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007536179576861740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075468652047757900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000854696e7944696e6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005546f61647a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006556e697175650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757617463686572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004576f726d00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80636352211e1161010257806399a2557a11610095578063c87b56dd11610064578063c87b56dd14610565578063e985e9c514610585578063f19e75d4146105ce578063f2fde38b146105ee57600080fd5b806399a2557a146104e5578063a22cb46514610505578063b88d4fde14610525578063c23dc68f1461053857600080fd5b8063715018a6116100d1578063715018a6146104705780638462151c146104855780638da5cb5b146104b257806395d89b41146104d057600080fd5b80636352211e146103f0578063690944d61461041057806369a030341461043057806370a082311461045057600080fd5b80631f85e3ca1161017a578063440bc7f311610149578063440bc7f31461036257806347535d7b146103825780635bbb2177146103a35780635d67aedb146103d057600080fd5b80631f85e3ca146102fc57806323b872dd1461031c578063372f657c1461032f57806342842e0e1461034f57600080fd5b8063081812fc116101b6578063081812fc14610276578063095ea7b3146102ae5780631649a8a9146102c357806318160ddd146102e357600080fd5b806301ffc9a7146101dd578063047fc9aa1461021257806306fdde0314610254575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612278565b61060e565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b506102467f00000000000000000000000000000000000000000000000000000000000001a481565b604051908152602001610209565b34801561026057600080fd5b50610269610660565b60405161020991906122e5565b34801561028257600080fd5b506102966102913660046122f8565b6106f2565b6040516001600160a01b039091168152602001610209565b6102c16102bc36600461232d565b610736565b005b3480156102cf57600080fd5b506101fd6102de3660046123a2565b6107d6565b3480156102ef57600080fd5b5060015460005403610246565b34801561030857600080fd5b506102c1610317366004612404565b610858565b6102c161032a36600461241f565b61087e565b34801561033b57600080fd5b506102c161034a36600461245b565b610a17565b6102c161035d36600461241f565b610a7e565b34801561036e57600080fd5b506102c161037d3660046122f8565b610a9e565b34801561038e57600080fd5b506008546101fd90600160a01b900460ff1681565b3480156103af57600080fd5b506103c36103be36600461245b565b610aab565b60405161020991906124d8565b3480156103dc57600080fd5b506102c16103eb36600461251a565b610b76565b3480156103fc57600080fd5b5061029661040b3660046122f8565b610de7565b34801561041c57600080fd5b5061026961042b3660046122f8565b610df2565b34801561043c57600080fd5b5061026961044b3660046122f8565b610e9e565b34801561045c57600080fd5b5061024661046b3660046125dd565b610eae565b34801561047c57600080fd5b506102c1610efc565b34801561049157600080fd5b506104a56104a03660046125dd565b610f10565b60405161020991906125f8565b3480156104be57600080fd5b506008546001600160a01b0316610296565b3480156104dc57600080fd5b50610269611018565b3480156104f157600080fd5b506104a5610500366004612630565b611027565b34801561051157600080fd5b506102c1610520366004612663565b61119e565b6102c16105333660046126ac565b61120a565b34801561054457600080fd5b506105586105533660046122f8565b611254565b6040516102099190612787565b34801561057157600080fd5b506102696105803660046122f8565b6112cc565b34801561059157600080fd5b506101fd6105a0366004612795565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156105da57600080fd5b506102c16105e93660046122f8565b611676565b3480156105fa57600080fd5b506102c16106093660046125dd565b61168a565b60006301ffc9a760e01b6001600160e01b03198316148061063f57506380ac58cd60e01b6001600160e01b03198316145b8061065a5750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461066f906127bf565b80601f016020809104026020016040519081016040528092919081815260200182805461069b906127bf565b80156106e85780601f106106bd576101008083540402835291602001916106e8565b820191906000526020600020905b8154815290600101906020018083116106cb57829003601f168201915b5050505050905090565b60006106fd82611705565b61071a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061074182610de7565b9050336001600160a01b0382161461077a5761075d81336105a0565b61077a576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061084e838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506009546040516bffffffffffffffffffffffff1960608b901b16602082015290925060340190506040516020818303038152906040528051906020012061172c565b90505b9392505050565b610860611742565b60088054911515600160a01b0260ff60a01b19909216919091179055565b60006108898261179c565b9050836001600160a01b0316816001600160a01b0316146108bc5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610909576108ec86336105a0565b61090957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661093057604051633a954ecd60e21b815260040160405180910390fd5b801561093b57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036109cd576001840160008181526004602052604081205490036109cb5760005481146109cb5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610a223383836107d6565b610a3f5760405163522fc3bd60e01b815260040160405180910390fd5b336000908152600a602052604090205460ff1615610a7057604051634a7ba1cb60e11b815260040160405180910390fd5b610a7a6001611803565b5050565b610a998383836040518060200160405280600081525061120a565b505050565b610aa6611742565b600955565b6060816000816001600160401b03811115610ac857610ac8612696565b604051908082528060200260200182016040528015610b1a57816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610ae65790505b50905060005b828114610b6d57610b48868683818110610b3c57610b3c6127f3565b90506020020135611254565b828281518110610b5a57610b5a6127f3565b6020908102919091010152600101610b20565b50949350505050565b610b7e611742565b868514610b9e57604051630cf0bdb360e21b815260040160405180910390fd5b868314610bbe57604051630cf0bdb360e21b815260040160405180910390fd5b868114610bde57604051630cf0bdb360e21b815260040160405180910390fd5b60408051608081018252606080825260006020830181905292820183905281018290525b898983818110610c1457610c146127f3565b9050602002810190610c269190612809565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250878783818110610c6f57610c6f6127f3565b9050602002016020810190610c84919061284f565b61ffff166020820152858583818110610c9f57610c9f6127f3565b9050602002016020810190610cb4919061284f565b61ffff166040820152610d1e848484818110610cd257610cd26127f3565b9050602002810190610ce49190612809565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061197d92505050565b6001600160a01b03166060820152600d8054600181018255600091909152815182916002027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501908190610d7290826128b9565b5060208201516001918201805460408501516060909501516001600160a01b031664010000000002640100000000600160c01b031961ffff968716620100000263ffffffff1990931696909416959095171791909116929092179091559190910190888210610c025750505050505050505050565b600061065a8261179c565b600b8181548110610e0257600080fd5b906000526020600020016000915090508054610e1d906127bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e49906127bf565b8015610e965780601f10610e6b57610100808354040283529160200191610e96565b820191906000526020600020905b815481529060010190602001808311610e7957829003601f168201915b505050505081565b600c8181548110610e0257600080fd5b60006001600160a01b038216610ed7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610f04611742565b610f0e60006119e2565b565b60606000806000610f2085610eae565b90506000816001600160401b03811115610f3c57610f3c612696565b604051908082528060200260200182016040528015610f65578160200160208202803683370190505b509050610f9260408051608081018252600080825260208201819052918101829052606081019190915290565b60005b83861461100c57610fa581611a34565b915081604001516110045781516001600160a01b031615610fc557815194505b876001600160a01b0316856001600160a01b0316036110045780838780600101985081518110610ff757610ff76127f3565b6020026020010181815250505b600101610f95565b50909695505050505050565b60606003805461066f906127bf565b606081831061104957604051631960ccad60e11b815260040160405180910390fd5b60008061105560005490565b905080841115611063578093505b600061106e87610eae565b90508486101561108d5785850381811015611087578091505b50611091565b5060005b6000816001600160401b038111156110ab576110ab612696565b6040519080825280602002602001820160405280156110d4578160200160208202803683370190505b509050816000036110ea57935061085192505050565b60006110f588611254565b905060008160400151611106575080515b885b8881141580156111185750848714155b1561118d5761112681611a34565b925082604001516111855782516001600160a01b03161561114657825191505b8a6001600160a01b0316826001600160a01b0316036111855780848880600101995081518110611178576111786127f3565b6020026020010181815250505b600101611108565b505050928352509095945050505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61121584848461087e565b6001600160a01b0383163b1561124e5761123184848484611a70565b61124e576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845290830182905293820181905292810183905290915060005483106112a85792915050565b6112b183611a34565b90508060400151156112c35792915050565b61085183611b5b565b60606112d782611705565b6112f457604051631d6fa32560e31b815260040160405180910390fd5b6000600d600e848154811061130b5761130b6127f3565b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff1681548110611343576113436127f3565b906000526020600020906002020160405180608001604052908160008201805461136c906127bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611398906127bf565b80156113e55780601f106113ba576101008083540402835291602001916113e5565b820191906000526020600020905b8154815290600101906020018083116113c857829003601f168201915b50505091835250506001919091015461ffff808216602080850191909152620100008304821660408501526401000000009092046001600160a01b0316606090930192909252820151600c805493945060009390929190911690811061144d5761144d6127f3565b906000526020600020018054611462906127bf565b80601f016020809104026020016040519081016040528092919081815260200182805461148e906127bf565b80156114db5780601f106114b0576101008083540402835291602001916114db565b820191906000526020600020905b8154815290600101906020018083116114be57829003601f168201915b5050505050905060006114f2828460000151611b90565b6114fb84611c1b565b611528604051806040016040528060078152602001667661726965747960c81b8152508660000151611c77565b61154e604051806040016040528060048152602001637479706560e01b81525086611c77565b6116276040518060400160405280600a815260200169189858dad9dc9bdd5b9960b21b815250600b896040015161ffff168154811061158f5761158f6127f3565b9060005260206000200180546115a4906127bf565b80601f01602080910402602001604051908101604052809291908181526020018280546115d0906127bf565b801561161d5780601f106115f25761010080835404028352916020019161161d565b820191906000526020600020905b81548152906001019060200180831161160057829003601f168201915b5050505050611c77565b60405160200161163b959493929190612994565b60405160208183030381529060405290508060405160200161165d9190612ae1565b6040516020818303038152906040529350505050919050565b61167e611742565b61168781611803565b50565b611692611742565b6001600160a01b0381166116fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b611687816119e2565b600080548210801561065a575050600090815260046020526040902054600160e01b161590565b6000826117398584611c8c565b14949350505050565b6008546001600160a01b03163314610f0e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016116f3565b6000816000548110156117ea5760008181526004602052604081205490600160e01b821690036117e8575b806000036108515750600019016000818152600460205260409020546117c7565b505b604051636f96cda160e11b815260040160405180910390fd5b600854600160a01b900460ff1661182d5760405163589ed34b60e01b815260040160405180910390fd5b6000547f00000000000000000000000000000000000000000000000000000000000001a4828201111561187357604051631a11574b60e01b815260040160405180910390fd5b600042336040516020016118a392919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b6040516020818303038152906040528051906020012060001c905060005b838160ff161015611935576118d582611cd9565b600e84815481106118e8576118e86127f3565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508261192190612b35565b92508061192d81612b4e565b9150506118c1565b506008546001600160a01b0316331461196357336000908152600a60205260409020805460ff191660011790555b610a99338460405180602001604052806000815250611e9e565b6000806119a8836040516020016119949190612b6d565b604051602081830303815290604052611f0b565b90508051602082016000f091506001600160a01b0382166119dc5760405163046a55db60e11b815260040160405180910390fd5b50919050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051608081018252600080825260208201819052918101829052606081019190915260008281526004602052604090205461065a90611f37565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611aa5903390899088908890600401612b93565b6020604051808303816000875af1925050508015611ae0575060408051601f3d908101601f19168201909252611add91810190612bd0565b60015b611b3e573d808015611b0e576040519150601f19603f3d011682016040523d82523d6000602084013e611b13565b606091505b508051600003611b36576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60408051608081018252600080825260208201819052918101829052606081019190915261065a611b8b8361179c565b611f37565b60405165556e6971756560d01b60208201526060906026016040516020818303038152906040528051906020012083604051602001611bcf9190612bed565b6040516020818303038152906040528051906020012003611bf157508061065a565b8282604051602001611c04929190612c09565b604051602081830303815290604052905092915050565b606061065a600b836040015161ffff1681548110611c3b57611c3b6127f3565b90600052602060002001611c528460600151611f7e565b604051602001611c63929190612c45565b604051602081830303815290604052611f8e565b60608282604051602001611c04929190612ee4565b600081815b8451811015611cd157611cbd82868381518110611cb057611cb06127f3565b6020026020010151611f9c565b915080611cc981612b35565b915050611c91565b509392505050565b6000601054600003611cfe57604051631a11574b60e01b815260040160405180910390fd5b601080546000198101918290556000908481611d1c57611d1c612f56565b069050600f8181548110611d3257611d326127f3565b600091825260208220601082040154600f9091166002026101000a900461ffff169003611d5f5780611d97565b600f8181548110611d7257611d726127f3565b90600052602060002090601091828204019190066002029054906101000a900461ffff165b9250600f8281548110611dac57611dac6127f3565b60009182526020909120601082040154600f9091166002026101000a900461ffff1615611e0f57600f8281548110611de657611de66127f3565b90600052602060002090601091828204019190066002029054906101000a900461ffff16611e11565b815b600f8281548110611e2457611e246127f3565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506000600f8381548110611e6857611e686127f3565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050919050565b611ea88383611fc8565b6001600160a01b0383163b15610a99576000548281035b611ed26000868380600101945086611a70565b611eef576040516368d2bf6b60e11b815260040160405180910390fd5b818110611ebf578160005414611f0457600080fd5b5050505050565b6060815182604051602001611f21929190612f6c565b6040516020818303038152906040529050919050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b606061065a8260016000196120c6565b606061065a8260008061217b565b6000818310611fb8576000828152602084905260409020610851565b5060009182526020526040902090565b6000805490829003611fed5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461209c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612064565b50816000036120bd57604051622e076360e81b815260040160405180910390fd5b60005550505050565b6060833b60008190036120e9575050604080516020810190915260008152610851565b80841115612107575050604080516020810190915260008152610851565b838310156121395760405163162544fd60e11b81526004810182905260248101859052604481018490526064016116f3565b838303848203600082821061214e5782612150565b815b60408051603f8301601f19168101909152818152955090508087602087018a3c505050509392505050565b606083518015611cd1576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c1651600053603f81600c1c1651600153603f8160061c1651600253603f8116516003535060005182526004820191508082106121eb57602001604052613d3d60f01b60038406600204808303919091526000861515909102918290035290038252509392505050565b6001600160e01b03198116811461168757600080fd5b60006020828403121561228a57600080fd5b813561085181612262565b60005b838110156122b0578181015183820152602001612298565b50506000910152565b600081518084526122d1816020860160208601612295565b601f01601f19169290920160200192915050565b60208152600061085160208301846122b9565b60006020828403121561230a57600080fd5b5035919050565b80356001600160a01b038116811461232857600080fd5b919050565b6000806040838503121561234057600080fd5b61234983612311565b946020939093013593505050565b60008083601f84011261236957600080fd5b5081356001600160401b0381111561238057600080fd5b6020830191508360208260051b850101111561239b57600080fd5b9250929050565b6000806000604084860312156123b757600080fd5b6123c084612311565b925060208401356001600160401b038111156123db57600080fd5b6123e786828701612357565b9497909650939450505050565b8035801515811461232857600080fd5b60006020828403121561241657600080fd5b610851826123f4565b60008060006060848603121561243457600080fd5b61243d84612311565b925061244b60208501612311565b9150604084013590509250925092565b6000806020838503121561246e57600080fd5b82356001600160401b0381111561248457600080fd5b61249085828601612357565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b8181101561100c5761250783855161249c565b92840192608092909201916001016124f4565b6000806000806000806000806080898b03121561253657600080fd5b88356001600160401b038082111561254d57600080fd5b6125598c838d01612357565b909a50985060208b013591508082111561257257600080fd5b61257e8c838d01612357565b909850965060408b013591508082111561259757600080fd5b6125a38c838d01612357565b909650945060608b01359150808211156125bc57600080fd5b506125c98b828c01612357565b999c989b5096995094979396929594505050565b6000602082840312156125ef57600080fd5b61085182612311565b6020808252825182820181905260009190848201906040850190845b8181101561100c57835183529284019291840191600101612614565b60008060006060848603121561264557600080fd5b61264e84612311565b95602085013595506040909401359392505050565b6000806040838503121561267657600080fd5b61267f83612311565b915061268d602084016123f4565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156126c257600080fd5b6126cb85612311565b93506126d960208601612311565b92506040850135915060608501356001600160401b03808211156126fc57600080fd5b818701915087601f83011261271057600080fd5b81358181111561272257612722612696565b604051601f8201601f19908116603f0116810190838211818310171561274a5761274a612696565b816040528281528a602084870101111561276357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6080810161065a828461249c565b600080604083850312156127a857600080fd5b6127b183612311565b915061268d60208401612311565b600181811c908216806127d357607f821691505b6020821081036119dc57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261282057600080fd5b8301803591506001600160401b0382111561283a57600080fd5b60200191503681900382131561239b57600080fd5b60006020828403121561286157600080fd5b813561ffff8116811461085157600080fd5b601f821115610a9957600081815260208120601f850160051c8101602086101561289a5750805b601f850160051c820191505b81811015610a0f578281556001016128a6565b81516001600160401b038111156128d2576128d2612696565b6128e6816128e084546127bf565b84612873565b602080601f83116001811461291b57600084156129035750858301515b600019600386901b1c1916600185901b178555610a0f565b600085815260208120601f198616915b8281101561294a5788860151825594840194600190910190840161292b565b50858210156129685787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815161298a818560208601612295565b9290920192915050565b693d913730b6b2911d101160b11b815285516000906129ba81600a850160208b01612295565b71111610113232b9b1b934b83a34b7b7111d1160711b600a918401918201527f3133333720637269747465727320617265207075726520312f312068616e6463601c8201527f72616674656420616e696d616c73206c6976696e67206f6e636861696e000000603c8201527f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b62616059820152641cd94d8d0b60da1b60798201528651612a6c81607e840160208b01612295565b61088b60f21b9101607e8101919091526e2261747472696275746573223a205b60881b6080820152612ad5612ac7612ac1612aae612abb81608f87018c612978565b600b60fa1b815260010190565b89612978565b86612978565b615d7d60f01b815260020190565b98975050505050505050565b7519185d184e985c1c1b1a58d85d1a5bdb8bda9cdbdb8b60521b815260008251612b12816016850160208701612295565b9190910160160192915050565b634e487b7160e01b600052601160045260246000fd5b600060018201612b4757612b47612b1f565b5060010190565b600060ff821660ff8103612b6457612b64612b1f565b60010192915050565b6000815260008251612b86816001850160208701612295565b9190910160010192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bc6908301846122b9565b9695505050505050565b600060208284031215612be257600080fd5b815161085181612262565b60008251612bff818460208701612295565b9190910192915050565b60008351612c1b818460208801612295565b600160fd1b9083019081528351612c39816001840160208801612295565b01600101949350505050565b7f3c7376672069643d2263726974746572222077696474683d22313030252220688152600060207f65696768743d2231303025222076696577426f783d2230203020323030303020818401527f32303030302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f6040840152691918181817b9bb33911f60b11b60608401527f3c7374796c653e23637269747465727b6261636b67726f756e642d636f6c6f72606a840152601d60f91b608a840152608b60008654612d09816127bf565b60018281168015612d215760018114612d3a57612d6a565b60ff198416898701528215158302890186019450612d6a565b8a6000528660002060005b84811015612d605781548b8201890152908301908801612d45565b505085838a010194505b50507f3b6261636b67726f756e642d696d6167653a75726c28646174613a696d616765835250506b0bdc1b99ced8985cd94d8d0b60a21b6020820152612ed9612db6602c830188612978565b7f293b6261636b67726f756e642d7265706561743a6e6f2d7265706561743b626181527f636b67726f756e642d73697a653a636f6e7461696e3b6261636b67726f756e6460208201527f2d706f736974696f6e3a63656e7465723b696d6167652d72656e646572696e6760408201527f3a2d7765626b69742d6f7074696d697a652d636f6e74726173743b2d6d732d6960608201527f6e746572706f6c6174696f6e2d6d6f64653a6e6561726573742d6e656967686260808201527f6f723b696d6167652d72656e646572696e673a2d6d6f7a2d63726973702d656460a08201527f6765733b696d6167652d72656e646572696e673a706978656c617465643b7d3c60c08201526c17b9ba3cb6329f1e17b9bb339f60991b60e082015260ed0190565b979650505050505050565b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090612f0f81600f850160208801612295565b6b1116113b30b63ab2911d101160a11b600f918401918201528351612f3b81601b840160208801612295565b61227d60f01b601b9290910191820152601d01949350505050565b634e487b7160e01b600052601260045260246000fd5b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201528151600090612faf81600e850160208701612295565b91909101600e01939250505056fea2646970667358221220346e1c9ab24d93e4308de2858d95f74d29eff28fbc9501fbe821ed0047d1114364736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000007280000000000000000000000000000000000000000000000000000000000000000d3133333720437269747465727300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3133333743524954544552000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012e00000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002640000000000000000000000000000000000000000000000000000000000000268000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000002740000000000000000000000000000000000000000000000000000000000000278000000000000000000000000000000000000000000000000000000000000027c000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002840000000000000000000000000000000000000000000000000000000000000288000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002940000000000000000000000000000000000000000000000000000000000000298000000000000000000000000000000000000000000000000000000000000029c00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b800000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f800000000000000000000000000000000000000000000000000000000000002fc000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003040000000000000000000000000000000000000000000000000000000000000308000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000003140000000000000000000000000000000000000000000000000000000000000318000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003240000000000000000000000000000000000000000000000000000000000000328000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003340000000000000000000000000000000000000000000000000000000000000338000000000000000000000000000000000000000000000000000000000000033c000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003440000000000000000000000000000000000000000000000000000000000000348000000000000000000000000000000000000000000000000000000000000034c000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000003540000000000000000000000000000000000000000000000000000000000000358000000000000000000000000000000000000000000000000000000000000035c000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003640000000000000000000000000000000000000000000000000000000000000368000000000000000000000000000000000000000000000000000000000000036c000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000003740000000000000000000000000000000000000000000000000000000000000378000000000000000000000000000000000000000000000000000000000000037c000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003840000000000000000000000000000000000000000000000000000000000000388000000000000000000000000000000000000000000000000000000000000038c000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003940000000000000000000000000000000000000000000000000000000000000398000000000000000000000000000000000000000000000000000000000000039c00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a400000000000000000000000000000000000000000000000000000000000003a800000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003b400000000000000000000000000000000000000000000000000000000000003b800000000000000000000000000000000000000000000000000000000000003bc00000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c400000000000000000000000000000000000000000000000000000000000003c800000000000000000000000000000000000000000000000000000000000003cc00000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d400000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003ec00000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f400000000000000000000000000000000000000000000000000000000000003f800000000000000000000000000000000000000000000000000000000000003fc000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004040000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000040c000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000004140000000000000000000000000000000000000000000000000000000000000418000000000000000000000000000000000000000000000000000000000000041c000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000004240000000000000000000000000000000000000000000000000000000000000428000000000000000000000000000000000000000000000000000000000000042c000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000004340000000000000000000000000000000000000000000000000000000000000438000000000000000000000000000000000000000000000000000000000000043c000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004440000000000000000000000000000000000000000000000000000000000000448000000000000000000000000000000000000000000000000000000000000044c000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000004540000000000000000000000000000000000000000000000000000000000000458000000000000000000000000000000000000000000000000000000000000045c000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004640000000000000000000000000000000000000000000000000000000000000468000000000000000000000000000000000000000000000000000000000000046c000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000004740000000000000000000000000000000000000000000000000000000000000478000000000000000000000000000000000000000000000000000000000000047c000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000004840000000000000000000000000000000000000000000000000000000000000488000000000000000000000000000000000000000000000000000000000000048c000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004940000000000000000000000000000000000000000000000000000000000000498000000000000000000000000000000000000000000000000000000000000049c00000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004a400000000000000000000000000000000000000000000000000000000000004a800000000000000000000000000000000000000000000000000000000000004ac00000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000004b400000000000000000000000000000000000000000000000000000000000004b800000000000000000000000000000000000000000000000000000000000004bc00000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004c400000000000000000000000000000000000000000000000000000000000004c800000000000000000000000000000000000000000000000000000000000004cc00000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000004d400000000000000000000000000000000000000000000000000000000000004d800000000000000000000000000000000000000000000000000000000000004dc00000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000004e400000000000000000000000000000000000000000000000000000000000004e800000000000000000000000000000000000000000000000000000000000004ec00000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000004f400000000000000000000000000000000000000000000000000000000000004f800000000000000000000000000000000000000000000000000000000000004fc000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005040000000000000000000000000000000000000000000000000000000000000508000000000000000000000000000000000000000000000000000000000000050c000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000005140000000000000000000000000000000000000000000000000000000000000518000000000000000000000000000000000000000000000000000000000000051c000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000005240000000000000000000000000000000000000000000000000000000000000528000000000000000000000000000000000000000000000000000000000000052c000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000005340000000000000000000000000000000000000000000000000000000000000538000000000000000000000000000000000000000000000000000000000000053c000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000005440000000000000000000000000000000000000000000000000000000000000548000000000000000000000000000000000000000000000000000000000000054c000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000005540000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000055c000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005640000000000000000000000000000000000000000000000000000000000000568000000000000000000000000000000000000000000000000000000000000056c000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000005740000000000000000000000000000000000000000000000000000000000000578000000000000000000000000000000000000000000000000000000000000057c000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000005840000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000058c000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000005940000000000000000000000000000000000000000000000000000000000000598000000000000000000000000000000000000000000000000000000000000059c00000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005a400000000000000000000000000000000000000000000000000000000000005a800000000000000000000000000000000000000000000000000000000000005ac00000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005b400000000000000000000000000000000000000000000000000000000000005b800000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005c800000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005e400000000000000000000000000000000000000000000000000000000000005e800000000000000000000000000000000000000000000000000000000000005ec00000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000005f400000000000000000000000000000000000000000000000000000000000005f800000000000000000000000000000000000000000000000000000000000005fc000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006040000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000060c000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006140000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000061c000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006240000000000000000000000000000000000000000000000000000000000000628000000000000000000000000000000000000000000000000000000000000062c000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006340000000000000000000000000000000000000000000000000000000000000638000000000000000000000000000000000000000000000000000000000000063c000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006440000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000064c000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006540000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000065c000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006640000000000000000000000000000000000000000000000000000000000000668000000000000000000000000000000000000000000000000000000000000066c000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000006740000000000000000000000000000000000000000000000000000000000000678000000000000000000000000000000000000000000000000000000000000067c000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006840000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000068c000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006940000000000000000000000000000000000000000000000000000000000000698000000000000000000000000000000000000000000000000000000000000069c00000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000006a800000000000000000000000000000000000000000000000000000000000006ac00000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006b400000000000000000000000000000000000000000000000000000000000006b800000000000000000000000000000000000000000000000000000000000006bc00000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006c800000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006dc00000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006e400000000000000000000000000000000000000000000000000000000000006e800000000000000000000000000000000000000000000000000000000000006ec00000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006f400000000000000000000000000000000000000000000000000000000000006f800000000000000000000000000000000000000000000000000000000000006fc000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000007040000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000070c000000000000000000000000000000000000000000000000000000000000071000000000000000000000000000000000000000000000000000000000000000007233030393330360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330306165643200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323232323633000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233239323435610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333663366373400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343563313866000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233436373163310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335333730393100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353361346131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233535356534620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335663632326200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363033383330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233633396266660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336363264393100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723376364646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233836323638310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338393330366400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386639373461000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233930366334660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339363234326500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723396336373963000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236230376135360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364373663666200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723646363656233000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236537303034660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365386431303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723656563333961000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236632303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366663637303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666639353366000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666396138650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330303030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303066666138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233031363530310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330393030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723306233613635000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233232323033340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333333439356400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333933393339000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233438333965360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334383936613600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356236656531000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233564326266350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335643738376100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363237373861000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233635376236660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336383030663900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723366261356534000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233666333139610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337653565616100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386635363362000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233939653535300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072363626462666300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723643138663765000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236435313531350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364373762626100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666266323336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666613430300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330303030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316232663061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233330633333310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333333633623800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343134313431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233539326432360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335393536353200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363330633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233636333933310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336393661366100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723373262653036000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233939396139390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072361303965396500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723623237333031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236232636264620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362333030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723646637313236000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236534646366660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366393734363900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723663962663830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366663030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303036623034000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233030666630300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330313837306600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316130393536000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233162316233620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332343166623100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333032373633000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233336333235390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335323462323400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356535646665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233731356139660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337373932373200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723383939396131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236165643466300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362363636363600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723626330306530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236530636538310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366666666303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303032366666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233035303066350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332353539613200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356333373565000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233631346164300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336623639353000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723383038303830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236239303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364633335333500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666163663135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666333730340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330303333303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723306130306666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233165313436390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332343132323700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723326134346131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233332336333390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333333333333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333734363664000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233361306530650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333623366356400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343934303732000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233538363034610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335643364666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356438353836000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233565366535610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335663838613500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363331363632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233634386535370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337313764623500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723376237643066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233864633666660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339626164623700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723616261336666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236332613133330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072363356335633500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723643537656231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236439613036360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365623165616100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723656431633234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236564383537320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366353030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666662376134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666653130330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366666666666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313030303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233130323430310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333313430396100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333932633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233833653966660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339356137636400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323135383030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233335353830300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333373732373500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333832666331000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233434303134650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334663536343100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363435626634000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233638383637610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362373962623500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303036653639000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233030626266650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330323339613100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303737383866000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233061353734620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330633034303500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723306431313135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233064363630300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330653835373400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313130623131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233131356233340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331353164326300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313630623062000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233139323966340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331393333366500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316131613161000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233162316231620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331633738363200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316562643433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233166316631660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331663432303700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323233666133000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233233326261620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332353962323400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323632333466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233236333532360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332366461666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323836633430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233239323833350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332393961633500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723326133366231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233330333533300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333303630383200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333131393535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233331333061640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333336134616400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333430306666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233334333932660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333346137653500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333664376535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233363313531380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333643365396200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723336662646163000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233431353833620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334323334316400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343262643431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233433363239360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334366666663300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343730313632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233437346235380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334383034323700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343838343438000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233439666666660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334623232323200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723346236393266000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233463616465390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334663462333200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353232643131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233534336530620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335363738396600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353639616262000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233537363833320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335376364666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356663646534000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233630336531340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336306533306400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363166616135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233633643736310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336363230333800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363735643662000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233639383238330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336616265333000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723366536643530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233733616564650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337343731636200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723373634323861000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233738346337360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337383937613300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723373937343939000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233739393263350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337633330303700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723383032323061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233835386562340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338396430623700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386239376336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233862623361630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338636332653000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386438386234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233864633638660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338653236626100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723393338666264000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233936343163660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339366365356500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723393862376433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233939643965610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339623763356600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723396562396434000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236162333032370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072361633332333200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723616665393363000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236231646238380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362333131616600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723623866663132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236239633964660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362636265656600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723626431656263000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236331666637610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364306132373000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723643364336433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236435616361340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364396666303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723653138643264000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236533313364330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365386333386400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723653961386138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236561656331360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365663663303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723663166656336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236637616266320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366393738363900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723663966346632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236662663235300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366643631333600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666437633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666303031300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366663038643600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666637633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666623830390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366666536303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303034626430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233030373664620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330383531613400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313364366666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233134636365350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333353766316600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723336134363661000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233432386436370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335663437363800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723366237343030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233735393237350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072361383839623300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353936623735000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233766376637660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366636539636200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000000442697262000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006447275646973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084865646765686f67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000850656e6775696e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007536179576861740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075468652047757900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000854696e7944696e6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005546f61647a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006556e697175650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757617463686572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004576f726d00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): 1337 Critters
Arg [1] : symbol (string): 1337CRITTER
Arg [2] : _supply (uint256): 420
Arg [3] : _backgroundsOptions (string[]): #009306,#00aed2,#222263,#29245a,#3f3f74,#45c18f,#4671c1,#537091,#53a4a1,#555e4b,#5f622b,#603830,#639bff,#662d91,#7cdddd,#862681,#89306d,#8f974a,#906c4f,#96242e,#9c679c,#b07a56,#d76cfb,#dcceb3,#e7004f,#e8d100,#eec39a,#f20000,#ff6700,#ff953f,#ff9a8e,#000000,#00ffa8,#016501,#0900ff,#0b3a65,#222034,#33495d,#393939,#4839e6,#4896a6,#5b6ee1,#5d2bf5,#5d787a,#62778a,#657b6f,#6800f9,#6ba5e4,#6f319a,#7e5eaa,#8f563b,#99e550,#cbdbfc,#d18f7e,#d51515,#d77bba,#fbf236,#ffa400,#0000ff,#1b2f0a,#30c331,#3363b8,#414141,#592d26,#595652,#630c00,#663931,#696a6a,#72be06,#999a99,#a09e9e,#b27301,#b2cbdb,#b30000,#df7126,#e4dcff,#f97469,#f9bf80,#ff0000,#ff00ff,#006b04,#00ff00,#01870f,#1a0956,#1b1b3b,#241fb1,#302763,#363259,#524b24,#5e5dfe,#715a9f,#779272,#8999a1,#aed4f0,#b66666,#bc00e0,#e0ce81,#ffff00,#0026ff,#0500f5,#2559a2,#5c375e,#614ad0,#6b6950,#808080,#b90000,#dc3535,#facf15,#ff3704,#003300,#0a00ff,#1e1469,#241227,#2a44a1,#323c39,#333333,#37466d,#3a0e0e,#3b3f5d,#494072,#58604a,#5d3dff,#5d8586,#5e6e5a,#5f88a5,#631662,#648e57,#717db5,#7b7d0f,#8dc6ff,#9badb7,#aba3ff,#c2a133,#c5c5c5,#d57eb1,#d9a066,#eb1eaa,#ed1c24,#ed8572,#f500ff,#ffb7a4,#ffe103,#ffffff,#100000,#102401,#31409a,#392c00,#83e9ff,#95a7cd,#215800,#355800,#377275,#382fc1,#44014e,#4f5641,#645bf4,#68867a,#b79bb5,#006e69,#00bbfe,#0239a1,#07788f,#0a574b,#0c0405,#0d1115,#0d6600,#0e8574,#110b11,#115b34,#151d2c,#160b0b,#1929f4,#19336e,#1a1a1a,#1b1b1b,#1c7862,#1ebd43,#1f1f1f,#1f4207,#223fa3,#232bab,#259b24,#26234f,#263526,#26daff,#286c40,#292835,#299ac5,#2a36b1,#303530,#306082,#311955,#3130ad,#33a4ad,#3400ff,#34392f,#34a7e5,#36d7e5,#3c1518,#3d3e9b,#3fbdac,#41583b,#42341d,#42bd41,#436296,#46fff3,#470162,#474b58,#480427,#488448,#49ffff,#4b2222,#4b692f,#4cade9,#4f4b32,#522d11,#543e0b,#56789f,#569abb,#576832,#57cdff,#5fcde4,#603e14,#60e30d,#61faa5,#63d761,#662038,#675d6b,#698283,#6abe30,#6e6d50,#73aede,#7471cb,#76428a,#784c76,#7897a3,#797499,#7992c5,#7c3007,#80220a,#858eb4,#89d0b7,#8b97c6,#8bb3ac,#8cc2e0,#8d88b4,#8dc68f,#8e26ba,#938fbd,#9641cf,#96ce5e,#98b7d3,#99d9ea,#9b7c5f,#9eb9d4,#ab3027,#ac3232,#afe93c,#b1db88,#b311af,#b8ff12,#b9c9df,#bcbeef,#bd1ebc,#c1ff7a,#d0a270,#d3d3d3,#d5aca4,#d9ff00,#e18d2d,#e313d3,#e8c38d,#e9a8a8,#eaec16,#ef6c00,#f1fec6,#f7abf2,#f97869,#f9f4f2,#fbf250,#fd6136,#fd7c00,#ff0010,#ff08d6,#ff7c00,#ffb809,#ffe600,#004bd0,#0076db,#0851a4,#13d6ff,#14cce5,#357f1f,#3a466a,#428d67,#5f4768,#6b7400,#759275,#a889b3,#596b75,#7f7f7f,#fce9cb
Arg [4] : _typesOptions (string[]): Birb,Drudis,Hedgehog,Penguins,SayWhat,The Guy,TinyDino,Toadz,Unique,Watcher,Worm
-----Encoded View---------------
950 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a4
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000007280
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [6] : 3133333720437269747465727300000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [8] : 3133333743524954544552000000000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000012e
Arg [10] : 00000000000000000000000000000000000000000000000000000000000025c0
Arg [11] : 0000000000000000000000000000000000000000000000000000000000002600
Arg [12] : 0000000000000000000000000000000000000000000000000000000000002640
Arg [13] : 0000000000000000000000000000000000000000000000000000000000002680
Arg [14] : 00000000000000000000000000000000000000000000000000000000000026c0
Arg [15] : 0000000000000000000000000000000000000000000000000000000000002700
Arg [16] : 0000000000000000000000000000000000000000000000000000000000002740
Arg [17] : 0000000000000000000000000000000000000000000000000000000000002780
Arg [18] : 00000000000000000000000000000000000000000000000000000000000027c0
Arg [19] : 0000000000000000000000000000000000000000000000000000000000002800
Arg [20] : 0000000000000000000000000000000000000000000000000000000000002840
Arg [21] : 0000000000000000000000000000000000000000000000000000000000002880
Arg [22] : 00000000000000000000000000000000000000000000000000000000000028c0
Arg [23] : 0000000000000000000000000000000000000000000000000000000000002900
Arg [24] : 0000000000000000000000000000000000000000000000000000000000002940
Arg [25] : 0000000000000000000000000000000000000000000000000000000000002980
Arg [26] : 00000000000000000000000000000000000000000000000000000000000029c0
Arg [27] : 0000000000000000000000000000000000000000000000000000000000002a00
Arg [28] : 0000000000000000000000000000000000000000000000000000000000002a40
Arg [29] : 0000000000000000000000000000000000000000000000000000000000002a80
Arg [30] : 0000000000000000000000000000000000000000000000000000000000002ac0
Arg [31] : 0000000000000000000000000000000000000000000000000000000000002b00
Arg [32] : 0000000000000000000000000000000000000000000000000000000000002b40
Arg [33] : 0000000000000000000000000000000000000000000000000000000000002b80
Arg [34] : 0000000000000000000000000000000000000000000000000000000000002bc0
Arg [35] : 0000000000000000000000000000000000000000000000000000000000002c00
Arg [36] : 0000000000000000000000000000000000000000000000000000000000002c40
Arg [37] : 0000000000000000000000000000000000000000000000000000000000002c80
Arg [38] : 0000000000000000000000000000000000000000000000000000000000002cc0
Arg [39] : 0000000000000000000000000000000000000000000000000000000000002d00
Arg [40] : 0000000000000000000000000000000000000000000000000000000000002d40
Arg [41] : 0000000000000000000000000000000000000000000000000000000000002d80
Arg [42] : 0000000000000000000000000000000000000000000000000000000000002dc0
Arg [43] : 0000000000000000000000000000000000000000000000000000000000002e00
Arg [44] : 0000000000000000000000000000000000000000000000000000000000002e40
Arg [45] : 0000000000000000000000000000000000000000000000000000000000002e80
Arg [46] : 0000000000000000000000000000000000000000000000000000000000002ec0
Arg [47] : 0000000000000000000000000000000000000000000000000000000000002f00
Arg [48] : 0000000000000000000000000000000000000000000000000000000000002f40
Arg [49] : 0000000000000000000000000000000000000000000000000000000000002f80
Arg [50] : 0000000000000000000000000000000000000000000000000000000000002fc0
Arg [51] : 0000000000000000000000000000000000000000000000000000000000003000
Arg [52] : 0000000000000000000000000000000000000000000000000000000000003040
Arg [53] : 0000000000000000000000000000000000000000000000000000000000003080
Arg [54] : 00000000000000000000000000000000000000000000000000000000000030c0
Arg [55] : 0000000000000000000000000000000000000000000000000000000000003100
Arg [56] : 0000000000000000000000000000000000000000000000000000000000003140
Arg [57] : 0000000000000000000000000000000000000000000000000000000000003180
Arg [58] : 00000000000000000000000000000000000000000000000000000000000031c0
Arg [59] : 0000000000000000000000000000000000000000000000000000000000003200
Arg [60] : 0000000000000000000000000000000000000000000000000000000000003240
Arg [61] : 0000000000000000000000000000000000000000000000000000000000003280
Arg [62] : 00000000000000000000000000000000000000000000000000000000000032c0
Arg [63] : 0000000000000000000000000000000000000000000000000000000000003300
Arg [64] : 0000000000000000000000000000000000000000000000000000000000003340
Arg [65] : 0000000000000000000000000000000000000000000000000000000000003380
Arg [66] : 00000000000000000000000000000000000000000000000000000000000033c0
Arg [67] : 0000000000000000000000000000000000000000000000000000000000003400
Arg [68] : 0000000000000000000000000000000000000000000000000000000000003440
Arg [69] : 0000000000000000000000000000000000000000000000000000000000003480
Arg [70] : 00000000000000000000000000000000000000000000000000000000000034c0
Arg [71] : 0000000000000000000000000000000000000000000000000000000000003500
Arg [72] : 0000000000000000000000000000000000000000000000000000000000003540
Arg [73] : 0000000000000000000000000000000000000000000000000000000000003580
Arg [74] : 00000000000000000000000000000000000000000000000000000000000035c0
Arg [75] : 0000000000000000000000000000000000000000000000000000000000003600
Arg [76] : 0000000000000000000000000000000000000000000000000000000000003640
Arg [77] : 0000000000000000000000000000000000000000000000000000000000003680
Arg [78] : 00000000000000000000000000000000000000000000000000000000000036c0
Arg [79] : 0000000000000000000000000000000000000000000000000000000000003700
Arg [80] : 0000000000000000000000000000000000000000000000000000000000003740
Arg [81] : 0000000000000000000000000000000000000000000000000000000000003780
Arg [82] : 00000000000000000000000000000000000000000000000000000000000037c0
Arg [83] : 0000000000000000000000000000000000000000000000000000000000003800
Arg [84] : 0000000000000000000000000000000000000000000000000000000000003840
Arg [85] : 0000000000000000000000000000000000000000000000000000000000003880
Arg [86] : 00000000000000000000000000000000000000000000000000000000000038c0
Arg [87] : 0000000000000000000000000000000000000000000000000000000000003900
Arg [88] : 0000000000000000000000000000000000000000000000000000000000003940
Arg [89] : 0000000000000000000000000000000000000000000000000000000000003980
Arg [90] : 00000000000000000000000000000000000000000000000000000000000039c0
Arg [91] : 0000000000000000000000000000000000000000000000000000000000003a00
Arg [92] : 0000000000000000000000000000000000000000000000000000000000003a40
Arg [93] : 0000000000000000000000000000000000000000000000000000000000003a80
Arg [94] : 0000000000000000000000000000000000000000000000000000000000003ac0
Arg [95] : 0000000000000000000000000000000000000000000000000000000000003b00
Arg [96] : 0000000000000000000000000000000000000000000000000000000000003b40
Arg [97] : 0000000000000000000000000000000000000000000000000000000000003b80
Arg [98] : 0000000000000000000000000000000000000000000000000000000000003bc0
Arg [99] : 0000000000000000000000000000000000000000000000000000000000003c00
Arg [100] : 0000000000000000000000000000000000000000000000000000000000003c40
Arg [101] : 0000000000000000000000000000000000000000000000000000000000003c80
Arg [102] : 0000000000000000000000000000000000000000000000000000000000003cc0
Arg [103] : 0000000000000000000000000000000000000000000000000000000000003d00
Arg [104] : 0000000000000000000000000000000000000000000000000000000000003d40
Arg [105] : 0000000000000000000000000000000000000000000000000000000000003d80
Arg [106] : 0000000000000000000000000000000000000000000000000000000000003dc0
Arg [107] : 0000000000000000000000000000000000000000000000000000000000003e00
Arg [108] : 0000000000000000000000000000000000000000000000000000000000003e40
Arg [109] : 0000000000000000000000000000000000000000000000000000000000003e80
Arg [110] : 0000000000000000000000000000000000000000000000000000000000003ec0
Arg [111] : 0000000000000000000000000000000000000000000000000000000000003f00
Arg [112] : 0000000000000000000000000000000000000000000000000000000000003f40
Arg [113] : 0000000000000000000000000000000000000000000000000000000000003f80
Arg [114] : 0000000000000000000000000000000000000000000000000000000000003fc0
Arg [115] : 0000000000000000000000000000000000000000000000000000000000004000
Arg [116] : 0000000000000000000000000000000000000000000000000000000000004040
Arg [117] : 0000000000000000000000000000000000000000000000000000000000004080
Arg [118] : 00000000000000000000000000000000000000000000000000000000000040c0
Arg [119] : 0000000000000000000000000000000000000000000000000000000000004100
Arg [120] : 0000000000000000000000000000000000000000000000000000000000004140
Arg [121] : 0000000000000000000000000000000000000000000000000000000000004180
Arg [122] : 00000000000000000000000000000000000000000000000000000000000041c0
Arg [123] : 0000000000000000000000000000000000000000000000000000000000004200
Arg [124] : 0000000000000000000000000000000000000000000000000000000000004240
Arg [125] : 0000000000000000000000000000000000000000000000000000000000004280
Arg [126] : 00000000000000000000000000000000000000000000000000000000000042c0
Arg [127] : 0000000000000000000000000000000000000000000000000000000000004300
Arg [128] : 0000000000000000000000000000000000000000000000000000000000004340
Arg [129] : 0000000000000000000000000000000000000000000000000000000000004380
Arg [130] : 00000000000000000000000000000000000000000000000000000000000043c0
Arg [131] : 0000000000000000000000000000000000000000000000000000000000004400
Arg [132] : 0000000000000000000000000000000000000000000000000000000000004440
Arg [133] : 0000000000000000000000000000000000000000000000000000000000004480
Arg [134] : 00000000000000000000000000000000000000000000000000000000000044c0
Arg [135] : 0000000000000000000000000000000000000000000000000000000000004500
Arg [136] : 0000000000000000000000000000000000000000000000000000000000004540
Arg [137] : 0000000000000000000000000000000000000000000000000000000000004580
Arg [138] : 00000000000000000000000000000000000000000000000000000000000045c0
Arg [139] : 0000000000000000000000000000000000000000000000000000000000004600
Arg [140] : 0000000000000000000000000000000000000000000000000000000000004640
Arg [141] : 0000000000000000000000000000000000000000000000000000000000004680
Arg [142] : 00000000000000000000000000000000000000000000000000000000000046c0
Arg [143] : 0000000000000000000000000000000000000000000000000000000000004700
Arg [144] : 0000000000000000000000000000000000000000000000000000000000004740
Arg [145] : 0000000000000000000000000000000000000000000000000000000000004780
Arg [146] : 00000000000000000000000000000000000000000000000000000000000047c0
Arg [147] : 0000000000000000000000000000000000000000000000000000000000004800
Arg [148] : 0000000000000000000000000000000000000000000000000000000000004840
Arg [149] : 0000000000000000000000000000000000000000000000000000000000004880
Arg [150] : 00000000000000000000000000000000000000000000000000000000000048c0
Arg [151] : 0000000000000000000000000000000000000000000000000000000000004900
Arg [152] : 0000000000000000000000000000000000000000000000000000000000004940
Arg [153] : 0000000000000000000000000000000000000000000000000000000000004980
Arg [154] : 00000000000000000000000000000000000000000000000000000000000049c0
Arg [155] : 0000000000000000000000000000000000000000000000000000000000004a00
Arg [156] : 0000000000000000000000000000000000000000000000000000000000004a40
Arg [157] : 0000000000000000000000000000000000000000000000000000000000004a80
Arg [158] : 0000000000000000000000000000000000000000000000000000000000004ac0
Arg [159] : 0000000000000000000000000000000000000000000000000000000000004b00
Arg [160] : 0000000000000000000000000000000000000000000000000000000000004b40
Arg [161] : 0000000000000000000000000000000000000000000000000000000000004b80
Arg [162] : 0000000000000000000000000000000000000000000000000000000000004bc0
Arg [163] : 0000000000000000000000000000000000000000000000000000000000004c00
Arg [164] : 0000000000000000000000000000000000000000000000000000000000004c40
Arg [165] : 0000000000000000000000000000000000000000000000000000000000004c80
Arg [166] : 0000000000000000000000000000000000000000000000000000000000004cc0
Arg [167] : 0000000000000000000000000000000000000000000000000000000000004d00
Arg [168] : 0000000000000000000000000000000000000000000000000000000000004d40
Arg [169] : 0000000000000000000000000000000000000000000000000000000000004d80
Arg [170] : 0000000000000000000000000000000000000000000000000000000000004dc0
Arg [171] : 0000000000000000000000000000000000000000000000000000000000004e00
Arg [172] : 0000000000000000000000000000000000000000000000000000000000004e40
Arg [173] : 0000000000000000000000000000000000000000000000000000000000004e80
Arg [174] : 0000000000000000000000000000000000000000000000000000000000004ec0
Arg [175] : 0000000000000000000000000000000000000000000000000000000000004f00
Arg [176] : 0000000000000000000000000000000000000000000000000000000000004f40
Arg [177] : 0000000000000000000000000000000000000000000000000000000000004f80
Arg [178] : 0000000000000000000000000000000000000000000000000000000000004fc0
Arg [179] : 0000000000000000000000000000000000000000000000000000000000005000
Arg [180] : 0000000000000000000000000000000000000000000000000000000000005040
Arg [181] : 0000000000000000000000000000000000000000000000000000000000005080
Arg [182] : 00000000000000000000000000000000000000000000000000000000000050c0
Arg [183] : 0000000000000000000000000000000000000000000000000000000000005100
Arg [184] : 0000000000000000000000000000000000000000000000000000000000005140
Arg [185] : 0000000000000000000000000000000000000000000000000000000000005180
Arg [186] : 00000000000000000000000000000000000000000000000000000000000051c0
Arg [187] : 0000000000000000000000000000000000000000000000000000000000005200
Arg [188] : 0000000000000000000000000000000000000000000000000000000000005240
Arg [189] : 0000000000000000000000000000000000000000000000000000000000005280
Arg [190] : 00000000000000000000000000000000000000000000000000000000000052c0
Arg [191] : 0000000000000000000000000000000000000000000000000000000000005300
Arg [192] : 0000000000000000000000000000000000000000000000000000000000005340
Arg [193] : 0000000000000000000000000000000000000000000000000000000000005380
Arg [194] : 00000000000000000000000000000000000000000000000000000000000053c0
Arg [195] : 0000000000000000000000000000000000000000000000000000000000005400
Arg [196] : 0000000000000000000000000000000000000000000000000000000000005440
Arg [197] : 0000000000000000000000000000000000000000000000000000000000005480
Arg [198] : 00000000000000000000000000000000000000000000000000000000000054c0
Arg [199] : 0000000000000000000000000000000000000000000000000000000000005500
Arg [200] : 0000000000000000000000000000000000000000000000000000000000005540
Arg [201] : 0000000000000000000000000000000000000000000000000000000000005580
Arg [202] : 00000000000000000000000000000000000000000000000000000000000055c0
Arg [203] : 0000000000000000000000000000000000000000000000000000000000005600
Arg [204] : 0000000000000000000000000000000000000000000000000000000000005640
Arg [205] : 0000000000000000000000000000000000000000000000000000000000005680
Arg [206] : 00000000000000000000000000000000000000000000000000000000000056c0
Arg [207] : 0000000000000000000000000000000000000000000000000000000000005700
Arg [208] : 0000000000000000000000000000000000000000000000000000000000005740
Arg [209] : 0000000000000000000000000000000000000000000000000000000000005780
Arg [210] : 00000000000000000000000000000000000000000000000000000000000057c0
Arg [211] : 0000000000000000000000000000000000000000000000000000000000005800
Arg [212] : 0000000000000000000000000000000000000000000000000000000000005840
Arg [213] : 0000000000000000000000000000000000000000000000000000000000005880
Arg [214] : 00000000000000000000000000000000000000000000000000000000000058c0
Arg [215] : 0000000000000000000000000000000000000000000000000000000000005900
Arg [216] : 0000000000000000000000000000000000000000000000000000000000005940
Arg [217] : 0000000000000000000000000000000000000000000000000000000000005980
Arg [218] : 00000000000000000000000000000000000000000000000000000000000059c0
Arg [219] : 0000000000000000000000000000000000000000000000000000000000005a00
Arg [220] : 0000000000000000000000000000000000000000000000000000000000005a40
Arg [221] : 0000000000000000000000000000000000000000000000000000000000005a80
Arg [222] : 0000000000000000000000000000000000000000000000000000000000005ac0
Arg [223] : 0000000000000000000000000000000000000000000000000000000000005b00
Arg [224] : 0000000000000000000000000000000000000000000000000000000000005b40
Arg [225] : 0000000000000000000000000000000000000000000000000000000000005b80
Arg [226] : 0000000000000000000000000000000000000000000000000000000000005bc0
Arg [227] : 0000000000000000000000000000000000000000000000000000000000005c00
Arg [228] : 0000000000000000000000000000000000000000000000000000000000005c40
Arg [229] : 0000000000000000000000000000000000000000000000000000000000005c80
Arg [230] : 0000000000000000000000000000000000000000000000000000000000005cc0
Arg [231] : 0000000000000000000000000000000000000000000000000000000000005d00
Arg [232] : 0000000000000000000000000000000000000000000000000000000000005d40
Arg [233] : 0000000000000000000000000000000000000000000000000000000000005d80
Arg [234] : 0000000000000000000000000000000000000000000000000000000000005dc0
Arg [235] : 0000000000000000000000000000000000000000000000000000000000005e00
Arg [236] : 0000000000000000000000000000000000000000000000000000000000005e40
Arg [237] : 0000000000000000000000000000000000000000000000000000000000005e80
Arg [238] : 0000000000000000000000000000000000000000000000000000000000005ec0
Arg [239] : 0000000000000000000000000000000000000000000000000000000000005f00
Arg [240] : 0000000000000000000000000000000000000000000000000000000000005f40
Arg [241] : 0000000000000000000000000000000000000000000000000000000000005f80
Arg [242] : 0000000000000000000000000000000000000000000000000000000000005fc0
Arg [243] : 0000000000000000000000000000000000000000000000000000000000006000
Arg [244] : 0000000000000000000000000000000000000000000000000000000000006040
Arg [245] : 0000000000000000000000000000000000000000000000000000000000006080
Arg [246] : 00000000000000000000000000000000000000000000000000000000000060c0
Arg [247] : 0000000000000000000000000000000000000000000000000000000000006100
Arg [248] : 0000000000000000000000000000000000000000000000000000000000006140
Arg [249] : 0000000000000000000000000000000000000000000000000000000000006180
Arg [250] : 00000000000000000000000000000000000000000000000000000000000061c0
Arg [251] : 0000000000000000000000000000000000000000000000000000000000006200
Arg [252] : 0000000000000000000000000000000000000000000000000000000000006240
Arg [253] : 0000000000000000000000000000000000000000000000000000000000006280
Arg [254] : 00000000000000000000000000000000000000000000000000000000000062c0
Arg [255] : 0000000000000000000000000000000000000000000000000000000000006300
Arg [256] : 0000000000000000000000000000000000000000000000000000000000006340
Arg [257] : 0000000000000000000000000000000000000000000000000000000000006380
Arg [258] : 00000000000000000000000000000000000000000000000000000000000063c0
Arg [259] : 0000000000000000000000000000000000000000000000000000000000006400
Arg [260] : 0000000000000000000000000000000000000000000000000000000000006440
Arg [261] : 0000000000000000000000000000000000000000000000000000000000006480
Arg [262] : 00000000000000000000000000000000000000000000000000000000000064c0
Arg [263] : 0000000000000000000000000000000000000000000000000000000000006500
Arg [264] : 0000000000000000000000000000000000000000000000000000000000006540
Arg [265] : 0000000000000000000000000000000000000000000000000000000000006580
Arg [266] : 00000000000000000000000000000000000000000000000000000000000065c0
Arg [267] : 0000000000000000000000000000000000000000000000000000000000006600
Arg [268] : 0000000000000000000000000000000000000000000000000000000000006640
Arg [269] : 0000000000000000000000000000000000000000000000000000000000006680
Arg [270] : 00000000000000000000000000000000000000000000000000000000000066c0
Arg [271] : 0000000000000000000000000000000000000000000000000000000000006700
Arg [272] : 0000000000000000000000000000000000000000000000000000000000006740
Arg [273] : 0000000000000000000000000000000000000000000000000000000000006780
Arg [274] : 00000000000000000000000000000000000000000000000000000000000067c0
Arg [275] : 0000000000000000000000000000000000000000000000000000000000006800
Arg [276] : 0000000000000000000000000000000000000000000000000000000000006840
Arg [277] : 0000000000000000000000000000000000000000000000000000000000006880
Arg [278] : 00000000000000000000000000000000000000000000000000000000000068c0
Arg [279] : 0000000000000000000000000000000000000000000000000000000000006900
Arg [280] : 0000000000000000000000000000000000000000000000000000000000006940
Arg [281] : 0000000000000000000000000000000000000000000000000000000000006980
Arg [282] : 00000000000000000000000000000000000000000000000000000000000069c0
Arg [283] : 0000000000000000000000000000000000000000000000000000000000006a00
Arg [284] : 0000000000000000000000000000000000000000000000000000000000006a40
Arg [285] : 0000000000000000000000000000000000000000000000000000000000006a80
Arg [286] : 0000000000000000000000000000000000000000000000000000000000006ac0
Arg [287] : 0000000000000000000000000000000000000000000000000000000000006b00
Arg [288] : 0000000000000000000000000000000000000000000000000000000000006b40
Arg [289] : 0000000000000000000000000000000000000000000000000000000000006b80
Arg [290] : 0000000000000000000000000000000000000000000000000000000000006bc0
Arg [291] : 0000000000000000000000000000000000000000000000000000000000006c00
Arg [292] : 0000000000000000000000000000000000000000000000000000000000006c40
Arg [293] : 0000000000000000000000000000000000000000000000000000000000006c80
Arg [294] : 0000000000000000000000000000000000000000000000000000000000006cc0
Arg [295] : 0000000000000000000000000000000000000000000000000000000000006d00
Arg [296] : 0000000000000000000000000000000000000000000000000000000000006d40
Arg [297] : 0000000000000000000000000000000000000000000000000000000000006d80
Arg [298] : 0000000000000000000000000000000000000000000000000000000000006dc0
Arg [299] : 0000000000000000000000000000000000000000000000000000000000006e00
Arg [300] : 0000000000000000000000000000000000000000000000000000000000006e40
Arg [301] : 0000000000000000000000000000000000000000000000000000000000006e80
Arg [302] : 0000000000000000000000000000000000000000000000000000000000006ec0
Arg [303] : 0000000000000000000000000000000000000000000000000000000000006f00
Arg [304] : 0000000000000000000000000000000000000000000000000000000000006f40
Arg [305] : 0000000000000000000000000000000000000000000000000000000000006f80
Arg [306] : 0000000000000000000000000000000000000000000000000000000000006fc0
Arg [307] : 0000000000000000000000000000000000000000000000000000000000007000
Arg [308] : 0000000000000000000000000000000000000000000000000000000000007040
Arg [309] : 0000000000000000000000000000000000000000000000000000000000007080
Arg [310] : 00000000000000000000000000000000000000000000000000000000000070c0
Arg [311] : 0000000000000000000000000000000000000000000000000000000000007100
Arg [312] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [313] : 2330303933303600000000000000000000000000000000000000000000000000
Arg [314] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [315] : 2330306165643200000000000000000000000000000000000000000000000000
Arg [316] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [317] : 2332323232363300000000000000000000000000000000000000000000000000
Arg [318] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [319] : 2332393234356100000000000000000000000000000000000000000000000000
Arg [320] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [321] : 2333663366373400000000000000000000000000000000000000000000000000
Arg [322] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [323] : 2334356331386600000000000000000000000000000000000000000000000000
Arg [324] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [325] : 2334363731633100000000000000000000000000000000000000000000000000
Arg [326] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [327] : 2335333730393100000000000000000000000000000000000000000000000000
Arg [328] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [329] : 2335336134613100000000000000000000000000000000000000000000000000
Arg [330] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [331] : 2335353565346200000000000000000000000000000000000000000000000000
Arg [332] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [333] : 2335663632326200000000000000000000000000000000000000000000000000
Arg [334] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [335] : 2336303338333000000000000000000000000000000000000000000000000000
Arg [336] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [337] : 2336333962666600000000000000000000000000000000000000000000000000
Arg [338] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [339] : 2336363264393100000000000000000000000000000000000000000000000000
Arg [340] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [341] : 2337636464646400000000000000000000000000000000000000000000000000
Arg [342] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [343] : 2338363236383100000000000000000000000000000000000000000000000000
Arg [344] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [345] : 2338393330366400000000000000000000000000000000000000000000000000
Arg [346] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [347] : 2338663937346100000000000000000000000000000000000000000000000000
Arg [348] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [349] : 2339303663346600000000000000000000000000000000000000000000000000
Arg [350] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [351] : 2339363234326500000000000000000000000000000000000000000000000000
Arg [352] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [353] : 2339633637396300000000000000000000000000000000000000000000000000
Arg [354] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [355] : 2362303761353600000000000000000000000000000000000000000000000000
Arg [356] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [357] : 2364373663666200000000000000000000000000000000000000000000000000
Arg [358] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [359] : 2364636365623300000000000000000000000000000000000000000000000000
Arg [360] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [361] : 2365373030346600000000000000000000000000000000000000000000000000
Arg [362] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [363] : 2365386431303000000000000000000000000000000000000000000000000000
Arg [364] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [365] : 2365656333396100000000000000000000000000000000000000000000000000
Arg [366] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [367] : 2366323030303000000000000000000000000000000000000000000000000000
Arg [368] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [369] : 2366663637303000000000000000000000000000000000000000000000000000
Arg [370] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [371] : 2366663935336600000000000000000000000000000000000000000000000000
Arg [372] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [373] : 2366663961386500000000000000000000000000000000000000000000000000
Arg [374] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [375] : 2330303030303000000000000000000000000000000000000000000000000000
Arg [376] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [377] : 2330306666613800000000000000000000000000000000000000000000000000
Arg [378] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [379] : 2330313635303100000000000000000000000000000000000000000000000000
Arg [380] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [381] : 2330393030666600000000000000000000000000000000000000000000000000
Arg [382] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [383] : 2330623361363500000000000000000000000000000000000000000000000000
Arg [384] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [385] : 2332323230333400000000000000000000000000000000000000000000000000
Arg [386] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [387] : 2333333439356400000000000000000000000000000000000000000000000000
Arg [388] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [389] : 2333393339333900000000000000000000000000000000000000000000000000
Arg [390] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [391] : 2334383339653600000000000000000000000000000000000000000000000000
Arg [392] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [393] : 2334383936613600000000000000000000000000000000000000000000000000
Arg [394] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [395] : 2335623665653100000000000000000000000000000000000000000000000000
Arg [396] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [397] : 2335643262663500000000000000000000000000000000000000000000000000
Arg [398] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [399] : 2335643738376100000000000000000000000000000000000000000000000000
Arg [400] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [401] : 2336323737386100000000000000000000000000000000000000000000000000
Arg [402] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [403] : 2336353762366600000000000000000000000000000000000000000000000000
Arg [404] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [405] : 2336383030663900000000000000000000000000000000000000000000000000
Arg [406] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [407] : 2336626135653400000000000000000000000000000000000000000000000000
Arg [408] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [409] : 2336663331396100000000000000000000000000000000000000000000000000
Arg [410] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [411] : 2337653565616100000000000000000000000000000000000000000000000000
Arg [412] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [413] : 2338663536336200000000000000000000000000000000000000000000000000
Arg [414] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [415] : 2339396535353000000000000000000000000000000000000000000000000000
Arg [416] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [417] : 2363626462666300000000000000000000000000000000000000000000000000
Arg [418] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [419] : 2364313866376500000000000000000000000000000000000000000000000000
Arg [420] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [421] : 2364353135313500000000000000000000000000000000000000000000000000
Arg [422] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [423] : 2364373762626100000000000000000000000000000000000000000000000000
Arg [424] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [425] : 2366626632333600000000000000000000000000000000000000000000000000
Arg [426] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [427] : 2366666134303000000000000000000000000000000000000000000000000000
Arg [428] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [429] : 2330303030666600000000000000000000000000000000000000000000000000
Arg [430] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [431] : 2331623266306100000000000000000000000000000000000000000000000000
Arg [432] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [433] : 2333306333333100000000000000000000000000000000000000000000000000
Arg [434] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [435] : 2333333633623800000000000000000000000000000000000000000000000000
Arg [436] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [437] : 2334313431343100000000000000000000000000000000000000000000000000
Arg [438] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [439] : 2335393264323600000000000000000000000000000000000000000000000000
Arg [440] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [441] : 2335393536353200000000000000000000000000000000000000000000000000
Arg [442] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [443] : 2336333063303000000000000000000000000000000000000000000000000000
Arg [444] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [445] : 2336363339333100000000000000000000000000000000000000000000000000
Arg [446] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [447] : 2336393661366100000000000000000000000000000000000000000000000000
Arg [448] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [449] : 2337326265303600000000000000000000000000000000000000000000000000
Arg [450] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [451] : 2339393961393900000000000000000000000000000000000000000000000000
Arg [452] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [453] : 2361303965396500000000000000000000000000000000000000000000000000
Arg [454] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [455] : 2362323733303100000000000000000000000000000000000000000000000000
Arg [456] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [457] : 2362326362646200000000000000000000000000000000000000000000000000
Arg [458] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [459] : 2362333030303000000000000000000000000000000000000000000000000000
Arg [460] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [461] : 2364663731323600000000000000000000000000000000000000000000000000
Arg [462] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [463] : 2365346463666600000000000000000000000000000000000000000000000000
Arg [464] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [465] : 2366393734363900000000000000000000000000000000000000000000000000
Arg [466] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [467] : 2366396266383000000000000000000000000000000000000000000000000000
Arg [468] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [469] : 2366663030303000000000000000000000000000000000000000000000000000
Arg [470] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [471] : 2366663030666600000000000000000000000000000000000000000000000000
Arg [472] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [473] : 2330303662303400000000000000000000000000000000000000000000000000
Arg [474] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [475] : 2330306666303000000000000000000000000000000000000000000000000000
Arg [476] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [477] : 2330313837306600000000000000000000000000000000000000000000000000
Arg [478] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [479] : 2331613039353600000000000000000000000000000000000000000000000000
Arg [480] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [481] : 2331623162336200000000000000000000000000000000000000000000000000
Arg [482] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [483] : 2332343166623100000000000000000000000000000000000000000000000000
Arg [484] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [485] : 2333303237363300000000000000000000000000000000000000000000000000
Arg [486] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [487] : 2333363332353900000000000000000000000000000000000000000000000000
Arg [488] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [489] : 2335323462323400000000000000000000000000000000000000000000000000
Arg [490] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [491] : 2335653564666500000000000000000000000000000000000000000000000000
Arg [492] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [493] : 2337313561396600000000000000000000000000000000000000000000000000
Arg [494] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [495] : 2337373932373200000000000000000000000000000000000000000000000000
Arg [496] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [497] : 2338393939613100000000000000000000000000000000000000000000000000
Arg [498] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [499] : 2361656434663000000000000000000000000000000000000000000000000000
Arg [500] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [501] : 2362363636363600000000000000000000000000000000000000000000000000
Arg [502] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [503] : 2362633030653000000000000000000000000000000000000000000000000000
Arg [504] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [505] : 2365306365383100000000000000000000000000000000000000000000000000
Arg [506] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [507] : 2366666666303000000000000000000000000000000000000000000000000000
Arg [508] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [509] : 2330303236666600000000000000000000000000000000000000000000000000
Arg [510] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [511] : 2330353030663500000000000000000000000000000000000000000000000000
Arg [512] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [513] : 2332353539613200000000000000000000000000000000000000000000000000
Arg [514] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [515] : 2335633337356500000000000000000000000000000000000000000000000000
Arg [516] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [517] : 2336313461643000000000000000000000000000000000000000000000000000
Arg [518] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [519] : 2336623639353000000000000000000000000000000000000000000000000000
Arg [520] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [521] : 2338303830383000000000000000000000000000000000000000000000000000
Arg [522] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [523] : 2362393030303000000000000000000000000000000000000000000000000000
Arg [524] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [525] : 2364633335333500000000000000000000000000000000000000000000000000
Arg [526] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [527] : 2366616366313500000000000000000000000000000000000000000000000000
Arg [528] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [529] : 2366663337303400000000000000000000000000000000000000000000000000
Arg [530] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [531] : 2330303333303000000000000000000000000000000000000000000000000000
Arg [532] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [533] : 2330613030666600000000000000000000000000000000000000000000000000
Arg [534] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [535] : 2331653134363900000000000000000000000000000000000000000000000000
Arg [536] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [537] : 2332343132323700000000000000000000000000000000000000000000000000
Arg [538] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [539] : 2332613434613100000000000000000000000000000000000000000000000000
Arg [540] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [541] : 2333323363333900000000000000000000000000000000000000000000000000
Arg [542] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [543] : 2333333333333300000000000000000000000000000000000000000000000000
Arg [544] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [545] : 2333373436366400000000000000000000000000000000000000000000000000
Arg [546] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [547] : 2333613065306500000000000000000000000000000000000000000000000000
Arg [548] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [549] : 2333623366356400000000000000000000000000000000000000000000000000
Arg [550] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [551] : 2334393430373200000000000000000000000000000000000000000000000000
Arg [552] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [553] : 2335383630346100000000000000000000000000000000000000000000000000
Arg [554] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [555] : 2335643364666600000000000000000000000000000000000000000000000000
Arg [556] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [557] : 2335643835383600000000000000000000000000000000000000000000000000
Arg [558] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [559] : 2335653665356100000000000000000000000000000000000000000000000000
Arg [560] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [561] : 2335663838613500000000000000000000000000000000000000000000000000
Arg [562] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [563] : 2336333136363200000000000000000000000000000000000000000000000000
Arg [564] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [565] : 2336343865353700000000000000000000000000000000000000000000000000
Arg [566] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [567] : 2337313764623500000000000000000000000000000000000000000000000000
Arg [568] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [569] : 2337623764306600000000000000000000000000000000000000000000000000
Arg [570] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [571] : 2338646336666600000000000000000000000000000000000000000000000000
Arg [572] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [573] : 2339626164623700000000000000000000000000000000000000000000000000
Arg [574] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [575] : 2361626133666600000000000000000000000000000000000000000000000000
Arg [576] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [577] : 2363326131333300000000000000000000000000000000000000000000000000
Arg [578] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [579] : 2363356335633500000000000000000000000000000000000000000000000000
Arg [580] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [581] : 2364353765623100000000000000000000000000000000000000000000000000
Arg [582] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [583] : 2364396130363600000000000000000000000000000000000000000000000000
Arg [584] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [585] : 2365623165616100000000000000000000000000000000000000000000000000
Arg [586] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [587] : 2365643163323400000000000000000000000000000000000000000000000000
Arg [588] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [589] : 2365643835373200000000000000000000000000000000000000000000000000
Arg [590] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [591] : 2366353030666600000000000000000000000000000000000000000000000000
Arg [592] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [593] : 2366666237613400000000000000000000000000000000000000000000000000
Arg [594] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [595] : 2366666531303300000000000000000000000000000000000000000000000000
Arg [596] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [597] : 2366666666666600000000000000000000000000000000000000000000000000
Arg [598] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [599] : 2331303030303000000000000000000000000000000000000000000000000000
Arg [600] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [601] : 2331303234303100000000000000000000000000000000000000000000000000
Arg [602] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [603] : 2333313430396100000000000000000000000000000000000000000000000000
Arg [604] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [605] : 2333393263303000000000000000000000000000000000000000000000000000
Arg [606] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [607] : 2338336539666600000000000000000000000000000000000000000000000000
Arg [608] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [609] : 2339356137636400000000000000000000000000000000000000000000000000
Arg [610] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [611] : 2332313538303000000000000000000000000000000000000000000000000000
Arg [612] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [613] : 2333353538303000000000000000000000000000000000000000000000000000
Arg [614] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [615] : 2333373732373500000000000000000000000000000000000000000000000000
Arg [616] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [617] : 2333383266633100000000000000000000000000000000000000000000000000
Arg [618] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [619] : 2334343031346500000000000000000000000000000000000000000000000000
Arg [620] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [621] : 2334663536343100000000000000000000000000000000000000000000000000
Arg [622] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [623] : 2336343562663400000000000000000000000000000000000000000000000000
Arg [624] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [625] : 2336383836376100000000000000000000000000000000000000000000000000
Arg [626] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [627] : 2362373962623500000000000000000000000000000000000000000000000000
Arg [628] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [629] : 2330303665363900000000000000000000000000000000000000000000000000
Arg [630] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [631] : 2330306262666500000000000000000000000000000000000000000000000000
Arg [632] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [633] : 2330323339613100000000000000000000000000000000000000000000000000
Arg [634] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [635] : 2330373738386600000000000000000000000000000000000000000000000000
Arg [636] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [637] : 2330613537346200000000000000000000000000000000000000000000000000
Arg [638] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [639] : 2330633034303500000000000000000000000000000000000000000000000000
Arg [640] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [641] : 2330643131313500000000000000000000000000000000000000000000000000
Arg [642] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [643] : 2330643636303000000000000000000000000000000000000000000000000000
Arg [644] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [645] : 2330653835373400000000000000000000000000000000000000000000000000
Arg [646] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [647] : 2331313062313100000000000000000000000000000000000000000000000000
Arg [648] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [649] : 2331313562333400000000000000000000000000000000000000000000000000
Arg [650] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [651] : 2331353164326300000000000000000000000000000000000000000000000000
Arg [652] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [653] : 2331363062306200000000000000000000000000000000000000000000000000
Arg [654] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [655] : 2331393239663400000000000000000000000000000000000000000000000000
Arg [656] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [657] : 2331393333366500000000000000000000000000000000000000000000000000
Arg [658] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [659] : 2331613161316100000000000000000000000000000000000000000000000000
Arg [660] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [661] : 2331623162316200000000000000000000000000000000000000000000000000
Arg [662] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [663] : 2331633738363200000000000000000000000000000000000000000000000000
Arg [664] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [665] : 2331656264343300000000000000000000000000000000000000000000000000
Arg [666] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [667] : 2331663166316600000000000000000000000000000000000000000000000000
Arg [668] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [669] : 2331663432303700000000000000000000000000000000000000000000000000
Arg [670] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [671] : 2332323366613300000000000000000000000000000000000000000000000000
Arg [672] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [673] : 2332333262616200000000000000000000000000000000000000000000000000
Arg [674] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [675] : 2332353962323400000000000000000000000000000000000000000000000000
Arg [676] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [677] : 2332363233346600000000000000000000000000000000000000000000000000
Arg [678] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [679] : 2332363335323600000000000000000000000000000000000000000000000000
Arg [680] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [681] : 2332366461666600000000000000000000000000000000000000000000000000
Arg [682] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [683] : 2332383663343000000000000000000000000000000000000000000000000000
Arg [684] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [685] : 2332393238333500000000000000000000000000000000000000000000000000
Arg [686] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [687] : 2332393961633500000000000000000000000000000000000000000000000000
Arg [688] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [689] : 2332613336623100000000000000000000000000000000000000000000000000
Arg [690] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [691] : 2333303335333000000000000000000000000000000000000000000000000000
Arg [692] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [693] : 2333303630383200000000000000000000000000000000000000000000000000
Arg [694] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [695] : 2333313139353500000000000000000000000000000000000000000000000000
Arg [696] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [697] : 2333313330616400000000000000000000000000000000000000000000000000
Arg [698] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [699] : 2333336134616400000000000000000000000000000000000000000000000000
Arg [700] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [701] : 2333343030666600000000000000000000000000000000000000000000000000
Arg [702] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [703] : 2333343339326600000000000000000000000000000000000000000000000000
Arg [704] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [705] : 2333346137653500000000000000000000000000000000000000000000000000
Arg [706] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [707] : 2333366437653500000000000000000000000000000000000000000000000000
Arg [708] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [709] : 2333633135313800000000000000000000000000000000000000000000000000
Arg [710] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [711] : 2333643365396200000000000000000000000000000000000000000000000000
Arg [712] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [713] : 2333666264616300000000000000000000000000000000000000000000000000
Arg [714] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [715] : 2334313538336200000000000000000000000000000000000000000000000000
Arg [716] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [717] : 2334323334316400000000000000000000000000000000000000000000000000
Arg [718] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [719] : 2334326264343100000000000000000000000000000000000000000000000000
Arg [720] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [721] : 2334333632393600000000000000000000000000000000000000000000000000
Arg [722] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [723] : 2334366666663300000000000000000000000000000000000000000000000000
Arg [724] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [725] : 2334373031363200000000000000000000000000000000000000000000000000
Arg [726] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [727] : 2334373462353800000000000000000000000000000000000000000000000000
Arg [728] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [729] : 2334383034323700000000000000000000000000000000000000000000000000
Arg [730] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [731] : 2334383834343800000000000000000000000000000000000000000000000000
Arg [732] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [733] : 2334396666666600000000000000000000000000000000000000000000000000
Arg [734] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [735] : 2334623232323200000000000000000000000000000000000000000000000000
Arg [736] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [737] : 2334623639326600000000000000000000000000000000000000000000000000
Arg [738] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [739] : 2334636164653900000000000000000000000000000000000000000000000000
Arg [740] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [741] : 2334663462333200000000000000000000000000000000000000000000000000
Arg [742] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [743] : 2335323264313100000000000000000000000000000000000000000000000000
Arg [744] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [745] : 2335343365306200000000000000000000000000000000000000000000000000
Arg [746] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [747] : 2335363738396600000000000000000000000000000000000000000000000000
Arg [748] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [749] : 2335363961626200000000000000000000000000000000000000000000000000
Arg [750] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [751] : 2335373638333200000000000000000000000000000000000000000000000000
Arg [752] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [753] : 2335376364666600000000000000000000000000000000000000000000000000
Arg [754] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [755] : 2335666364653400000000000000000000000000000000000000000000000000
Arg [756] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [757] : 2336303365313400000000000000000000000000000000000000000000000000
Arg [758] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [759] : 2336306533306400000000000000000000000000000000000000000000000000
Arg [760] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [761] : 2336316661613500000000000000000000000000000000000000000000000000
Arg [762] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [763] : 2336336437363100000000000000000000000000000000000000000000000000
Arg [764] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [765] : 2336363230333800000000000000000000000000000000000000000000000000
Arg [766] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [767] : 2336373564366200000000000000000000000000000000000000000000000000
Arg [768] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [769] : 2336393832383300000000000000000000000000000000000000000000000000
Arg [770] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [771] : 2336616265333000000000000000000000000000000000000000000000000000
Arg [772] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [773] : 2336653664353000000000000000000000000000000000000000000000000000
Arg [774] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [775] : 2337336165646500000000000000000000000000000000000000000000000000
Arg [776] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [777] : 2337343731636200000000000000000000000000000000000000000000000000
Arg [778] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [779] : 2337363432386100000000000000000000000000000000000000000000000000
Arg [780] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [781] : 2337383463373600000000000000000000000000000000000000000000000000
Arg [782] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [783] : 2337383937613300000000000000000000000000000000000000000000000000
Arg [784] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [785] : 2337393734393900000000000000000000000000000000000000000000000000
Arg [786] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [787] : 2337393932633500000000000000000000000000000000000000000000000000
Arg [788] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [789] : 2337633330303700000000000000000000000000000000000000000000000000
Arg [790] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [791] : 2338303232306100000000000000000000000000000000000000000000000000
Arg [792] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [793] : 2338353865623400000000000000000000000000000000000000000000000000
Arg [794] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [795] : 2338396430623700000000000000000000000000000000000000000000000000
Arg [796] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [797] : 2338623937633600000000000000000000000000000000000000000000000000
Arg [798] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [799] : 2338626233616300000000000000000000000000000000000000000000000000
Arg [800] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [801] : 2338636332653000000000000000000000000000000000000000000000000000
Arg [802] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [803] : 2338643838623400000000000000000000000000000000000000000000000000
Arg [804] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [805] : 2338646336386600000000000000000000000000000000000000000000000000
Arg [806] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [807] : 2338653236626100000000000000000000000000000000000000000000000000
Arg [808] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [809] : 2339333866626400000000000000000000000000000000000000000000000000
Arg [810] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [811] : 2339363431636600000000000000000000000000000000000000000000000000
Arg [812] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [813] : 2339366365356500000000000000000000000000000000000000000000000000
Arg [814] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [815] : 2339386237643300000000000000000000000000000000000000000000000000
Arg [816] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [817] : 2339396439656100000000000000000000000000000000000000000000000000
Arg [818] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [819] : 2339623763356600000000000000000000000000000000000000000000000000
Arg [820] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [821] : 2339656239643400000000000000000000000000000000000000000000000000
Arg [822] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [823] : 2361623330323700000000000000000000000000000000000000000000000000
Arg [824] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [825] : 2361633332333200000000000000000000000000000000000000000000000000
Arg [826] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [827] : 2361666539336300000000000000000000000000000000000000000000000000
Arg [828] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [829] : 2362316462383800000000000000000000000000000000000000000000000000
Arg [830] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [831] : 2362333131616600000000000000000000000000000000000000000000000000
Arg [832] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [833] : 2362386666313200000000000000000000000000000000000000000000000000
Arg [834] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [835] : 2362396339646600000000000000000000000000000000000000000000000000
Arg [836] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [837] : 2362636265656600000000000000000000000000000000000000000000000000
Arg [838] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [839] : 2362643165626300000000000000000000000000000000000000000000000000
Arg [840] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [841] : 2363316666376100000000000000000000000000000000000000000000000000
Arg [842] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [843] : 2364306132373000000000000000000000000000000000000000000000000000
Arg [844] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [845] : 2364336433643300000000000000000000000000000000000000000000000000
Arg [846] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [847] : 2364356163613400000000000000000000000000000000000000000000000000
Arg [848] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [849] : 2364396666303000000000000000000000000000000000000000000000000000
Arg [850] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [851] : 2365313864326400000000000000000000000000000000000000000000000000
Arg [852] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [853] : 2365333133643300000000000000000000000000000000000000000000000000
Arg [854] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [855] : 2365386333386400000000000000000000000000000000000000000000000000
Arg [856] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [857] : 2365396138613800000000000000000000000000000000000000000000000000
Arg [858] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [859] : 2365616563313600000000000000000000000000000000000000000000000000
Arg [860] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [861] : 2365663663303000000000000000000000000000000000000000000000000000
Arg [862] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [863] : 2366316665633600000000000000000000000000000000000000000000000000
Arg [864] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [865] : 2366376162663200000000000000000000000000000000000000000000000000
Arg [866] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [867] : 2366393738363900000000000000000000000000000000000000000000000000
Arg [868] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [869] : 2366396634663200000000000000000000000000000000000000000000000000
Arg [870] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [871] : 2366626632353000000000000000000000000000000000000000000000000000
Arg [872] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [873] : 2366643631333600000000000000000000000000000000000000000000000000
Arg [874] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [875] : 2366643763303000000000000000000000000000000000000000000000000000
Arg [876] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [877] : 2366663030313000000000000000000000000000000000000000000000000000
Arg [878] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [879] : 2366663038643600000000000000000000000000000000000000000000000000
Arg [880] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [881] : 2366663763303000000000000000000000000000000000000000000000000000
Arg [882] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [883] : 2366666238303900000000000000000000000000000000000000000000000000
Arg [884] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [885] : 2366666536303000000000000000000000000000000000000000000000000000
Arg [886] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [887] : 2330303462643000000000000000000000000000000000000000000000000000
Arg [888] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [889] : 2330303736646200000000000000000000000000000000000000000000000000
Arg [890] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [891] : 2330383531613400000000000000000000000000000000000000000000000000
Arg [892] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [893] : 2331336436666600000000000000000000000000000000000000000000000000
Arg [894] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [895] : 2331346363653500000000000000000000000000000000000000000000000000
Arg [896] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [897] : 2333353766316600000000000000000000000000000000000000000000000000
Arg [898] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [899] : 2333613436366100000000000000000000000000000000000000000000000000
Arg [900] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [901] : 2334323864363700000000000000000000000000000000000000000000000000
Arg [902] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [903] : 2335663437363800000000000000000000000000000000000000000000000000
Arg [904] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [905] : 2336623734303000000000000000000000000000000000000000000000000000
Arg [906] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [907] : 2337353932373500000000000000000000000000000000000000000000000000
Arg [908] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [909] : 2361383839623300000000000000000000000000000000000000000000000000
Arg [910] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [911] : 2335393662373500000000000000000000000000000000000000000000000000
Arg [912] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [913] : 2337663766376600000000000000000000000000000000000000000000000000
Arg [914] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [915] : 2366636539636200000000000000000000000000000000000000000000000000
Arg [916] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [917] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [918] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [919] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [920] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [921] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [922] : 00000000000000000000000000000000000000000000000000000000000002a0
Arg [923] : 00000000000000000000000000000000000000000000000000000000000002e0
Arg [924] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [925] : 0000000000000000000000000000000000000000000000000000000000000360
Arg [926] : 00000000000000000000000000000000000000000000000000000000000003a0
Arg [927] : 00000000000000000000000000000000000000000000000000000000000003e0
Arg [928] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [929] : 4269726200000000000000000000000000000000000000000000000000000000
Arg [930] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [931] : 4472756469730000000000000000000000000000000000000000000000000000
Arg [932] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [933] : 4865646765686f67000000000000000000000000000000000000000000000000
Arg [934] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [935] : 50656e6775696e73000000000000000000000000000000000000000000000000
Arg [936] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [937] : 5361795768617400000000000000000000000000000000000000000000000000
Arg [938] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [939] : 5468652047757900000000000000000000000000000000000000000000000000
Arg [940] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [941] : 54696e7944696e6f000000000000000000000000000000000000000000000000
Arg [942] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [943] : 546f61647a000000000000000000000000000000000000000000000000000000
Arg [944] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [945] : 556e697175650000000000000000000000000000000000000000000000000000
Arg [946] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [947] : 5761746368657200000000000000000000000000000000000000000000000000
Arg [948] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [949] : 576f726d00000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.