ERC-721
Overview
Max Total Supply
128 TGR
Holders
51
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TheGodlyReborn
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-01 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * 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. */ 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 proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _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} * * _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 the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild 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 for 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) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild 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 for 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) { 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) } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @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); } // File: erc721a/contracts/extensions/IERC721ABurnable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721ABurnable. */ interface IERC721ABurnable is IERC721A { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) external; } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @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; } } } // File: erc721a/contracts/extensions/ERC721ABurnable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721ABurnable. * * @dev ERC721A token that can be irreversibly burned (destroyed). */ abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual override { _burn(tokenId, true); } } // File: contracts/mintingGodly.sol pragma solidity ^0.8.10; contract TheGodlyReborn is ERC721A, ERC721ABurnable, ERC721AQueryable, Ownable { string private _baseTokenURI; using Strings for uint256; uint256 public maxSupply = 3000; uint256 public maxWLSupply = 1000; uint256 public mintPerTrx = 3; uint256 public mintPerAcc = 3; uint256 public pubPrice = 0.0095 ether; uint256 public wlPrice = 0.0077 ether; bytes32 public merkleRoot; bool public pubStat; bool public wlStat; constructor() ERC721A("TheGodlyReborn", "TGR") {} function publicMint(uint256 _quantity) external payable { require(pubStat, "Public mint is not active"); require(_quantity > 0, "Incorrect Quantity"); require(_quantity <= mintPerTrx, "Over amount per trx"); require(_numberMinted(msg.sender) + _quantity <= mintPerAcc,"No more tokens for you"); require(_totalMinted() + _quantity <= maxSupply, "Reached max supply"); require(msg.value >= pubPrice * _quantity, "Need more tokens"); _safeMint(msg.sender, _quantity); } function whitelistMint(bytes32[] calldata _merkleProof, uint256 _quantity) external payable { require(wlStat, "Whitelist mint is not active"); require(_quantity > 0, "Incorrect Quantity"); require(_quantity <= mintPerTrx, "Over amount per trx"); require(_numberMinted(msg.sender) + _quantity <= mintPerAcc,"No more tokens for you"); require(_totalMinted() + _quantity <= maxWLSupply, "Reached max WL supply"); require(checkProof(_merkleProof), "Invalid proof"); require(msg.value >= wlPrice * _quantity, "Need more tokens"); _safeMint(msg.sender, _quantity); } function setMaxSupply(uint256 _maxSupply) public onlyOwner{ maxSupply = _maxSupply; } function setMaxWLSupply(uint256 _maxWLSupply) public onlyOwner{ maxWLSupply = _maxWLSupply; } function setMintPerTrx(uint256 _mintPerTrx) public onlyOwner{ mintPerTrx = _mintPerTrx; } function setMintPerAcc(uint256 _mintPerAcc) public onlyOwner{ mintPerAcc = _mintPerAcc; } function setPubPrice(uint256 _pubPrice) public onlyOwner{ pubPrice = _pubPrice; } function setWlPrice(uint256 _wlPrice) public onlyOwner{ wlPrice = _wlPrice; } function setPubStat() public onlyOwner { pubStat = !pubStat; } function setWlStat() public onlyOwner { wlStat = !wlStat; } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } function checkMintCount() public view returns(uint256){ return _numberMinted(msg.sender); } function teamMint( uint256 quantity) public payable onlyOwner { require(_totalMinted() + quantity <= maxSupply); _safeMint(msg.sender, quantity); } function teamDrop( address to, uint256 airSupply) public payable onlyOwner { require(_totalMinted() + airSupply <= maxSupply); _safeMint(to, airSupply); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) public onlyOwner { _baseTokenURI = baseURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), ".json")) : ""; } function checkProof(bytes32[] calldata _merkleProof) public view returns (bool){ bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Incorrect proof"); return true; } function totalMinted() public view returns(uint256){ return _totalMinted(); } function withdraw() public onlyOwner { payable(msg.sender).transfer(payable(address(this)).balance); } function withdrawAmount(uint256 _amount) public onlyOwner{ (bool success, ) = payable(msg.sender).call{value: _amount}(""); require(success); } function burnToCrisp(uint256 tokenId) public onlyOwner { require(_exists(tokenId), "Token does not exist"); _burn(tokenId); } function checkBurn() public view returns(uint256){ return _totalBurned(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnToCrisp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"checkProof","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWLSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPerAcc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPerTrx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubStat","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWLSupply","type":"uint256"}],"name":"setMaxWLSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPerAcc","type":"uint256"}],"name":"setMintPerAcc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPerTrx","type":"uint256"}],"name":"setMintPerTrx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pubPrice","type":"uint256"}],"name":"setPubPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPubStat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlPrice","type":"uint256"}],"name":"setWlPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWlStat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"airSupply","type":"uint256"}],"name":"teamDrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"totalMinted","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":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlStat","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052610bb8600a556103e8600b556003600c556003600d556621c0331d5dc000600e55661b5b1bf4c54000600f553480156200003d57600080fd5b506040518060400160405280600e81526020017f546865476f646c795265626f726e0000000000000000000000000000000000008152506040518060400160405280600381526020017f54475200000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000c2929190620001ed565b508060039080519060200190620000db929190620001ed565b50620000ec6200011a60201b60201c565b600081905550505062000114620001086200011f60201b60201c565b6200012760201b60201c565b62000302565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001fb90620002cc565b90600052602060002090601f0160209004810192826200021f57600085556200026b565b82601f106200023a57805160ff19168380011785556200026b565b828001600101855582156200026b579182015b828111156200026a5782518255916020019190600101906200024d565b5b5090506200027a91906200027e565b5090565b5b80821115620002995760008160009055506001016200027f565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002e557607f821691505b60208210811415620002fc57620002fb6200029d565b5b50919050565b6148fd80620003126000396000f3fe6080604052600436106102ff5760003560e01c80636f8b44b011610190578063ae3a1f98116100dc578063c6b3e75411610095578063d5abeb011161006f578063d5abeb0114610aea578063dcd5994e14610b15578063e985e9c514610b3e578063f2fde38b14610b7b576102ff565b8063c6b3e75414610a6b578063c7f8d01a14610a82578063c87b56dd14610aad576102ff565b8063ae3a1f9814610975578063aff3a96614610991578063b88d4fde146109bc578063bddb7be7146109d8578063bf62113b14610a03578063c23dc68f14610a2e576102ff565b80638dd07d0f1161014957806395d89b411161012357806395d89b41146108b957806399a2557a146108e4578063a22cb46514610921578063a2309ff81461094a576102ff565b80638dd07d0f1461083c5780638fbaf4c51461086557806391ae811014610890576102ff565b80636f8b44b01461072e57806370a0823114610757578063715018a6146107945780637cb64759146107ab5780638462151c146107d45780638da5cb5b14610811576102ff565b80632904e6d91161024f57806342842e0e11610208578063515dc327116101e2578063515dc3271461066057806355f804b31461068b5780635bbb2177146106b45780636352211e146106f1576102ff565b806342842e0e146105f257806342966c681461060e578063480da21214610637576102ff565b80632904e6d9146105335780632db115441461054f5780632eb4a7ab1461056b5780632fbba115146105965780633202c12c146105b25780633ccfd60b146105db576102ff565b806314f0703d116102bc57806318160ddd1161029657806318160ddd146104aa57806319575e6f146104d5578063214939e61461050057806323b872dd14610517576102ff565b806314f0703d1461041957806316ddcd191461044257806317abc7021461047f576102ff565b806301ffc9a7146103045780630562b9f71461034157806306fdde031461036a578063081812fc14610395578063095ea7b3146103d25780630b17087e146103ee575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613274565b610ba4565b60405161033891906132bc565b60405180910390f35b34801561034d57600080fd5b506103686004803603810190610363919061330d565b610c36565b005b34801561037657600080fd5b5061037f610cb8565b60405161038c91906133d3565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b7919061330d565b610d4a565b6040516103c99190613436565b60405180910390f35b6103ec60048036038101906103e7919061347d565b610dc9565b005b3480156103fa57600080fd5b50610403610f0d565b60405161041091906132bc565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b919061330d565b610f20565b005b34801561044e57600080fd5b5061046960048036038101906104649190613522565b610f32565b60405161047691906132bc565b60405180910390f35b34801561048b57600080fd5b50610494610ff6565b6040516104a1919061357e565b60405180910390f35b3480156104b657600080fd5b506104bf610ffc565b6040516104cc919061357e565b60405180910390f35b3480156104e157600080fd5b506104ea611013565b6040516104f791906132bc565b60405180910390f35b34801561050c57600080fd5b50610515611026565b005b610531600480360381019061052c9190613599565b61105a565b005b61054d600480360381019061054891906135ec565b61137f565b005b6105696004803603810190610564919061330d565b6115ad565b005b34801561057757600080fd5b50610580611790565b60405161058d9190613665565b60405180910390f35b6105b060048036038101906105ab919061330d565b611796565b005b3480156105be57600080fd5b506105d960048036038101906105d4919061330d565b6117cc565b005b3480156105e757600080fd5b506105f06117de565b005b61060c60048036038101906106079190613599565b611846565b005b34801561061a57600080fd5b506106356004803603810190610630919061330d565b611866565b005b34801561064357600080fd5b5061065e6004803603810190610659919061330d565b611874565b005b34801561066c57600080fd5b50610675611886565b604051610682919061357e565b60405180910390f35b34801561069757600080fd5b506106b260048036038101906106ad91906136d6565b61188c565b005b3480156106c057600080fd5b506106db60048036038101906106d69190613779565b6118aa565b6040516106e89190613929565b60405180910390f35b3480156106fd57600080fd5b506107186004803603810190610713919061330d565b61196d565b6040516107259190613436565b60405180910390f35b34801561073a57600080fd5b506107556004803603810190610750919061330d565b61197f565b005b34801561076357600080fd5b5061077e6004803603810190610779919061394b565b611991565b60405161078b919061357e565b60405180910390f35b3480156107a057600080fd5b506107a9611a4a565b005b3480156107b757600080fd5b506107d260048036038101906107cd91906139a4565b611a5e565b005b3480156107e057600080fd5b506107fb60048036038101906107f6919061394b565b611a70565b6040516108089190613a8f565b60405180910390f35b34801561081d57600080fd5b50610826611bba565b6040516108339190613436565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e919061330d565b611be4565b005b34801561087157600080fd5b5061087a611bf6565b604051610887919061357e565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b2919061330d565b611c06565b005b3480156108c557600080fd5b506108ce611c62565b6040516108db91906133d3565b60405180910390f35b3480156108f057600080fd5b5061090b60048036038101906109069190613ab1565b611cf4565b6040516109189190613a8f565b60405180910390f35b34801561092d57600080fd5b5061094860048036038101906109439190613b30565b611f08565b005b34801561095657600080fd5b5061095f612013565b60405161096c919061357e565b60405180910390f35b61098f600480360381019061098a919061347d565b612022565b005b34801561099d57600080fd5b506109a6612059565b6040516109b3919061357e565b60405180910390f35b6109d660048036038101906109d19190613ca0565b612068565b005b3480156109e457600080fd5b506109ed6120db565b6040516109fa919061357e565b60405180910390f35b348015610a0f57600080fd5b50610a186120e1565b604051610a25919061357e565b60405180910390f35b348015610a3a57600080fd5b50610a556004803603810190610a50919061330d565b6120e7565b604051610a629190613d78565b60405180910390f35b348015610a7757600080fd5b50610a80612151565b005b348015610a8e57600080fd5b50610a97612185565b604051610aa4919061357e565b60405180910390f35b348015610ab957600080fd5b50610ad46004803603810190610acf919061330d565b61218b565b604051610ae191906133d3565b60405180910390f35b348015610af657600080fd5b50610aff612232565b604051610b0c919061357e565b60405180910390f35b348015610b2157600080fd5b50610b3c6004803603810190610b37919061330d565b612238565b005b348015610b4a57600080fd5b50610b656004803603810190610b609190613d93565b61224a565b604051610b7291906132bc565b60405180910390f35b348015610b8757600080fd5b50610ba26004803603810190610b9d919061394b565b6122de565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bff57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c2f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610c3e612362565b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610c6490613e04565b60006040518083038185875af1925050503d8060008114610ca1576040519150601f19603f3d011682016040523d82523d6000602084013e610ca6565b606091505b5050905080610cb457600080fd5b5050565b606060028054610cc790613e48565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf390613e48565b8015610d405780601f10610d1557610100808354040283529160200191610d40565b820191906000526020600020905b815481529060010190602001808311610d2357829003601f168201915b5050505050905090565b6000610d55826123e0565b610d8b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dd48261196d565b90508073ffffffffffffffffffffffffffffffffffffffff16610df561243f565b73ffffffffffffffffffffffffffffffffffffffff1614610e5857610e2181610e1c61243f565b61224a565b610e57576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601160009054906101000a900460ff1681565b610f28612362565b80600d8190555050565b60008033604051602001610f469190613ec2565b604051602081830303815290604052805190602001209050610fac848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105483612447565b610feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe290613f29565b60405180910390fd5b600191505092915050565b600d5481565b600061100661245e565b6001546000540303905090565b601160019054906101000a900460ff1681565b61102e612362565b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b600061106582612463565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110cc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806110d884612531565b915091506110ee81876110e961243f565b612558565b61113a57611103866110fe61243f565b61224a565b611139576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156111a1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111ae868686600161259c565b80156111b957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611287856112638888876125a2565b7c0200000000000000000000000000000000000000000000000000000000176125ca565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561130f57600060018501905060006004600083815260200190815260200160002054141561130d57600054811461130c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461137786868660016125f5565b505050505050565b601160019054906101000a900460ff166113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c590613f95565b60405180910390fd5b60008111611411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140890614001565b60405180910390fd5b600c54811115611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144d9061406d565b60405180910390fd5b600d5481611463336125fb565b61146d91906140bc565b11156114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a59061415e565b60405180910390fd5b600b54816114ba612652565b6114c491906140bc565b1115611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc906141ca565b60405180910390fd5b61150f8383610f32565b61154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154590614236565b60405180910390fd5b80600f5461155c9190614256565b34101561159e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611595906142fc565b60405180910390fd5b6115a83382612665565b505050565b601160009054906101000a900460ff166115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f390614368565b60405180910390fd5b6000811161163f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163690614001565b60405180910390fd5b600c54811115611684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167b9061406d565b60405180910390fd5b600d5481611691336125fb565b61169b91906140bc565b11156116dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d39061415e565b60405180910390fd5b600a54816116e8612652565b6116f291906140bc565b1115611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a906143d4565b60405180910390fd5b80600e546117419190614256565b341015611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a906142fc565b60405180910390fd5b61178d3382612665565b50565b60105481565b61179e612362565b600a54816117aa612652565b6117b491906140bc565b11156117bf57600080fd5b6117c93382612665565b50565b6117d4612362565b80600c8190555050565b6117e6612362565b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611843573d6000803e3d6000fd5b50565b61186183838360405180602001604052806000815250612068565b505050565b611871816001612683565b50565b61187c612362565b80600b8190555050565b600b5481565b611894612362565b8181600991906118a5929190613116565b505050565b6060600083839050905060008167ffffffffffffffff8111156118d0576118cf613b75565b5b60405190808252806020026020018201604052801561190957816020015b6118f661319c565b8152602001906001900390816118ee5790505b50905060005b8281146119615761193886868381811061192c5761192b6143f4565b5b905060200201356120e7565b82828151811061194b5761194a6143f4565b5b602002602001018190525080600101905061190f565b50809250505092915050565b600061197882612463565b9050919050565b611987612362565b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611a52612362565b611a5c60006128d7565b565b611a66612362565b8060108190555050565b60606000806000611a8085611991565b905060008167ffffffffffffffff811115611a9e57611a9d613b75565b5b604051908082528060200260200182016040528015611acc5781602001602082028036833780820191505090505b509050611ad761319c565b6000611ae161245e565b90505b838614611bac57611af48161299d565b9150816040015115611b0557611ba1565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611b4557816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611ba05780838780600101985081518110611b9357611b926143f4565b5b6020026020010181815250505b5b806001019050611ae4565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bec612362565b80600f8190555050565b6000611c01336125fb565b905090565b611c0e612362565b611c17816123e0565b611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d9061446f565b60405180910390fd5b611c5f816129c8565b50565b606060038054611c7190613e48565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9d90613e48565b8015611cea5780601f10611cbf57610100808354040283529160200191611cea565b820191906000526020600020905b815481529060010190602001808311611ccd57829003601f168201915b5050505050905090565b6060818310611d2f576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611d3a6129d6565b9050611d4461245e565b851015611d5657611d5361245e565b94505b80841115611d62578093505b6000611d6d87611991565b905084861015611d90576000868603905081811015611d8a578091505b50611d95565b600090505b60008167ffffffffffffffff811115611db157611db0613b75565b5b604051908082528060200260200182016040528015611ddf5781602001602082028036833780820191505090505b5090506000821415611df75780945050505050611f01565b6000611e02886120e7565b905060008160400151611e1757816000015190505b60008990505b888114158015611e2d5750848714155b15611ef357611e3b8161299d565b9250826040015115611e4c57611ee8565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611e8c57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee75780848880600101995081518110611eda57611ed96143f4565b5b6020026020010181815250505b5b806001019050611e1d565b508583528296505050505050505b9392505050565b8060076000611f1561243f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611fc261243f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161200791906132bc565b60405180910390a35050565b600061201d612652565b905090565b61202a612362565b600a5481612036612652565b61204091906140bc565b111561204b57600080fd5b6120558282612665565b5050565b60006120636129df565b905090565b61207384848461105a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120d55761209e848484846129e9565b6120d4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600e5481565b600c5481565b6120ef61319c565b6120f761319c565b6120ff61245e565b831080612113575061210f6129d6565b8310155b15612121578091505061214c565b61212a8361299d565b905080604001511561213f578091505061214c565b61214883612b3a565b9150505b919050565b612159612362565b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b600f5481565b6060612196826123e0565b6121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cc90614501565b60405180910390fd5b60006121df612b5a565b905060008151116121ff576040518060200160405280600081525061222a565b8061220984612bec565b60405160200161221a9291906145a9565b6040516020818303038152906040525b915050919050565b600a5481565b612240612362565b80600e8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e6612362565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d9061464a565b60405180910390fd5b61235f816128d7565b50565b61236a612d4d565b73ffffffffffffffffffffffffffffffffffffffff16612388611bba565b73ffffffffffffffffffffffffffffffffffffffff16146123de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d5906146b6565b60405180910390fd5b565b6000816123eb61245e565b111580156123fa575060005482105b8015612438575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6000826124548584612d55565b1490509392505050565b600090565b6000808290508061247261245e565b116124fa576000548110156124f95760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156124f7575b60008114156124ed5760046000836001900393508381526020019081526020016000205490506124c2565b809250505061252c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86125b9868684612dab565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600061265c61245e565b60005403905090565b61267f828260405180602001604052806000815250612db4565b5050565b600061268e83612463565b905060008190506000806126a186612531565b91509150841561270a576126bd81846126b861243f565b612558565b612709576126d2836126cd61243f565b61224a565b612708576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61271883600088600161259c565b801561272357600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127cb83612788856000886125a2565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176125ca565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415612853576000600187019050600060046000838152602001908152602001600020541415612851576000548114612850578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128bd8360008860016125f5565b600160008154809291906001019190505550505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129a561319c565b6129c16004600084815260200190815260200160002054612e51565b9050919050565b6129d3816000612683565b50565b60008054905090565b6000600154905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a0f61243f565b8786866040518563ffffffff1660e01b8152600401612a31949392919061472b565b6020604051808303816000875af1925050508015612a6d57506040513d601f19601f82011682018060405250810190612a6a919061478c565b60015b612ae7573d8060008114612a9d576040519150601f19603f3d011682016040523d82523d6000602084013e612aa2565b606091505b50600081511415612adf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612b4261319c565b612b53612b4e83612463565b612e51565b9050919050565b606060098054612b6990613e48565b80601f0160208091040260200160405190810160405280929190818152602001828054612b9590613e48565b8015612be25780601f10612bb757610100808354040283529160200191612be2565b820191906000526020600020905b815481529060010190602001808311612bc557829003601f168201915b5050505050905090565b60606000821415612c34576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d48565b600082905060005b60008214612c66578080612c4f906147b9565b915050600a82612c5f9190614831565b9150612c3c565b60008167ffffffffffffffff811115612c8257612c81613b75565b5b6040519080825280601f01601f191660200182016040528015612cb45781602001600182028036833780820191505090505b5090505b60008514612d4157600182612ccd9190614862565b9150600a85612cdc9190614896565b6030612ce891906140bc565b60f81b818381518110612cfe57612cfd6143f4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d3a9190614831565b9450612cb8565b8093505050505b919050565b600033905090565b60008082905060005b8451811015612da057612d8b82868381518110612d7e57612d7d6143f4565b5b6020026020010151612f07565b91508080612d98906147b9565b915050612d5e565b508091505092915050565b60009392505050565b612dbe8383612f32565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612e4c57600080549050600083820390505b612dfe60008683806001019450866129e9565b612e34576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612deb578160005414612e4957600080fd5b50505b505050565b612e5961319c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6000818310612f1f57612f1a82846130ef565b612f2a565b612f2983836130ef565b5b905092915050565b6000805490506000821415612f73576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f80600084838561259c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612ff783612fe860008660006125a2565b612ff185613106565b176125ca565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461309857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061305d565b5060008214156130d4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506130ea60008483856125f5565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b82805461312290613e48565b90600052602060002090601f016020900481019282613144576000855561318b565b82601f1061315d57803560ff191683800117855561318b565b8280016001018555821561318b579182015b8281111561318a57823582559160200191906001019061316f565b5b50905061319891906131eb565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156132045760008160009055506001016131ec565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132518161321c565b811461325c57600080fd5b50565b60008135905061326e81613248565b92915050565b60006020828403121561328a57613289613212565b5b60006132988482850161325f565b91505092915050565b60008115159050919050565b6132b6816132a1565b82525050565b60006020820190506132d160008301846132ad565b92915050565b6000819050919050565b6132ea816132d7565b81146132f557600080fd5b50565b600081359050613307816132e1565b92915050565b60006020828403121561332357613322613212565b5b6000613331848285016132f8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613374578082015181840152602081019050613359565b83811115613383576000848401525b50505050565b6000601f19601f8301169050919050565b60006133a58261333a565b6133af8185613345565b93506133bf818560208601613356565b6133c881613389565b840191505092915050565b600060208201905081810360008301526133ed818461339a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613420826133f5565b9050919050565b61343081613415565b82525050565b600060208201905061344b6000830184613427565b92915050565b61345a81613415565b811461346557600080fd5b50565b60008135905061347781613451565b92915050565b6000806040838503121561349457613493613212565b5b60006134a285828601613468565b92505060206134b3858286016132f8565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126134e2576134e16134bd565b5b8235905067ffffffffffffffff8111156134ff576134fe6134c2565b5b60208301915083602082028301111561351b5761351a6134c7565b5b9250929050565b6000806020838503121561353957613538613212565b5b600083013567ffffffffffffffff81111561355757613556613217565b5b613563858286016134cc565b92509250509250929050565b613578816132d7565b82525050565b6000602082019050613593600083018461356f565b92915050565b6000806000606084860312156135b2576135b1613212565b5b60006135c086828701613468565b93505060206135d186828701613468565b92505060406135e2868287016132f8565b9150509250925092565b60008060006040848603121561360557613604613212565b5b600084013567ffffffffffffffff81111561362357613622613217565b5b61362f868287016134cc565b93509350506020613642868287016132f8565b9150509250925092565b6000819050919050565b61365f8161364c565b82525050565b600060208201905061367a6000830184613656565b92915050565b60008083601f840112613696576136956134bd565b5b8235905067ffffffffffffffff8111156136b3576136b26134c2565b5b6020830191508360018202830111156136cf576136ce6134c7565b5b9250929050565b600080602083850312156136ed576136ec613212565b5b600083013567ffffffffffffffff81111561370b5761370a613217565b5b61371785828601613680565b92509250509250929050565b60008083601f840112613739576137386134bd565b5b8235905067ffffffffffffffff811115613756576137556134c2565b5b602083019150836020820283011115613772576137716134c7565b5b9250929050565b600080602083850312156137905761378f613212565b5b600083013567ffffffffffffffff8111156137ae576137ad613217565b5b6137ba85828601613723565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137fb81613415565b82525050565b600067ffffffffffffffff82169050919050565b61381e81613801565b82525050565b61382d816132a1565b82525050565b600062ffffff82169050919050565b61384b81613833565b82525050565b60808201600082015161386760008501826137f2565b50602082015161387a6020850182613815565b50604082015161388d6040850182613824565b5060608201516138a06060850182613842565b50505050565b60006138b28383613851565b60808301905092915050565b6000602082019050919050565b60006138d6826137c6565b6138e081856137d1565b93506138eb836137e2565b8060005b8381101561391c57815161390388826138a6565b975061390e836138be565b9250506001810190506138ef565b5085935050505092915050565b6000602082019050818103600083015261394381846138cb565b905092915050565b60006020828403121561396157613960613212565b5b600061396f84828501613468565b91505092915050565b6139818161364c565b811461398c57600080fd5b50565b60008135905061399e81613978565b92915050565b6000602082840312156139ba576139b9613212565b5b60006139c88482850161398f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a06816132d7565b82525050565b6000613a1883836139fd565b60208301905092915050565b6000602082019050919050565b6000613a3c826139d1565b613a4681856139dc565b9350613a51836139ed565b8060005b83811015613a82578151613a698882613a0c565b9750613a7483613a24565b925050600181019050613a55565b5085935050505092915050565b60006020820190508181036000830152613aa98184613a31565b905092915050565b600080600060608486031215613aca57613ac9613212565b5b6000613ad886828701613468565b9350506020613ae9868287016132f8565b9250506040613afa868287016132f8565b9150509250925092565b613b0d816132a1565b8114613b1857600080fd5b50565b600081359050613b2a81613b04565b92915050565b60008060408385031215613b4757613b46613212565b5b6000613b5585828601613468565b9250506020613b6685828601613b1b565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bad82613389565b810181811067ffffffffffffffff82111715613bcc57613bcb613b75565b5b80604052505050565b6000613bdf613208565b9050613beb8282613ba4565b919050565b600067ffffffffffffffff821115613c0b57613c0a613b75565b5b613c1482613389565b9050602081019050919050565b82818337600083830152505050565b6000613c43613c3e84613bf0565b613bd5565b905082815260208101848484011115613c5f57613c5e613b70565b5b613c6a848285613c21565b509392505050565b600082601f830112613c8757613c866134bd565b5b8135613c97848260208601613c30565b91505092915050565b60008060008060808587031215613cba57613cb9613212565b5b6000613cc887828801613468565b9450506020613cd987828801613468565b9350506040613cea878288016132f8565b925050606085013567ffffffffffffffff811115613d0b57613d0a613217565b5b613d1787828801613c72565b91505092959194509250565b608082016000820151613d3960008501826137f2565b506020820151613d4c6020850182613815565b506040820151613d5f6040850182613824565b506060820151613d726060850182613842565b50505050565b6000608082019050613d8d6000830184613d23565b92915050565b60008060408385031215613daa57613da9613212565b5b6000613db885828601613468565b9250506020613dc985828601613468565b9150509250929050565b600081905092915050565b50565b6000613dee600083613dd3565b9150613df982613dde565b600082019050919050565b6000613e0f82613de1565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e6057607f821691505b60208210811415613e7457613e73613e19565b5b50919050565b60008160601b9050919050565b6000613e9282613e7a565b9050919050565b6000613ea482613e87565b9050919050565b613ebc613eb782613415565b613e99565b82525050565b6000613ece8284613eab565b60148201915081905092915050565b7f496e636f72726563742070726f6f660000000000000000000000000000000000600082015250565b6000613f13600f83613345565b9150613f1e82613edd565b602082019050919050565b60006020820190508181036000830152613f4281613f06565b9050919050565b7f57686974656c697374206d696e74206973206e6f742061637469766500000000600082015250565b6000613f7f601c83613345565b9150613f8a82613f49565b602082019050919050565b60006020820190508181036000830152613fae81613f72565b9050919050565b7f496e636f7272656374205175616e746974790000000000000000000000000000600082015250565b6000613feb601283613345565b9150613ff682613fb5565b602082019050919050565b6000602082019050818103600083015261401a81613fde565b9050919050565b7f4f76657220616d6f756e74207065722074727800000000000000000000000000600082015250565b6000614057601383613345565b915061406282614021565b602082019050919050565b600060208201905081810360008301526140868161404a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140c7826132d7565b91506140d2836132d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141075761410661408d565b5b828201905092915050565b7f4e6f206d6f726520746f6b656e7320666f7220796f7500000000000000000000600082015250565b6000614148601683613345565b915061415382614112565b602082019050919050565b600060208201905081810360008301526141778161413b565b9050919050565b7f52656163686564206d617820574c20737570706c790000000000000000000000600082015250565b60006141b4601583613345565b91506141bf8261417e565b602082019050919050565b600060208201905081810360008301526141e3816141a7565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614220600d83613345565b915061422b826141ea565b602082019050919050565b6000602082019050818103600083015261424f81614213565b9050919050565b6000614261826132d7565b915061426c836132d7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142a5576142a461408d565b5b828202905092915050565b7f4e656564206d6f726520746f6b656e7300000000000000000000000000000000600082015250565b60006142e6601083613345565b91506142f1826142b0565b602082019050919050565b60006020820190508181036000830152614315816142d9565b9050919050565b7f5075626c6963206d696e74206973206e6f742061637469766500000000000000600082015250565b6000614352601983613345565b915061435d8261431c565b602082019050919050565b6000602082019050818103600083015261438181614345565b9050919050565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b60006143be601283613345565b91506143c982614388565b602082019050919050565b600060208201905081810360008301526143ed816143b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000614459601483613345565b915061446482614423565b602082019050919050565b600060208201905081810360008301526144888161444c565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006144eb602f83613345565b91506144f68261448f565b604082019050919050565b6000602082019050818103600083015261451a816144de565b9050919050565b600081905092915050565b60006145378261333a565b6145418185614521565b9350614551818560208601613356565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614593600583614521565b915061459e8261455d565b600582019050919050565b60006145b5828561452c565b91506145c1828461452c565b91506145cc82614586565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614634602683613345565b915061463f826145d8565b604082019050919050565b6000602082019050818103600083015261466381614627565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146a0602083613345565b91506146ab8261466a565b602082019050919050565b600060208201905081810360008301526146cf81614693565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006146fd826146d6565b61470781856146e1565b9350614717818560208601613356565b61472081613389565b840191505092915050565b60006080820190506147406000830187613427565b61474d6020830186613427565b61475a604083018561356f565b818103606083015261476c81846146f2565b905095945050505050565b60008151905061478681613248565b92915050565b6000602082840312156147a2576147a1613212565b5b60006147b084828501614777565b91505092915050565b60006147c4826132d7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147f7576147f661408d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061483c826132d7565b9150614847836132d7565b92508261485757614856614802565b5b828204905092915050565b600061486d826132d7565b9150614878836132d7565b92508282101561488b5761488a61408d565b5b828203905092915050565b60006148a1826132d7565b91506148ac836132d7565b9250826148bc576148bb614802565b5b82820690509291505056fea2646970667358221220df31084e3cd382912d9f39ce94c687f919c107de021c905f5fc9cb59773b323a64736f6c634300080a0033
Deployed Bytecode
0x6080604052600436106102ff5760003560e01c80636f8b44b011610190578063ae3a1f98116100dc578063c6b3e75411610095578063d5abeb011161006f578063d5abeb0114610aea578063dcd5994e14610b15578063e985e9c514610b3e578063f2fde38b14610b7b576102ff565b8063c6b3e75414610a6b578063c7f8d01a14610a82578063c87b56dd14610aad576102ff565b8063ae3a1f9814610975578063aff3a96614610991578063b88d4fde146109bc578063bddb7be7146109d8578063bf62113b14610a03578063c23dc68f14610a2e576102ff565b80638dd07d0f1161014957806395d89b411161012357806395d89b41146108b957806399a2557a146108e4578063a22cb46514610921578063a2309ff81461094a576102ff565b80638dd07d0f1461083c5780638fbaf4c51461086557806391ae811014610890576102ff565b80636f8b44b01461072e57806370a0823114610757578063715018a6146107945780637cb64759146107ab5780638462151c146107d45780638da5cb5b14610811576102ff565b80632904e6d91161024f57806342842e0e11610208578063515dc327116101e2578063515dc3271461066057806355f804b31461068b5780635bbb2177146106b45780636352211e146106f1576102ff565b806342842e0e146105f257806342966c681461060e578063480da21214610637576102ff565b80632904e6d9146105335780632db115441461054f5780632eb4a7ab1461056b5780632fbba115146105965780633202c12c146105b25780633ccfd60b146105db576102ff565b806314f0703d116102bc57806318160ddd1161029657806318160ddd146104aa57806319575e6f146104d5578063214939e61461050057806323b872dd14610517576102ff565b806314f0703d1461041957806316ddcd191461044257806317abc7021461047f576102ff565b806301ffc9a7146103045780630562b9f71461034157806306fdde031461036a578063081812fc14610395578063095ea7b3146103d25780630b17087e146103ee575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613274565b610ba4565b60405161033891906132bc565b60405180910390f35b34801561034d57600080fd5b506103686004803603810190610363919061330d565b610c36565b005b34801561037657600080fd5b5061037f610cb8565b60405161038c91906133d3565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b7919061330d565b610d4a565b6040516103c99190613436565b60405180910390f35b6103ec60048036038101906103e7919061347d565b610dc9565b005b3480156103fa57600080fd5b50610403610f0d565b60405161041091906132bc565b60405180910390f35b34801561042557600080fd5b50610440600480360381019061043b919061330d565b610f20565b005b34801561044e57600080fd5b5061046960048036038101906104649190613522565b610f32565b60405161047691906132bc565b60405180910390f35b34801561048b57600080fd5b50610494610ff6565b6040516104a1919061357e565b60405180910390f35b3480156104b657600080fd5b506104bf610ffc565b6040516104cc919061357e565b60405180910390f35b3480156104e157600080fd5b506104ea611013565b6040516104f791906132bc565b60405180910390f35b34801561050c57600080fd5b50610515611026565b005b610531600480360381019061052c9190613599565b61105a565b005b61054d600480360381019061054891906135ec565b61137f565b005b6105696004803603810190610564919061330d565b6115ad565b005b34801561057757600080fd5b50610580611790565b60405161058d9190613665565b60405180910390f35b6105b060048036038101906105ab919061330d565b611796565b005b3480156105be57600080fd5b506105d960048036038101906105d4919061330d565b6117cc565b005b3480156105e757600080fd5b506105f06117de565b005b61060c60048036038101906106079190613599565b611846565b005b34801561061a57600080fd5b506106356004803603810190610630919061330d565b611866565b005b34801561064357600080fd5b5061065e6004803603810190610659919061330d565b611874565b005b34801561066c57600080fd5b50610675611886565b604051610682919061357e565b60405180910390f35b34801561069757600080fd5b506106b260048036038101906106ad91906136d6565b61188c565b005b3480156106c057600080fd5b506106db60048036038101906106d69190613779565b6118aa565b6040516106e89190613929565b60405180910390f35b3480156106fd57600080fd5b506107186004803603810190610713919061330d565b61196d565b6040516107259190613436565b60405180910390f35b34801561073a57600080fd5b506107556004803603810190610750919061330d565b61197f565b005b34801561076357600080fd5b5061077e6004803603810190610779919061394b565b611991565b60405161078b919061357e565b60405180910390f35b3480156107a057600080fd5b506107a9611a4a565b005b3480156107b757600080fd5b506107d260048036038101906107cd91906139a4565b611a5e565b005b3480156107e057600080fd5b506107fb60048036038101906107f6919061394b565b611a70565b6040516108089190613a8f565b60405180910390f35b34801561081d57600080fd5b50610826611bba565b6040516108339190613436565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e919061330d565b611be4565b005b34801561087157600080fd5b5061087a611bf6565b604051610887919061357e565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b2919061330d565b611c06565b005b3480156108c557600080fd5b506108ce611c62565b6040516108db91906133d3565b60405180910390f35b3480156108f057600080fd5b5061090b60048036038101906109069190613ab1565b611cf4565b6040516109189190613a8f565b60405180910390f35b34801561092d57600080fd5b5061094860048036038101906109439190613b30565b611f08565b005b34801561095657600080fd5b5061095f612013565b60405161096c919061357e565b60405180910390f35b61098f600480360381019061098a919061347d565b612022565b005b34801561099d57600080fd5b506109a6612059565b6040516109b3919061357e565b60405180910390f35b6109d660048036038101906109d19190613ca0565b612068565b005b3480156109e457600080fd5b506109ed6120db565b6040516109fa919061357e565b60405180910390f35b348015610a0f57600080fd5b50610a186120e1565b604051610a25919061357e565b60405180910390f35b348015610a3a57600080fd5b50610a556004803603810190610a50919061330d565b6120e7565b604051610a629190613d78565b60405180910390f35b348015610a7757600080fd5b50610a80612151565b005b348015610a8e57600080fd5b50610a97612185565b604051610aa4919061357e565b60405180910390f35b348015610ab957600080fd5b50610ad46004803603810190610acf919061330d565b61218b565b604051610ae191906133d3565b60405180910390f35b348015610af657600080fd5b50610aff612232565b604051610b0c919061357e565b60405180910390f35b348015610b2157600080fd5b50610b3c6004803603810190610b37919061330d565b612238565b005b348015610b4a57600080fd5b50610b656004803603810190610b609190613d93565b61224a565b604051610b7291906132bc565b60405180910390f35b348015610b8757600080fd5b50610ba26004803603810190610b9d919061394b565b6122de565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bff57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c2f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610c3e612362565b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610c6490613e04565b60006040518083038185875af1925050503d8060008114610ca1576040519150601f19603f3d011682016040523d82523d6000602084013e610ca6565b606091505b5050905080610cb457600080fd5b5050565b606060028054610cc790613e48565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf390613e48565b8015610d405780601f10610d1557610100808354040283529160200191610d40565b820191906000526020600020905b815481529060010190602001808311610d2357829003601f168201915b5050505050905090565b6000610d55826123e0565b610d8b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dd48261196d565b90508073ffffffffffffffffffffffffffffffffffffffff16610df561243f565b73ffffffffffffffffffffffffffffffffffffffff1614610e5857610e2181610e1c61243f565b61224a565b610e57576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601160009054906101000a900460ff1681565b610f28612362565b80600d8190555050565b60008033604051602001610f469190613ec2565b604051602081830303815290604052805190602001209050610fac848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105483612447565b610feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe290613f29565b60405180910390fd5b600191505092915050565b600d5481565b600061100661245e565b6001546000540303905090565b601160019054906101000a900460ff1681565b61102e612362565b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b600061106582612463565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110cc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806110d884612531565b915091506110ee81876110e961243f565b612558565b61113a57611103866110fe61243f565b61224a565b611139576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156111a1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111ae868686600161259c565b80156111b957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611287856112638888876125a2565b7c0200000000000000000000000000000000000000000000000000000000176125ca565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561130f57600060018501905060006004600083815260200190815260200160002054141561130d57600054811461130c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461137786868660016125f5565b505050505050565b601160019054906101000a900460ff166113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c590613f95565b60405180910390fd5b60008111611411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140890614001565b60405180910390fd5b600c54811115611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144d9061406d565b60405180910390fd5b600d5481611463336125fb565b61146d91906140bc565b11156114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a59061415e565b60405180910390fd5b600b54816114ba612652565b6114c491906140bc565b1115611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc906141ca565b60405180910390fd5b61150f8383610f32565b61154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154590614236565b60405180910390fd5b80600f5461155c9190614256565b34101561159e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611595906142fc565b60405180910390fd5b6115a83382612665565b505050565b601160009054906101000a900460ff166115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f390614368565b60405180910390fd5b6000811161163f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163690614001565b60405180910390fd5b600c54811115611684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167b9061406d565b60405180910390fd5b600d5481611691336125fb565b61169b91906140bc565b11156116dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d39061415e565b60405180910390fd5b600a54816116e8612652565b6116f291906140bc565b1115611733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172a906143d4565b60405180910390fd5b80600e546117419190614256565b341015611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a906142fc565b60405180910390fd5b61178d3382612665565b50565b60105481565b61179e612362565b600a54816117aa612652565b6117b491906140bc565b11156117bf57600080fd5b6117c93382612665565b50565b6117d4612362565b80600c8190555050565b6117e6612362565b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611843573d6000803e3d6000fd5b50565b61186183838360405180602001604052806000815250612068565b505050565b611871816001612683565b50565b61187c612362565b80600b8190555050565b600b5481565b611894612362565b8181600991906118a5929190613116565b505050565b6060600083839050905060008167ffffffffffffffff8111156118d0576118cf613b75565b5b60405190808252806020026020018201604052801561190957816020015b6118f661319c565b8152602001906001900390816118ee5790505b50905060005b8281146119615761193886868381811061192c5761192b6143f4565b5b905060200201356120e7565b82828151811061194b5761194a6143f4565b5b602002602001018190525080600101905061190f565b50809250505092915050565b600061197882612463565b9050919050565b611987612362565b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611a52612362565b611a5c60006128d7565b565b611a66612362565b8060108190555050565b60606000806000611a8085611991565b905060008167ffffffffffffffff811115611a9e57611a9d613b75565b5b604051908082528060200260200182016040528015611acc5781602001602082028036833780820191505090505b509050611ad761319c565b6000611ae161245e565b90505b838614611bac57611af48161299d565b9150816040015115611b0557611ba1565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611b4557816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611ba05780838780600101985081518110611b9357611b926143f4565b5b6020026020010181815250505b5b806001019050611ae4565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611bec612362565b80600f8190555050565b6000611c01336125fb565b905090565b611c0e612362565b611c17816123e0565b611c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4d9061446f565b60405180910390fd5b611c5f816129c8565b50565b606060038054611c7190613e48565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9d90613e48565b8015611cea5780601f10611cbf57610100808354040283529160200191611cea565b820191906000526020600020905b815481529060010190602001808311611ccd57829003601f168201915b5050505050905090565b6060818310611d2f576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611d3a6129d6565b9050611d4461245e565b851015611d5657611d5361245e565b94505b80841115611d62578093505b6000611d6d87611991565b905084861015611d90576000868603905081811015611d8a578091505b50611d95565b600090505b60008167ffffffffffffffff811115611db157611db0613b75565b5b604051908082528060200260200182016040528015611ddf5781602001602082028036833780820191505090505b5090506000821415611df75780945050505050611f01565b6000611e02886120e7565b905060008160400151611e1757816000015190505b60008990505b888114158015611e2d5750848714155b15611ef357611e3b8161299d565b9250826040015115611e4c57611ee8565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611e8c57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ee75780848880600101995081518110611eda57611ed96143f4565b5b6020026020010181815250505b5b806001019050611e1d565b508583528296505050505050505b9392505050565b8060076000611f1561243f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611fc261243f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161200791906132bc565b60405180910390a35050565b600061201d612652565b905090565b61202a612362565b600a5481612036612652565b61204091906140bc565b111561204b57600080fd5b6120558282612665565b5050565b60006120636129df565b905090565b61207384848461105a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120d55761209e848484846129e9565b6120d4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600e5481565b600c5481565b6120ef61319c565b6120f761319c565b6120ff61245e565b831080612113575061210f6129d6565b8310155b15612121578091505061214c565b61212a8361299d565b905080604001511561213f578091505061214c565b61214883612b3a565b9150505b919050565b612159612362565b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b600f5481565b6060612196826123e0565b6121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cc90614501565b60405180910390fd5b60006121df612b5a565b905060008151116121ff576040518060200160405280600081525061222a565b8061220984612bec565b60405160200161221a9291906145a9565b6040516020818303038152906040525b915050919050565b600a5481565b612240612362565b80600e8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e6612362565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234d9061464a565b60405180910390fd5b61235f816128d7565b50565b61236a612d4d565b73ffffffffffffffffffffffffffffffffffffffff16612388611bba565b73ffffffffffffffffffffffffffffffffffffffff16146123de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d5906146b6565b60405180910390fd5b565b6000816123eb61245e565b111580156123fa575060005482105b8015612438575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6000826124548584612d55565b1490509392505050565b600090565b6000808290508061247261245e565b116124fa576000548110156124f95760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156124f7575b60008114156124ed5760046000836001900393508381526020019081526020016000205490506124c2565b809250505061252c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86125b9868684612dab565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600061265c61245e565b60005403905090565b61267f828260405180602001604052806000815250612db4565b5050565b600061268e83612463565b905060008190506000806126a186612531565b91509150841561270a576126bd81846126b861243f565b612558565b612709576126d2836126cd61243f565b61224a565b612708576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61271883600088600161259c565b801561272357600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127cb83612788856000886125a2565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176125ca565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415612853576000600187019050600060046000838152602001908152602001600020541415612851576000548114612850578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128bd8360008860016125f5565b600160008154809291906001019190505550505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129a561319c565b6129c16004600084815260200190815260200160002054612e51565b9050919050565b6129d3816000612683565b50565b60008054905090565b6000600154905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a0f61243f565b8786866040518563ffffffff1660e01b8152600401612a31949392919061472b565b6020604051808303816000875af1925050508015612a6d57506040513d601f19601f82011682018060405250810190612a6a919061478c565b60015b612ae7573d8060008114612a9d576040519150601f19603f3d011682016040523d82523d6000602084013e612aa2565b606091505b50600081511415612adf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612b4261319c565b612b53612b4e83612463565b612e51565b9050919050565b606060098054612b6990613e48565b80601f0160208091040260200160405190810160405280929190818152602001828054612b9590613e48565b8015612be25780601f10612bb757610100808354040283529160200191612be2565b820191906000526020600020905b815481529060010190602001808311612bc557829003601f168201915b5050505050905090565b60606000821415612c34576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d48565b600082905060005b60008214612c66578080612c4f906147b9565b915050600a82612c5f9190614831565b9150612c3c565b60008167ffffffffffffffff811115612c8257612c81613b75565b5b6040519080825280601f01601f191660200182016040528015612cb45781602001600182028036833780820191505090505b5090505b60008514612d4157600182612ccd9190614862565b9150600a85612cdc9190614896565b6030612ce891906140bc565b60f81b818381518110612cfe57612cfd6143f4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d3a9190614831565b9450612cb8565b8093505050505b919050565b600033905090565b60008082905060005b8451811015612da057612d8b82868381518110612d7e57612d7d6143f4565b5b6020026020010151612f07565b91508080612d98906147b9565b915050612d5e565b508091505092915050565b60009392505050565b612dbe8383612f32565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612e4c57600080549050600083820390505b612dfe60008683806001019450866129e9565b612e34576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612deb578160005414612e4957600080fd5b50505b505050565b612e5961319c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6000818310612f1f57612f1a82846130ef565b612f2a565b612f2983836130ef565b5b905092915050565b6000805490506000821415612f73576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f80600084838561259c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612ff783612fe860008660006125a2565b612ff185613106565b176125ca565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461309857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061305d565b5060008214156130d4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506130ea60008483856125f5565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b82805461312290613e48565b90600052602060002090601f016020900481019282613144576000855561318b565b82601f1061315d57803560ff191683800117855561318b565b8280016001018555821561318b579182015b8281111561318a57823582559160200191906001019061316f565b5b50905061319891906131eb565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156132045760008160009055506001016131ec565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132518161321c565b811461325c57600080fd5b50565b60008135905061326e81613248565b92915050565b60006020828403121561328a57613289613212565b5b60006132988482850161325f565b91505092915050565b60008115159050919050565b6132b6816132a1565b82525050565b60006020820190506132d160008301846132ad565b92915050565b6000819050919050565b6132ea816132d7565b81146132f557600080fd5b50565b600081359050613307816132e1565b92915050565b60006020828403121561332357613322613212565b5b6000613331848285016132f8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613374578082015181840152602081019050613359565b83811115613383576000848401525b50505050565b6000601f19601f8301169050919050565b60006133a58261333a565b6133af8185613345565b93506133bf818560208601613356565b6133c881613389565b840191505092915050565b600060208201905081810360008301526133ed818461339a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613420826133f5565b9050919050565b61343081613415565b82525050565b600060208201905061344b6000830184613427565b92915050565b61345a81613415565b811461346557600080fd5b50565b60008135905061347781613451565b92915050565b6000806040838503121561349457613493613212565b5b60006134a285828601613468565b92505060206134b3858286016132f8565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126134e2576134e16134bd565b5b8235905067ffffffffffffffff8111156134ff576134fe6134c2565b5b60208301915083602082028301111561351b5761351a6134c7565b5b9250929050565b6000806020838503121561353957613538613212565b5b600083013567ffffffffffffffff81111561355757613556613217565b5b613563858286016134cc565b92509250509250929050565b613578816132d7565b82525050565b6000602082019050613593600083018461356f565b92915050565b6000806000606084860312156135b2576135b1613212565b5b60006135c086828701613468565b93505060206135d186828701613468565b92505060406135e2868287016132f8565b9150509250925092565b60008060006040848603121561360557613604613212565b5b600084013567ffffffffffffffff81111561362357613622613217565b5b61362f868287016134cc565b93509350506020613642868287016132f8565b9150509250925092565b6000819050919050565b61365f8161364c565b82525050565b600060208201905061367a6000830184613656565b92915050565b60008083601f840112613696576136956134bd565b5b8235905067ffffffffffffffff8111156136b3576136b26134c2565b5b6020830191508360018202830111156136cf576136ce6134c7565b5b9250929050565b600080602083850312156136ed576136ec613212565b5b600083013567ffffffffffffffff81111561370b5761370a613217565b5b61371785828601613680565b92509250509250929050565b60008083601f840112613739576137386134bd565b5b8235905067ffffffffffffffff811115613756576137556134c2565b5b602083019150836020820283011115613772576137716134c7565b5b9250929050565b600080602083850312156137905761378f613212565b5b600083013567ffffffffffffffff8111156137ae576137ad613217565b5b6137ba85828601613723565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137fb81613415565b82525050565b600067ffffffffffffffff82169050919050565b61381e81613801565b82525050565b61382d816132a1565b82525050565b600062ffffff82169050919050565b61384b81613833565b82525050565b60808201600082015161386760008501826137f2565b50602082015161387a6020850182613815565b50604082015161388d6040850182613824565b5060608201516138a06060850182613842565b50505050565b60006138b28383613851565b60808301905092915050565b6000602082019050919050565b60006138d6826137c6565b6138e081856137d1565b93506138eb836137e2565b8060005b8381101561391c57815161390388826138a6565b975061390e836138be565b9250506001810190506138ef565b5085935050505092915050565b6000602082019050818103600083015261394381846138cb565b905092915050565b60006020828403121561396157613960613212565b5b600061396f84828501613468565b91505092915050565b6139818161364c565b811461398c57600080fd5b50565b60008135905061399e81613978565b92915050565b6000602082840312156139ba576139b9613212565b5b60006139c88482850161398f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a06816132d7565b82525050565b6000613a1883836139fd565b60208301905092915050565b6000602082019050919050565b6000613a3c826139d1565b613a4681856139dc565b9350613a51836139ed565b8060005b83811015613a82578151613a698882613a0c565b9750613a7483613a24565b925050600181019050613a55565b5085935050505092915050565b60006020820190508181036000830152613aa98184613a31565b905092915050565b600080600060608486031215613aca57613ac9613212565b5b6000613ad886828701613468565b9350506020613ae9868287016132f8565b9250506040613afa868287016132f8565b9150509250925092565b613b0d816132a1565b8114613b1857600080fd5b50565b600081359050613b2a81613b04565b92915050565b60008060408385031215613b4757613b46613212565b5b6000613b5585828601613468565b9250506020613b6685828601613b1b565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bad82613389565b810181811067ffffffffffffffff82111715613bcc57613bcb613b75565b5b80604052505050565b6000613bdf613208565b9050613beb8282613ba4565b919050565b600067ffffffffffffffff821115613c0b57613c0a613b75565b5b613c1482613389565b9050602081019050919050565b82818337600083830152505050565b6000613c43613c3e84613bf0565b613bd5565b905082815260208101848484011115613c5f57613c5e613b70565b5b613c6a848285613c21565b509392505050565b600082601f830112613c8757613c866134bd565b5b8135613c97848260208601613c30565b91505092915050565b60008060008060808587031215613cba57613cb9613212565b5b6000613cc887828801613468565b9450506020613cd987828801613468565b9350506040613cea878288016132f8565b925050606085013567ffffffffffffffff811115613d0b57613d0a613217565b5b613d1787828801613c72565b91505092959194509250565b608082016000820151613d3960008501826137f2565b506020820151613d4c6020850182613815565b506040820151613d5f6040850182613824565b506060820151613d726060850182613842565b50505050565b6000608082019050613d8d6000830184613d23565b92915050565b60008060408385031215613daa57613da9613212565b5b6000613db885828601613468565b9250506020613dc985828601613468565b9150509250929050565b600081905092915050565b50565b6000613dee600083613dd3565b9150613df982613dde565b600082019050919050565b6000613e0f82613de1565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e6057607f821691505b60208210811415613e7457613e73613e19565b5b50919050565b60008160601b9050919050565b6000613e9282613e7a565b9050919050565b6000613ea482613e87565b9050919050565b613ebc613eb782613415565b613e99565b82525050565b6000613ece8284613eab565b60148201915081905092915050565b7f496e636f72726563742070726f6f660000000000000000000000000000000000600082015250565b6000613f13600f83613345565b9150613f1e82613edd565b602082019050919050565b60006020820190508181036000830152613f4281613f06565b9050919050565b7f57686974656c697374206d696e74206973206e6f742061637469766500000000600082015250565b6000613f7f601c83613345565b9150613f8a82613f49565b602082019050919050565b60006020820190508181036000830152613fae81613f72565b9050919050565b7f496e636f7272656374205175616e746974790000000000000000000000000000600082015250565b6000613feb601283613345565b9150613ff682613fb5565b602082019050919050565b6000602082019050818103600083015261401a81613fde565b9050919050565b7f4f76657220616d6f756e74207065722074727800000000000000000000000000600082015250565b6000614057601383613345565b915061406282614021565b602082019050919050565b600060208201905081810360008301526140868161404a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140c7826132d7565b91506140d2836132d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141075761410661408d565b5b828201905092915050565b7f4e6f206d6f726520746f6b656e7320666f7220796f7500000000000000000000600082015250565b6000614148601683613345565b915061415382614112565b602082019050919050565b600060208201905081810360008301526141778161413b565b9050919050565b7f52656163686564206d617820574c20737570706c790000000000000000000000600082015250565b60006141b4601583613345565b91506141bf8261417e565b602082019050919050565b600060208201905081810360008301526141e3816141a7565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614220600d83613345565b915061422b826141ea565b602082019050919050565b6000602082019050818103600083015261424f81614213565b9050919050565b6000614261826132d7565b915061426c836132d7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142a5576142a461408d565b5b828202905092915050565b7f4e656564206d6f726520746f6b656e7300000000000000000000000000000000600082015250565b60006142e6601083613345565b91506142f1826142b0565b602082019050919050565b60006020820190508181036000830152614315816142d9565b9050919050565b7f5075626c6963206d696e74206973206e6f742061637469766500000000000000600082015250565b6000614352601983613345565b915061435d8261431c565b602082019050919050565b6000602082019050818103600083015261438181614345565b9050919050565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b60006143be601283613345565b91506143c982614388565b602082019050919050565b600060208201905081810360008301526143ed816143b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000614459601483613345565b915061446482614423565b602082019050919050565b600060208201905081810360008301526144888161444c565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006144eb602f83613345565b91506144f68261448f565b604082019050919050565b6000602082019050818103600083015261451a816144de565b9050919050565b600081905092915050565b60006145378261333a565b6145418185614521565b9350614551818560208601613356565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614593600583614521565b915061459e8261455d565b600582019050919050565b60006145b5828561452c565b91506145c1828461452c565b91506145cc82614586565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614634602683613345565b915061463f826145d8565b604082019050919050565b6000602082019050818103600083015261466381614627565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146a0602083613345565b91506146ab8261466a565b602082019050919050565b600060208201905081810360008301526146cf81614693565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006146fd826146d6565b61470781856146e1565b9350614717818560208601613356565b61472081613389565b840191505092915050565b60006080820190506147406000830187613427565b61474d6020830186613427565b61475a604083018561356f565b818103606083015261476c81846146f2565b905095945050505050565b60008151905061478681613248565b92915050565b6000602082840312156147a2576147a1613212565b5b60006147b084828501614777565b91505092915050565b60006147c4826132d7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147f7576147f661408d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061483c826132d7565b9150614847836132d7565b92508261485757614856614802565b5b828204905092915050565b600061486d826132d7565b9150614878836132d7565b92508282101561488b5761488a61408d565b5b828203905092915050565b60006148a1826132d7565b91506148ac836132d7565b9250826148bc576148bb614802565b5b82820690509291505056fea2646970667358221220df31084e3cd382912d9f39ce94c687f919c107de021c905f5fc9cb59773b323a64736f6c634300080a0033
Deployed Bytecode Sourcemap
76378:4708:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36208:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80666:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37110:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43601:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43034:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76826:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78457:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80172:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76661:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32861:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76854:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78847:72;;;;;;;;;;;;;:::i;:::-;;47240:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77480:642;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76938:534;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76792:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79152:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78348:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80541:117;;;;;;;;;;;;;:::i;:::-;;50161:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76194:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78235:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76581:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79637:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70907:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38503:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78130:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34045:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13998:103;;;;;;;;;;;;;:::i;:::-;;78927:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74783:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13350:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78667:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79041:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80840:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37286:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71823:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44159:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80444:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79330:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80996:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50952:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76699:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76623:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70320:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78764:75;;;;;;;;;;;;;:::i;:::-;;76746:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79747:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76541:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78566:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44550:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14256:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36208:639;36293:4;36632:10;36617:25;;:11;:25;;;;:102;;;;36709:10;36694:25;;:11;:25;;;;36617:102;:179;;;;36786:10;36771:25;;:11;:25;;;;36617:179;36597:199;;36208:639;;;:::o;80666:165::-;13236:13;:11;:13::i;:::-;80734:12:::1;80760:10;80752:24;;80784:7;80752:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80733:63;;;80815:7;80807:16;;;::::0;::::1;;80723:108;80666:165:::0;:::o;37110:100::-;37164:13;37197:5;37190:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37110:100;:::o;43601:218::-;43677:7;43702:16;43710:7;43702;:16::i;:::-;43697:64;;43727:34;;;;;;;;;;;;;;43697:64;43781:15;:24;43797:7;43781:24;;;;;;;;;;;:30;;;;;;;;;;;;43774:37;;43601:218;;;:::o;43034:408::-;43123:13;43139:16;43147:7;43139;:16::i;:::-;43123:32;;43195:5;43172:28;;:19;:17;:19::i;:::-;:28;;;43168:175;;43220:44;43237:5;43244:19;:17;:19::i;:::-;43220:16;:44::i;:::-;43215:128;;43292:35;;;;;;;;;;;;;;43215:128;43168:175;43388:2;43355:15;:24;43371:7;43355:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;43426:7;43422:2;43406:28;;43415:5;43406:28;;;;;;;;;;;;43112:330;43034:408;;:::o;76826:19::-;;;;;;;;;;;;;:::o;78457:101::-;13236:13;:11;:13::i;:::-;78539:11:::1;78526:10;:24;;;;78457:101:::0;:::o;80172:264::-;80246:4;80262:12;80304:10;80287:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;80277:39;;;;;;80262:54;;80335:50;80354:12;;80335:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80368:10;;80380:4;80335:18;:50::i;:::-;80327:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;80423:4;80416:11;;;80172:264;;;;:::o;76661:29::-;;;;:::o;32861:323::-;32922:7;33150:15;:13;:15::i;:::-;33135:12;;33119:13;;:28;:46;33112:53;;32861:323;:::o;76854:18::-;;;;;;;;;;;;;:::o;78847:72::-;13236:13;:11;:13::i;:::-;78904:6:::1;;;;;;;;;;;78903:7;78894:6;;:16;;;;;;;;;;;;;;;;;;78847:72::o:0;47240:2825::-;47382:27;47412;47431:7;47412:18;:27::i;:::-;47382:57;;47497:4;47456:45;;47472:19;47456:45;;;47452:86;;47510:28;;;;;;;;;;;;;;47452:86;47552:27;47581:23;47608:35;47635:7;47608:26;:35::i;:::-;47551:92;;;;47743:68;47768:15;47785:4;47791:19;:17;:19::i;:::-;47743:24;:68::i;:::-;47738:180;;47831:43;47848:4;47854:19;:17;:19::i;:::-;47831:16;:43::i;:::-;47826:92;;47883:35;;;;;;;;;;;;;;47826:92;47738:180;47949:1;47935:16;;:2;:16;;;47931:52;;;47960:23;;;;;;;;;;;;;;47931:52;47996:43;48018:4;48024:2;48028:7;48037:1;47996:21;:43::i;:::-;48132:15;48129:160;;;48272:1;48251:19;48244:30;48129:160;48669:18;:24;48688:4;48669:24;;;;;;;;;;;;;;;;48667:26;;;;;;;;;;;;48738:18;:22;48757:2;48738:22;;;;;;;;;;;;;;;;48736:24;;;;;;;;;;;49060:146;49097:2;49146:45;49161:4;49167:2;49171:19;49146:14;:45::i;:::-;29260:8;49118:73;49060:18;:146::i;:::-;49031:17;:26;49049:7;49031:26;;;;;;;;;;;:175;;;;49377:1;29260:8;49326:19;:47;:52;49322:627;;;49399:19;49431:1;49421:7;:11;49399:33;;49588:1;49554:17;:30;49572:11;49554:30;;;;;;;;;;;;:35;49550:384;;;49692:13;;49677:11;:28;49673:242;;49872:19;49839:17;:30;49857:11;49839:30;;;;;;;;;;;:52;;;;49673:242;49550:384;49380:569;49322:627;49996:7;49992:2;49977:27;;49986:4;49977:27;;;;;;;;;;;;50015:42;50036:4;50042:2;50046:7;50055:1;50015:20;:42::i;:::-;47371:2694;;;47240:2825;;;:::o;77480:642::-;77591:6;;;;;;;;;;;77583:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;77661:1;77649:9;:13;77641:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;77717:10;;77704:9;:23;;77696:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;77811:10;;77798:9;77770:25;77784:10;77770:13;:25::i;:::-;:37;;;;:::i;:::-;:51;;77762:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;77896:11;;77883:9;77866:14;:12;:14::i;:::-;:26;;;;:::i;:::-;:41;;77858:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;77952:24;77963:12;;77952:10;:24::i;:::-;77944:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;78036:9;78026:7;;:19;;;;:::i;:::-;78013:9;:32;;78005:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;78082:32;78092:10;78104:9;78082;:32::i;:::-;77480:642;;;:::o;76938:534::-;77013:7;;;;;;;;;;;77005:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;77081:1;77069:9;:13;77061:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;77137:10;;77124:9;:23;;77116:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;77231:10;;77218:9;77190:25;77204:10;77190:13;:25::i;:::-;:37;;;;:::i;:::-;:51;;77182:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;77316:9;;77303;77286:14;:12;:14::i;:::-;:26;;;;:::i;:::-;:39;;77278:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;77391:9;77380:8;;:20;;;;:::i;:::-;77367:9;:33;;77359:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;77432:32;77442:10;77454:9;77432;:32::i;:::-;76938:534;:::o;76792:25::-;;;;:::o;79152:170::-;13236:13;:11;:13::i;:::-;79262:9:::1;;79250:8;79233:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:38;;79225:47;;;::::0;::::1;;79283:31;79293:10;79305:8;79283:9;:31::i;:::-;79152:170:::0;:::o;78348:101::-;13236:13;:11;:13::i;:::-;78430:11:::1;78417:10;:24;;;;78348:101:::0;:::o;80541:117::-;13236:13;:11;:13::i;:::-;80595:10:::1;80587:28;;:60;80632:4;80616:30;;;80587:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;80541:117::o:0;50161:193::-;50307:39;50324:4;50330:2;50334:7;50307:39;;;;;;;;;;;;:16;:39::i;:::-;50161:193;;;:::o;76194:94::-;76260:20;76266:7;76275:4;76260:5;:20::i;:::-;76194:94;:::o;78235:105::-;13236:13;:11;:13::i;:::-;78320:12:::1;78306:11;:26;;;;78235:105:::0;:::o;76581:33::-;;;;:::o;79637:102::-;13236:13;:11;:13::i;:::-;79724:7:::1;;79708:13;:23;;;;;;;:::i;:::-;;79637:102:::0;;:::o;70907:528::-;71051:23;71117:22;71142:8;;:15;;71117:40;;71172:34;71230:14;71209:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;71172:73;;71265:9;71260:125;71281:14;71276:1;:19;71260:125;;71337:32;71357:8;;71366:1;71357:11;;;;;;;:::i;:::-;;;;;;;;71337:19;:32::i;:::-;71321:10;71332:1;71321:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;71297:3;;;;;71260:125;;;;71406:10;71399:17;;;;70907:528;;;;:::o;38503:152::-;38575:7;38618:27;38637:7;38618:18;:27::i;:::-;38595:52;;38503:152;;;:::o;78130:97::-;13236:13;:11;:13::i;:::-;78209:10:::1;78197:9;:22;;;;78130:97:::0;:::o;34045:233::-;34117:7;34158:1;34141:19;;:5;:19;;;34137:60;;;34169:28;;;;;;;;;;;;;;34137:60;28204:13;34215:18;:25;34234:5;34215:25;;;;;;;;;;;;;;;;:55;34208:62;;34045:233;;;:::o;13998:103::-;13236:13;:11;:13::i;:::-;14063:30:::1;14090:1;14063:18;:30::i;:::-;13998:103::o:0;78927:106::-;13236:13;:11;:13::i;:::-;79014:11:::1;79001:10;:24;;;;78927:106:::0;:::o;74783:900::-;74861:16;74915:19;74949:25;74989:22;75014:16;75024:5;75014:9;:16::i;:::-;74989:41;;75045:25;75087:14;75073:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75045:57;;75117:31;;:::i;:::-;75168:9;75180:15;:13;:15::i;:::-;75168:27;;75163:472;75212:14;75197:11;:29;75163:472;;75264:15;75277:1;75264:12;:15::i;:::-;75252:27;;75302:9;:16;;;75298:73;;;75343:8;;75298:73;75419:1;75393:28;;:9;:14;;;:28;;;75389:111;;75466:9;:14;;;75446:34;;75389:111;75543:5;75522:26;;:17;:26;;;75518:102;;;75599:1;75573:8;75582:13;;;;;;75573:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;75518:102;75163:472;75228:3;;;;;75163:472;;;;75656:8;75649:15;;;;;;;74783:900;;;:::o;13350:87::-;13396:7;13423:6;;;;;;;;;;;13416:13;;13350:87;:::o;78667:89::-;13236:13;:11;:13::i;:::-;78740:8:::1;78730:7;:18;;;;78667:89:::0;:::o;79041:103::-;79087:7;79111:25;79125:10;79111:13;:25::i;:::-;79104:32;;79041:103;:::o;80840:148::-;13236:13;:11;:13::i;:::-;80914:16:::1;80922:7;80914;:16::i;:::-;80906:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;80966:14;80972:7;80966:5;:14::i;:::-;80840:148:::0;:::o;37286:104::-;37342:13;37375:7;37368:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37286:104;:::o;71823:2513::-;71966:16;72033:4;72024:5;:13;72020:45;;72046:19;;;;;;;;;;;;;;72020:45;72080:19;72114:17;72134:14;:12;:14::i;:::-;72114:34;;72234:15;:13;:15::i;:::-;72226:5;:23;72222:87;;;72278:15;:13;:15::i;:::-;72270:23;;72222:87;72385:9;72378:4;:16;72374:73;;;72422:9;72415:16;;72374:73;72461:25;72489:16;72499:5;72489:9;:16::i;:::-;72461:44;;72683:4;72675:5;:12;72671:278;;;72708:19;72737:5;72730:4;:12;72708:34;;72779:17;72765:11;:31;72761:111;;;72841:11;72821:31;;72761:111;72689:198;72671:278;;;72932:1;72912:21;;72671:278;72963:25;73005:17;72991:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72963:60;;73063:1;73042:17;:22;73038:78;;;73092:8;73085:15;;;;;;;;73038:78;73260:31;73294:26;73314:5;73294:19;:26::i;:::-;73260:60;;73335:25;73580:9;:16;;;73575:92;;73637:9;:14;;;73617:34;;73575:92;73686:9;73698:5;73686:17;;73681:478;73710:4;73705:1;:9;;:45;;;;;73733:17;73718:11;:32;;73705:45;73681:478;;;73788:15;73801:1;73788:12;:15::i;:::-;73776:27;;73826:9;:16;;;73822:73;;;73867:8;;73822:73;73943:1;73917:28;;:9;:14;;;:28;;;73913:111;;73990:9;:14;;;73970:34;;73913:111;74067:5;74046:26;;:17;:26;;;74042:102;;;74123:1;74097:8;74106:13;;;;;;74097:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;74042:102;73681:478;73752:3;;;;;73681:478;;;;74261:11;74251:8;74244:29;74309:8;74302:15;;;;;;;;71823:2513;;;;;;:::o;44159:234::-;44306:8;44254:18;:39;44273:19;:17;:19::i;:::-;44254:39;;;;;;;;;;;;;;;:49;44294:8;44254:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;44366:8;44330:55;;44345:19;:17;:19::i;:::-;44330:55;;;44376:8;44330:55;;;;;;:::i;:::-;;;;;;;;44159:234;;:::o;80444:89::-;80487:7;80511:14;:12;:14::i;:::-;80504:21;;80444:89;:::o;79330:175::-;13236:13;:11;:13::i;:::-;79452:9:::1;;79439;79422:14;:12;:14::i;:::-;:26;;;;:::i;:::-;:39;;79414:48;;;::::0;::::1;;79473:24;79483:2;79487:9;79473;:24::i;:::-;79330:175:::0;;:::o;80996:87::-;81037:7;81061:14;:12;:14::i;:::-;81054:21;;80996:87;:::o;50952:407::-;51127:31;51140:4;51146:2;51150:7;51127:12;:31::i;:::-;51191:1;51173:2;:14;;;:19;51169:183;;51212:56;51243:4;51249:2;51253:7;51262:5;51212:30;:56::i;:::-;51207:145;;51296:40;;;;;;;;;;;;;;51207:145;51169:183;50952:407;;;;:::o;76699:38::-;;;;:::o;76623:29::-;;;;:::o;70320:428::-;70404:21;;:::i;:::-;70438:31;;:::i;:::-;70494:15;:13;:15::i;:::-;70484:7;:25;:54;;;;70524:14;:12;:14::i;:::-;70513:7;:25;;70484:54;70480:103;;;70562:9;70555:16;;;;;70480:103;70605:21;70618:7;70605:12;:21::i;:::-;70593:33;;70641:9;:16;;;70637:65;;;70681:9;70674:16;;;;;70637:65;70719:21;70732:7;70719:12;:21::i;:::-;70712:28;;;70320:428;;;;:::o;78764:75::-;13236:13;:11;:13::i;:::-;78823:7:::1;;;;;;;;;;;78822:8;78812:7;;:18;;;;;;;;;;;;;;;;;;78764:75::o:0;76746:37::-;;;;:::o;79747:417::-;79855:13;79892:16;79900:7;79892;:16::i;:::-;79884:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;79968:28;79999:10;:8;:10::i;:::-;79968:41;;80056:1;80031:14;80025:28;:32;:131;;;;;;;;;;;;;;;;;80095:14;80111:18;:7;:16;:18::i;:::-;80078:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80025:131;80018:138;;;79747:417;;;:::o;76541:31::-;;;;:::o;78566:93::-;13236:13;:11;:13::i;:::-;78642:9:::1;78631:8;:20;;;;78566:93:::0;:::o;44550:164::-;44647:4;44671:18;:25;44690:5;44671:25;;;;;;;;;;;;;;;:35;44697:8;44671:35;;;;;;;;;;;;;;;;;;;;;;;;;44664:42;;44550:164;;;;:::o;14256:201::-;13236:13;:11;:13::i;:::-;14365:1:::1;14345:22;;:8;:22;;;;14337:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14421:28;14440:8;14421:18;:28::i;:::-;14256:201:::0;:::o;13515:132::-;13590:12;:10;:12::i;:::-;13579:23;;:7;:5;:7::i;:::-;:23;;;13571:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13515:132::o;44972:282::-;45037:4;45093:7;45074:15;:13;:15::i;:::-;:26;;:66;;;;;45127:13;;45117:7;:23;45074:66;:153;;;;;45226:1;28980:8;45178:17;:26;45196:7;45178:26;;;;;;;;;;;;:44;:49;45074:153;45054:173;;44972:282;;;:::o;67280:105::-;67340:7;67367:10;67360:17;;67280:105;:::o;1219:190::-;1344:4;1397;1368:25;1381:5;1388:4;1368:12;:25::i;:::-;:33;1361:40;;1219:190;;;;;:::o;32377:92::-;32433:7;32377:92;:::o;39658:1275::-;39725:7;39745:12;39760:7;39745:22;;39828:4;39809:15;:13;:15::i;:::-;:23;39805:1061;;39862:13;;39855:4;:20;39851:1015;;;39900:14;39917:17;:23;39935:4;39917:23;;;;;;;;;;;;39900:40;;40034:1;28980:8;40006:6;:24;:29;40002:845;;;40671:113;40688:1;40678:6;:11;40671:113;;;40731:17;:25;40749:6;;;;;;;40731:25;;;;;;;;;;;;40722:34;;40671:113;;;40817:6;40810:13;;;;;;40002:845;39877:989;39851:1015;39805:1061;40894:31;;;;;;;;;;;;;;39658:1275;;;;:::o;46135:485::-;46237:27;46266:23;46307:38;46348:15;:24;46364:7;46348:24;;;;;;;;;;;46307:65;;46525:18;46502:41;;46582:19;46576:26;46557:45;;46487:126;46135:485;;;:::o;45363:659::-;45512:11;45677:16;45670:5;45666:28;45657:37;;45837:16;45826:9;45822:32;45809:45;;45987:15;45976:9;45973:30;45965:5;45954:9;45951:20;45948:56;45938:66;;45363:659;;;;;:::o;52021:159::-;;;;;:::o;66589:311::-;66724:7;66744:16;29384:3;66770:19;:41;;66744:68;;29384:3;66838:31;66849:4;66855:2;66859:9;66838:10;:31::i;:::-;66830:40;;:62;;66823:69;;;66589:311;;;;;:::o;41481:450::-;41561:14;41729:16;41722:5;41718:28;41709:37;;41906:5;41892:11;41867:23;41863:41;41860:52;41853:5;41850:63;41840:73;;41481:450;;;;:::o;52845:158::-;;;;;:::o;34360:178::-;34421:7;28204:13;28342:2;34449:18;:25;34468:5;34449:25;;;;;;;;;;;;;;;;:50;;34448:82;34441:89;;34360:178;;;:::o;33282:296::-;33337:7;33544:15;:13;:15::i;:::-;33528:13;;:31;33521:38;;33282:296;:::o;61112:112::-;61189:27;61199:2;61203:8;61189:27;;;;;;;;;;;;:9;:27::i;:::-;61112:112;;:::o;61809:3081::-;61889:27;61919;61938:7;61919:18;:27::i;:::-;61889:57;;61959:12;61990:19;61959:52;;62025:27;62054:23;62081:35;62108:7;62081:26;:35::i;:::-;62024:92;;;;62133:13;62129:316;;;62254:68;62279:15;62296:4;62302:19;:17;:19::i;:::-;62254:24;:68::i;:::-;62249:184;;62346:43;62363:4;62369:19;:17;:19::i;:::-;62346:16;:43::i;:::-;62341:92;;62398:35;;;;;;;;;;;;;;62341:92;62249:184;62129:316;62457:51;62479:4;62493:1;62497:7;62506:1;62457:21;:51::i;:::-;62601:15;62598:160;;;62741:1;62720:19;62713:30;62598:160;63419:1;28469:3;63389:1;:26;;63388:32;63360:18;:24;63379:4;63360:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;63687:176;63724:4;63795:53;63810:4;63824:1;63828:19;63795:14;:53::i;:::-;29260:8;28980;63748:43;63747:101;63687:18;:176::i;:::-;63658:17;:26;63676:7;63658:26;;;;;;;;;;;:205;;;;64034:1;29260:8;63983:19;:47;:52;63979:627;;;64056:19;64088:1;64078:7;:11;64056:33;;64245:1;64211:17;:30;64229:11;64211:30;;;;;;;;;;;;:35;64207:384;;;64349:13;;64334:11;:28;64330:242;;64529:19;64496:17;:30;64514:11;64496:30;;;;;;;;;;;:52;;;;64330:242;64207:384;64037:569;63979:627;64661:7;64657:1;64634:35;;64643:4;64634:35;;;;;;;;;;;;64680:50;64701:4;64715:1;64719:7;64728:1;64680:20;:50::i;:::-;64857:12;;:14;;;;;;;;;;;;;61878:3012;;;;61809:3081;;:::o;14617:191::-;14691:16;14710:6;;;;;;;;;;;14691:25;;14736:8;14727:6;;:17;;;;;;;;;;;;;;;;;;14791:8;14760:40;;14781:8;14760:40;;;;;;;;;;;;14680:128;14617:191;:::o;39106:161::-;39174:21;;:::i;:::-;39215:44;39234:17;:24;39252:5;39234:24;;;;;;;;;;;;39215:18;:44::i;:::-;39208:51;;39106:161;;;:::o;61491:89::-;61551:21;61557:7;61566:5;61551;:21::i;:::-;61491:89;:::o;32548:103::-;32603:7;32630:13;;32623:20;;32548:103;:::o;33660:102::-;33715:7;33742:12;;33735:19;;33660:102;:::o;53443:716::-;53606:4;53652:2;53627:45;;;53673:19;:17;:19::i;:::-;53694:4;53700:7;53709:5;53627:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53623:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53927:1;53910:6;:13;:18;53906:235;;;53956:40;;;;;;;;;;;;;;53906:235;54099:6;54093:13;54084:6;54080:2;54076:15;54069:38;53623:529;53796:54;;;53786:64;;;:6;:64;;;;53779:71;;;53443:716;;;;;;:::o;38844:166::-;38914:21;;:::i;:::-;38955:47;38974:27;38993:7;38974:18;:27::i;:::-;38955:18;:47::i;:::-;38948:54;;38844:166;;;:::o;79513:112::-;79573:13;79604;79597:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79513:112;:::o;9155:723::-;9211:13;9441:1;9432:5;:10;9428:53;;;9459:10;;;;;;;;;;;;;;;;;;;;;9428:53;9491:12;9506:5;9491:20;;9522:14;9547:78;9562:1;9554:4;:9;9547:78;;9580:8;;;;;:::i;:::-;;;;9611:2;9603:10;;;;;:::i;:::-;;;9547:78;;;9635:19;9667:6;9657:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9635:39;;9685:154;9701:1;9692:5;:10;9685:154;;9729:1;9719:11;;;;;:::i;:::-;;;9796:2;9788:5;:10;;;;:::i;:::-;9775:2;:24;;;;:::i;:::-;9762:39;;9745:6;9752;9745:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9825:2;9816:11;;;;;:::i;:::-;;;9685:154;;;9863:6;9849:21;;;;;9155:723;;;;:::o;11901:98::-;11954:7;11981:10;11974:17;;11901:98;:::o;2086:296::-;2169:7;2189:20;2212:4;2189:27;;2232:9;2227:118;2251:5;:12;2247:1;:16;2227:118;;;2300:33;2310:12;2324:5;2330:1;2324:8;;;;;;;;:::i;:::-;;;;;;;;2300:9;:33::i;:::-;2285:48;;2265:3;;;;;:::i;:::-;;;;2227:118;;;;2362:12;2355:19;;;2086:296;;;;:::o;66290:147::-;66427:6;66290:147;;;;;:::o;60339:689::-;60470:19;60476:2;60480:8;60470:5;:19::i;:::-;60549:1;60531:2;:14;;;:19;60527:483;;60571:11;60585:13;;60571:27;;60617:13;60639:8;60633:3;:14;60617:30;;60666:233;60697:62;60736:1;60740:2;60744:7;;;;;;60753:5;60697:30;:62::i;:::-;60692:167;;60795:40;;;;;;;;;;;;;;60692:167;60894:3;60886:5;:11;60666:233;;60981:3;60964:13;;:20;60960:34;;60986:8;;;60960:34;60552:458;;60527:483;60339:689;;;:::o;41032:366::-;41098:31;;:::i;:::-;41175:6;41142:9;:14;;:41;;;;;;;;;;;28863:3;41228:6;:33;;41194:9;:24;;:68;;;;;;;;;;;41320:1;28980:8;41292:6;:24;:29;;41273:9;:16;;:48;;;;;;;;;;;29384:3;41361:6;:28;;41332:9;:19;;:58;;;;;;;;;;;41032:366;;;:::o;8293:149::-;8356:7;8387:1;8383;:5;:51;;8414:20;8429:1;8432;8414:14;:20::i;:::-;8383:51;;;8391:20;8406:1;8409;8391:14;:20::i;:::-;8383:51;8376:58;;8293:149;;;;:::o;54621:2966::-;54694:20;54717:13;;54694:36;;54757:1;54745:8;:13;54741:44;;;54767:18;;;;;;;;;;;;;;54741:44;54798:61;54828:1;54832:2;54836:12;54850:8;54798:21;:61::i;:::-;55342:1;28342:2;55312:1;:26;;55311:32;55299:8;:45;55273:18;:22;55292:2;55273:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;55621:139;55658:2;55712:33;55735:1;55739:2;55743:1;55712:14;:33::i;:::-;55679:30;55700:8;55679:20;:30::i;:::-;:66;55621:18;:139::i;:::-;55587:17;:31;55605:12;55587:31;;;;;;;;;;;:173;;;;55777:16;55808:11;55837:8;55822:12;:23;55808:37;;56358:16;56354:2;56350:25;56338:37;;56730:12;56690:8;56649:1;56587:25;56528:1;56467;56440:335;57101:1;57087:12;57083:20;57041:346;57142:3;57133:7;57130:16;57041:346;;57360:7;57350:8;57347:1;57320:25;57317:1;57314;57309:59;57195:1;57186:7;57182:15;57171:26;;57041:346;;;57045:77;57432:1;57420:8;:13;57416:45;;;57442:19;;;;;;;;;;;;;;57416:45;57494:3;57478:13;:19;;;;55047:2462;;57519:60;57548:1;57552:2;57556:12;57570:8;57519:20;:60::i;:::-;54683:2904;54621:2966;;:::o;8450:268::-;8518:13;8625:1;8619:4;8612:15;8654:1;8648:4;8641:15;8695:4;8689;8679:21;8670:30;;8450:268;;;;:::o;42033:324::-;42103:14;42336:1;42326:8;42323:15;42297:24;42293:46;42283:56;;42033:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:307::-;2557:1;2567:113;2581:6;2578:1;2575:13;2567:113;;;2666:1;2661:3;2657:11;2651:18;2647:1;2642:3;2638:11;2631:39;2603:2;2600:1;2596:10;2591:15;;2567:113;;;2698:6;2695:1;2692:13;2689:101;;;2778:1;2769:6;2764:3;2760:16;2753:27;2689:101;2538:258;2489:307;;;:::o;2802:102::-;2843:6;2894:2;2890:7;2885:2;2878:5;2874:14;2870:28;2860:38;;2802:102;;;:::o;2910:364::-;2998:3;3026:39;3059:5;3026:39;:::i;:::-;3081:71;3145:6;3140:3;3081:71;:::i;:::-;3074:78;;3161:52;3206:6;3201:3;3194:4;3187:5;3183:16;3161:52;:::i;:::-;3238:29;3260:6;3238:29;:::i;:::-;3233:3;3229:39;3222:46;;3002:272;2910:364;;;;:::o;3280:313::-;3393:4;3431:2;3420:9;3416:18;3408:26;;3480:9;3474:4;3470:20;3466:1;3455:9;3451:17;3444:47;3508:78;3581:4;3572:6;3508:78;:::i;:::-;3500:86;;3280:313;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:117;5293:1;5290;5283:12;5324:568;5397:8;5407:6;5457:3;5450:4;5442:6;5438:17;5434:27;5424:122;;5465:79;;:::i;:::-;5424:122;5578:6;5565:20;5555:30;;5608:18;5600:6;5597:30;5594:117;;;5630:79;;:::i;:::-;5594:117;5744:4;5736:6;5732:17;5720:29;;5798:3;5790:4;5782:6;5778:17;5768:8;5764:32;5761:41;5758:128;;;5805:79;;:::i;:::-;5758:128;5324:568;;;;;:::o;5898:559::-;5984:6;5992;6041:2;6029:9;6020:7;6016:23;6012:32;6009:119;;;6047:79;;:::i;:::-;6009:119;6195:1;6184:9;6180:17;6167:31;6225:18;6217:6;6214:30;6211:117;;;6247:79;;:::i;:::-;6211:117;6360:80;6432:7;6423:6;6412:9;6408:22;6360:80;:::i;:::-;6342:98;;;;6138:312;5898:559;;;;;:::o;6463:118::-;6550:24;6568:5;6550:24;:::i;:::-;6545:3;6538:37;6463:118;;:::o;6587:222::-;6680:4;6718:2;6707:9;6703:18;6695:26;;6731:71;6799:1;6788:9;6784:17;6775:6;6731:71;:::i;:::-;6587:222;;;;:::o;6815:619::-;6892:6;6900;6908;6957:2;6945:9;6936:7;6932:23;6928:32;6925:119;;;6963:79;;:::i;:::-;6925:119;7083:1;7108:53;7153:7;7144:6;7133:9;7129:22;7108:53;:::i;:::-;7098:63;;7054:117;7210:2;7236:53;7281:7;7272:6;7261:9;7257:22;7236:53;:::i;:::-;7226:63;;7181:118;7338:2;7364:53;7409:7;7400:6;7389:9;7385:22;7364:53;:::i;:::-;7354:63;;7309:118;6815:619;;;;;:::o;7440:704::-;7535:6;7543;7551;7600:2;7588:9;7579:7;7575:23;7571:32;7568:119;;;7606:79;;:::i;:::-;7568:119;7754:1;7743:9;7739:17;7726:31;7784:18;7776:6;7773:30;7770:117;;;7806:79;;:::i;:::-;7770:117;7919:80;7991:7;7982:6;7971:9;7967:22;7919:80;:::i;:::-;7901:98;;;;7697:312;8048:2;8074:53;8119:7;8110:6;8099:9;8095:22;8074:53;:::i;:::-;8064:63;;8019:118;7440:704;;;;;:::o;8150:77::-;8187:7;8216:5;8205:16;;8150:77;;;:::o;8233:118::-;8320:24;8338:5;8320:24;:::i;:::-;8315:3;8308:37;8233:118;;:::o;8357:222::-;8450:4;8488:2;8477:9;8473:18;8465:26;;8501:71;8569:1;8558:9;8554:17;8545:6;8501:71;:::i;:::-;8357:222;;;;:::o;8599:553::-;8657:8;8667:6;8717:3;8710:4;8702:6;8698:17;8694:27;8684:122;;8725:79;;:::i;:::-;8684:122;8838:6;8825:20;8815:30;;8868:18;8860:6;8857:30;8854:117;;;8890:79;;:::i;:::-;8854:117;9004:4;8996:6;8992:17;8980:29;;9058:3;9050:4;9042:6;9038:17;9028:8;9024:32;9021:41;9018:128;;;9065:79;;:::i;:::-;9018:128;8599:553;;;;;:::o;9158:529::-;9229:6;9237;9286:2;9274:9;9265:7;9261:23;9257:32;9254:119;;;9292:79;;:::i;:::-;9254:119;9440:1;9429:9;9425:17;9412:31;9470:18;9462:6;9459:30;9456:117;;;9492:79;;:::i;:::-;9456:117;9605:65;9662:7;9653:6;9642:9;9638:22;9605:65;:::i;:::-;9587:83;;;;9383:297;9158:529;;;;;:::o;9710:568::-;9783:8;9793:6;9843:3;9836:4;9828:6;9824:17;9820:27;9810:122;;9851:79;;:::i;:::-;9810:122;9964:6;9951:20;9941:30;;9994:18;9986:6;9983:30;9980:117;;;10016:79;;:::i;:::-;9980:117;10130:4;10122:6;10118:17;10106:29;;10184:3;10176:4;10168:6;10164:17;10154:8;10150:32;10147:41;10144:128;;;10191:79;;:::i;:::-;10144:128;9710:568;;;;;:::o;10284:559::-;10370:6;10378;10427:2;10415:9;10406:7;10402:23;10398:32;10395:119;;;10433:79;;:::i;:::-;10395:119;10581:1;10570:9;10566:17;10553:31;10611:18;10603:6;10600:30;10597:117;;;10633:79;;:::i;:::-;10597:117;10746:80;10818:7;10809:6;10798:9;10794:22;10746:80;:::i;:::-;10728:98;;;;10524:312;10284:559;;;;;:::o;10849:145::-;10947:6;10981:5;10975:12;10965:22;;10849:145;;;:::o;11000:215::-;11130:11;11164:6;11159:3;11152:19;11204:4;11199:3;11195:14;11180:29;;11000:215;;;;:::o;11221:163::-;11319:4;11342:3;11334:11;;11372:4;11367:3;11363:14;11355:22;;11221:163;;;:::o;11390:108::-;11467:24;11485:5;11467:24;:::i;:::-;11462:3;11455:37;11390:108;;:::o;11504:101::-;11540:7;11580:18;11573:5;11569:30;11558:41;;11504:101;;;:::o;11611:105::-;11686:23;11703:5;11686:23;:::i;:::-;11681:3;11674:36;11611:105;;:::o;11722:99::-;11793:21;11808:5;11793:21;:::i;:::-;11788:3;11781:34;11722:99;;:::o;11827:91::-;11863:7;11903:8;11896:5;11892:20;11881:31;;11827:91;;;:::o;11924:105::-;11999:23;12016:5;11999:23;:::i;:::-;11994:3;11987:36;11924:105;;:::o;12107:864::-;12256:4;12251:3;12247:14;12343:4;12336:5;12332:16;12326:23;12362:63;12419:4;12414:3;12410:14;12396:12;12362:63;:::i;:::-;12271:164;12527:4;12520:5;12516:16;12510:23;12546:61;12601:4;12596:3;12592:14;12578:12;12546:61;:::i;:::-;12445:172;12701:4;12694:5;12690:16;12684:23;12720:57;12771:4;12766:3;12762:14;12748:12;12720:57;:::i;:::-;12627:160;12874:4;12867:5;12863:16;12857:23;12893:61;12948:4;12943:3;12939:14;12925:12;12893:61;:::i;:::-;12797:167;12225:746;12107:864;;:::o;12977:303::-;13108:10;13129:108;13233:3;13225:6;13129:108;:::i;:::-;13269:4;13264:3;13260:14;13246:28;;12977:303;;;;:::o;13286:144::-;13387:4;13419;13414:3;13410:14;13402:22;;13286:144;;;:::o;13512:980::-;13693:3;13722:85;13801:5;13722:85;:::i;:::-;13823:117;13933:6;13928:3;13823:117;:::i;:::-;13816:124;;13964:87;14045:5;13964:87;:::i;:::-;14074:7;14105:1;14090:377;14115:6;14112:1;14109:13;14090:377;;;14191:6;14185:13;14218:125;14339:3;14324:13;14218:125;:::i;:::-;14211:132;;14366:91;14450:6;14366:91;:::i;:::-;14356:101;;14150:317;14137:1;14134;14130:9;14125:14;;14090:377;;;14094:14;14483:3;14476:10;;13698:794;;;13512:980;;;;:::o;14498:497::-;14703:4;14741:2;14730:9;14726:18;14718:26;;14790:9;14784:4;14780:20;14776:1;14765:9;14761:17;14754:47;14818:170;14983:4;14974:6;14818:170;:::i;:::-;14810:178;;14498:497;;;;:::o;15001:329::-;15060:6;15109:2;15097:9;15088:7;15084:23;15080:32;15077:119;;;15115:79;;:::i;:::-;15077:119;15235:1;15260:53;15305:7;15296:6;15285:9;15281:22;15260:53;:::i;:::-;15250:63;;15206:117;15001:329;;;;:::o;15336:122::-;15409:24;15427:5;15409:24;:::i;:::-;15402:5;15399:35;15389:63;;15448:1;15445;15438:12;15389:63;15336:122;:::o;15464:139::-;15510:5;15548:6;15535:20;15526:29;;15564:33;15591:5;15564:33;:::i;:::-;15464:139;;;;:::o;15609:329::-;15668:6;15717:2;15705:9;15696:7;15692:23;15688:32;15685:119;;;15723:79;;:::i;:::-;15685:119;15843:1;15868:53;15913:7;15904:6;15893:9;15889:22;15868:53;:::i;:::-;15858:63;;15814:117;15609:329;;;;:::o;15944:114::-;16011:6;16045:5;16039:12;16029:22;;15944:114;;;:::o;16064:184::-;16163:11;16197:6;16192:3;16185:19;16237:4;16232:3;16228:14;16213:29;;16064:184;;;;:::o;16254:132::-;16321:4;16344:3;16336:11;;16374:4;16369:3;16365:14;16357:22;;16254:132;;;:::o;16392:108::-;16469:24;16487:5;16469:24;:::i;:::-;16464:3;16457:37;16392:108;;:::o;16506:179::-;16575:10;16596:46;16638:3;16630:6;16596:46;:::i;:::-;16674:4;16669:3;16665:14;16651:28;;16506:179;;;;:::o;16691:113::-;16761:4;16793;16788:3;16784:14;16776:22;;16691:113;;;:::o;16840:732::-;16959:3;16988:54;17036:5;16988:54;:::i;:::-;17058:86;17137:6;17132:3;17058:86;:::i;:::-;17051:93;;17168:56;17218:5;17168:56;:::i;:::-;17247:7;17278:1;17263:284;17288:6;17285:1;17282:13;17263:284;;;17364:6;17358:13;17391:63;17450:3;17435:13;17391:63;:::i;:::-;17384:70;;17477:60;17530:6;17477:60;:::i;:::-;17467:70;;17323:224;17310:1;17307;17303:9;17298:14;;17263:284;;;17267:14;17563:3;17556:10;;16964:608;;;16840:732;;;;:::o;17578:373::-;17721:4;17759:2;17748:9;17744:18;17736:26;;17808:9;17802:4;17798:20;17794:1;17783:9;17779:17;17772:47;17836:108;17939:4;17930:6;17836:108;:::i;:::-;17828:116;;17578:373;;;;:::o;17957:619::-;18034:6;18042;18050;18099:2;18087:9;18078:7;18074:23;18070:32;18067:119;;;18105:79;;:::i;:::-;18067:119;18225:1;18250:53;18295:7;18286:6;18275:9;18271:22;18250:53;:::i;:::-;18240:63;;18196:117;18352:2;18378:53;18423:7;18414:6;18403:9;18399:22;18378:53;:::i;:::-;18368:63;;18323:118;18480:2;18506:53;18551:7;18542:6;18531:9;18527:22;18506:53;:::i;:::-;18496:63;;18451:118;17957:619;;;;;:::o;18582:116::-;18652:21;18667:5;18652:21;:::i;:::-;18645:5;18642:32;18632:60;;18688:1;18685;18678:12;18632:60;18582:116;:::o;18704:133::-;18747:5;18785:6;18772:20;18763:29;;18801:30;18825:5;18801:30;:::i;:::-;18704:133;;;;:::o;18843:468::-;18908:6;18916;18965:2;18953:9;18944:7;18940:23;18936:32;18933:119;;;18971:79;;:::i;:::-;18933:119;19091:1;19116:53;19161:7;19152:6;19141:9;19137:22;19116:53;:::i;:::-;19106:63;;19062:117;19218:2;19244:50;19286:7;19277:6;19266:9;19262:22;19244:50;:::i;:::-;19234:60;;19189:115;18843:468;;;;;:::o;19317:117::-;19426:1;19423;19416:12;19440:180;19488:77;19485:1;19478:88;19585:4;19582:1;19575:15;19609:4;19606:1;19599:15;19626:281;19709:27;19731:4;19709:27;:::i;:::-;19701:6;19697:40;19839:6;19827:10;19824:22;19803:18;19791:10;19788:34;19785:62;19782:88;;;19850:18;;:::i;:::-;19782:88;19890:10;19886:2;19879:22;19669:238;19626:281;;:::o;19913:129::-;19947:6;19974:20;;:::i;:::-;19964:30;;20003:33;20031:4;20023:6;20003:33;:::i;:::-;19913:129;;;:::o;20048:307::-;20109:4;20199:18;20191:6;20188:30;20185:56;;;20221:18;;:::i;:::-;20185:56;20259:29;20281:6;20259:29;:::i;:::-;20251:37;;20343:4;20337;20333:15;20325:23;;20048:307;;;:::o;20361:154::-;20445:6;20440:3;20435;20422:30;20507:1;20498:6;20493:3;20489:16;20482:27;20361:154;;;:::o;20521:410::-;20598:5;20623:65;20639:48;20680:6;20639:48;:::i;:::-;20623:65;:::i;:::-;20614:74;;20711:6;20704:5;20697:21;20749:4;20742:5;20738:16;20787:3;20778:6;20773:3;20769:16;20766:25;20763:112;;;20794:79;;:::i;:::-;20763:112;20884:41;20918:6;20913:3;20908;20884:41;:::i;:::-;20604:327;20521:410;;;;;:::o;20950:338::-;21005:5;21054:3;21047:4;21039:6;21035:17;21031:27;21021:122;;21062:79;;:::i;:::-;21021:122;21179:6;21166:20;21204:78;21278:3;21270:6;21263:4;21255:6;21251:17;21204:78;:::i;:::-;21195:87;;21011:277;20950:338;;;;:::o;21294:943::-;21389:6;21397;21405;21413;21462:3;21450:9;21441:7;21437:23;21433:33;21430:120;;;21469:79;;:::i;:::-;21430:120;21589:1;21614:53;21659:7;21650:6;21639:9;21635:22;21614:53;:::i;:::-;21604:63;;21560:117;21716:2;21742:53;21787:7;21778:6;21767:9;21763:22;21742:53;:::i;:::-;21732:63;;21687:118;21844:2;21870:53;21915:7;21906:6;21895:9;21891:22;21870:53;:::i;:::-;21860:63;;21815:118;22000:2;21989:9;21985:18;21972:32;22031:18;22023:6;22020:30;22017:117;;;22053:79;;:::i;:::-;22017:117;22158:62;22212:7;22203:6;22192:9;22188:22;22158:62;:::i;:::-;22148:72;;21943:287;21294:943;;;;;;;:::o;22315:874::-;22474:4;22469:3;22465:14;22561:4;22554:5;22550:16;22544:23;22580:63;22637:4;22632:3;22628:14;22614:12;22580:63;:::i;:::-;22489:164;22745:4;22738:5;22734:16;22728:23;22764:61;22819:4;22814:3;22810:14;22796:12;22764:61;:::i;:::-;22663:172;22919:4;22912:5;22908:16;22902:23;22938:57;22989:4;22984:3;22980:14;22966:12;22938:57;:::i;:::-;22845:160;23092:4;23085:5;23081:16;23075:23;23111:61;23166:4;23161:3;23157:14;23143:12;23111:61;:::i;:::-;23015:167;22443:746;22315:874;;:::o;23195:347::-;23350:4;23388:3;23377:9;23373:19;23365:27;;23402:133;23532:1;23521:9;23517:17;23508:6;23402:133;:::i;:::-;23195:347;;;;:::o;23548:474::-;23616:6;23624;23673:2;23661:9;23652:7;23648:23;23644:32;23641:119;;;23679:79;;:::i;:::-;23641:119;23799:1;23824:53;23869:7;23860:6;23849:9;23845:22;23824:53;:::i;:::-;23814:63;;23770:117;23926:2;23952:53;23997:7;23988:6;23977:9;23973:22;23952:53;:::i;:::-;23942:63;;23897:118;23548:474;;;;;:::o;24028:147::-;24129:11;24166:3;24151:18;;24028:147;;;;:::o;24181:114::-;;:::o;24301:398::-;24460:3;24481:83;24562:1;24557:3;24481:83;:::i;:::-;24474:90;;24573:93;24662:3;24573:93;:::i;:::-;24691:1;24686:3;24682:11;24675:18;;24301:398;;;:::o;24705:379::-;24889:3;24911:147;25054:3;24911:147;:::i;:::-;24904:154;;25075:3;25068:10;;24705:379;;;:::o;25090:180::-;25138:77;25135:1;25128:88;25235:4;25232:1;25225:15;25259:4;25256:1;25249:15;25276:320;25320:6;25357:1;25351:4;25347:12;25337:22;;25404:1;25398:4;25394:12;25425:18;25415:81;;25481:4;25473:6;25469:17;25459:27;;25415:81;25543:2;25535:6;25532:14;25512:18;25509:38;25506:84;;;25562:18;;:::i;:::-;25506:84;25327:269;25276:320;;;:::o;25602:94::-;25635:8;25683:5;25679:2;25675:14;25654:35;;25602:94;;;:::o;25702:::-;25741:7;25770:20;25784:5;25770:20;:::i;:::-;25759:31;;25702:94;;;:::o;25802:100::-;25841:7;25870:26;25890:5;25870:26;:::i;:::-;25859:37;;25802:100;;;:::o;25908:157::-;26013:45;26033:24;26051:5;26033:24;:::i;:::-;26013:45;:::i;:::-;26008:3;26001:58;25908:157;;:::o;26071:256::-;26183:3;26198:75;26269:3;26260:6;26198:75;:::i;:::-;26298:2;26293:3;26289:12;26282:19;;26318:3;26311:10;;26071:256;;;;:::o;26333:165::-;26473:17;26469:1;26461:6;26457:14;26450:41;26333:165;:::o;26504:366::-;26646:3;26667:67;26731:2;26726:3;26667:67;:::i;:::-;26660:74;;26743:93;26832:3;26743:93;:::i;:::-;26861:2;26856:3;26852:12;26845:19;;26504:366;;;:::o;26876:419::-;27042:4;27080:2;27069:9;27065:18;27057:26;;27129:9;27123:4;27119:20;27115:1;27104:9;27100:17;27093:47;27157:131;27283:4;27157:131;:::i;:::-;27149:139;;26876:419;;;:::o;27301:178::-;27441:30;27437:1;27429:6;27425:14;27418:54;27301:178;:::o;27485:366::-;27627:3;27648:67;27712:2;27707:3;27648:67;:::i;:::-;27641:74;;27724:93;27813:3;27724:93;:::i;:::-;27842:2;27837:3;27833:12;27826:19;;27485:366;;;:::o;27857:419::-;28023:4;28061:2;28050:9;28046:18;28038:26;;28110:9;28104:4;28100:20;28096:1;28085:9;28081:17;28074:47;28138:131;28264:4;28138:131;:::i;:::-;28130:139;;27857:419;;;:::o;28282:168::-;28422:20;28418:1;28410:6;28406:14;28399:44;28282:168;:::o;28456:366::-;28598:3;28619:67;28683:2;28678:3;28619:67;:::i;:::-;28612:74;;28695:93;28784:3;28695:93;:::i;:::-;28813:2;28808:3;28804:12;28797:19;;28456:366;;;:::o;28828:419::-;28994:4;29032:2;29021:9;29017:18;29009:26;;29081:9;29075:4;29071:20;29067:1;29056:9;29052:17;29045:47;29109:131;29235:4;29109:131;:::i;:::-;29101:139;;28828:419;;;:::o;29253:169::-;29393:21;29389:1;29381:6;29377:14;29370:45;29253:169;:::o;29428:366::-;29570:3;29591:67;29655:2;29650:3;29591:67;:::i;:::-;29584:74;;29667:93;29756:3;29667:93;:::i;:::-;29785:2;29780:3;29776:12;29769:19;;29428:366;;;:::o;29800:419::-;29966:4;30004:2;29993:9;29989:18;29981:26;;30053:9;30047:4;30043:20;30039:1;30028:9;30024:17;30017:47;30081:131;30207:4;30081:131;:::i;:::-;30073:139;;29800:419;;;:::o;30225:180::-;30273:77;30270:1;30263:88;30370:4;30367:1;30360:15;30394:4;30391:1;30384:15;30411:305;30451:3;30470:20;30488:1;30470:20;:::i;:::-;30465:25;;30504:20;30522:1;30504:20;:::i;:::-;30499:25;;30658:1;30590:66;30586:74;30583:1;30580:81;30577:107;;;30664:18;;:::i;:::-;30577:107;30708:1;30705;30701:9;30694:16;;30411:305;;;;:::o;30722:172::-;30862:24;30858:1;30850:6;30846:14;30839:48;30722:172;:::o;30900:366::-;31042:3;31063:67;31127:2;31122:3;31063:67;:::i;:::-;31056:74;;31139:93;31228:3;31139:93;:::i;:::-;31257:2;31252:3;31248:12;31241:19;;30900:366;;;:::o;31272:419::-;31438:4;31476:2;31465:9;31461:18;31453:26;;31525:9;31519:4;31515:20;31511:1;31500:9;31496:17;31489:47;31553:131;31679:4;31553:131;:::i;:::-;31545:139;;31272:419;;;:::o;31697:171::-;31837:23;31833:1;31825:6;31821:14;31814:47;31697:171;:::o;31874:366::-;32016:3;32037:67;32101:2;32096:3;32037:67;:::i;:::-;32030:74;;32113:93;32202:3;32113:93;:::i;:::-;32231:2;32226:3;32222:12;32215:19;;31874:366;;;:::o;32246:419::-;32412:4;32450:2;32439:9;32435:18;32427:26;;32499:9;32493:4;32489:20;32485:1;32474:9;32470:17;32463:47;32527:131;32653:4;32527:131;:::i;:::-;32519:139;;32246:419;;;:::o;32671:163::-;32811:15;32807:1;32799:6;32795:14;32788:39;32671:163;:::o;32840:366::-;32982:3;33003:67;33067:2;33062:3;33003:67;:::i;:::-;32996:74;;33079:93;33168:3;33079:93;:::i;:::-;33197:2;33192:3;33188:12;33181:19;;32840:366;;;:::o;33212:419::-;33378:4;33416:2;33405:9;33401:18;33393:26;;33465:9;33459:4;33455:20;33451:1;33440:9;33436:17;33429:47;33493:131;33619:4;33493:131;:::i;:::-;33485:139;;33212:419;;;:::o;33637:348::-;33677:7;33700:20;33718:1;33700:20;:::i;:::-;33695:25;;33734:20;33752:1;33734:20;:::i;:::-;33729:25;;33922:1;33854:66;33850:74;33847:1;33844:81;33839:1;33832:9;33825:17;33821:105;33818:131;;;33929:18;;:::i;:::-;33818:131;33977:1;33974;33970:9;33959:20;;33637:348;;;;:::o;33991:166::-;34131:18;34127:1;34119:6;34115:14;34108:42;33991:166;:::o;34163:366::-;34305:3;34326:67;34390:2;34385:3;34326:67;:::i;:::-;34319:74;;34402:93;34491:3;34402:93;:::i;:::-;34520:2;34515:3;34511:12;34504:19;;34163:366;;;:::o;34535:419::-;34701:4;34739:2;34728:9;34724:18;34716:26;;34788:9;34782:4;34778:20;34774:1;34763:9;34759:17;34752:47;34816:131;34942:4;34816:131;:::i;:::-;34808:139;;34535:419;;;:::o;34960:175::-;35100:27;35096:1;35088:6;35084:14;35077:51;34960:175;:::o;35141:366::-;35283:3;35304:67;35368:2;35363:3;35304:67;:::i;:::-;35297:74;;35380:93;35469:3;35380:93;:::i;:::-;35498:2;35493:3;35489:12;35482:19;;35141:366;;;:::o;35513:419::-;35679:4;35717:2;35706:9;35702:18;35694:26;;35766:9;35760:4;35756:20;35752:1;35741:9;35737:17;35730:47;35794:131;35920:4;35794:131;:::i;:::-;35786:139;;35513:419;;;:::o;35938:168::-;36078:20;36074:1;36066:6;36062:14;36055:44;35938:168;:::o;36112:366::-;36254:3;36275:67;36339:2;36334:3;36275:67;:::i;:::-;36268:74;;36351:93;36440:3;36351:93;:::i;:::-;36469:2;36464:3;36460:12;36453:19;;36112:366;;;:::o;36484:419::-;36650:4;36688:2;36677:9;36673:18;36665:26;;36737:9;36731:4;36727:20;36723:1;36712:9;36708:17;36701:47;36765:131;36891:4;36765:131;:::i;:::-;36757:139;;36484:419;;;:::o;36909:180::-;36957:77;36954:1;36947:88;37054:4;37051:1;37044:15;37078:4;37075:1;37068:15;37095:170;37235:22;37231:1;37223:6;37219:14;37212:46;37095:170;:::o;37271:366::-;37413:3;37434:67;37498:2;37493:3;37434:67;:::i;:::-;37427:74;;37510:93;37599:3;37510:93;:::i;:::-;37628:2;37623:3;37619:12;37612:19;;37271:366;;;:::o;37643:419::-;37809:4;37847:2;37836:9;37832:18;37824:26;;37896:9;37890:4;37886:20;37882:1;37871:9;37867:17;37860:47;37924:131;38050:4;37924:131;:::i;:::-;37916:139;;37643:419;;;:::o;38068:234::-;38208:34;38204:1;38196:6;38192:14;38185:58;38277:17;38272:2;38264:6;38260:15;38253:42;38068:234;:::o;38308:366::-;38450:3;38471:67;38535:2;38530:3;38471:67;:::i;:::-;38464:74;;38547:93;38636:3;38547:93;:::i;:::-;38665:2;38660:3;38656:12;38649:19;;38308:366;;;:::o;38680:419::-;38846:4;38884:2;38873:9;38869:18;38861:26;;38933:9;38927:4;38923:20;38919:1;38908:9;38904:17;38897:47;38961:131;39087:4;38961:131;:::i;:::-;38953:139;;38680:419;;;:::o;39105:148::-;39207:11;39244:3;39229:18;;39105:148;;;;:::o;39259:377::-;39365:3;39393:39;39426:5;39393:39;:::i;:::-;39448:89;39530:6;39525:3;39448:89;:::i;:::-;39441:96;;39546:52;39591:6;39586:3;39579:4;39572:5;39568:16;39546:52;:::i;:::-;39623:6;39618:3;39614:16;39607:23;;39369:267;39259:377;;;;:::o;39642:155::-;39782:7;39778:1;39770:6;39766:14;39759:31;39642:155;:::o;39803:400::-;39963:3;39984:84;40066:1;40061:3;39984:84;:::i;:::-;39977:91;;40077:93;40166:3;40077:93;:::i;:::-;40195:1;40190:3;40186:11;40179:18;;39803:400;;;:::o;40209:701::-;40490:3;40512:95;40603:3;40594:6;40512:95;:::i;:::-;40505:102;;40624:95;40715:3;40706:6;40624:95;:::i;:::-;40617:102;;40736:148;40880:3;40736:148;:::i;:::-;40729:155;;40901:3;40894:10;;40209:701;;;;;:::o;40916:225::-;41056:34;41052:1;41044:6;41040:14;41033:58;41125:8;41120:2;41112:6;41108:15;41101:33;40916:225;:::o;41147:366::-;41289:3;41310:67;41374:2;41369:3;41310:67;:::i;:::-;41303:74;;41386:93;41475:3;41386:93;:::i;:::-;41504:2;41499:3;41495:12;41488:19;;41147:366;;;:::o;41519:419::-;41685:4;41723:2;41712:9;41708:18;41700:26;;41772:9;41766:4;41762:20;41758:1;41747:9;41743:17;41736:47;41800:131;41926:4;41800:131;:::i;:::-;41792:139;;41519:419;;;:::o;41944:182::-;42084:34;42080:1;42072:6;42068:14;42061:58;41944:182;:::o;42132:366::-;42274:3;42295:67;42359:2;42354:3;42295:67;:::i;:::-;42288:74;;42371:93;42460:3;42371:93;:::i;:::-;42489:2;42484:3;42480:12;42473:19;;42132:366;;;:::o;42504:419::-;42670:4;42708:2;42697:9;42693:18;42685:26;;42757:9;42751:4;42747:20;42743:1;42732:9;42728:17;42721:47;42785:131;42911:4;42785:131;:::i;:::-;42777:139;;42504:419;;;:::o;42929:98::-;42980:6;43014:5;43008:12;42998:22;;42929:98;;;:::o;43033:168::-;43116:11;43150:6;43145:3;43138:19;43190:4;43185:3;43181:14;43166:29;;43033:168;;;;:::o;43207:360::-;43293:3;43321:38;43353:5;43321:38;:::i;:::-;43375:70;43438:6;43433:3;43375:70;:::i;:::-;43368:77;;43454:52;43499:6;43494:3;43487:4;43480:5;43476:16;43454:52;:::i;:::-;43531:29;43553:6;43531:29;:::i;:::-;43526:3;43522:39;43515:46;;43297:270;43207:360;;;;:::o;43573:640::-;43768:4;43806:3;43795:9;43791:19;43783:27;;43820:71;43888:1;43877:9;43873:17;43864:6;43820:71;:::i;:::-;43901:72;43969:2;43958:9;43954:18;43945:6;43901:72;:::i;:::-;43983;44051:2;44040:9;44036:18;44027:6;43983:72;:::i;:::-;44102:9;44096:4;44092:20;44087:2;44076:9;44072:18;44065:48;44130:76;44201:4;44192:6;44130:76;:::i;:::-;44122:84;;43573:640;;;;;;;:::o;44219:141::-;44275:5;44306:6;44300:13;44291:22;;44322:32;44348:5;44322:32;:::i;:::-;44219:141;;;;:::o;44366:349::-;44435:6;44484:2;44472:9;44463:7;44459:23;44455:32;44452:119;;;44490:79;;:::i;:::-;44452:119;44610:1;44635:63;44690:7;44681:6;44670:9;44666:22;44635:63;:::i;:::-;44625:73;;44581:127;44366:349;;;;:::o;44721:233::-;44760:3;44783:24;44801:5;44783:24;:::i;:::-;44774:33;;44829:66;44822:5;44819:77;44816:103;;;44899:18;;:::i;:::-;44816:103;44946:1;44939:5;44935:13;44928:20;;44721:233;;;:::o;44960:180::-;45008:77;45005:1;44998:88;45105:4;45102:1;45095:15;45129:4;45126:1;45119:15;45146:185;45186:1;45203:20;45221:1;45203:20;:::i;:::-;45198:25;;45237:20;45255:1;45237:20;:::i;:::-;45232:25;;45276:1;45266:35;;45281:18;;:::i;:::-;45266:35;45323:1;45320;45316:9;45311:14;;45146:185;;;;:::o;45337:191::-;45377:4;45397:20;45415:1;45397:20;:::i;:::-;45392:25;;45431:20;45449:1;45431:20;:::i;:::-;45426:25;;45470:1;45467;45464:8;45461:34;;;45475:18;;:::i;:::-;45461:34;45520:1;45517;45513:9;45505:17;;45337:191;;;;:::o;45534:176::-;45566:1;45583:20;45601:1;45583:20;:::i;:::-;45578:25;;45617:20;45635:1;45617:20;:::i;:::-;45612:25;;45656:1;45646:35;;45661:18;;:::i;:::-;45646:35;45702:1;45699;45695:9;45690:14;;45534:176;;;;:::o
Swarm Source
ipfs://df31084e3cd382912d9f39ce94c687f919c107de021c905f5fc9cb59773b323a
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.