ERC-721
Overview
Max Total Supply
1,365 BLNKAN
Holders
111
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 BLNKANLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Ancients
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-31 */ // SPDX-License-Identifier: MIT // 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: 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: contracts/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: contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: contracts/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: @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: contracts/Ancients.sol pragma solidity ^0.8.4; contract Ancients is ERC721AQueryable, Ownable { string public metadataPath = "https://theblinkless.s3.amazonaws.com/ancients/metadata/"; address public payoutWallet = 0xeD2faa60373eC70E57B39152aeE5Ce4ed7C333c7; //wallet for payouts address public projectWallet = 0xB818B1BbF47fC499B621f6807d61a61046C6478f; //project wallet uint256 maxSupply = 1500; mapping(address => bool) public claimedWallets; bool public isMinting = false; bytes32 public root = 0xb96d5faaa1f37ddf087866f17bde60c73f22d000f763e0fc310cfc1279cd929a; constructor() ERC721A("The Blinkless: Ancients", "BLNKAN") {} /* * Ensures the caller is not a proxy contract or bot, but is an actual wallet. */ modifier callerIsUser() { //we only want to mint to real people require(tx.origin == msg.sender, "The caller is another contract"); _; } /* * Verifies the wallet is allowed to mint */ function verifyProof(bytes32[] memory proof, bytes32 leaf) public view returns (bool){ return MerkleProof.verify(proof,root,leaf); } /** * Return metadata path */ function tokenURI(uint tokenId) override(ERC721A) public view returns(string memory _uri){ return string(abi.encodePacked(metadataPath,Strings.toString(tokenId),".json")); } /** * Check claimed wallets */ function checkClaimedWallet(address walletAddress) public view returns(bool hasClaimed){ return claimedWallets[walletAddress]; } /** * Claim Ancients */ function mint(uint256 _amount, bytes32[] memory proof, bytes32[] memory proof2, bytes32 leaf) public payable callerIsUser{ //check mint status require(isMinting, "Mint disabled."); //limit supply require(totalSupply() + _amount <= maxSupply,"Too many"); //check wallet not already claimed against require(claimedWallets[msg.sender] != true, "Wallet already claimed against!"); //verify wallet is allowed require(verifyProof(proof,leaf), "Wallet cannot claim!"); bytes32 leaf2 = keccak256(abi.encodePacked(msg.sender)); require(verifyProof(proof2,leaf2), "Wallet cannot claim!"); //mark wallet as claimed claimedWallets[msg.sender] = true; _mint(address(msg.sender), _amount); } /* * Contract owner can mint */ function ownerMint(uint256 _amount) public onlyOwner{ require(totalSupply() + _amount <= maxSupply,"Too many"); _mint(address(projectWallet),_amount); } /* * Contract owner can mint */ function teamMint() public onlyOwner{ _mint(address(projectWallet), 300); //prizes _mint(address(0x93661f17f56314A62025d788088f71Ff8c0756b5), 20); //digi _mint(address(0xc114F6181f0c90c07BfA3DEB1F19b4B50f3FA884), 20); //elgallo } /* * Update mint status */ function updateIsMinting(bool _isMinting) external onlyOwner{ isMinting = _isMinting; } /** * Update the metadata path */ function updateMetadataPath(string memory _path) public onlyOwner{ metadataPath = _path; } /** * Update the merkle root */ function updateRoot(bytes32 _root) public onlyOwner{ root = _root; } /** * Update the project wallet address */ function updateProjectWallet(address _projectWallet) public onlyOwner{ projectWallet = _projectWallet; } /** * Update the payout wallet address */ function updatePayoutWallet(address _payoutWallet) public onlyOwner{ payoutWallet = _payoutWallet; } /* * Withdraw by owner */ function withdraw() external onlyOwner { (bool success, ) = payable(payoutWallet).call{value: address(this).balance}(""); require(success, "Transfer failed."); } /* * These are here to receive ETH sent to the contract address */ receive() external payable {} fallback() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"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"},{"stateMutability":"payable","type":"fallback"},{"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":"address","name":"walletAddress","type":"address"}],"name":"checkClaimedWallet","outputs":[{"internalType":"bool","name":"hasClaimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedWallets","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":"isMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataPath","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"proof2","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payoutWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isMinting","type":"bool"}],"name":"updateIsMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_path","type":"string"}],"name":"updateMetadataPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_payoutWallet","type":"address"}],"name":"updatePayoutWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_projectWallet","type":"address"}],"name":"updateProjectWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"updateRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405260405180606001604052806038815260200162004389603891396009908051906020019062000035929190620002e5565b5073ed2faa60373ec70e57b39152aee5ce4ed7c333c7600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b818b1bbf47fc499b621f6807d61a61046c6478f600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506105dc600c556000600e60006101000a81548160ff0219169083151502179055507fb96d5faaa1f37ddf087866f17bde60c73f22d000f763e0fc310cfc1279cd929a60001b600f553480156200013557600080fd5b506040518060400160405280601781526020017f54686520426c696e6b6c6573733a20416e6369656e74730000000000000000008152506040518060400160405280600681526020017f424c4e4b414e00000000000000000000000000000000000000000000000000008152508160029080519060200190620001ba929190620002e5565b508060039080519060200190620001d3929190620002e5565b50620001e46200021260201b60201c565b60008190555050506200020c620002006200021760201b60201c565b6200021f60201b60201c565b620003fa565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002f39062000395565b90600052602060002090601f01602090048101928262000317576000855562000363565b82601f106200033257805160ff191683800117855562000363565b8280016001018555821562000363579182015b828111156200036257825182559160200191906001019062000345565b5b50905062000372919062000376565b5090565b5b808211156200039157600081600090555060010162000377565b5090565b60006002820490506001821680620003ae57607f821691505b60208210811415620003c557620003c4620003cb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613f7f806200040a6000396000f3fe6080604052600436106102295760003560e01c80638462151c11610123578063beb08ab9116100ab578063e985e9c51161006f578063e985e9c514610802578063ebf0c7171461083f578063f19e75d41461086a578063f2fde38b14610893578063fb28a540146108bc57610230565b8063beb08ab9146106f7578063c23dc68f14610722578063c39f1ad51461075f578063c87b56dd1461079c578063e88a8f4a146107d957610230565b806399a2557a116100f257806399a2557a14610621578063a22cb4651461065e578063b80ac7df14610687578063b88d4fde146106c4578063ba7a86b8146106e057610230565b80638462151c146105635780638488bb4e146105a05780638da5cb5b146105cb57806395d89b41146105f657610230565b806342842e0e116101b15780636352211e116101755780636352211e1461046c57806369b027b8146104a957806370a08231146104e6578063715018a614610523578063719276281461053a57610230565b806342842e0e146103a557806355d5204c146103c15780635bbb2177146103ea5780635c3d25ca146104275780635c45efa91461045057610230565b806318160ddd116101f857806318160ddd146102f357806321ff99701461031e57806323b872dd146103475780632a8092df146103635780633ccfd60b1461038e57610230565b806301ffc9a71461023257806306fdde031461026f578063081812fc1461029a578063095ea7b3146102d757610230565b3661023057005b005b34801561023e57600080fd5b5061025960048036038101906102549190612f33565b6108e7565b6040516102669190613660565b60405180910390f35b34801561027b57600080fd5b50610284610979565b6040516102919190613696565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190612fd6565b610a0b565b6040516102ce91906135b5565b60405180910390f35b6102f160048036038101906102ec9190612d9d565b610a8a565b005b3480156102ff57600080fd5b50610308610bce565b60405161031591906137d3565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190612f06565b610be5565b005b610361600480360381019061035c9190612c87565b610bf7565b005b34801561036f57600080fd5b50610378610f1c565b6040516103859190613660565b60405180910390f35b34801561039a57600080fd5b506103a3610f2f565b005b6103bf60048036038101906103ba9190612c87565b611008565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190612f8d565b611028565b005b3480156103f657600080fd5b50610411600480360381019061040c9190612e8c565b61104a565b60405161041e919061361c565b60405180910390f35b34801561043357600080fd5b5061044e60048036038101906104499190612c1a565b61110d565b005b61046a60048036038101906104659190613003565b611159565b005b34801561047857600080fd5b50610493600480360381019061048e9190612fd6565b611427565b6040516104a091906135b5565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb9190612c1a565b611439565b6040516104dd9190613660565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190612c1a565b611459565b60405161051a91906137d3565b60405180910390f35b34801561052f57600080fd5b50610538611512565b005b34801561054657600080fd5b50610561600480360381019061055c9190612c1a565b611526565b005b34801561056f57600080fd5b5061058a60048036038101906105859190612c1a565b611572565b604051610597919061363e565b60405180910390f35b3480156105ac57600080fd5b506105b56116bc565b6040516105c291906135b5565b60405180910390f35b3480156105d757600080fd5b506105e06116e2565b6040516105ed91906135b5565b60405180910390f35b34801561060257600080fd5b5061060b61170c565b6040516106189190613696565b60405180910390f35b34801561062d57600080fd5b5061064860048036038101906106439190612ddd565b61179e565b604051610655919061363e565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190612d5d565b6119b2565b005b34801561069357600080fd5b506106ae60048036038101906106a99190612e30565b611abd565b6040516106bb9190613660565b60405180910390f35b6106de60048036038101906106d99190612cda565b611ad4565b005b3480156106ec57600080fd5b506106f5611b47565b005b34801561070357600080fd5b5061070c611bbd565b60405161071991906135b5565b60405180910390f35b34801561072e57600080fd5b5061074960048036038101906107449190612fd6565b611be3565b60405161075691906137b8565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190612c1a565b611c4d565b6040516107939190613660565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190612fd6565b611ca3565b6040516107d09190613696565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb9190612ed9565b611cd7565b005b34801561080e57600080fd5b5061082960048036038101906108249190612c47565b611cfc565b6040516108369190613660565b60405180910390f35b34801561084b57600080fd5b50610854611d90565b604051610861919061367b565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190612fd6565b611d96565b005b34801561089f57600080fd5b506108ba60048036038101906108b59190612c1a565b611e24565b005b3480156108c857600080fd5b506108d1611ea8565b6040516108de9190613696565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109725750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461098890613b14565b80601f01602080910402602001604051908101604052809291908181526020018280546109b490613b14565b8015610a015780601f106109d657610100808354040283529160200191610a01565b820191906000526020600020905b8154815290600101906020018083116109e457829003601f168201915b5050505050905090565b6000610a1682611f36565b610a4c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9582611427565b90508073ffffffffffffffffffffffffffffffffffffffff16610ab6611f95565b73ffffffffffffffffffffffffffffffffffffffff1614610b1957610ae281610add611f95565b611cfc565b610b18576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bd8611f9d565b6001546000540303905090565b610bed611fa2565b80600f8190555050565b6000610c0282612020565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c69576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c75846120ee565b91509150610c8b8187610c86611f95565b612115565b610cd757610ca086610c9b611f95565b611cfc565b610cd6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d3e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d4b8686866001612159565b8015610d5657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e2485610e0088888761215f565b7c020000000000000000000000000000000000000000000000000000000017612187565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610eac576000600185019050600060046000838152602001908152602001600020541415610eaa576000548114610ea9578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f1486868660016121b2565b505050505050565b600e60009054906101000a900460ff1681565b610f37611fa2565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610f7f906135a0565b60006040518083038185875af1925050503d8060008114610fbc576040519150601f19603f3d011682016040523d82523d6000602084013e610fc1565b606091505b5050905080611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc90613798565b60405180910390fd5b50565b61102383838360405180602001604052806000815250611ad4565b505050565b611030611fa2565b80600990805190602001906110469291906128d6565b5050565b6060600083839050905060008167ffffffffffffffff8111156110705761106f613cd1565b5b6040519080825280602002602001820160405280156110a957816020015b61109661295c565b81526020019060019003908161108e5790505b50905060005b828114611101576110d88686838181106110cc576110cb613ca2565b5b90506020020135611be3565b8282815181106110eb576110ea613ca2565b5b60200260200101819052508060010190506110af565b50809250505092915050565b611115611fa2565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111be90613738565b60405180910390fd5b600e60009054906101000a900460ff16611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d906136d8565b60405180910390fd5b600c5484611222610bce565b61122c9190613976565b111561126d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126490613758565b60405180910390fd5b60011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f8906136f8565b60405180910390fd5b61130b8382611abd565b61134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134190613718565b60405180910390fd5b60003360405160200161135d9190613556565b60405160208183030381529060405280519060200120905061137f8382611abd565b6113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b590613718565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061142033866121b8565b5050505050565b600061143282612020565b9050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61151a611fa2565b6115246000612375565b565b61152e611fa2565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600080600061158285611459565b905060008167ffffffffffffffff8111156115a05761159f613cd1565b5b6040519080825280602002602001820160405280156115ce5781602001602082028036833780820191505090505b5090506115d961295c565b60006115e3611f9d565b90505b8386146116ae576115f68161243b565b9150816040015115611607576116a3565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461164757816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156116a2578083878060010198508151811061169557611694613ca2565b5b6020026020010181815250505b5b8060010190506115e6565b508195505050505050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461171b90613b14565b80601f016020809104026020016040519081016040528092919081815260200182805461174790613b14565b80156117945780601f1061176957610100808354040283529160200191611794565b820191906000526020600020905b81548152906001019060200180831161177757829003601f168201915b5050505050905090565b60608183106117d9576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806117e4612466565b90506117ee611f9d565b851015611800576117fd611f9d565b94505b8084111561180c578093505b600061181787611459565b90508486101561183a576000868603905081811015611834578091505b5061183f565b600090505b60008167ffffffffffffffff81111561185b5761185a613cd1565b5b6040519080825280602002602001820160405280156118895781602001602082028036833780820191505090505b50905060008214156118a157809450505050506119ab565b60006118ac88611be3565b9050600081604001516118c157816000015190505b60008990505b8881141580156118d75750848714155b1561199d576118e58161243b565b92508260400151156118f657611992565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461193657826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611991578084888060010199508151811061198457611983613ca2565b5b6020026020010181815250505b5b8060010190506118c7565b508583528296505050505050505b9392505050565b80600760006119bf611f95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a6c611f95565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ab19190613660565b60405180910390a35050565b6000611acc83600f548461246f565b905092915050565b611adf848484610bf7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b4157611b0a84848484612486565b611b40576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b4f611fa2565b611b7d600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661012c6121b8565b611b9c7393661f17f56314a62025d788088f71ff8c0756b560146121b8565b611bbb73c114f6181f0c90c07bfa3deb1f19b4b50f3fa88460146121b8565b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611beb61295c565b611bf361295c565b611bfb611f9d565b831080611c0f5750611c0b612466565b8310155b15611c1d5780915050611c48565b611c268361243b565b9050806040015115611c3b5780915050611c48565b611c44836125e6565b9150505b919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60606009611cb083612606565b604051602001611cc1929190613571565b6040516020818303038152906040529050919050565b611cdf611fa2565b80600e60006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b611d9e611fa2565b600c5481611daa610bce565b611db49190613976565b1115611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec90613758565b60405180910390fd5b611e21600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826121b8565b50565b611e2c611fa2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e93906136b8565b60405180910390fd5b611ea581612375565b50565b60098054611eb590613b14565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee190613b14565b8015611f2e5780601f10611f0357610100808354040283529160200191611f2e565b820191906000526020600020905b815481529060010190602001808311611f1157829003601f168201915b505050505081565b600081611f41611f9d565b11158015611f50575060005482105b8015611f8e575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b611faa612767565b73ffffffffffffffffffffffffffffffffffffffff16611fc86116e2565b73ffffffffffffffffffffffffffffffffffffffff161461201e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201590613778565b60405180910390fd5b565b6000808290508061202f611f9d565b116120b7576000548110156120b65760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120b4575b60008114156120aa57600460008360019003935083815260200190815260200160002054905061207f565b80925050506120e9565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861217686868461276f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008054905060008214156121f9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122066000848385612159565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061227d8361226e600086600061215f565b61227785612778565b17612187565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461231e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506122e3565b50600082141561235a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061237060008483856121b2565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61244361295c565b61245f6004600084815260200190815260200160002054612788565b9050919050565b60008054905090565b60008261247c858461283e565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124ac611f95565b8786866040518563ffffffff1660e01b81526004016124ce94939291906135d0565b602060405180830381600087803b1580156124e857600080fd5b505af192505050801561251957506040513d601f19601f820116820180604052508101906125169190612f60565b60015b612593573d8060008114612549576040519150601f19603f3d011682016040523d82523d6000602084013e61254e565b606091505b5060008151141561258b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6125ee61295c565b6125ff6125fa83612020565b612788565b9050919050565b6060600082141561264e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612762565b600082905060005b6000821461268057808061266990613b77565b915050600a8261267991906139cc565b9150612656565b60008167ffffffffffffffff81111561269c5761269b613cd1565b5b6040519080825280601f01601f1916602001820160405280156126ce5781602001600182028036833780820191505090505b5090505b6000851461275b576001826126e791906139fd565b9150600a856126f69190613be4565b60306127029190613976565b60f81b81838151811061271857612717613ca2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561275491906139cc565b94506126d2565b8093505050505b919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b61279061295c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008082905060005b8451811015612889576128748286838151811061286757612866613ca2565b5b6020026020010151612894565b9150808061288190613b77565b915050612847565b508091505092915050565b60008183106128ac576128a782846128bf565b6128b7565b6128b683836128bf565b5b905092915050565b600082600052816020526040600020905092915050565b8280546128e290613b14565b90600052602060002090601f016020900481019282612904576000855561294b565b82601f1061291d57805160ff191683800117855561294b565b8280016001018555821561294b579182015b8281111561294a57825182559160200191906001019061292f565b5b50905061295891906129ab565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156129c45760008160009055506001016129ac565b5090565b60006129db6129d684613813565b6137ee565b905080838252602082019050828560208602820111156129fe576129fd613d0a565b5b60005b85811015612a2e5781612a148882612b6a565b845260208401935060208301925050600181019050612a01565b5050509392505050565b6000612a4b612a468461383f565b6137ee565b905082815260208101848484011115612a6757612a66613d0f565b5b612a72848285613ad2565b509392505050565b6000612a8d612a8884613870565b6137ee565b905082815260208101848484011115612aa957612aa8613d0f565b5b612ab4848285613ad2565b509392505050565b600081359050612acb81613ed6565b92915050565b600082601f830112612ae657612ae5613d05565b5b8135612af68482602086016129c8565b91505092915050565b60008083601f840112612b1557612b14613d05565b5b8235905067ffffffffffffffff811115612b3257612b31613d00565b5b602083019150836020820283011115612b4e57612b4d613d0a565b5b9250929050565b600081359050612b6481613eed565b92915050565b600081359050612b7981613f04565b92915050565b600081359050612b8e81613f1b565b92915050565b600081519050612ba381613f1b565b92915050565b600082601f830112612bbe57612bbd613d05565b5b8135612bce848260208601612a38565b91505092915050565b600082601f830112612bec57612beb613d05565b5b8135612bfc848260208601612a7a565b91505092915050565b600081359050612c1481613f32565b92915050565b600060208284031215612c3057612c2f613d19565b5b6000612c3e84828501612abc565b91505092915050565b60008060408385031215612c5e57612c5d613d19565b5b6000612c6c85828601612abc565b9250506020612c7d85828601612abc565b9150509250929050565b600080600060608486031215612ca057612c9f613d19565b5b6000612cae86828701612abc565b9350506020612cbf86828701612abc565b9250506040612cd086828701612c05565b9150509250925092565b60008060008060808587031215612cf457612cf3613d19565b5b6000612d0287828801612abc565b9450506020612d1387828801612abc565b9350506040612d2487828801612c05565b925050606085013567ffffffffffffffff811115612d4557612d44613d14565b5b612d5187828801612ba9565b91505092959194509250565b60008060408385031215612d7457612d73613d19565b5b6000612d8285828601612abc565b9250506020612d9385828601612b55565b9150509250929050565b60008060408385031215612db457612db3613d19565b5b6000612dc285828601612abc565b9250506020612dd385828601612c05565b9150509250929050565b600080600060608486031215612df657612df5613d19565b5b6000612e0486828701612abc565b9350506020612e1586828701612c05565b9250506040612e2686828701612c05565b9150509250925092565b60008060408385031215612e4757612e46613d19565b5b600083013567ffffffffffffffff811115612e6557612e64613d14565b5b612e7185828601612ad1565b9250506020612e8285828601612b6a565b9150509250929050565b60008060208385031215612ea357612ea2613d19565b5b600083013567ffffffffffffffff811115612ec157612ec0613d14565b5b612ecd85828601612aff565b92509250509250929050565b600060208284031215612eef57612eee613d19565b5b6000612efd84828501612b55565b91505092915050565b600060208284031215612f1c57612f1b613d19565b5b6000612f2a84828501612b6a565b91505092915050565b600060208284031215612f4957612f48613d19565b5b6000612f5784828501612b7f565b91505092915050565b600060208284031215612f7657612f75613d19565b5b6000612f8484828501612b94565b91505092915050565b600060208284031215612fa357612fa2613d19565b5b600082013567ffffffffffffffff811115612fc157612fc0613d14565b5b612fcd84828501612bd7565b91505092915050565b600060208284031215612fec57612feb613d19565b5b6000612ffa84828501612c05565b91505092915050565b6000806000806080858703121561301d5761301c613d19565b5b600061302b87828801612c05565b945050602085013567ffffffffffffffff81111561304c5761304b613d14565b5b61305887828801612ad1565b935050604085013567ffffffffffffffff81111561307957613078613d14565b5b61308587828801612ad1565b925050606061309687828801612b6a565b91505092959194509250565b60006130ae8383613470565b60808301905092915050565b60006130c68383613529565b60208301905092915050565b6130db81613a31565b82525050565b6130ea81613a31565b82525050565b6131016130fc82613a31565b613bc0565b82525050565b6000613112826138d6565b61311c818561391c565b9350613127836138a1565b8060005b8381101561315857815161313f88826130a2565b975061314a83613902565b92505060018101905061312b565b5085935050505092915050565b6000613170826138e1565b61317a818561392d565b9350613185836138b1565b8060005b838110156131b657815161319d88826130ba565b97506131a88361390f565b925050600181019050613189565b5085935050505092915050565b6131cc81613a43565b82525050565b6131db81613a43565b82525050565b6131ea81613a4f565b82525050565b60006131fb826138ec565b613205818561393e565b9350613215818560208601613ae1565b61321e81613d1e565b840191505092915050565b6000613234826138f7565b61323e818561395a565b935061324e818560208601613ae1565b61325781613d1e565b840191505092915050565b600061326d826138f7565b613277818561396b565b9350613287818560208601613ae1565b80840191505092915050565b600081546132a081613b14565b6132aa818661396b565b945060018216600081146132c557600181146132d657613309565b60ff19831686528186019350613309565b6132df856138c1565b60005b83811015613301578154818901526001820191506020810190506132e2565b838801955050505b50505092915050565b600061331f60268361395a565b915061332a82613d3c565b604082019050919050565b6000613342600e8361395a565b915061334d82613d8b565b602082019050919050565b6000613365601f8361395a565b915061337082613db4565b602082019050919050565b600061338860148361395a565b915061339382613ddd565b602082019050919050565b60006133ab601e8361395a565b91506133b682613e06565b602082019050919050565b60006133ce60058361396b565b91506133d982613e2f565b600582019050919050565b60006133f160088361395a565b91506133fc82613e58565b602082019050919050565b600061341460208361395a565b915061341f82613e81565b602082019050919050565b600061343760008361394f565b915061344282613eaa565b600082019050919050565b600061345a60108361395a565b915061346582613ead565b602082019050919050565b60808201600082015161348660008501826130d2565b5060208201516134996020850182613547565b5060408201516134ac60408501826131c3565b5060608201516134bf606085018261351a565b50505050565b6080820160008201516134db60008501826130d2565b5060208201516134ee6020850182613547565b50604082015161350160408501826131c3565b506060820151613514606085018261351a565b50505050565b61352381613aa5565b82525050565b61353281613ab4565b82525050565b61354181613ab4565b82525050565b61355081613abe565b82525050565b600061356282846130f0565b60148201915081905092915050565b600061357d8285613293565b91506135898284613262565b9150613594826133c1565b91508190509392505050565b60006135ab8261342a565b9150819050919050565b60006020820190506135ca60008301846130e1565b92915050565b60006080820190506135e560008301876130e1565b6135f260208301866130e1565b6135ff6040830185613538565b818103606083015261361181846131f0565b905095945050505050565b600060208201905081810360008301526136368184613107565b905092915050565b600060208201905081810360008301526136588184613165565b905092915050565b600060208201905061367560008301846131d2565b92915050565b600060208201905061369060008301846131e1565b92915050565b600060208201905081810360008301526136b08184613229565b905092915050565b600060208201905081810360008301526136d181613312565b9050919050565b600060208201905081810360008301526136f181613335565b9050919050565b6000602082019050818103600083015261371181613358565b9050919050565b600060208201905081810360008301526137318161337b565b9050919050565b600060208201905081810360008301526137518161339e565b9050919050565b60006020820190508181036000830152613771816133e4565b9050919050565b6000602082019050818103600083015261379181613407565b9050919050565b600060208201905081810360008301526137b18161344d565b9050919050565b60006080820190506137cd60008301846134c5565b92915050565b60006020820190506137e86000830184613538565b92915050565b60006137f8613809565b90506138048282613b46565b919050565b6000604051905090565b600067ffffffffffffffff82111561382e5761382d613cd1565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561385a57613859613cd1565b5b61386382613d1e565b9050602081019050919050565b600067ffffffffffffffff82111561388b5761388a613cd1565b5b61389482613d1e565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061398182613ab4565b915061398c83613ab4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139c1576139c0613c15565b5b828201905092915050565b60006139d782613ab4565b91506139e283613ab4565b9250826139f2576139f1613c44565b5b828204905092915050565b6000613a0882613ab4565b9150613a1383613ab4565b925082821015613a2657613a25613c15565b5b828203905092915050565b6000613a3c82613a85565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613aff578082015181840152602081019050613ae4565b83811115613b0e576000848401525b50505050565b60006002820490506001821680613b2c57607f821691505b60208210811415613b4057613b3f613c73565b5b50919050565b613b4f82613d1e565b810181811067ffffffffffffffff82111715613b6e57613b6d613cd1565b5b80604052505050565b6000613b8282613ab4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bb557613bb4613c15565b5b600182019050919050565b6000613bcb82613bd2565b9050919050565b6000613bdd82613d2f565b9050919050565b6000613bef82613ab4565b9150613bfa83613ab4565b925082613c0a57613c09613c44565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e742064697361626c65642e000000000000000000000000000000000000600082015250565b7f57616c6c657420616c726561647920636c61696d656420616761696e73742100600082015250565b7f57616c6c65742063616e6e6f7420636c61696d21000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f546f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b613edf81613a31565b8114613eea57600080fd5b50565b613ef681613a43565b8114613f0157600080fd5b50565b613f0d81613a4f565b8114613f1857600080fd5b50565b613f2481613a59565b8114613f2f57600080fd5b50565b613f3b81613ab4565b8114613f4657600080fd5b5056fea2646970667358221220891099e21958f505eb9ed00d631960184d784e2538b71044d07852bce4d7c7c964736f6c6343000807003368747470733a2f2f746865626c696e6b6c6573732e73332e616d617a6f6e6177732e636f6d2f616e6369656e74732f6d657461646174612f
Deployed Bytecode
0x6080604052600436106102295760003560e01c80638462151c11610123578063beb08ab9116100ab578063e985e9c51161006f578063e985e9c514610802578063ebf0c7171461083f578063f19e75d41461086a578063f2fde38b14610893578063fb28a540146108bc57610230565b8063beb08ab9146106f7578063c23dc68f14610722578063c39f1ad51461075f578063c87b56dd1461079c578063e88a8f4a146107d957610230565b806399a2557a116100f257806399a2557a14610621578063a22cb4651461065e578063b80ac7df14610687578063b88d4fde146106c4578063ba7a86b8146106e057610230565b80638462151c146105635780638488bb4e146105a05780638da5cb5b146105cb57806395d89b41146105f657610230565b806342842e0e116101b15780636352211e116101755780636352211e1461046c57806369b027b8146104a957806370a08231146104e6578063715018a614610523578063719276281461053a57610230565b806342842e0e146103a557806355d5204c146103c15780635bbb2177146103ea5780635c3d25ca146104275780635c45efa91461045057610230565b806318160ddd116101f857806318160ddd146102f357806321ff99701461031e57806323b872dd146103475780632a8092df146103635780633ccfd60b1461038e57610230565b806301ffc9a71461023257806306fdde031461026f578063081812fc1461029a578063095ea7b3146102d757610230565b3661023057005b005b34801561023e57600080fd5b5061025960048036038101906102549190612f33565b6108e7565b6040516102669190613660565b60405180910390f35b34801561027b57600080fd5b50610284610979565b6040516102919190613696565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190612fd6565b610a0b565b6040516102ce91906135b5565b60405180910390f35b6102f160048036038101906102ec9190612d9d565b610a8a565b005b3480156102ff57600080fd5b50610308610bce565b60405161031591906137d3565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190612f06565b610be5565b005b610361600480360381019061035c9190612c87565b610bf7565b005b34801561036f57600080fd5b50610378610f1c565b6040516103859190613660565b60405180910390f35b34801561039a57600080fd5b506103a3610f2f565b005b6103bf60048036038101906103ba9190612c87565b611008565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190612f8d565b611028565b005b3480156103f657600080fd5b50610411600480360381019061040c9190612e8c565b61104a565b60405161041e919061361c565b60405180910390f35b34801561043357600080fd5b5061044e60048036038101906104499190612c1a565b61110d565b005b61046a60048036038101906104659190613003565b611159565b005b34801561047857600080fd5b50610493600480360381019061048e9190612fd6565b611427565b6040516104a091906135b5565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb9190612c1a565b611439565b6040516104dd9190613660565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190612c1a565b611459565b60405161051a91906137d3565b60405180910390f35b34801561052f57600080fd5b50610538611512565b005b34801561054657600080fd5b50610561600480360381019061055c9190612c1a565b611526565b005b34801561056f57600080fd5b5061058a60048036038101906105859190612c1a565b611572565b604051610597919061363e565b60405180910390f35b3480156105ac57600080fd5b506105b56116bc565b6040516105c291906135b5565b60405180910390f35b3480156105d757600080fd5b506105e06116e2565b6040516105ed91906135b5565b60405180910390f35b34801561060257600080fd5b5061060b61170c565b6040516106189190613696565b60405180910390f35b34801561062d57600080fd5b5061064860048036038101906106439190612ddd565b61179e565b604051610655919061363e565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190612d5d565b6119b2565b005b34801561069357600080fd5b506106ae60048036038101906106a99190612e30565b611abd565b6040516106bb9190613660565b60405180910390f35b6106de60048036038101906106d99190612cda565b611ad4565b005b3480156106ec57600080fd5b506106f5611b47565b005b34801561070357600080fd5b5061070c611bbd565b60405161071991906135b5565b60405180910390f35b34801561072e57600080fd5b5061074960048036038101906107449190612fd6565b611be3565b60405161075691906137b8565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190612c1a565b611c4d565b6040516107939190613660565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190612fd6565b611ca3565b6040516107d09190613696565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb9190612ed9565b611cd7565b005b34801561080e57600080fd5b5061082960048036038101906108249190612c47565b611cfc565b6040516108369190613660565b60405180910390f35b34801561084b57600080fd5b50610854611d90565b604051610861919061367b565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190612fd6565b611d96565b005b34801561089f57600080fd5b506108ba60048036038101906108b59190612c1a565b611e24565b005b3480156108c857600080fd5b506108d1611ea8565b6040516108de9190613696565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061094257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109725750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461098890613b14565b80601f01602080910402602001604051908101604052809291908181526020018280546109b490613b14565b8015610a015780601f106109d657610100808354040283529160200191610a01565b820191906000526020600020905b8154815290600101906020018083116109e457829003601f168201915b5050505050905090565b6000610a1682611f36565b610a4c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9582611427565b90508073ffffffffffffffffffffffffffffffffffffffff16610ab6611f95565b73ffffffffffffffffffffffffffffffffffffffff1614610b1957610ae281610add611f95565b611cfc565b610b18576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bd8611f9d565b6001546000540303905090565b610bed611fa2565b80600f8190555050565b6000610c0282612020565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c69576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c75846120ee565b91509150610c8b8187610c86611f95565b612115565b610cd757610ca086610c9b611f95565b611cfc565b610cd6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d3e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d4b8686866001612159565b8015610d5657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e2485610e0088888761215f565b7c020000000000000000000000000000000000000000000000000000000017612187565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610eac576000600185019050600060046000838152602001908152602001600020541415610eaa576000548114610ea9578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f1486868660016121b2565b505050505050565b600e60009054906101000a900460ff1681565b610f37611fa2565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610f7f906135a0565b60006040518083038185875af1925050503d8060008114610fbc576040519150601f19603f3d011682016040523d82523d6000602084013e610fc1565b606091505b5050905080611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc90613798565b60405180910390fd5b50565b61102383838360405180602001604052806000815250611ad4565b505050565b611030611fa2565b80600990805190602001906110469291906128d6565b5050565b6060600083839050905060008167ffffffffffffffff8111156110705761106f613cd1565b5b6040519080825280602002602001820160405280156110a957816020015b61109661295c565b81526020019060019003908161108e5790505b50905060005b828114611101576110d88686838181106110cc576110cb613ca2565b5b90506020020135611be3565b8282815181106110eb576110ea613ca2565b5b60200260200101819052508060010190506110af565b50809250505092915050565b611115611fa2565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111be90613738565b60405180910390fd5b600e60009054906101000a900460ff16611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d906136d8565b60405180910390fd5b600c5484611222610bce565b61122c9190613976565b111561126d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126490613758565b60405180910390fd5b60011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f8906136f8565b60405180910390fd5b61130b8382611abd565b61134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134190613718565b60405180910390fd5b60003360405160200161135d9190613556565b60405160208183030381529060405280519060200120905061137f8382611abd565b6113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b590613718565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061142033866121b8565b5050505050565b600061143282612020565b9050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61151a611fa2565b6115246000612375565b565b61152e611fa2565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600080600061158285611459565b905060008167ffffffffffffffff8111156115a05761159f613cd1565b5b6040519080825280602002602001820160405280156115ce5781602001602082028036833780820191505090505b5090506115d961295c565b60006115e3611f9d565b90505b8386146116ae576115f68161243b565b9150816040015115611607576116a3565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461164757816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156116a2578083878060010198508151811061169557611694613ca2565b5b6020026020010181815250505b5b8060010190506115e6565b508195505050505050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461171b90613b14565b80601f016020809104026020016040519081016040528092919081815260200182805461174790613b14565b80156117945780601f1061176957610100808354040283529160200191611794565b820191906000526020600020905b81548152906001019060200180831161177757829003601f168201915b5050505050905090565b60608183106117d9576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806117e4612466565b90506117ee611f9d565b851015611800576117fd611f9d565b94505b8084111561180c578093505b600061181787611459565b90508486101561183a576000868603905081811015611834578091505b5061183f565b600090505b60008167ffffffffffffffff81111561185b5761185a613cd1565b5b6040519080825280602002602001820160405280156118895781602001602082028036833780820191505090505b50905060008214156118a157809450505050506119ab565b60006118ac88611be3565b9050600081604001516118c157816000015190505b60008990505b8881141580156118d75750848714155b1561199d576118e58161243b565b92508260400151156118f657611992565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461193657826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611991578084888060010199508151811061198457611983613ca2565b5b6020026020010181815250505b5b8060010190506118c7565b508583528296505050505050505b9392505050565b80600760006119bf611f95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a6c611f95565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ab19190613660565b60405180910390a35050565b6000611acc83600f548461246f565b905092915050565b611adf848484610bf7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b4157611b0a84848484612486565b611b40576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b4f611fa2565b611b7d600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661012c6121b8565b611b9c7393661f17f56314a62025d788088f71ff8c0756b560146121b8565b611bbb73c114f6181f0c90c07bfa3deb1f19b4b50f3fa88460146121b8565b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611beb61295c565b611bf361295c565b611bfb611f9d565b831080611c0f5750611c0b612466565b8310155b15611c1d5780915050611c48565b611c268361243b565b9050806040015115611c3b5780915050611c48565b611c44836125e6565b9150505b919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60606009611cb083612606565b604051602001611cc1929190613571565b6040516020818303038152906040529050919050565b611cdf611fa2565b80600e60006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b611d9e611fa2565b600c5481611daa610bce565b611db49190613976565b1115611df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dec90613758565b60405180910390fd5b611e21600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826121b8565b50565b611e2c611fa2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e93906136b8565b60405180910390fd5b611ea581612375565b50565b60098054611eb590613b14565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee190613b14565b8015611f2e5780601f10611f0357610100808354040283529160200191611f2e565b820191906000526020600020905b815481529060010190602001808311611f1157829003601f168201915b505050505081565b600081611f41611f9d565b11158015611f50575060005482105b8015611f8e575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b611faa612767565b73ffffffffffffffffffffffffffffffffffffffff16611fc86116e2565b73ffffffffffffffffffffffffffffffffffffffff161461201e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201590613778565b60405180910390fd5b565b6000808290508061202f611f9d565b116120b7576000548110156120b65760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120b4575b60008114156120aa57600460008360019003935083815260200190815260200160002054905061207f565b80925050506120e9565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861217686868461276f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008054905060008214156121f9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122066000848385612159565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061227d8361226e600086600061215f565b61227785612778565b17612187565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461231e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506122e3565b50600082141561235a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061237060008483856121b2565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61244361295c565b61245f6004600084815260200190815260200160002054612788565b9050919050565b60008054905090565b60008261247c858461283e565b1490509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124ac611f95565b8786866040518563ffffffff1660e01b81526004016124ce94939291906135d0565b602060405180830381600087803b1580156124e857600080fd5b505af192505050801561251957506040513d601f19601f820116820180604052508101906125169190612f60565b60015b612593573d8060008114612549576040519150601f19603f3d011682016040523d82523d6000602084013e61254e565b606091505b5060008151141561258b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6125ee61295c565b6125ff6125fa83612020565b612788565b9050919050565b6060600082141561264e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612762565b600082905060005b6000821461268057808061266990613b77565b915050600a8261267991906139cc565b9150612656565b60008167ffffffffffffffff81111561269c5761269b613cd1565b5b6040519080825280601f01601f1916602001820160405280156126ce5781602001600182028036833780820191505090505b5090505b6000851461275b576001826126e791906139fd565b9150600a856126f69190613be4565b60306127029190613976565b60f81b81838151811061271857612717613ca2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561275491906139cc565b94506126d2565b8093505050505b919050565b600033905090565b60009392505050565b60006001821460e11b9050919050565b61279061295c565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008082905060005b8451811015612889576128748286838151811061286757612866613ca2565b5b6020026020010151612894565b9150808061288190613b77565b915050612847565b508091505092915050565b60008183106128ac576128a782846128bf565b6128b7565b6128b683836128bf565b5b905092915050565b600082600052816020526040600020905092915050565b8280546128e290613b14565b90600052602060002090601f016020900481019282612904576000855561294b565b82601f1061291d57805160ff191683800117855561294b565b8280016001018555821561294b579182015b8281111561294a57825182559160200191906001019061292f565b5b50905061295891906129ab565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156129c45760008160009055506001016129ac565b5090565b60006129db6129d684613813565b6137ee565b905080838252602082019050828560208602820111156129fe576129fd613d0a565b5b60005b85811015612a2e5781612a148882612b6a565b845260208401935060208301925050600181019050612a01565b5050509392505050565b6000612a4b612a468461383f565b6137ee565b905082815260208101848484011115612a6757612a66613d0f565b5b612a72848285613ad2565b509392505050565b6000612a8d612a8884613870565b6137ee565b905082815260208101848484011115612aa957612aa8613d0f565b5b612ab4848285613ad2565b509392505050565b600081359050612acb81613ed6565b92915050565b600082601f830112612ae657612ae5613d05565b5b8135612af68482602086016129c8565b91505092915050565b60008083601f840112612b1557612b14613d05565b5b8235905067ffffffffffffffff811115612b3257612b31613d00565b5b602083019150836020820283011115612b4e57612b4d613d0a565b5b9250929050565b600081359050612b6481613eed565b92915050565b600081359050612b7981613f04565b92915050565b600081359050612b8e81613f1b565b92915050565b600081519050612ba381613f1b565b92915050565b600082601f830112612bbe57612bbd613d05565b5b8135612bce848260208601612a38565b91505092915050565b600082601f830112612bec57612beb613d05565b5b8135612bfc848260208601612a7a565b91505092915050565b600081359050612c1481613f32565b92915050565b600060208284031215612c3057612c2f613d19565b5b6000612c3e84828501612abc565b91505092915050565b60008060408385031215612c5e57612c5d613d19565b5b6000612c6c85828601612abc565b9250506020612c7d85828601612abc565b9150509250929050565b600080600060608486031215612ca057612c9f613d19565b5b6000612cae86828701612abc565b9350506020612cbf86828701612abc565b9250506040612cd086828701612c05565b9150509250925092565b60008060008060808587031215612cf457612cf3613d19565b5b6000612d0287828801612abc565b9450506020612d1387828801612abc565b9350506040612d2487828801612c05565b925050606085013567ffffffffffffffff811115612d4557612d44613d14565b5b612d5187828801612ba9565b91505092959194509250565b60008060408385031215612d7457612d73613d19565b5b6000612d8285828601612abc565b9250506020612d9385828601612b55565b9150509250929050565b60008060408385031215612db457612db3613d19565b5b6000612dc285828601612abc565b9250506020612dd385828601612c05565b9150509250929050565b600080600060608486031215612df657612df5613d19565b5b6000612e0486828701612abc565b9350506020612e1586828701612c05565b9250506040612e2686828701612c05565b9150509250925092565b60008060408385031215612e4757612e46613d19565b5b600083013567ffffffffffffffff811115612e6557612e64613d14565b5b612e7185828601612ad1565b9250506020612e8285828601612b6a565b9150509250929050565b60008060208385031215612ea357612ea2613d19565b5b600083013567ffffffffffffffff811115612ec157612ec0613d14565b5b612ecd85828601612aff565b92509250509250929050565b600060208284031215612eef57612eee613d19565b5b6000612efd84828501612b55565b91505092915050565b600060208284031215612f1c57612f1b613d19565b5b6000612f2a84828501612b6a565b91505092915050565b600060208284031215612f4957612f48613d19565b5b6000612f5784828501612b7f565b91505092915050565b600060208284031215612f7657612f75613d19565b5b6000612f8484828501612b94565b91505092915050565b600060208284031215612fa357612fa2613d19565b5b600082013567ffffffffffffffff811115612fc157612fc0613d14565b5b612fcd84828501612bd7565b91505092915050565b600060208284031215612fec57612feb613d19565b5b6000612ffa84828501612c05565b91505092915050565b6000806000806080858703121561301d5761301c613d19565b5b600061302b87828801612c05565b945050602085013567ffffffffffffffff81111561304c5761304b613d14565b5b61305887828801612ad1565b935050604085013567ffffffffffffffff81111561307957613078613d14565b5b61308587828801612ad1565b925050606061309687828801612b6a565b91505092959194509250565b60006130ae8383613470565b60808301905092915050565b60006130c68383613529565b60208301905092915050565b6130db81613a31565b82525050565b6130ea81613a31565b82525050565b6131016130fc82613a31565b613bc0565b82525050565b6000613112826138d6565b61311c818561391c565b9350613127836138a1565b8060005b8381101561315857815161313f88826130a2565b975061314a83613902565b92505060018101905061312b565b5085935050505092915050565b6000613170826138e1565b61317a818561392d565b9350613185836138b1565b8060005b838110156131b657815161319d88826130ba565b97506131a88361390f565b925050600181019050613189565b5085935050505092915050565b6131cc81613a43565b82525050565b6131db81613a43565b82525050565b6131ea81613a4f565b82525050565b60006131fb826138ec565b613205818561393e565b9350613215818560208601613ae1565b61321e81613d1e565b840191505092915050565b6000613234826138f7565b61323e818561395a565b935061324e818560208601613ae1565b61325781613d1e565b840191505092915050565b600061326d826138f7565b613277818561396b565b9350613287818560208601613ae1565b80840191505092915050565b600081546132a081613b14565b6132aa818661396b565b945060018216600081146132c557600181146132d657613309565b60ff19831686528186019350613309565b6132df856138c1565b60005b83811015613301578154818901526001820191506020810190506132e2565b838801955050505b50505092915050565b600061331f60268361395a565b915061332a82613d3c565b604082019050919050565b6000613342600e8361395a565b915061334d82613d8b565b602082019050919050565b6000613365601f8361395a565b915061337082613db4565b602082019050919050565b600061338860148361395a565b915061339382613ddd565b602082019050919050565b60006133ab601e8361395a565b91506133b682613e06565b602082019050919050565b60006133ce60058361396b565b91506133d982613e2f565b600582019050919050565b60006133f160088361395a565b91506133fc82613e58565b602082019050919050565b600061341460208361395a565b915061341f82613e81565b602082019050919050565b600061343760008361394f565b915061344282613eaa565b600082019050919050565b600061345a60108361395a565b915061346582613ead565b602082019050919050565b60808201600082015161348660008501826130d2565b5060208201516134996020850182613547565b5060408201516134ac60408501826131c3565b5060608201516134bf606085018261351a565b50505050565b6080820160008201516134db60008501826130d2565b5060208201516134ee6020850182613547565b50604082015161350160408501826131c3565b506060820151613514606085018261351a565b50505050565b61352381613aa5565b82525050565b61353281613ab4565b82525050565b61354181613ab4565b82525050565b61355081613abe565b82525050565b600061356282846130f0565b60148201915081905092915050565b600061357d8285613293565b91506135898284613262565b9150613594826133c1565b91508190509392505050565b60006135ab8261342a565b9150819050919050565b60006020820190506135ca60008301846130e1565b92915050565b60006080820190506135e560008301876130e1565b6135f260208301866130e1565b6135ff6040830185613538565b818103606083015261361181846131f0565b905095945050505050565b600060208201905081810360008301526136368184613107565b905092915050565b600060208201905081810360008301526136588184613165565b905092915050565b600060208201905061367560008301846131d2565b92915050565b600060208201905061369060008301846131e1565b92915050565b600060208201905081810360008301526136b08184613229565b905092915050565b600060208201905081810360008301526136d181613312565b9050919050565b600060208201905081810360008301526136f181613335565b9050919050565b6000602082019050818103600083015261371181613358565b9050919050565b600060208201905081810360008301526137318161337b565b9050919050565b600060208201905081810360008301526137518161339e565b9050919050565b60006020820190508181036000830152613771816133e4565b9050919050565b6000602082019050818103600083015261379181613407565b9050919050565b600060208201905081810360008301526137b18161344d565b9050919050565b60006080820190506137cd60008301846134c5565b92915050565b60006020820190506137e86000830184613538565b92915050565b60006137f8613809565b90506138048282613b46565b919050565b6000604051905090565b600067ffffffffffffffff82111561382e5761382d613cd1565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561385a57613859613cd1565b5b61386382613d1e565b9050602081019050919050565b600067ffffffffffffffff82111561388b5761388a613cd1565b5b61389482613d1e565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061398182613ab4565b915061398c83613ab4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139c1576139c0613c15565b5b828201905092915050565b60006139d782613ab4565b91506139e283613ab4565b9250826139f2576139f1613c44565b5b828204905092915050565b6000613a0882613ab4565b9150613a1383613ab4565b925082821015613a2657613a25613c15565b5b828203905092915050565b6000613a3c82613a85565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613aff578082015181840152602081019050613ae4565b83811115613b0e576000848401525b50505050565b60006002820490506001821680613b2c57607f821691505b60208210811415613b4057613b3f613c73565b5b50919050565b613b4f82613d1e565b810181811067ffffffffffffffff82111715613b6e57613b6d613cd1565b5b80604052505050565b6000613b8282613ab4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bb557613bb4613c15565b5b600182019050919050565b6000613bcb82613bd2565b9050919050565b6000613bdd82613d2f565b9050919050565b6000613bef82613ab4565b9150613bfa83613ab4565b925082613c0a57613c09613c44565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e742064697361626c65642e000000000000000000000000000000000000600082015250565b7f57616c6c657420616c726561647920636c61696d656420616761696e73742100600082015250565b7f57616c6c65742063616e6e6f7420636c61696d21000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f546f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b613edf81613a31565b8114613eea57600080fd5b50565b613ef681613a43565b8114613f0157600080fd5b50565b613f0d81613a4f565b8114613f1857600080fd5b50565b613f2481613a59565b8114613f2f57600080fd5b50565b613f3b81613ab4565b8114613f4657600080fd5b5056fea2646970667358221220891099e21958f505eb9ed00d631960184d784e2538b71044d07852bce4d7c7c964736f6c63430008070033
Deployed Bytecode Sourcemap
75272:4205:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29647:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30549:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37040:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36473:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26300:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78630:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40679:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75703:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79127:184;;;;;;;;;;;;;:::i;:::-;;43600:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78470:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64325:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78963:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76883:821;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31942:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75650:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27484:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74379:103;;;;;;;;;;;;;:::i;:::-;;78778:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68201:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75422:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73731:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30725:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65241:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37598:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76247:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44391:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77998:261;;;;;;;;;;;;;:::i;:::-;;75522:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63738:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76694:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76447:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78309:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37989:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75739:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77767:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74637:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75328:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29647:639;29732:4;30071:10;30056:25;;:11;:25;;;;:102;;;;30148:10;30133:25;;:11;:25;;;;30056:102;:179;;;;30225:10;30210:25;;:11;:25;;;;30056:179;30036:199;;29647:639;;;:::o;30549:100::-;30603:13;30636:5;30629:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30549:100;:::o;37040:218::-;37116:7;37141:16;37149:7;37141;:16::i;:::-;37136:64;;37166:34;;;;;;;;;;;;;;37136:64;37220:15;:24;37236:7;37220:24;;;;;;;;;;;:30;;;;;;;;;;;;37213:37;;37040:218;;;:::o;36473:408::-;36562:13;36578:16;36586:7;36578;:16::i;:::-;36562:32;;36634:5;36611:28;;:19;:17;:19::i;:::-;:28;;;36607:175;;36659:44;36676:5;36683:19;:17;:19::i;:::-;36659:16;:44::i;:::-;36654:128;;36731:35;;;;;;;;;;;;;;36654:128;36607:175;36827:2;36794:15;:24;36810:7;36794:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;36865:7;36861:2;36845:28;;36854:5;36845:28;;;;;;;;;;;;36551:330;36473:408;;:::o;26300:323::-;26361:7;26589:15;:13;:15::i;:::-;26574:12;;26558:13;;:28;:46;26551:53;;26300:323;:::o;78630:82::-;73617:13;:11;:13::i;:::-;78699:5:::1;78692:4;:12;;;;78630:82:::0;:::o;40679:2825::-;40821:27;40851;40870:7;40851:18;:27::i;:::-;40821:57;;40936:4;40895:45;;40911:19;40895:45;;;40891:86;;40949:28;;;;;;;;;;;;;;40891:86;40991:27;41020:23;41047:35;41074:7;41047:26;:35::i;:::-;40990:92;;;;41182:68;41207:15;41224:4;41230:19;:17;:19::i;:::-;41182:24;:68::i;:::-;41177:180;;41270:43;41287:4;41293:19;:17;:19::i;:::-;41270:16;:43::i;:::-;41265:92;;41322:35;;;;;;;;;;;;;;41265:92;41177:180;41388:1;41374:16;;:2;:16;;;41370:52;;;41399:23;;;;;;;;;;;;;;41370:52;41435:43;41457:4;41463:2;41467:7;41476:1;41435:21;:43::i;:::-;41571:15;41568:160;;;41711:1;41690:19;41683:30;41568:160;42108:18;:24;42127:4;42108:24;;;;;;;;;;;;;;;;42106:26;;;;;;;;;;;;42177:18;:22;42196:2;42177:22;;;;;;;;;;;;;;;;42175:24;;;;;;;;;;;42499:146;42536:2;42585:45;42600:4;42606:2;42610:19;42585:14;:45::i;:::-;22699:8;42557:73;42499:18;:146::i;:::-;42470:17;:26;42488:7;42470:26;;;;;;;;;;;:175;;;;42816:1;22699:8;42765:19;:47;:52;42761:627;;;42838:19;42870:1;42860:7;:11;42838:33;;43027:1;42993:17;:30;43011:11;42993:30;;;;;;;;;;;;:35;42989:384;;;43131:13;;43116:11;:28;43112:242;;43311:19;43278:17;:30;43296:11;43278:30;;;;;;;;;;;:52;;;;43112:242;42989:384;42819:569;42761:627;43435:7;43431:2;43416:27;;43425:4;43416:27;;;;;;;;;;;;43454:42;43475:4;43481:2;43485:7;43494:1;43454:20;:42::i;:::-;40810:2694;;;40679:2825;;;:::o;75703:29::-;;;;;;;;;;;;;:::o;79127:184::-;73617:13;:11;:13::i;:::-;79178:12:::1;79204;;;;;;;;;;;79196:26;;79230:21;79196:60;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79177:79;;;79275:7;79267:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;79166:145;79127:184::o:0;43600:193::-;43746:39;43763:4;43769:2;43773:7;43746:39;;;;;;;;;;;;:16;:39::i;:::-;43600:193;;;:::o;78470:104::-;73617:13;:11;:13::i;:::-;78561:5:::1;78546:12;:20;;;;;;;;;;;;:::i;:::-;;78470:104:::0;:::o;64325:528::-;64469:23;64535:22;64560:8;;:15;;64535:40;;64590:34;64648:14;64627:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;64590:73;;64683:9;64678:125;64699:14;64694:1;:19;64678:125;;64755:32;64775:8;;64784:1;64775:11;;;;;;;:::i;:::-;;;;;;;;64755:19;:32::i;:::-;64739:10;64750:1;64739:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;64715:3;;;;;64678:125;;;;64824:10;64817:17;;;;64325:528;;;;:::o;78963:114::-;73617:13;:11;:13::i;:::-;79056::::1;79041:12;;:28;;;;;;;;;;;;;;;;;;78963:114:::0;:::o;76883:821::-;76110:10;76097:23;;:9;:23;;;76089:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;77052:9:::1;;;;;;;;;;;77044:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;77152:9;;77141:7;77125:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;77117:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;77276:4;77246:34;;:14;:26;77261:10;77246:26;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;;77238:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;77373:23;77385:5;77391:4;77373:11;:23::i;:::-;77365:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;77434:13;77477:10;77460:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;77450:39;;;;;;77434:55;;77508:25;77520:6;77527:5;77508:11;:25::i;:::-;77500:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;77634:4;77605:14;:26;77620:10;77605:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;77651:35;77665:10;77678:7;77651:5;:35::i;:::-;77004:700;76883:821:::0;;;;:::o;31942:152::-;32014:7;32057:27;32076:7;32057:18;:27::i;:::-;32034:52;;31942:152;;;:::o;75650:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;27484:233::-;27556:7;27597:1;27580:19;;:5;:19;;;27576:60;;;27608:28;;;;;;;;;;;;;;27576:60;21643:13;27654:18;:25;27673:5;27654:25;;;;;;;;;;;;;;;;:55;27647:62;;27484:233;;;:::o;74379:103::-;73617:13;:11;:13::i;:::-;74444:30:::1;74471:1;74444:18;:30::i;:::-;74379:103::o:0;78778:118::-;73617:13;:11;:13::i;:::-;78874:14:::1;78858:13;;:30;;;;;;;;;;;;;;;;;;78778:118:::0;:::o;68201:900::-;68279:16;68333:19;68367:25;68407:22;68432:16;68442:5;68432:9;:16::i;:::-;68407:41;;68463:25;68505:14;68491:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68463:57;;68535:31;;:::i;:::-;68586:9;68598:15;:13;:15::i;:::-;68586:27;;68581:472;68630:14;68615:11;:29;68581:472;;68682:15;68695:1;68682:12;:15::i;:::-;68670:27;;68720:9;:16;;;68716:73;;;68761:8;;68716:73;68837:1;68811:28;;:9;:14;;;:28;;;68807:111;;68884:9;:14;;;68864:34;;68807:111;68961:5;68940:26;;:17;:26;;;68936:102;;;69017:1;68991:8;69000:13;;;;;;68991:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;68936:102;68581:472;68646:3;;;;;68581:472;;;;69074:8;69067:15;;;;;;;68201:900;;;:::o;75422:72::-;;;;;;;;;;;;;:::o;73731:87::-;73777:7;73804:6;;;;;;;;;;;73797:13;;73731:87;:::o;30725:104::-;30781:13;30814:7;30807:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30725:104;:::o;65241:2513::-;65384:16;65451:4;65442:5;:13;65438:45;;65464:19;;;;;;;;;;;;;;65438:45;65498:19;65532:17;65552:14;:12;:14::i;:::-;65532:34;;65652:15;:13;:15::i;:::-;65644:5;:23;65640:87;;;65696:15;:13;:15::i;:::-;65688:23;;65640:87;65803:9;65796:4;:16;65792:73;;;65840:9;65833:16;;65792:73;65879:25;65907:16;65917:5;65907:9;:16::i;:::-;65879:44;;66101:4;66093:5;:12;66089:278;;;66126:19;66155:5;66148:4;:12;66126:34;;66197:17;66183:11;:31;66179:111;;;66259:11;66239:31;;66179:111;66107:198;66089:278;;;66350:1;66330:21;;66089:278;66381:25;66423:17;66409:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66381:60;;66481:1;66460:17;:22;66456:78;;;66510:8;66503:15;;;;;;;;66456:78;66678:31;66712:26;66732:5;66712:19;:26::i;:::-;66678:60;;66753:25;66998:9;:16;;;66993:92;;67055:9;:14;;;67035:34;;66993:92;67104:9;67116:5;67104:17;;67099:478;67128:4;67123:1;:9;;:45;;;;;67151:17;67136:11;:32;;67123:45;67099:478;;;67206:15;67219:1;67206:12;:15::i;:::-;67194:27;;67244:9;:16;;;67240:73;;;67285:8;;67240:73;67361:1;67335:28;;:9;:14;;;:28;;;67331:111;;67408:9;:14;;;67388:34;;67331:111;67485:5;67464:26;;:17;:26;;;67460:102;;;67541:1;67515:8;67524:13;;;;;;67515:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;67460:102;67099:478;67170:3;;;;;67099:478;;;;67679:11;67669:8;67662:29;67727:8;67720:15;;;;;;;;65241:2513;;;;;;:::o;37598:234::-;37745:8;37693:18;:39;37712:19;:17;:19::i;:::-;37693:39;;;;;;;;;;;;;;;:49;37733:8;37693:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;37805:8;37769:55;;37784:19;:17;:19::i;:::-;37769:55;;;37815:8;37769:55;;;;;;:::i;:::-;;;;;;;;37598:234;;:::o;76247:146::-;76327:4;76350:35;76369:5;76375:4;;76380;76350:18;:35::i;:::-;76343:42;;76247:146;;;;:::o;44391:407::-;44566:31;44579:4;44585:2;44589:7;44566:12;:31::i;:::-;44630:1;44612:2;:14;;;:19;44608:183;;44651:56;44682:4;44688:2;44692:7;44701:5;44651:30;:56::i;:::-;44646:145;;44735:40;;;;;;;;;;;;;;44646:145;44608:183;44391:407;;;;:::o;77998:261::-;73617:13;:11;:13::i;:::-;78045:34:::1;78059:13;;;;;;;;;;;78075:3;78045:5;:34::i;:::-;78099:62;78113:42;78158:2;78099:5;:62::i;:::-;78179;78193:42;78238:2;78179:5;:62::i;:::-;77998:261::o:0;75522:73::-;;;;;;;;;;;;;:::o;63738:428::-;63822:21;;:::i;:::-;63856:31;;:::i;:::-;63912:15;:13;:15::i;:::-;63902:7;:25;:54;;;;63942:14;:12;:14::i;:::-;63931:7;:25;;63902:54;63898:103;;;63980:9;63973:16;;;;;63898:103;64023:21;64036:7;64023:12;:21::i;:::-;64011:33;;64059:9;:16;;;64055:65;;;64099:9;64092:16;;;;;64055:65;64137:21;64150:7;64137:12;:21::i;:::-;64130:28;;;63738:428;;;;:::o;76694:142::-;76765:15;76799:14;:29;76814:13;76799:29;;;;;;;;;;;;;;;;;;;;;;;;;76792:36;;76694:142;;;:::o;76447:188::-;76518:18;76579:12;76592:25;76609:7;76592:16;:25::i;:::-;76562:64;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76548:79;;76447:188;;;:::o;78309:101::-;73617:13;:11;:13::i;:::-;78392:10:::1;78380:9;;:22;;;;;;;;;;;;;;;;;;78309:101:::0;:::o;37989:164::-;38086:4;38110:18;:25;38129:5;38110:25;;;;;;;;;;;;;;;:35;38136:8;38110:35;;;;;;;;;;;;;;;;;;;;;;;;;38103:42;;37989:164;;;;:::o;75739:88::-;;;;:::o;77767:175::-;73617:13;:11;:13::i;:::-;77865:9:::1;;77854:7;77838:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;77830:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;77897:37;77911:13;;;;;;;;;;;77926:7;77897:5;:37::i;:::-;77767:175:::0;:::o;74637:201::-;73617:13;:11;:13::i;:::-;74746:1:::1;74726:22;;:8;:22;;;;74718:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;74802:28;74821:8;74802:18;:28::i;:::-;74637:201:::0;:::o;75328:87::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38411:282::-;38476:4;38532:7;38513:15;:13;:15::i;:::-;:26;;:66;;;;;38566:13;;38556:7;:23;38513:66;:153;;;;;38665:1;22419:8;38617:17;:26;38635:7;38617:26;;;;;;;;;;;;:44;:49;38513:153;38493:173;;38411:282;;;:::o;60719:105::-;60779:7;60806:10;60799:17;;60719:105;:::o;25816:92::-;25872:7;25816:92;:::o;73896:132::-;73971:12;:10;:12::i;:::-;73960:23;;:7;:5;:7::i;:::-;:23;;;73952:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73896:132::o;33097:1275::-;33164:7;33184:12;33199:7;33184:22;;33267:4;33248:15;:13;:15::i;:::-;:23;33244:1061;;33301:13;;33294:4;:20;33290:1015;;;33339:14;33356:17;:23;33374:4;33356:23;;;;;;;;;;;;33339:40;;33473:1;22419:8;33445:6;:24;:29;33441:845;;;34110:113;34127:1;34117:6;:11;34110:113;;;34170:17;:25;34188:6;;;;;;;34170:25;;;;;;;;;;;;34161:34;;34110:113;;;34256:6;34249:13;;;;;;33441:845;33316:989;33290:1015;33244:1061;34333:31;;;;;;;;;;;;;;33097:1275;;;;:::o;39574:485::-;39676:27;39705:23;39746:38;39787:15;:24;39803:7;39787:24;;;;;;;;;;;39746:65;;39964:18;39941:41;;40021:19;40015:26;39996:45;;39926:126;39574:485;;;:::o;38802:659::-;38951:11;39116:16;39109:5;39105:28;39096:37;;39276:16;39265:9;39261:32;39248:45;;39426:15;39415:9;39412:30;39404:5;39393:9;39390:20;39387:56;39377:66;;38802:659;;;;;:::o;45460:159::-;;;;;:::o;60028:311::-;60163:7;60183:16;22823:3;60209:19;:41;;60183:68;;22823:3;60277:31;60288:4;60294:2;60298:9;60277:10;:31::i;:::-;60269:40;;:62;;60262:69;;;60028:311;;;;;:::o;34920:450::-;35000:14;35168:16;35161:5;35157:28;35148:37;;35345:5;35331:11;35306:23;35302:41;35299:52;35292:5;35289:63;35279:73;;34920:450;;;;:::o;46284:158::-;;;;;:::o;48060:2966::-;48133:20;48156:13;;48133:36;;48196:1;48184:8;:13;48180:44;;;48206:18;;;;;;;;;;;;;;48180:44;48237:61;48267:1;48271:2;48275:12;48289:8;48237:21;:61::i;:::-;48781:1;21781:2;48751:1;:26;;48750:32;48738:8;:45;48712:18;:22;48731:2;48712:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;49060:139;49097:2;49151:33;49174:1;49178:2;49182:1;49151:14;:33::i;:::-;49118:30;49139:8;49118:20;:30::i;:::-;:66;49060:18;:139::i;:::-;49026:17;:31;49044:12;49026:31;;;;;;;;;;;:173;;;;49216:16;49247:11;49276:8;49261:12;:23;49247:37;;49797:16;49793:2;49789:25;49777:37;;50169:12;50129:8;50088:1;50026:25;49967:1;49906;49879:335;50540:1;50526:12;50522:20;50480:346;50581:3;50572:7;50569:16;50480:346;;50799:7;50789:8;50786:1;50759:25;50756:1;50753;50748:59;50634:1;50625:7;50621:15;50610:26;;50480:346;;;50484:77;50871:1;50859:8;:13;50855:45;;;50881:19;;;;;;;;;;;;;;50855:45;50933:3;50917:13;:19;;;;48486:2462;;50958:60;50987:1;50991:2;50995:12;51009:8;50958:20;:60::i;:::-;48122:2904;48060:2966;;:::o;74998:191::-;75072:16;75091:6;;;;;;;;;;;75072:25;;75117:8;75108:6;;:17;;;;;;;;;;;;;;;;;;75172:8;75141:40;;75162:8;75141:40;;;;;;;;;;;;75061:128;74998:191;:::o;32545:161::-;32613:21;;:::i;:::-;32654:44;32673:17;:24;32691:5;32673:24;;;;;;;;;;;;32654:18;:44::i;:::-;32647:51;;32545:161;;;:::o;25987:103::-;26042:7;26069:13;;26062:20;;25987:103;:::o;1252:190::-;1377:4;1430;1401:25;1414:5;1421:4;1401:12;:25::i;:::-;:33;1394:40;;1252:190;;;;;:::o;46882:716::-;47045:4;47091:2;47066:45;;;47112:19;:17;:19::i;:::-;47133:4;47139:7;47148:5;47066:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47062:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47366:1;47349:6;:13;:18;47345:235;;;47395:40;;;;;;;;;;;;;;47345:235;47538:6;47532:13;47523:6;47519:2;47515:15;47508:38;47062:529;47235:54;;;47225:64;;;:6;:64;;;;47218:71;;;46882:716;;;;;;:::o;32283:166::-;32353:21;;:::i;:::-;32394:47;32413:27;32432:7;32413:18;:27::i;:::-;32394:18;:47::i;:::-;32387:54;;32283:166;;;:::o;69536:723::-;69592:13;69822:1;69813:5;:10;69809:53;;;69840:10;;;;;;;;;;;;;;;;;;;;;69809:53;69872:12;69887:5;69872:20;;69903:14;69928:78;69943:1;69935:4;:9;69928:78;;69961:8;;;;;:::i;:::-;;;;69992:2;69984:10;;;;;:::i;:::-;;;69928:78;;;70016:19;70048:6;70038:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70016:39;;70066:154;70082:1;70073:5;:10;70066:154;;70110:1;70100:11;;;;;:::i;:::-;;;70177:2;70169:5;:10;;;;:::i;:::-;70156:2;:24;;;;:::i;:::-;70143:39;;70126:6;70133;70126:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;70206:2;70197:11;;;;;:::i;:::-;;;70066:154;;;70244:6;70230:21;;;;;69536:723;;;;:::o;72282:98::-;72335:7;72362:10;72355:17;;72282:98;:::o;59729:147::-;59866:6;59729:147;;;;;:::o;35472:324::-;35542:14;35775:1;35765:8;35762:15;35736:24;35732:46;35722:56;;35472:324;;;:::o;34471:366::-;34537:31;;:::i;:::-;34614:6;34581:9;:14;;:41;;;;;;;;;;;22302:3;34667:6;:33;;34633:9;:24;;:68;;;;;;;;;;;34759:1;22419:8;34731:6;:24;:29;;34712:9;:16;;:48;;;;;;;;;;;22823:3;34800:6;:28;;34771:9;:19;;:58;;;;;;;;;;;34471:366;;;:::o;2119:296::-;2202:7;2222:20;2245:4;2222:27;;2265:9;2260:118;2284:5;:12;2280:1;:16;2260:118;;;2333:33;2343:12;2357:5;2363:1;2357:8;;;;;;;;:::i;:::-;;;;;;;;2333:9;:33::i;:::-;2318:48;;2298:3;;;;;:::i;:::-;;;;2260:118;;;;2395:12;2388:19;;;2119:296;;;;:::o;8326:149::-;8389:7;8420:1;8416;:5;:51;;8447:20;8462:1;8465;8447:14;:20::i;:::-;8416:51;;;8424:20;8439:1;8442;8424:14;:20::i;:::-;8416:51;8409:58;;8326:149;;;;:::o;8483:268::-;8551:13;8658:1;8652:4;8645:15;8687:1;8681:4;8674:15;8728:4;8722;8712:21;8703:30;;8483:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2141:568::-;2214:8;2224:6;2274:3;2267:4;2259:6;2255:17;2251:27;2241:122;;2282:79;;:::i;:::-;2241:122;2395:6;2382:20;2372:30;;2425:18;2417:6;2414:30;2411:117;;;2447:79;;:::i;:::-;2411:117;2561:4;2553:6;2549:17;2537:29;;2615:3;2607:4;2599:6;2595:17;2585:8;2581:32;2578:41;2575:128;;;2622:79;;:::i;:::-;2575:128;2141:568;;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:139::-;2900:5;2938:6;2925:20;2916:29;;2954:33;2981:5;2954:33;:::i;:::-;2854:139;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;2999:137;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3142:141;;;;:::o;3302:338::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:122;;3414:79;;:::i;:::-;3373:122;3531:6;3518:20;3556:78;3630:3;3622:6;3615:4;3607:6;3603:17;3556:78;:::i;:::-;3547:87;;3363:277;3302:338;;;;:::o;3660:340::-;3716:5;3765:3;3758:4;3750:6;3746:17;3742:27;3732:122;;3773:79;;:::i;:::-;3732:122;3890:6;3877:20;3915:79;3990:3;3982:6;3975:4;3967:6;3963:17;3915:79;:::i;:::-;3906:88;;3722:278;3660:340;;;;:::o;4006:139::-;4052:5;4090:6;4077:20;4068:29;;4106:33;4133:5;4106:33;:::i;:::-;4006:139;;;;:::o;4151:329::-;4210:6;4259:2;4247:9;4238:7;4234:23;4230:32;4227:119;;;4265:79;;:::i;:::-;4227:119;4385:1;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4356:117;4151:329;;;;:::o;4486:474::-;4554:6;4562;4611:2;4599:9;4590:7;4586:23;4582:32;4579:119;;;4617:79;;:::i;:::-;4579:119;4737:1;4762:53;4807:7;4798:6;4787:9;4783:22;4762:53;:::i;:::-;4752:63;;4708:117;4864:2;4890:53;4935:7;4926:6;4915:9;4911:22;4890:53;:::i;:::-;4880:63;;4835:118;4486:474;;;;;:::o;4966:619::-;5043:6;5051;5059;5108:2;5096:9;5087:7;5083:23;5079:32;5076:119;;;5114:79;;:::i;:::-;5076:119;5234:1;5259:53;5304:7;5295:6;5284:9;5280:22;5259:53;:::i;:::-;5249:63;;5205:117;5361:2;5387:53;5432:7;5423:6;5412:9;5408:22;5387:53;:::i;:::-;5377:63;;5332:118;5489:2;5515:53;5560:7;5551:6;5540:9;5536:22;5515:53;:::i;:::-;5505:63;;5460:118;4966:619;;;;;:::o;5591:943::-;5686:6;5694;5702;5710;5759:3;5747:9;5738:7;5734:23;5730:33;5727:120;;;5766:79;;:::i;:::-;5727:120;5886:1;5911:53;5956:7;5947:6;5936:9;5932:22;5911:53;:::i;:::-;5901:63;;5857:117;6013:2;6039:53;6084:7;6075:6;6064:9;6060:22;6039:53;:::i;:::-;6029:63;;5984:118;6141:2;6167:53;6212:7;6203:6;6192:9;6188:22;6167:53;:::i;:::-;6157:63;;6112:118;6297:2;6286:9;6282:18;6269:32;6328:18;6320:6;6317:30;6314:117;;;6350:79;;:::i;:::-;6314:117;6455:62;6509:7;6500:6;6489:9;6485:22;6455:62;:::i;:::-;6445:72;;6240:287;5591:943;;;;;;;:::o;6540:468::-;6605:6;6613;6662:2;6650:9;6641:7;6637:23;6633:32;6630:119;;;6668:79;;:::i;:::-;6630:119;6788:1;6813:53;6858:7;6849:6;6838:9;6834:22;6813:53;:::i;:::-;6803:63;;6759:117;6915:2;6941:50;6983:7;6974:6;6963:9;6959:22;6941:50;:::i;:::-;6931:60;;6886:115;6540:468;;;;;:::o;7014:474::-;7082:6;7090;7139:2;7127:9;7118:7;7114:23;7110:32;7107:119;;;7145:79;;:::i;:::-;7107:119;7265:1;7290:53;7335:7;7326:6;7315:9;7311:22;7290:53;:::i;:::-;7280:63;;7236:117;7392:2;7418:53;7463:7;7454:6;7443:9;7439:22;7418:53;:::i;:::-;7408:63;;7363:118;7014:474;;;;;:::o;7494:619::-;7571:6;7579;7587;7636:2;7624:9;7615:7;7611:23;7607:32;7604:119;;;7642:79;;:::i;:::-;7604:119;7762:1;7787:53;7832:7;7823:6;7812:9;7808:22;7787:53;:::i;:::-;7777:63;;7733:117;7889:2;7915:53;7960:7;7951:6;7940:9;7936:22;7915:53;:::i;:::-;7905:63;;7860:118;8017:2;8043:53;8088:7;8079:6;8068:9;8064:22;8043:53;:::i;:::-;8033:63;;7988:118;7494:619;;;;;:::o;8119:684::-;8212:6;8220;8269:2;8257:9;8248:7;8244:23;8240:32;8237:119;;;8275:79;;:::i;:::-;8237:119;8423:1;8412:9;8408:17;8395:31;8453:18;8445:6;8442:30;8439:117;;;8475:79;;:::i;:::-;8439:117;8580:78;8650:7;8641:6;8630:9;8626:22;8580:78;:::i;:::-;8570:88;;8366:302;8707:2;8733:53;8778:7;8769:6;8758:9;8754:22;8733:53;:::i;:::-;8723:63;;8678:118;8119:684;;;;;:::o;8809:559::-;8895:6;8903;8952:2;8940:9;8931:7;8927:23;8923:32;8920:119;;;8958:79;;:::i;:::-;8920:119;9106:1;9095:9;9091:17;9078:31;9136:18;9128:6;9125:30;9122:117;;;9158:79;;:::i;:::-;9122:117;9271:80;9343:7;9334:6;9323:9;9319:22;9271:80;:::i;:::-;9253:98;;;;9049:312;8809:559;;;;;:::o;9374:323::-;9430:6;9479:2;9467:9;9458:7;9454:23;9450:32;9447:119;;;9485:79;;:::i;:::-;9447:119;9605:1;9630:50;9672:7;9663:6;9652:9;9648:22;9630:50;:::i;:::-;9620:60;;9576:114;9374:323;;;;:::o;9703:329::-;9762:6;9811:2;9799:9;9790:7;9786:23;9782:32;9779:119;;;9817:79;;:::i;:::-;9779:119;9937:1;9962:53;10007:7;9998:6;9987:9;9983:22;9962:53;:::i;:::-;9952:63;;9908:117;9703:329;;;;:::o;10038:327::-;10096:6;10145:2;10133:9;10124:7;10120:23;10116:32;10113:119;;;10151:79;;:::i;:::-;10113:119;10271:1;10296:52;10340:7;10331:6;10320:9;10316:22;10296:52;:::i;:::-;10286:62;;10242:116;10038:327;;;;:::o;10371:349::-;10440:6;10489:2;10477:9;10468:7;10464:23;10460:32;10457:119;;;10495:79;;:::i;:::-;10457:119;10615:1;10640:63;10695:7;10686:6;10675:9;10671:22;10640:63;:::i;:::-;10630:73;;10586:127;10371:349;;;;:::o;10726:509::-;10795:6;10844:2;10832:9;10823:7;10819:23;10815:32;10812:119;;;10850:79;;:::i;:::-;10812:119;10998:1;10987:9;10983:17;10970:31;11028:18;11020:6;11017:30;11014:117;;;11050:79;;:::i;:::-;11014:117;11155:63;11210:7;11201:6;11190:9;11186:22;11155:63;:::i;:::-;11145:73;;10941:287;10726:509;;;;:::o;11241:329::-;11300:6;11349:2;11337:9;11328:7;11324:23;11320:32;11317:119;;;11355:79;;:::i;:::-;11317:119;11475:1;11500:53;11545:7;11536:6;11525:9;11521:22;11500:53;:::i;:::-;11490:63;;11446:117;11241:329;;;;:::o;11576:1185::-;11712:6;11720;11728;11736;11785:3;11773:9;11764:7;11760:23;11756:33;11753:120;;;11792:79;;:::i;:::-;11753:120;11912:1;11937:53;11982:7;11973:6;11962:9;11958:22;11937:53;:::i;:::-;11927:63;;11883:117;12067:2;12056:9;12052:18;12039:32;12098:18;12090:6;12087:30;12084:117;;;12120:79;;:::i;:::-;12084:117;12225:78;12295:7;12286:6;12275:9;12271:22;12225:78;:::i;:::-;12215:88;;12010:303;12380:2;12369:9;12365:18;12352:32;12411:18;12403:6;12400:30;12397:117;;;12433:79;;:::i;:::-;12397:117;12538:78;12608:7;12599:6;12588:9;12584:22;12538:78;:::i;:::-;12528:88;;12323:303;12665:2;12691:53;12736:7;12727:6;12716:9;12712:22;12691:53;:::i;:::-;12681:63;;12636:118;11576:1185;;;;;;;:::o;12767:303::-;12898:10;12919:108;13023:3;13015:6;12919:108;:::i;:::-;13059:4;13054:3;13050:14;13036:28;;12767:303;;;;:::o;13076:179::-;13145:10;13166:46;13208:3;13200:6;13166:46;:::i;:::-;13244:4;13239:3;13235:14;13221:28;;13076:179;;;;:::o;13261:108::-;13338:24;13356:5;13338:24;:::i;:::-;13333:3;13326:37;13261:108;;:::o;13375:118::-;13462:24;13480:5;13462:24;:::i;:::-;13457:3;13450:37;13375:118;;:::o;13499:157::-;13604:45;13624:24;13642:5;13624:24;:::i;:::-;13604:45;:::i;:::-;13599:3;13592:58;13499:157;;:::o;13738:980::-;13919:3;13948:85;14027:5;13948:85;:::i;:::-;14049:117;14159:6;14154:3;14049:117;:::i;:::-;14042:124;;14190:87;14271:5;14190:87;:::i;:::-;14300:7;14331:1;14316:377;14341:6;14338:1;14335:13;14316:377;;;14417:6;14411:13;14444:125;14565:3;14550:13;14444:125;:::i;:::-;14437:132;;14592:91;14676:6;14592:91;:::i;:::-;14582:101;;14376:317;14363:1;14360;14356:9;14351:14;;14316:377;;;14320:14;14709:3;14702:10;;13924:794;;;13738:980;;;;:::o;14754:732::-;14873:3;14902:54;14950:5;14902:54;:::i;:::-;14972:86;15051:6;15046:3;14972:86;:::i;:::-;14965:93;;15082:56;15132:5;15082:56;:::i;:::-;15161:7;15192:1;15177:284;15202:6;15199:1;15196:13;15177:284;;;15278:6;15272:13;15305:63;15364:3;15349:13;15305:63;:::i;:::-;15298:70;;15391:60;15444:6;15391:60;:::i;:::-;15381:70;;15237:224;15224:1;15221;15217:9;15212:14;;15177:284;;;15181:14;15477:3;15470:10;;14878:608;;;14754:732;;;;:::o;15492:99::-;15563:21;15578:5;15563:21;:::i;:::-;15558:3;15551:34;15492:99;;:::o;15597:109::-;15678:21;15693:5;15678:21;:::i;:::-;15673:3;15666:34;15597:109;;:::o;15712:118::-;15799:24;15817:5;15799:24;:::i;:::-;15794:3;15787:37;15712:118;;:::o;15836:360::-;15922:3;15950:38;15982:5;15950:38;:::i;:::-;16004:70;16067:6;16062:3;16004:70;:::i;:::-;15997:77;;16083:52;16128:6;16123:3;16116:4;16109:5;16105:16;16083:52;:::i;:::-;16160:29;16182:6;16160:29;:::i;:::-;16155:3;16151:39;16144:46;;15926:270;15836:360;;;;:::o;16202:364::-;16290:3;16318:39;16351:5;16318:39;:::i;:::-;16373:71;16437:6;16432:3;16373:71;:::i;:::-;16366:78;;16453:52;16498:6;16493:3;16486:4;16479:5;16475:16;16453:52;:::i;:::-;16530:29;16552:6;16530:29;:::i;:::-;16525:3;16521:39;16514:46;;16294:272;16202:364;;;;:::o;16572:377::-;16678:3;16706:39;16739:5;16706:39;:::i;:::-;16761:89;16843:6;16838:3;16761:89;:::i;:::-;16754:96;;16859:52;16904:6;16899:3;16892:4;16885:5;16881:16;16859:52;:::i;:::-;16936:6;16931:3;16927:16;16920:23;;16682:267;16572:377;;;;:::o;16979:845::-;17082:3;17119:5;17113:12;17148:36;17174:9;17148:36;:::i;:::-;17200:89;17282:6;17277:3;17200:89;:::i;:::-;17193:96;;17320:1;17309:9;17305:17;17336:1;17331:137;;;;17482:1;17477:341;;;;17298:520;;17331:137;17415:4;17411:9;17400;17396:25;17391:3;17384:38;17451:6;17446:3;17442:16;17435:23;;17331:137;;17477:341;17544:38;17576:5;17544:38;:::i;:::-;17604:1;17618:154;17632:6;17629:1;17626:13;17618:154;;;17706:7;17700:14;17696:1;17691:3;17687:11;17680:35;17756:1;17747:7;17743:15;17732:26;;17654:4;17651:1;17647:12;17642:17;;17618:154;;;17801:6;17796:3;17792:16;17785:23;;17484:334;;17298:520;;17086:738;;16979:845;;;;:::o;17830:366::-;17972:3;17993:67;18057:2;18052:3;17993:67;:::i;:::-;17986:74;;18069:93;18158:3;18069:93;:::i;:::-;18187:2;18182:3;18178:12;18171:19;;17830:366;;;:::o;18202:::-;18344:3;18365:67;18429:2;18424:3;18365:67;:::i;:::-;18358:74;;18441:93;18530:3;18441:93;:::i;:::-;18559:2;18554:3;18550:12;18543:19;;18202:366;;;:::o;18574:::-;18716:3;18737:67;18801:2;18796:3;18737:67;:::i;:::-;18730:74;;18813:93;18902:3;18813:93;:::i;:::-;18931:2;18926:3;18922:12;18915:19;;18574:366;;;:::o;18946:::-;19088:3;19109:67;19173:2;19168:3;19109:67;:::i;:::-;19102:74;;19185:93;19274:3;19185:93;:::i;:::-;19303:2;19298:3;19294:12;19287:19;;18946:366;;;:::o;19318:::-;19460:3;19481:67;19545:2;19540:3;19481:67;:::i;:::-;19474:74;;19557:93;19646:3;19557:93;:::i;:::-;19675:2;19670:3;19666:12;19659:19;;19318:366;;;:::o;19690:400::-;19850:3;19871:84;19953:1;19948:3;19871:84;:::i;:::-;19864:91;;19964:93;20053:3;19964:93;:::i;:::-;20082:1;20077:3;20073:11;20066:18;;19690:400;;;:::o;20096:365::-;20238:3;20259:66;20323:1;20318:3;20259:66;:::i;:::-;20252:73;;20334:93;20423:3;20334:93;:::i;:::-;20452:2;20447:3;20443:12;20436:19;;20096:365;;;:::o;20467:366::-;20609:3;20630:67;20694:2;20689:3;20630:67;:::i;:::-;20623:74;;20706:93;20795:3;20706:93;:::i;:::-;20824:2;20819:3;20815:12;20808:19;;20467:366;;;:::o;20839:398::-;20998:3;21019:83;21100:1;21095:3;21019:83;:::i;:::-;21012:90;;21111:93;21200:3;21111:93;:::i;:::-;21229:1;21224:3;21220:11;21213:18;;20839:398;;;:::o;21243:366::-;21385:3;21406:67;21470:2;21465:3;21406:67;:::i;:::-;21399:74;;21482:93;21571:3;21482:93;:::i;:::-;21600:2;21595:3;21591:12;21584:19;;21243:366;;;:::o;21687:864::-;21836:4;21831:3;21827:14;21923:4;21916:5;21912:16;21906:23;21942:63;21999:4;21994:3;21990:14;21976:12;21942:63;:::i;:::-;21851:164;22107:4;22100:5;22096:16;22090:23;22126:61;22181:4;22176:3;22172:14;22158:12;22126:61;:::i;:::-;22025:172;22281:4;22274:5;22270:16;22264:23;22300:57;22351:4;22346:3;22342:14;22328:12;22300:57;:::i;:::-;22207:160;22454:4;22447:5;22443:16;22437:23;22473:61;22528:4;22523:3;22519:14;22505:12;22473:61;:::i;:::-;22377:167;21805:746;21687:864;;:::o;22629:874::-;22788:4;22783:3;22779:14;22875:4;22868:5;22864:16;22858:23;22894:63;22951:4;22946:3;22942:14;22928:12;22894:63;:::i;:::-;22803:164;23059:4;23052:5;23048:16;23042:23;23078:61;23133:4;23128:3;23124:14;23110:12;23078:61;:::i;:::-;22977:172;23233:4;23226:5;23222:16;23216:23;23252:57;23303:4;23298:3;23294:14;23280:12;23252:57;:::i;:::-;23159:160;23406:4;23399:5;23395:16;23389:23;23425:61;23480:4;23475:3;23471:14;23457:12;23425:61;:::i;:::-;23329:167;22757:746;22629:874;;:::o;23509:105::-;23584:23;23601:5;23584:23;:::i;:::-;23579:3;23572:36;23509:105;;:::o;23620:108::-;23697:24;23715:5;23697:24;:::i;:::-;23692:3;23685:37;23620:108;;:::o;23734:118::-;23821:24;23839:5;23821:24;:::i;:::-;23816:3;23809:37;23734:118;;:::o;23858:105::-;23933:23;23950:5;23933:23;:::i;:::-;23928:3;23921:36;23858:105;;:::o;23969:256::-;24081:3;24096:75;24167:3;24158:6;24096:75;:::i;:::-;24196:2;24191:3;24187:12;24180:19;;24216:3;24209:10;;23969:256;;;;:::o;24231:695::-;24509:3;24531:92;24619:3;24610:6;24531:92;:::i;:::-;24524:99;;24640:95;24731:3;24722:6;24640:95;:::i;:::-;24633:102;;24752:148;24896:3;24752:148;:::i;:::-;24745:155;;24917:3;24910:10;;24231:695;;;;;:::o;24932:379::-;25116:3;25138:147;25281:3;25138:147;:::i;:::-;25131:154;;25302:3;25295:10;;24932:379;;;:::o;25317:222::-;25410:4;25448:2;25437:9;25433:18;25425:26;;25461:71;25529:1;25518:9;25514:17;25505:6;25461:71;:::i;:::-;25317:222;;;;:::o;25545:640::-;25740:4;25778:3;25767:9;25763:19;25755:27;;25792:71;25860:1;25849:9;25845:17;25836:6;25792:71;:::i;:::-;25873:72;25941:2;25930:9;25926:18;25917:6;25873:72;:::i;:::-;25955;26023:2;26012:9;26008:18;25999:6;25955:72;:::i;:::-;26074:9;26068:4;26064:20;26059:2;26048:9;26044:18;26037:48;26102:76;26173:4;26164:6;26102:76;:::i;:::-;26094:84;;25545:640;;;;;;;:::o;26191:497::-;26396:4;26434:2;26423:9;26419:18;26411:26;;26483:9;26477:4;26473:20;26469:1;26458:9;26454:17;26447:47;26511:170;26676:4;26667:6;26511:170;:::i;:::-;26503:178;;26191:497;;;;:::o;26694:373::-;26837:4;26875:2;26864:9;26860:18;26852:26;;26924:9;26918:4;26914:20;26910:1;26899:9;26895:17;26888:47;26952:108;27055:4;27046:6;26952:108;:::i;:::-;26944:116;;26694:373;;;;:::o;27073:210::-;27160:4;27198:2;27187:9;27183:18;27175:26;;27211:65;27273:1;27262:9;27258:17;27249:6;27211:65;:::i;:::-;27073:210;;;;:::o;27289:222::-;27382:4;27420:2;27409:9;27405:18;27397:26;;27433:71;27501:1;27490:9;27486:17;27477:6;27433:71;:::i;:::-;27289:222;;;;:::o;27517:313::-;27630:4;27668:2;27657:9;27653:18;27645:26;;27717:9;27711:4;27707:20;27703:1;27692:9;27688:17;27681:47;27745:78;27818:4;27809:6;27745:78;:::i;:::-;27737:86;;27517:313;;;;:::o;27836:419::-;28002:4;28040:2;28029:9;28025:18;28017:26;;28089:9;28083:4;28079:20;28075:1;28064:9;28060:17;28053:47;28117:131;28243:4;28117:131;:::i;:::-;28109:139;;27836:419;;;:::o;28261:::-;28427:4;28465:2;28454:9;28450:18;28442:26;;28514:9;28508:4;28504:20;28500:1;28489:9;28485:17;28478:47;28542:131;28668:4;28542:131;:::i;:::-;28534:139;;28261:419;;;:::o;28686:::-;28852:4;28890:2;28879:9;28875:18;28867:26;;28939:9;28933:4;28929:20;28925:1;28914:9;28910:17;28903:47;28967:131;29093:4;28967:131;:::i;:::-;28959:139;;28686:419;;;:::o;29111:::-;29277:4;29315:2;29304:9;29300:18;29292:26;;29364:9;29358:4;29354:20;29350:1;29339:9;29335:17;29328:47;29392:131;29518:4;29392:131;:::i;:::-;29384:139;;29111:419;;;:::o;29536:::-;29702:4;29740:2;29729:9;29725:18;29717:26;;29789:9;29783:4;29779:20;29775:1;29764:9;29760:17;29753:47;29817:131;29943:4;29817:131;:::i;:::-;29809:139;;29536:419;;;:::o;29961:::-;30127:4;30165:2;30154:9;30150:18;30142:26;;30214:9;30208:4;30204:20;30200:1;30189:9;30185:17;30178:47;30242:131;30368:4;30242:131;:::i;:::-;30234:139;;29961:419;;;:::o;30386:::-;30552:4;30590:2;30579:9;30575:18;30567:26;;30639:9;30633:4;30629:20;30625:1;30614:9;30610:17;30603:47;30667:131;30793:4;30667:131;:::i;:::-;30659:139;;30386:419;;;:::o;30811:::-;30977:4;31015:2;31004:9;31000:18;30992:26;;31064:9;31058:4;31054:20;31050:1;31039:9;31035:17;31028:47;31092:131;31218:4;31092:131;:::i;:::-;31084:139;;30811:419;;;:::o;31236:347::-;31391:4;31429:3;31418:9;31414:19;31406:27;;31443:133;31573:1;31562:9;31558:17;31549:6;31443:133;:::i;:::-;31236:347;;;;:::o;31589:222::-;31682:4;31720:2;31709:9;31705:18;31697:26;;31733:71;31801:1;31790:9;31786:17;31777:6;31733:71;:::i;:::-;31589:222;;;;:::o;31817:129::-;31851:6;31878:20;;:::i;:::-;31868:30;;31907:33;31935:4;31927:6;31907:33;:::i;:::-;31817:129;;;:::o;31952:75::-;31985:6;32018:2;32012:9;32002:19;;31952:75;:::o;32033:311::-;32110:4;32200:18;32192:6;32189:30;32186:56;;;32222:18;;:::i;:::-;32186:56;32272:4;32264:6;32260:17;32252:25;;32332:4;32326;32322:15;32314:23;;32033:311;;;:::o;32350:307::-;32411:4;32501:18;32493:6;32490:30;32487:56;;;32523:18;;:::i;:::-;32487:56;32561:29;32583:6;32561:29;:::i;:::-;32553:37;;32645:4;32639;32635:15;32627:23;;32350:307;;;:::o;32663:308::-;32725:4;32815:18;32807:6;32804:30;32801:56;;;32837:18;;:::i;:::-;32801:56;32875:29;32897:6;32875:29;:::i;:::-;32867:37;;32959:4;32953;32949:15;32941:23;;32663:308;;;:::o;32977:163::-;33075:4;33098:3;33090:11;;33128:4;33123:3;33119:14;33111:22;;32977:163;;;:::o;33146:132::-;33213:4;33236:3;33228:11;;33266:4;33261:3;33257:14;33249:22;;33146:132;;;:::o;33284:141::-;33333:4;33356:3;33348:11;;33379:3;33376:1;33369:14;33413:4;33410:1;33400:18;33392:26;;33284:141;;;:::o;33431:145::-;33529:6;33563:5;33557:12;33547:22;;33431:145;;;:::o;33582:114::-;33649:6;33683:5;33677:12;33667:22;;33582:114;;;:::o;33702:98::-;33753:6;33787:5;33781:12;33771:22;;33702:98;;;:::o;33806:99::-;33858:6;33892:5;33886:12;33876:22;;33806:99;;;:::o;33911:144::-;34012:4;34044;34039:3;34035:14;34027:22;;33911:144;;;:::o;34061:113::-;34131:4;34163;34158:3;34154:14;34146:22;;34061:113;;;:::o;34180:215::-;34310:11;34344:6;34339:3;34332:19;34384:4;34379:3;34375:14;34360:29;;34180:215;;;;:::o;34401:184::-;34500:11;34534:6;34529:3;34522:19;34574:4;34569:3;34565:14;34550:29;;34401:184;;;;:::o;34591:168::-;34674:11;34708:6;34703:3;34696:19;34748:4;34743:3;34739:14;34724:29;;34591:168;;;;:::o;34765:147::-;34866:11;34903:3;34888:18;;34765:147;;;;:::o;34918:169::-;35002:11;35036:6;35031:3;35024:19;35076:4;35071:3;35067:14;35052:29;;34918:169;;;;:::o;35093:148::-;35195:11;35232:3;35217:18;;35093:148;;;;:::o;35247:305::-;35287:3;35306:20;35324:1;35306:20;:::i;:::-;35301:25;;35340:20;35358:1;35340:20;:::i;:::-;35335:25;;35494:1;35426:66;35422:74;35419:1;35416:81;35413:107;;;35500:18;;:::i;:::-;35413:107;35544:1;35541;35537:9;35530:16;;35247:305;;;;:::o;35558:185::-;35598:1;35615:20;35633:1;35615:20;:::i;:::-;35610:25;;35649:20;35667:1;35649:20;:::i;:::-;35644:25;;35688:1;35678:35;;35693:18;;:::i;:::-;35678:35;35735:1;35732;35728:9;35723:14;;35558:185;;;;:::o;35749:191::-;35789:4;35809:20;35827:1;35809:20;:::i;:::-;35804:25;;35843:20;35861:1;35843:20;:::i;:::-;35838:25;;35882:1;35879;35876:8;35873:34;;;35887:18;;:::i;:::-;35873:34;35932:1;35929;35925:9;35917:17;;35749:191;;;;:::o;35946:96::-;35983:7;36012:24;36030:5;36012:24;:::i;:::-;36001:35;;35946:96;;;:::o;36048:90::-;36082:7;36125:5;36118:13;36111:21;36100:32;;36048:90;;;:::o;36144:77::-;36181:7;36210:5;36199:16;;36144:77;;;:::o;36227:149::-;36263:7;36303:66;36296:5;36292:78;36281:89;;36227:149;;;:::o;36382:126::-;36419:7;36459:42;36452:5;36448:54;36437:65;;36382:126;;;:::o;36514:91::-;36550:7;36590:8;36583:5;36579:20;36568:31;;36514:91;;;:::o;36611:77::-;36648:7;36677:5;36666:16;;36611:77;;;:::o;36694:101::-;36730:7;36770:18;36763:5;36759:30;36748:41;;36694:101;;;:::o;36801:154::-;36885:6;36880:3;36875;36862:30;36947:1;36938:6;36933:3;36929:16;36922:27;36801:154;;;:::o;36961:307::-;37029:1;37039:113;37053:6;37050:1;37047:13;37039:113;;;37138:1;37133:3;37129:11;37123:18;37119:1;37114:3;37110:11;37103:39;37075:2;37072:1;37068:10;37063:15;;37039:113;;;37170:6;37167:1;37164:13;37161:101;;;37250:1;37241:6;37236:3;37232:16;37225:27;37161:101;37010:258;36961:307;;;:::o;37274:320::-;37318:6;37355:1;37349:4;37345:12;37335:22;;37402:1;37396:4;37392:12;37423:18;37413:81;;37479:4;37471:6;37467:17;37457:27;;37413:81;37541:2;37533:6;37530:14;37510:18;37507:38;37504:84;;;37560:18;;:::i;:::-;37504:84;37325:269;37274:320;;;:::o;37600:281::-;37683:27;37705:4;37683:27;:::i;:::-;37675:6;37671:40;37813:6;37801:10;37798:22;37777:18;37765:10;37762:34;37759:62;37756:88;;;37824:18;;:::i;:::-;37756:88;37864:10;37860:2;37853:22;37643:238;37600:281;;:::o;37887:233::-;37926:3;37949:24;37967:5;37949:24;:::i;:::-;37940:33;;37995:66;37988:5;37985:77;37982:103;;;38065:18;;:::i;:::-;37982:103;38112:1;38105:5;38101:13;38094:20;;37887:233;;;:::o;38126:100::-;38165:7;38194:26;38214:5;38194:26;:::i;:::-;38183:37;;38126:100;;;:::o;38232:94::-;38271:7;38300:20;38314:5;38300:20;:::i;:::-;38289:31;;38232:94;;;:::o;38332:176::-;38364:1;38381:20;38399:1;38381:20;:::i;:::-;38376:25;;38415:20;38433:1;38415:20;:::i;:::-;38410:25;;38454:1;38444:35;;38459:18;;:::i;:::-;38444:35;38500:1;38497;38493:9;38488:14;;38332:176;;;;:::o;38514:180::-;38562:77;38559:1;38552:88;38659:4;38656:1;38649:15;38683:4;38680:1;38673:15;38700:180;38748:77;38745:1;38738:88;38845:4;38842:1;38835:15;38869:4;38866:1;38859:15;38886:180;38934:77;38931:1;38924:88;39031:4;39028:1;39021:15;39055:4;39052:1;39045:15;39072:180;39120:77;39117:1;39110:88;39217:4;39214:1;39207:15;39241:4;39238:1;39231:15;39258:180;39306:77;39303:1;39296:88;39403:4;39400:1;39393:15;39427:4;39424:1;39417:15;39444:117;39553:1;39550;39543:12;39567:117;39676:1;39673;39666:12;39690:117;39799:1;39796;39789:12;39813:117;39922:1;39919;39912:12;39936:117;40045:1;40042;40035:12;40059:117;40168:1;40165;40158:12;40182:102;40223:6;40274:2;40270:7;40265:2;40258:5;40254:14;40250:28;40240:38;;40182:102;;;:::o;40290:94::-;40323:8;40371:5;40367:2;40363:14;40342:35;;40290:94;;;:::o;40390:225::-;40530:34;40526:1;40518:6;40514:14;40507:58;40599:8;40594:2;40586:6;40582:15;40575:33;40390:225;:::o;40621:164::-;40761:16;40757:1;40749:6;40745:14;40738:40;40621:164;:::o;40791:181::-;40931:33;40927:1;40919:6;40915:14;40908:57;40791:181;:::o;40978:170::-;41118:22;41114:1;41106:6;41102:14;41095:46;40978:170;:::o;41154:180::-;41294:32;41290:1;41282:6;41278:14;41271:56;41154:180;:::o;41340:155::-;41480:7;41476:1;41468:6;41464:14;41457:31;41340:155;:::o;41501:158::-;41641:10;41637:1;41629:6;41625:14;41618:34;41501:158;:::o;41665:182::-;41805:34;41801:1;41793:6;41789:14;41782:58;41665:182;:::o;41853:114::-;;:::o;41973:166::-;42113:18;42109:1;42101:6;42097:14;42090:42;41973:166;:::o;42145:122::-;42218:24;42236:5;42218:24;:::i;:::-;42211:5;42208:35;42198:63;;42257:1;42254;42247:12;42198:63;42145:122;:::o;42273:116::-;42343:21;42358:5;42343:21;:::i;:::-;42336:5;42333:32;42323:60;;42379:1;42376;42369:12;42323:60;42273:116;:::o;42395:122::-;42468:24;42486:5;42468:24;:::i;:::-;42461:5;42458:35;42448:63;;42507:1;42504;42497:12;42448:63;42395:122;:::o;42523:120::-;42595:23;42612:5;42595:23;:::i;:::-;42588:5;42585:34;42575:62;;42633:1;42630;42623:12;42575:62;42523:120;:::o;42649:122::-;42722:24;42740:5;42722:24;:::i;:::-;42715:5;42712:35;42702:63;;42761:1;42758;42751:12;42702:63;42649:122;:::o
Swarm Source
ipfs://891099e21958f505eb9ed00d631960184d784e2538b71044d07852bce4d7c7c9
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.