Feature Tip: Add private address tag to any address under My Name Tag !
Overview
TokenID
23004
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Frontiers
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-06 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // 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/Frontiers.sol pragma solidity ^0.8.4; contract Frontiers is ERC721AQueryable, Ownable { string metadataPath = "https://universe.theblinkless.com/frontiersjson/"; mapping(uint256 => string) public tokenList; // tokenid => "[planetid]-[parcelid]"; mapping(uint256 => uint256) public planetParcelCounts; // planetid => # of parcels address payoutWallet = 0xeD2faa60373eC70E57B39152aeE5Ce4ed7C333c7; //wallet for payouts address optixReceiver = 0xB818B1BbF47fC499B621f6807d61a61046C6478f; // wallet to receive optix address bigBangContract = 0x12bE473a9299B29a1E22c0893695254a97dEa07f; //big bang contract address address optixContract = 0xa93fce39D926527Af68B8520FB55e2f74D9201b5; // optix contract address uint256 optixMintPrice = 5000 ether; uint256 currentlyMinting = 0; bytes32 root = 0x14a5ea8f1752b06b4aa9292e0c381cb9fbf293d53f033935235cae2ef6e7ae2d; constructor() ERC721A("The Blinkless: Frontiers", "BLNKFR") {} /* * Verifies the parcel count supplied from metadata is accurate */ function verifyParcelCount(bytes32[] memory proof, bytes32 leaf) public view returns (bool){ return MerkleProof.verify(proof,root,leaf); } function mint(uint256 quantity, uint256 pt, uint256 pl, bytes32[] memory proof, bytes32 leaf) external payable { //ensure minting is enabled require(currentlyMinting == 1, "Mint disabled."); //check planet ownership require(IERC721A(bigBangContract).ownerOf(pt) == msg.sender, "You can only split a planet you own."); //check pl require(verifyParcelCount(proof,leaf), "Parcel count does not match!"); //check parcels require(quantity + planetParcelCounts[pt] <= pl, "Not enough parcels to fill split order."); //transfer optix for mint (must have approval already!) IERC20(optixContract).transferFrom(msg.sender,address(optixReceiver),optixMintPrice * quantity); //connect parcel info to token ids //loop is bounded by max parcel count in big bang uint currentParcel = planetParcelCounts[pt]; uint i = 0; while(i < quantity){ uint256 thisTokenId = _nextTokenId() + i; tokenList[thisTokenId] = string.concat(Strings.toString(pt), "/",Strings.toString(currentParcel+1)); currentParcel++; i++; } //track parcel count for this planet planetParcelCounts[pt] += quantity; // mint the tokens _mint(msg.sender, quantity); } /** * Return metadata path */ function tokenURI(uint tokenId) override(ERC721A,IERC721A) public view returns(string memory _uri){ return string.concat(metadataPath,tokenList[tokenId],".json"); } /** * Update the optix mint price per parcel */ function updateOptixMintPrice(uint256 _price) public onlyOwner{ optixMintPrice = _price; } /** * Update the metadata path */ function updateMetadataPath(string memory _path) public onlyOwner{ metadataPath = _path; } /** * Update the big bang address */ function updateBigBangContract(address _contract) public onlyOwner{ bigBangContract = _contract; } /** * Update the optix address */ function updateOptixContract(address _contract) public onlyOwner{ optixContract = _contract; } /** * Update the optix receiver address */ function updateOptixReceiver(address _address) public onlyOwner{ optixReceiver = _address; } /** * Update the mint status */ function updateCurrentlyMinting(uint256 _status) public onlyOwner{ currentlyMinting = _status; } /** * Update the merkle root */ function updateRoot(bytes32 _root) public onlyOwner{ root = _root; } /** * 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":"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":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"pt","type":"uint256"},{"internalType":"uint256","name":"pl","type":"uint256"},{"internalType":"bytes32[]","name":"proof","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":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"planetParcelCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenList","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"address","name":"_contract","type":"address"}],"name":"updateBigBangContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_status","type":"uint256"}],"name":"updateCurrentlyMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_path","type":"string"}],"name":"updateMetadataPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"updateOptixContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateOptixMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateOptixReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_payoutWallet","type":"address"}],"name":"updatePayoutWallet","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":"verifyParcelCount","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
60806040526040518060600160405280603081526020016200474260309139600990816200002e9190620005e6565b5073ed2faa60373ec70e57b39152aee5ce4ed7c333c7600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b818b1bbf47fc499b621f6807d61a61046c6478f600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507312be473a9299b29a1e22c0893695254a97dea07f600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a93fce39d926527af68b8520fb55e2f74d9201b5600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555069010f0cf064dd5920000060105560006011557f14a5ea8f1752b06b4aa9292e0c381cb9fbf293d53f033935235cae2ef6e7ae2d60001b601255348015620001ca57600080fd5b506040518060400160405280601881526020017f54686520426c696e6b6c6573733a2046726f6e746965727300000000000000008152506040518060400160405280600681526020017f424c4e4b465200000000000000000000000000000000000000000000000000008152508160029081620002489190620005e6565b5080600390816200025a9190620005e6565b506200026b6200029960201b60201c565b600081905550505062000293620002876200029e60201b60201c565b620002a660201b60201c565b620006cd565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003ee57607f821691505b602082108103620004045762000403620003a6565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200046e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200042f565b6200047a86836200042f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004c7620004c1620004bb8462000492565b6200049c565b62000492565b9050919050565b6000819050919050565b620004e383620004a6565b620004fb620004f282620004ce565b8484546200043c565b825550505050565b600090565b6200051262000503565b6200051f818484620004d8565b505050565b5b8181101562000547576200053b60008262000508565b60018101905062000525565b5050565b601f821115620005965762000560816200040a565b6200056b846200041f565b810160208510156200057b578190505b620005936200058a856200041f565b83018262000524565b50505b505050565b600082821c905092915050565b6000620005bb600019846008026200059b565b1980831691505092915050565b6000620005d68383620005a8565b9150826002028217905092915050565b620005f1826200036c565b67ffffffffffffffff8111156200060d576200060c62000377565b5b620006198254620003d5565b620006268282856200054b565b600060209050601f8311600181146200065e576000841562000649578287015190505b620006558582620005c8565b865550620006c5565b601f1984166200066e866200040a565b60005b82811015620006985784890151825560018201915060208501945060208101905062000671565b86831015620006b85784890151620006b4601f891682620005a8565b8355505b6001600288020188555050505b505050505050565b61406580620006dd6000396000f3fe6080604052600436106101fd5760003560e01c80638462151c1161010d578063b88d4fde116100a0578063ca3f3e161161006f578063ca3f3e161461074b578063df8f519f14610774578063e6dbbac31461079d578063e985e9c5146107b9578063f2fde38b146107f657610204565b8063b88d4fde1461068c578063c23dc68f146106a8578063c7f01273146106e5578063c87b56dd1461070e57610204565b806399a2557a116100dc57806399a2557a146105c05780639ead7222146105fd578063a1ad4f401461063a578063a22cb4651461066357610204565b80638462151c146104f05780638da5cb5b1461052d578063913432121461055857806395d89b411461059557610204565b80633ccfd60b116101905780635c3d25ca1161015f5780635c3d25ca1461040d5780636352211e1461043657806370a0823114610473578063715018a6146104b05780637b46626c146104c757610204565b80633ccfd60b1461037457806342842e0e1461038b57806355d5204c146103a75780635bbb2177146103d057610204565b806318160ddd116101cc57806318160ddd146102c757806321ff9970146102f257806323b872dd1461031b5780633886070b1461033757610204565b806301ffc9a71461020657806306fdde0314610243578063081812fc1461026e578063095ea7b3146102ab57610204565b3661020457005b005b34801561021257600080fd5b5061022d6004803603810190610228919061288f565b61081f565b60405161023a91906128d7565b60405180910390f35b34801561024f57600080fd5b506102586108b1565b6040516102659190612982565b60405180910390f35b34801561027a57600080fd5b50610295600480360381019061029091906129da565b610943565b6040516102a29190612a48565b60405180910390f35b6102c560048036038101906102c09190612a8f565b6109c2565b005b3480156102d357600080fd5b506102dc610b06565b6040516102e99190612ade565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190612b2f565b610b1d565b005b61033560048036038101906103309190612b5c565b610b2f565b005b34801561034357600080fd5b5061035e600480360381019061035991906129da565b610e51565b60405161036b9190612ade565b60405180910390f35b34801561038057600080fd5b50610389610e69565b005b6103a560048036038101906103a09190612b5c565b610f59565b005b3480156103b357600080fd5b506103ce60048036038101906103c99190612ce4565b610f79565b005b3480156103dc57600080fd5b506103f760048036038101906103f29190612d8d565b610f94565b6040516104049190612f3d565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f9190612f5f565b611057565b005b34801561044257600080fd5b5061045d600480360381019061045891906129da565b6110a3565b60405161046a9190612a48565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190612f5f565b6110b5565b6040516104a79190612ade565b60405180910390f35b3480156104bc57600080fd5b506104c561116d565b005b3480156104d357600080fd5b506104ee60048036038101906104e991906129da565b611181565b005b3480156104fc57600080fd5b5061051760048036038101906105129190612f5f565b611193565b604051610524919061304a565b60405180910390f35b34801561053957600080fd5b506105426112d6565b60405161054f9190612a48565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a919061312f565b611300565b60405161058c91906128d7565b60405180910390f35b3480156105a157600080fd5b506105aa611317565b6040516105b79190612982565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e2919061318b565b6113a9565b6040516105f4919061304a565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f91906129da565b6115b5565b6040516106319190612982565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c91906129da565b611655565b005b34801561066f57600080fd5b5061068a6004803603810190610685919061320a565b611667565b005b6106a660048036038101906106a191906132eb565b611772565b005b3480156106b457600080fd5b506106cf60048036038101906106ca91906129da565b6117e5565b6040516106dc91906133c3565b60405180910390f35b3480156106f157600080fd5b5061070c60048036038101906107079190612f5f565b61184f565b005b34801561071a57600080fd5b50610735600480360381019061073091906129da565b61189b565b6040516107429190612982565b60405180910390f35b34801561075757600080fd5b50610772600480360381019061076d9190612f5f565b6118d9565b005b34801561078057600080fd5b5061079b60048036038101906107969190612f5f565b611925565b005b6107b760048036038101906107b291906133de565b611971565b005b3480156107c557600080fd5b506107e060048036038101906107db9190613475565b611d32565b6040516107ed91906128d7565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190612f5f565b611dc6565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108aa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108c0906134e4565b80601f01602080910402602001604051908101604052809291908181526020018280546108ec906134e4565b80156109395780601f1061090e57610100808354040283529160200191610939565b820191906000526020600020905b81548152906001019060200180831161091c57829003601f168201915b5050505050905090565b600061094e82611e49565b610984576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109cd826110a3565b90508073ffffffffffffffffffffffffffffffffffffffff166109ee611ea8565b73ffffffffffffffffffffffffffffffffffffffff1614610a5157610a1a81610a15611ea8565b611d32565b610a50576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610b10611eb0565b6001546000540303905090565b610b25611eb5565b8060128190555050565b6000610b3a82611f33565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ba1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610bad84611fff565b91509150610bc38187610bbe611ea8565b612026565b610c0f57610bd886610bd3611ea8565b611d32565b610c0e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610c75576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c82868686600161206a565b8015610c8d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d5b85610d37888887612070565b7c020000000000000000000000000000000000000000000000000000000017612098565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610de15760006001850190506000600460008381526020019081526020016000205403610ddf576000548114610dde578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e4986868660016120c3565b505050505050565b600b6020528060005260406000206000915090505481565b610e71611eb5565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1631604051610ed090613546565b60006040518083038185875af1925050503d8060008114610f0d576040519150601f19603f3d011682016040523d82523d6000602084013e610f12565b606091505b5050905080610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d906135a7565b60405180910390fd5b50565b610f7483838360405180602001604052806000815250611772565b505050565b610f81611eb5565b8060099081610f909190613773565b5050565b6060600083839050905060008167ffffffffffffffff811115610fba57610fb9612bb9565b5b604051908082528060200260200182016040528015610ff357816020015b610fe06127d4565b815260200190600190039081610fd85790505b50905060005b82811461104b5761102286868381811061101657611015613845565b5b905060200201356117e5565b82828151811061103557611034613845565b5b6020026020010181905250806001019050610ff9565b50809250505092915050565b61105f611eb5565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006110ae82611f33565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361111c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611175611eb5565b61117f60006120c9565b565b611189611eb5565b8060118190555050565b606060008060006111a3856110b5565b905060008167ffffffffffffffff8111156111c1576111c0612bb9565b5b6040519080825280602002602001820160405280156111ef5781602001602082028036833780820191505090505b5090506111fa6127d4565b6000611204611eb0565b90505b8386146112c8576112178161218f565b915081604001516112bd57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461126257816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036112bc57808387806001019850815181106112af576112ae613845565b5b6020026020010181815250505b5b806001019050611207565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061130f83601254846121ba565b905092915050565b606060038054611326906134e4565b80601f0160208091040260200160405190810160405280929190818152602001828054611352906134e4565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b5050505050905090565b60608183106113e4576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806113ef6121d1565b90506113f9611eb0565b85101561140b57611408611eb0565b94505b80841115611417578093505b6000611422876110b5565b90508486101561144557600086860390508181101561143f578091505b5061144a565b600090505b60008167ffffffffffffffff81111561146657611465612bb9565b5b6040519080825280602002602001820160405280156114945781602001602082028036833780820191505090505b509050600082036114ab57809450505050506115ae565b60006114b6886117e5565b9050600081604001516114cb57816000015190505b60008990505b8881141580156114e15750848714155b156115a0576114ef8161218f565b9250826040015161159557600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461153a57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611594578084888060010199508151811061158757611586613845565b5b6020026020010181815250505b5b8060010190506114d1565b508583528296505050505050505b9392505050565b600a60205280600052604060002060009150905080546115d4906134e4565b80601f0160208091040260200160405190810160405280929190818152602001828054611600906134e4565b801561164d5780601f106116225761010080835404028352916020019161164d565b820191906000526020600020905b81548152906001019060200180831161163057829003601f168201915b505050505081565b61165d611eb5565b8060108190555050565b8060076000611674611ea8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611721611ea8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161176691906128d7565b60405180910390a35050565b61177d848484610b2f565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117df576117a8848484846121da565b6117de576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6117ed6127d4565b6117f56127d4565b6117fd611eb0565b831080611811575061180d6121d1565b8310155b1561181f578091505061184a565b6118288361218f565b905080604001511561183d578091505061184a565b6118468361232a565b9150505b919050565b611857611eb5565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606009600a60008481526020019081526020016000206040516020016118c3929190613928565b6040516020818303038152906040529050919050565b6118e1611eb5565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61192d611eb5565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001601154146119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad906139a7565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b8152600401611a289190612ade565b602060405180830381865afa158015611a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6991906139dc565b73ffffffffffffffffffffffffffffffffffffffff1614611abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab690613a7b565b60405180910390fd5b611ac98282611300565b611b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aff90613ae7565b60405180910390fd5b82600b60008681526020019081526020016000205486611b289190613b36565b1115611b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6090613bdc565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688601054611bd99190613bfc565b6040518463ffffffff1660e01b8152600401611bf793929190613c3e565b6020604051808303816000875af1158015611c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3a9190613c8a565b506000600b600086815260200190815260200160002054905060005b86811015611cf557600081611c696121d1565b611c739190613b36565b9050611c7e8761234a565b611c93600185611c8e9190613b36565b61234a565b604051602001611ca4929190613d0e565b604051602081830303815290604052600a60008381526020019081526020016000209081611cd29190613773565b508280611cde90613d41565b9350508180611cec90613d41565b92505050611c56565b86600b60008881526020019081526020016000206000828254611d189190613b36565b92505081905550611d2933886124aa565b50505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611dce611eb5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3490613dfb565b60405180910390fd5b611e46816120c9565b50565b600081611e54611eb0565b11158015611e63575060005482105b8015611ea1575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b611ebd612665565b73ffffffffffffffffffffffffffffffffffffffff16611edb6112d6565b73ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2890613e67565b60405180910390fd5b565b60008082905080611f42611eb0565b11611fc857600054811015611fc75760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611fc5575b60008103611fbb576004600083600190039350838152602001908152602001600020549050611f91565b8092505050611ffa565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861208786868461266d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121976127d4565b6121b36004600084815260200190815260200160002054612676565b9050919050565b6000826121c7858461272c565b1490509392505050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612200611ea8565b8786866040518563ffffffff1660e01b81526004016122229493929190613edc565b6020604051808303816000875af192505050801561225e57506040513d601f19601f8201168201806040525081019061225b9190613f3d565b60015b6122d7573d806000811461228e576040519150601f19603f3d011682016040523d82523d6000602084013e612293565b606091505b5060008151036122cf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6123326127d4565b61234361233e83611f33565b612676565b9050919050565b606060008203612391576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124a5565b600082905060005b600082146123c35780806123ac90613d41565b915050600a826123bc9190613f99565b9150612399565b60008167ffffffffffffffff8111156123df576123de612bb9565b5b6040519080825280601f01601f1916602001820160405280156124115781602001600182028036833780820191505090505b5090505b6000851461249e5760018261242a9190613fca565b9150600a856124399190613ffe565b60306124459190613b36565b60f81b81838151811061245b5761245a613845565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124979190613f99565b9450612415565b8093505050505b919050565b600080549050600082036124ea576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124f7600084838561206a565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061256e8361255f6000866000612070565b61256885612782565b17612098565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461260f57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125d4565b506000820361264a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061266060008483856120c3565b505050565b600033905090565b60009392505050565b61267e6127d4565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008082905060005b8451811015612777576127628286838151811061275557612754613845565b5b6020026020010151612792565b9150808061276f90613d41565b915050612735565b508091505092915050565b60006001821460e11b9050919050565b60008183106127aa576127a582846127bd565b6127b5565b6127b483836127bd565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61286c81612837565b811461287757600080fd5b50565b60008135905061288981612863565b92915050565b6000602082840312156128a5576128a461282d565b5b60006128b38482850161287a565b91505092915050565b60008115159050919050565b6128d1816128bc565b82525050565b60006020820190506128ec60008301846128c8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561292c578082015181840152602081019050612911565b60008484015250505050565b6000601f19601f8301169050919050565b6000612954826128f2565b61295e81856128fd565b935061296e81856020860161290e565b61297781612938565b840191505092915050565b6000602082019050818103600083015261299c8184612949565b905092915050565b6000819050919050565b6129b7816129a4565b81146129c257600080fd5b50565b6000813590506129d4816129ae565b92915050565b6000602082840312156129f0576129ef61282d565b5b60006129fe848285016129c5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a3282612a07565b9050919050565b612a4281612a27565b82525050565b6000602082019050612a5d6000830184612a39565b92915050565b612a6c81612a27565b8114612a7757600080fd5b50565b600081359050612a8981612a63565b92915050565b60008060408385031215612aa657612aa561282d565b5b6000612ab485828601612a7a565b9250506020612ac5858286016129c5565b9150509250929050565b612ad8816129a4565b82525050565b6000602082019050612af36000830184612acf565b92915050565b6000819050919050565b612b0c81612af9565b8114612b1757600080fd5b50565b600081359050612b2981612b03565b92915050565b600060208284031215612b4557612b4461282d565b5b6000612b5384828501612b1a565b91505092915050565b600080600060608486031215612b7557612b7461282d565b5b6000612b8386828701612a7a565b9350506020612b9486828701612a7a565b9250506040612ba5868287016129c5565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612bf182612938565b810181811067ffffffffffffffff82111715612c1057612c0f612bb9565b5b80604052505050565b6000612c23612823565b9050612c2f8282612be8565b919050565b600067ffffffffffffffff821115612c4f57612c4e612bb9565b5b612c5882612938565b9050602081019050919050565b82818337600083830152505050565b6000612c87612c8284612c34565b612c19565b905082815260208101848484011115612ca357612ca2612bb4565b5b612cae848285612c65565b509392505050565b600082601f830112612ccb57612cca612baf565b5b8135612cdb848260208601612c74565b91505092915050565b600060208284031215612cfa57612cf961282d565b5b600082013567ffffffffffffffff811115612d1857612d17612832565b5b612d2484828501612cb6565b91505092915050565b600080fd5b600080fd5b60008083601f840112612d4d57612d4c612baf565b5b8235905067ffffffffffffffff811115612d6a57612d69612d2d565b5b602083019150836020820283011115612d8657612d85612d32565b5b9250929050565b60008060208385031215612da457612da361282d565b5b600083013567ffffffffffffffff811115612dc257612dc1612832565b5b612dce85828601612d37565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e0f81612a27565b82525050565b600067ffffffffffffffff82169050919050565b612e3281612e15565b82525050565b612e41816128bc565b82525050565b600062ffffff82169050919050565b612e5f81612e47565b82525050565b608082016000820151612e7b6000850182612e06565b506020820151612e8e6020850182612e29565b506040820151612ea16040850182612e38565b506060820151612eb46060850182612e56565b50505050565b6000612ec68383612e65565b60808301905092915050565b6000602082019050919050565b6000612eea82612dda565b612ef48185612de5565b9350612eff83612df6565b8060005b83811015612f30578151612f178882612eba565b9750612f2283612ed2565b925050600181019050612f03565b5085935050505092915050565b60006020820190508181036000830152612f578184612edf565b905092915050565b600060208284031215612f7557612f7461282d565b5b6000612f8384828501612a7a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612fc1816129a4565b82525050565b6000612fd38383612fb8565b60208301905092915050565b6000602082019050919050565b6000612ff782612f8c565b6130018185612f97565b935061300c83612fa8565b8060005b8381101561303d5781516130248882612fc7565b975061302f83612fdf565b925050600181019050613010565b5085935050505092915050565b600060208201905081810360008301526130648184612fec565b905092915050565b600067ffffffffffffffff82111561308757613086612bb9565b5b602082029050602081019050919050565b60006130ab6130a68461306c565b612c19565b905080838252602082019050602084028301858111156130ce576130cd612d32565b5b835b818110156130f757806130e38882612b1a565b8452602084019350506020810190506130d0565b5050509392505050565b600082601f83011261311657613115612baf565b5b8135613126848260208601613098565b91505092915050565b600080604083850312156131465761314561282d565b5b600083013567ffffffffffffffff81111561316457613163612832565b5b61317085828601613101565b925050602061318185828601612b1a565b9150509250929050565b6000806000606084860312156131a4576131a361282d565b5b60006131b286828701612a7a565b93505060206131c3868287016129c5565b92505060406131d4868287016129c5565b9150509250925092565b6131e7816128bc565b81146131f257600080fd5b50565b600081359050613204816131de565b92915050565b600080604083850312156132215761322061282d565b5b600061322f85828601612a7a565b9250506020613240858286016131f5565b9150509250929050565b600067ffffffffffffffff82111561326557613264612bb9565b5b61326e82612938565b9050602081019050919050565b600061328e6132898461324a565b612c19565b9050828152602081018484840111156132aa576132a9612bb4565b5b6132b5848285612c65565b509392505050565b600082601f8301126132d2576132d1612baf565b5b81356132e284826020860161327b565b91505092915050565b600080600080608085870312156133055761330461282d565b5b600061331387828801612a7a565b945050602061332487828801612a7a565b9350506040613335878288016129c5565b925050606085013567ffffffffffffffff81111561335657613355612832565b5b613362878288016132bd565b91505092959194509250565b6080820160008201516133846000850182612e06565b5060208201516133976020850182612e29565b5060408201516133aa6040850182612e38565b5060608201516133bd6060850182612e56565b50505050565b60006080820190506133d8600083018461336e565b92915050565b600080600080600060a086880312156133fa576133f961282d565b5b6000613408888289016129c5565b9550506020613419888289016129c5565b945050604061342a888289016129c5565b935050606086013567ffffffffffffffff81111561344b5761344a612832565b5b61345788828901613101565b925050608061346888828901612b1a565b9150509295509295909350565b6000806040838503121561348c5761348b61282d565b5b600061349a85828601612a7a565b92505060206134ab85828601612a7a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806134fc57607f821691505b60208210810361350f5761350e6134b5565b5b50919050565b600081905092915050565b50565b6000613530600083613515565b915061353b82613520565b600082019050919050565b600061355182613523565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006135916010836128fd565b915061359c8261355b565b602082019050919050565b600060208201905081810360008301526135c081613584565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135ec565b61363386836135ec565b95508019841693508086168417925050509392505050565b6000819050919050565b600061367061366b613666846129a4565b61364b565b6129a4565b9050919050565b6000819050919050565b61368a83613655565b61369e61369682613677565b8484546135f9565b825550505050565b600090565b6136b36136a6565b6136be818484613681565b505050565b5b818110156136e2576136d76000826136ab565b6001810190506136c4565b5050565b601f821115613727576136f8816135c7565b613701846135dc565b81016020851015613710578190505b61372461371c856135dc565b8301826136c3565b50505b505050565b600082821c905092915050565b600061374a6000198460080261372c565b1980831691505092915050565b60006137638383613739565b9150826002028217905092915050565b61377c826128f2565b67ffffffffffffffff81111561379557613794612bb9565b5b61379f82546134e4565b6137aa8282856136e6565b600060209050601f8311600181146137dd57600084156137cb578287015190505b6137d58582613757565b86555061383d565b601f1984166137eb866135c7565b60005b82811015613813578489015182556001820191506020850194506020810190506137ee565b86831015613830578489015161382c601f891682613739565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b6000815461388c816134e4565b6138968186613874565b945060018216600081146138b157600181146138c6576138f9565b60ff19831686528115158202860193506138f9565b6138cf856135c7565b60005b838110156138f1578154818901526001820191506020810190506138d2565b838801955050505b50505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b6000613934828561387f565b9150613940828461387f565b915061394b82613902565b6005820191508190509392505050565b7f4d696e742064697361626c65642e000000000000000000000000000000000000600082015250565b6000613991600e836128fd565b915061399c8261395b565b602082019050919050565b600060208201905081810360008301526139c081613984565b9050919050565b6000815190506139d681612a63565b92915050565b6000602082840312156139f2576139f161282d565b5b6000613a00848285016139c7565b91505092915050565b7f596f752063616e206f6e6c792073706c6974206120706c616e657420796f752060008201527f6f776e2e00000000000000000000000000000000000000000000000000000000602082015250565b6000613a656024836128fd565b9150613a7082613a09565b604082019050919050565b60006020820190508181036000830152613a9481613a58565b9050919050565b7f50617263656c20636f756e7420646f6573206e6f74206d617463682100000000600082015250565b6000613ad1601c836128fd565b9150613adc82613a9b565b602082019050919050565b60006020820190508181036000830152613b0081613ac4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b41826129a4565b9150613b4c836129a4565b9250828201905080821115613b6457613b63613b07565b5b92915050565b7f4e6f7420656e6f7567682070617263656c7320746f2066696c6c2073706c697460008201527f206f726465722e00000000000000000000000000000000000000000000000000602082015250565b6000613bc66027836128fd565b9150613bd182613b6a565b604082019050919050565b60006020820190508181036000830152613bf581613bb9565b9050919050565b6000613c07826129a4565b9150613c12836129a4565b9250828202613c20816129a4565b91508282048414831517613c3757613c36613b07565b5b5092915050565b6000606082019050613c536000830186612a39565b613c606020830185612a39565b613c6d6040830184612acf565b949350505050565b600081519050613c84816131de565b92915050565b600060208284031215613ca057613c9f61282d565b5b6000613cae84828501613c75565b91505092915050565b6000613cc2826128f2565b613ccc8185613874565b9350613cdc81856020860161290e565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000815250565b6000613d1a8285613cb7565b9150613d2582613ce8565b600182019150613d358284613cb7565b91508190509392505050565b6000613d4c826129a4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d7e57613d7d613b07565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613de56026836128fd565b9150613df082613d89565b604082019050919050565b60006020820190508181036000830152613e1481613dd8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e516020836128fd565b9150613e5c82613e1b565b602082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613eae82613e87565b613eb88185613e92565b9350613ec881856020860161290e565b613ed181612938565b840191505092915050565b6000608082019050613ef16000830187612a39565b613efe6020830186612a39565b613f0b6040830185612acf565b8181036060830152613f1d8184613ea3565b905095945050505050565b600081519050613f3781612863565b92915050565b600060208284031215613f5357613f5261282d565b5b6000613f6184828501613f28565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fa4826129a4565b9150613faf836129a4565b925082613fbf57613fbe613f6a565b5b828204905092915050565b6000613fd5826129a4565b9150613fe0836129a4565b9250828203905081811115613ff857613ff7613b07565b5b92915050565b6000614009826129a4565b9150614014836129a4565b92508261402457614023613f6a565b5b82820690509291505056fea2646970667358221220066aaaaf2587b1dd2a0885053653ec957983c45f4cba787790a06471dbe1f8bc64736f6c6343000811003368747470733a2f2f756e6976657273652e746865626c696e6b6c6573732e636f6d2f66726f6e74696572736a736f6e2f
Deployed Bytecode
0x6080604052600436106101fd5760003560e01c80638462151c1161010d578063b88d4fde116100a0578063ca3f3e161161006f578063ca3f3e161461074b578063df8f519f14610774578063e6dbbac31461079d578063e985e9c5146107b9578063f2fde38b146107f657610204565b8063b88d4fde1461068c578063c23dc68f146106a8578063c7f01273146106e5578063c87b56dd1461070e57610204565b806399a2557a116100dc57806399a2557a146105c05780639ead7222146105fd578063a1ad4f401461063a578063a22cb4651461066357610204565b80638462151c146104f05780638da5cb5b1461052d578063913432121461055857806395d89b411461059557610204565b80633ccfd60b116101905780635c3d25ca1161015f5780635c3d25ca1461040d5780636352211e1461043657806370a0823114610473578063715018a6146104b05780637b46626c146104c757610204565b80633ccfd60b1461037457806342842e0e1461038b57806355d5204c146103a75780635bbb2177146103d057610204565b806318160ddd116101cc57806318160ddd146102c757806321ff9970146102f257806323b872dd1461031b5780633886070b1461033757610204565b806301ffc9a71461020657806306fdde0314610243578063081812fc1461026e578063095ea7b3146102ab57610204565b3661020457005b005b34801561021257600080fd5b5061022d6004803603810190610228919061288f565b61081f565b60405161023a91906128d7565b60405180910390f35b34801561024f57600080fd5b506102586108b1565b6040516102659190612982565b60405180910390f35b34801561027a57600080fd5b50610295600480360381019061029091906129da565b610943565b6040516102a29190612a48565b60405180910390f35b6102c560048036038101906102c09190612a8f565b6109c2565b005b3480156102d357600080fd5b506102dc610b06565b6040516102e99190612ade565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190612b2f565b610b1d565b005b61033560048036038101906103309190612b5c565b610b2f565b005b34801561034357600080fd5b5061035e600480360381019061035991906129da565b610e51565b60405161036b9190612ade565b60405180910390f35b34801561038057600080fd5b50610389610e69565b005b6103a560048036038101906103a09190612b5c565b610f59565b005b3480156103b357600080fd5b506103ce60048036038101906103c99190612ce4565b610f79565b005b3480156103dc57600080fd5b506103f760048036038101906103f29190612d8d565b610f94565b6040516104049190612f3d565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f9190612f5f565b611057565b005b34801561044257600080fd5b5061045d600480360381019061045891906129da565b6110a3565b60405161046a9190612a48565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190612f5f565b6110b5565b6040516104a79190612ade565b60405180910390f35b3480156104bc57600080fd5b506104c561116d565b005b3480156104d357600080fd5b506104ee60048036038101906104e991906129da565b611181565b005b3480156104fc57600080fd5b5061051760048036038101906105129190612f5f565b611193565b604051610524919061304a565b60405180910390f35b34801561053957600080fd5b506105426112d6565b60405161054f9190612a48565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a919061312f565b611300565b60405161058c91906128d7565b60405180910390f35b3480156105a157600080fd5b506105aa611317565b6040516105b79190612982565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e2919061318b565b6113a9565b6040516105f4919061304a565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f91906129da565b6115b5565b6040516106319190612982565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c91906129da565b611655565b005b34801561066f57600080fd5b5061068a6004803603810190610685919061320a565b611667565b005b6106a660048036038101906106a191906132eb565b611772565b005b3480156106b457600080fd5b506106cf60048036038101906106ca91906129da565b6117e5565b6040516106dc91906133c3565b60405180910390f35b3480156106f157600080fd5b5061070c60048036038101906107079190612f5f565b61184f565b005b34801561071a57600080fd5b50610735600480360381019061073091906129da565b61189b565b6040516107429190612982565b60405180910390f35b34801561075757600080fd5b50610772600480360381019061076d9190612f5f565b6118d9565b005b34801561078057600080fd5b5061079b60048036038101906107969190612f5f565b611925565b005b6107b760048036038101906107b291906133de565b611971565b005b3480156107c557600080fd5b506107e060048036038101906107db9190613475565b611d32565b6040516107ed91906128d7565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190612f5f565b611dc6565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108aa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108c0906134e4565b80601f01602080910402602001604051908101604052809291908181526020018280546108ec906134e4565b80156109395780601f1061090e57610100808354040283529160200191610939565b820191906000526020600020905b81548152906001019060200180831161091c57829003601f168201915b5050505050905090565b600061094e82611e49565b610984576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109cd826110a3565b90508073ffffffffffffffffffffffffffffffffffffffff166109ee611ea8565b73ffffffffffffffffffffffffffffffffffffffff1614610a5157610a1a81610a15611ea8565b611d32565b610a50576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610b10611eb0565b6001546000540303905090565b610b25611eb5565b8060128190555050565b6000610b3a82611f33565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ba1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610bad84611fff565b91509150610bc38187610bbe611ea8565b612026565b610c0f57610bd886610bd3611ea8565b611d32565b610c0e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610c75576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c82868686600161206a565b8015610c8d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d5b85610d37888887612070565b7c020000000000000000000000000000000000000000000000000000000017612098565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610de15760006001850190506000600460008381526020019081526020016000205403610ddf576000548114610dde578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e4986868660016120c3565b505050505050565b600b6020528060005260406000206000915090505481565b610e71611eb5565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1631604051610ed090613546565b60006040518083038185875af1925050503d8060008114610f0d576040519150601f19603f3d011682016040523d82523d6000602084013e610f12565b606091505b5050905080610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d906135a7565b60405180910390fd5b50565b610f7483838360405180602001604052806000815250611772565b505050565b610f81611eb5565b8060099081610f909190613773565b5050565b6060600083839050905060008167ffffffffffffffff811115610fba57610fb9612bb9565b5b604051908082528060200260200182016040528015610ff357816020015b610fe06127d4565b815260200190600190039081610fd85790505b50905060005b82811461104b5761102286868381811061101657611015613845565b5b905060200201356117e5565b82828151811061103557611034613845565b5b6020026020010181905250806001019050610ff9565b50809250505092915050565b61105f611eb5565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006110ae82611f33565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361111c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611175611eb5565b61117f60006120c9565b565b611189611eb5565b8060118190555050565b606060008060006111a3856110b5565b905060008167ffffffffffffffff8111156111c1576111c0612bb9565b5b6040519080825280602002602001820160405280156111ef5781602001602082028036833780820191505090505b5090506111fa6127d4565b6000611204611eb0565b90505b8386146112c8576112178161218f565b915081604001516112bd57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461126257816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036112bc57808387806001019850815181106112af576112ae613845565b5b6020026020010181815250505b5b806001019050611207565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061130f83601254846121ba565b905092915050565b606060038054611326906134e4565b80601f0160208091040260200160405190810160405280929190818152602001828054611352906134e4565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b5050505050905090565b60608183106113e4576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806113ef6121d1565b90506113f9611eb0565b85101561140b57611408611eb0565b94505b80841115611417578093505b6000611422876110b5565b90508486101561144557600086860390508181101561143f578091505b5061144a565b600090505b60008167ffffffffffffffff81111561146657611465612bb9565b5b6040519080825280602002602001820160405280156114945781602001602082028036833780820191505090505b509050600082036114ab57809450505050506115ae565b60006114b6886117e5565b9050600081604001516114cb57816000015190505b60008990505b8881141580156114e15750848714155b156115a0576114ef8161218f565b9250826040015161159557600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461153a57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611594578084888060010199508151811061158757611586613845565b5b6020026020010181815250505b5b8060010190506114d1565b508583528296505050505050505b9392505050565b600a60205280600052604060002060009150905080546115d4906134e4565b80601f0160208091040260200160405190810160405280929190818152602001828054611600906134e4565b801561164d5780601f106116225761010080835404028352916020019161164d565b820191906000526020600020905b81548152906001019060200180831161163057829003601f168201915b505050505081565b61165d611eb5565b8060108190555050565b8060076000611674611ea8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611721611ea8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161176691906128d7565b60405180910390a35050565b61177d848484610b2f565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117df576117a8848484846121da565b6117de576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6117ed6127d4565b6117f56127d4565b6117fd611eb0565b831080611811575061180d6121d1565b8310155b1561181f578091505061184a565b6118288361218f565b905080604001511561183d578091505061184a565b6118468361232a565b9150505b919050565b611857611eb5565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606009600a60008481526020019081526020016000206040516020016118c3929190613928565b6040516020818303038152906040529050919050565b6118e1611eb5565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61192d611eb5565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001601154146119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad906139a7565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b8152600401611a289190612ade565b602060405180830381865afa158015611a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6991906139dc565b73ffffffffffffffffffffffffffffffffffffffff1614611abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab690613a7b565b60405180910390fd5b611ac98282611300565b611b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aff90613ae7565b60405180910390fd5b82600b60008681526020019081526020016000205486611b289190613b36565b1115611b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6090613bdc565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688601054611bd99190613bfc565b6040518463ffffffff1660e01b8152600401611bf793929190613c3e565b6020604051808303816000875af1158015611c16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3a9190613c8a565b506000600b600086815260200190815260200160002054905060005b86811015611cf557600081611c696121d1565b611c739190613b36565b9050611c7e8761234a565b611c93600185611c8e9190613b36565b61234a565b604051602001611ca4929190613d0e565b604051602081830303815290604052600a60008381526020019081526020016000209081611cd29190613773565b508280611cde90613d41565b9350508180611cec90613d41565b92505050611c56565b86600b60008881526020019081526020016000206000828254611d189190613b36565b92505081905550611d2933886124aa565b50505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611dce611eb5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3490613dfb565b60405180910390fd5b611e46816120c9565b50565b600081611e54611eb0565b11158015611e63575060005482105b8015611ea1575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b611ebd612665565b73ffffffffffffffffffffffffffffffffffffffff16611edb6112d6565b73ffffffffffffffffffffffffffffffffffffffff1614611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2890613e67565b60405180910390fd5b565b60008082905080611f42611eb0565b11611fc857600054811015611fc75760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611fc5575b60008103611fbb576004600083600190039350838152602001908152602001600020549050611f91565b8092505050611ffa565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861208786868461266d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121976127d4565b6121b36004600084815260200190815260200160002054612676565b9050919050565b6000826121c7858461272c565b1490509392505050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612200611ea8565b8786866040518563ffffffff1660e01b81526004016122229493929190613edc565b6020604051808303816000875af192505050801561225e57506040513d601f19601f8201168201806040525081019061225b9190613f3d565b60015b6122d7573d806000811461228e576040519150601f19603f3d011682016040523d82523d6000602084013e612293565b606091505b5060008151036122cf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6123326127d4565b61234361233e83611f33565b612676565b9050919050565b606060008203612391576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124a5565b600082905060005b600082146123c35780806123ac90613d41565b915050600a826123bc9190613f99565b9150612399565b60008167ffffffffffffffff8111156123df576123de612bb9565b5b6040519080825280601f01601f1916602001820160405280156124115781602001600182028036833780820191505090505b5090505b6000851461249e5760018261242a9190613fca565b9150600a856124399190613ffe565b60306124459190613b36565b60f81b81838151811061245b5761245a613845565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124979190613f99565b9450612415565b8093505050505b919050565b600080549050600082036124ea576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124f7600084838561206a565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061256e8361255f6000866000612070565b61256885612782565b17612098565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461260f57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125d4565b506000820361264a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061266060008483856120c3565b505050565b600033905090565b60009392505050565b61267e6127d4565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008082905060005b8451811015612777576127628286838151811061275557612754613845565b5b6020026020010151612792565b9150808061276f90613d41565b915050612735565b508091505092915050565b60006001821460e11b9050919050565b60008183106127aa576127a582846127bd565b6127b5565b6127b483836127bd565b5b905092915050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61286c81612837565b811461287757600080fd5b50565b60008135905061288981612863565b92915050565b6000602082840312156128a5576128a461282d565b5b60006128b38482850161287a565b91505092915050565b60008115159050919050565b6128d1816128bc565b82525050565b60006020820190506128ec60008301846128c8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561292c578082015181840152602081019050612911565b60008484015250505050565b6000601f19601f8301169050919050565b6000612954826128f2565b61295e81856128fd565b935061296e81856020860161290e565b61297781612938565b840191505092915050565b6000602082019050818103600083015261299c8184612949565b905092915050565b6000819050919050565b6129b7816129a4565b81146129c257600080fd5b50565b6000813590506129d4816129ae565b92915050565b6000602082840312156129f0576129ef61282d565b5b60006129fe848285016129c5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a3282612a07565b9050919050565b612a4281612a27565b82525050565b6000602082019050612a5d6000830184612a39565b92915050565b612a6c81612a27565b8114612a7757600080fd5b50565b600081359050612a8981612a63565b92915050565b60008060408385031215612aa657612aa561282d565b5b6000612ab485828601612a7a565b9250506020612ac5858286016129c5565b9150509250929050565b612ad8816129a4565b82525050565b6000602082019050612af36000830184612acf565b92915050565b6000819050919050565b612b0c81612af9565b8114612b1757600080fd5b50565b600081359050612b2981612b03565b92915050565b600060208284031215612b4557612b4461282d565b5b6000612b5384828501612b1a565b91505092915050565b600080600060608486031215612b7557612b7461282d565b5b6000612b8386828701612a7a565b9350506020612b9486828701612a7a565b9250506040612ba5868287016129c5565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612bf182612938565b810181811067ffffffffffffffff82111715612c1057612c0f612bb9565b5b80604052505050565b6000612c23612823565b9050612c2f8282612be8565b919050565b600067ffffffffffffffff821115612c4f57612c4e612bb9565b5b612c5882612938565b9050602081019050919050565b82818337600083830152505050565b6000612c87612c8284612c34565b612c19565b905082815260208101848484011115612ca357612ca2612bb4565b5b612cae848285612c65565b509392505050565b600082601f830112612ccb57612cca612baf565b5b8135612cdb848260208601612c74565b91505092915050565b600060208284031215612cfa57612cf961282d565b5b600082013567ffffffffffffffff811115612d1857612d17612832565b5b612d2484828501612cb6565b91505092915050565b600080fd5b600080fd5b60008083601f840112612d4d57612d4c612baf565b5b8235905067ffffffffffffffff811115612d6a57612d69612d2d565b5b602083019150836020820283011115612d8657612d85612d32565b5b9250929050565b60008060208385031215612da457612da361282d565b5b600083013567ffffffffffffffff811115612dc257612dc1612832565b5b612dce85828601612d37565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e0f81612a27565b82525050565b600067ffffffffffffffff82169050919050565b612e3281612e15565b82525050565b612e41816128bc565b82525050565b600062ffffff82169050919050565b612e5f81612e47565b82525050565b608082016000820151612e7b6000850182612e06565b506020820151612e8e6020850182612e29565b506040820151612ea16040850182612e38565b506060820151612eb46060850182612e56565b50505050565b6000612ec68383612e65565b60808301905092915050565b6000602082019050919050565b6000612eea82612dda565b612ef48185612de5565b9350612eff83612df6565b8060005b83811015612f30578151612f178882612eba565b9750612f2283612ed2565b925050600181019050612f03565b5085935050505092915050565b60006020820190508181036000830152612f578184612edf565b905092915050565b600060208284031215612f7557612f7461282d565b5b6000612f8384828501612a7a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612fc1816129a4565b82525050565b6000612fd38383612fb8565b60208301905092915050565b6000602082019050919050565b6000612ff782612f8c565b6130018185612f97565b935061300c83612fa8565b8060005b8381101561303d5781516130248882612fc7565b975061302f83612fdf565b925050600181019050613010565b5085935050505092915050565b600060208201905081810360008301526130648184612fec565b905092915050565b600067ffffffffffffffff82111561308757613086612bb9565b5b602082029050602081019050919050565b60006130ab6130a68461306c565b612c19565b905080838252602082019050602084028301858111156130ce576130cd612d32565b5b835b818110156130f757806130e38882612b1a565b8452602084019350506020810190506130d0565b5050509392505050565b600082601f83011261311657613115612baf565b5b8135613126848260208601613098565b91505092915050565b600080604083850312156131465761314561282d565b5b600083013567ffffffffffffffff81111561316457613163612832565b5b61317085828601613101565b925050602061318185828601612b1a565b9150509250929050565b6000806000606084860312156131a4576131a361282d565b5b60006131b286828701612a7a565b93505060206131c3868287016129c5565b92505060406131d4868287016129c5565b9150509250925092565b6131e7816128bc565b81146131f257600080fd5b50565b600081359050613204816131de565b92915050565b600080604083850312156132215761322061282d565b5b600061322f85828601612a7a565b9250506020613240858286016131f5565b9150509250929050565b600067ffffffffffffffff82111561326557613264612bb9565b5b61326e82612938565b9050602081019050919050565b600061328e6132898461324a565b612c19565b9050828152602081018484840111156132aa576132a9612bb4565b5b6132b5848285612c65565b509392505050565b600082601f8301126132d2576132d1612baf565b5b81356132e284826020860161327b565b91505092915050565b600080600080608085870312156133055761330461282d565b5b600061331387828801612a7a565b945050602061332487828801612a7a565b9350506040613335878288016129c5565b925050606085013567ffffffffffffffff81111561335657613355612832565b5b613362878288016132bd565b91505092959194509250565b6080820160008201516133846000850182612e06565b5060208201516133976020850182612e29565b5060408201516133aa6040850182612e38565b5060608201516133bd6060850182612e56565b50505050565b60006080820190506133d8600083018461336e565b92915050565b600080600080600060a086880312156133fa576133f961282d565b5b6000613408888289016129c5565b9550506020613419888289016129c5565b945050604061342a888289016129c5565b935050606086013567ffffffffffffffff81111561344b5761344a612832565b5b61345788828901613101565b925050608061346888828901612b1a565b9150509295509295909350565b6000806040838503121561348c5761348b61282d565b5b600061349a85828601612a7a565b92505060206134ab85828601612a7a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806134fc57607f821691505b60208210810361350f5761350e6134b5565b5b50919050565b600081905092915050565b50565b6000613530600083613515565b915061353b82613520565b600082019050919050565b600061355182613523565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006135916010836128fd565b915061359c8261355b565b602082019050919050565b600060208201905081810360008301526135c081613584565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135ec565b61363386836135ec565b95508019841693508086168417925050509392505050565b6000819050919050565b600061367061366b613666846129a4565b61364b565b6129a4565b9050919050565b6000819050919050565b61368a83613655565b61369e61369682613677565b8484546135f9565b825550505050565b600090565b6136b36136a6565b6136be818484613681565b505050565b5b818110156136e2576136d76000826136ab565b6001810190506136c4565b5050565b601f821115613727576136f8816135c7565b613701846135dc565b81016020851015613710578190505b61372461371c856135dc565b8301826136c3565b50505b505050565b600082821c905092915050565b600061374a6000198460080261372c565b1980831691505092915050565b60006137638383613739565b9150826002028217905092915050565b61377c826128f2565b67ffffffffffffffff81111561379557613794612bb9565b5b61379f82546134e4565b6137aa8282856136e6565b600060209050601f8311600181146137dd57600084156137cb578287015190505b6137d58582613757565b86555061383d565b601f1984166137eb866135c7565b60005b82811015613813578489015182556001820191506020850194506020810190506137ee565b86831015613830578489015161382c601f891682613739565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b6000815461388c816134e4565b6138968186613874565b945060018216600081146138b157600181146138c6576138f9565b60ff19831686528115158202860193506138f9565b6138cf856135c7565b60005b838110156138f1578154818901526001820191506020810190506138d2565b838801955050505b50505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b6000613934828561387f565b9150613940828461387f565b915061394b82613902565b6005820191508190509392505050565b7f4d696e742064697361626c65642e000000000000000000000000000000000000600082015250565b6000613991600e836128fd565b915061399c8261395b565b602082019050919050565b600060208201905081810360008301526139c081613984565b9050919050565b6000815190506139d681612a63565b92915050565b6000602082840312156139f2576139f161282d565b5b6000613a00848285016139c7565b91505092915050565b7f596f752063616e206f6e6c792073706c6974206120706c616e657420796f752060008201527f6f776e2e00000000000000000000000000000000000000000000000000000000602082015250565b6000613a656024836128fd565b9150613a7082613a09565b604082019050919050565b60006020820190508181036000830152613a9481613a58565b9050919050565b7f50617263656c20636f756e7420646f6573206e6f74206d617463682100000000600082015250565b6000613ad1601c836128fd565b9150613adc82613a9b565b602082019050919050565b60006020820190508181036000830152613b0081613ac4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b41826129a4565b9150613b4c836129a4565b9250828201905080821115613b6457613b63613b07565b5b92915050565b7f4e6f7420656e6f7567682070617263656c7320746f2066696c6c2073706c697460008201527f206f726465722e00000000000000000000000000000000000000000000000000602082015250565b6000613bc66027836128fd565b9150613bd182613b6a565b604082019050919050565b60006020820190508181036000830152613bf581613bb9565b9050919050565b6000613c07826129a4565b9150613c12836129a4565b9250828202613c20816129a4565b91508282048414831517613c3757613c36613b07565b5b5092915050565b6000606082019050613c536000830186612a39565b613c606020830185612a39565b613c6d6040830184612acf565b949350505050565b600081519050613c84816131de565b92915050565b600060208284031215613ca057613c9f61282d565b5b6000613cae84828501613c75565b91505092915050565b6000613cc2826128f2565b613ccc8185613874565b9350613cdc81856020860161290e565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000815250565b6000613d1a8285613cb7565b9150613d2582613ce8565b600182019150613d358284613cb7565b91508190509392505050565b6000613d4c826129a4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d7e57613d7d613b07565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613de56026836128fd565b9150613df082613d89565b604082019050919050565b60006020820190508181036000830152613e1481613dd8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e516020836128fd565b9150613e5c82613e1b565b602082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613eae82613e87565b613eb88185613e92565b9350613ec881856020860161290e565b613ed181612938565b840191505092915050565b6000608082019050613ef16000830187612a39565b613efe6020830186612a39565b613f0b6040830185612acf565b8181036060830152613f1d8184613ea3565b905095945050505050565b600081519050613f3781612863565b92915050565b600060208284031215613f5357613f5261282d565b5b6000613f6184828501613f28565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fa4826129a4565b9150613faf836129a4565b925082613fbf57613fbe613f6a565b5b828204905092915050565b6000613fd5826129a4565b9150613fe0836129a4565b9250828203905081811115613ff857613ff7613b07565b5b92915050565b6000614009826129a4565b9150614014836129a4565b92508261402457614023613f6a565b5b82820690509291505056fea2646970667358221220066aaaaf2587b1dd2a0885053653ec957983c45f4cba787790a06471dbe1f8bc64736f6c63430008110033
Deployed Bytecode Sourcemap
78119:4556:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32493:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33395:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39886:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39319:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29146:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82013:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43525:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78344:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82327:184;;;;;;;;;;;;;:::i;:::-;;46446:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81169:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67171:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82163:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34788:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30330:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77225:103;;;;;;;;;;;;;:::i;:::-;;81847:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71047:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76577:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79148:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33571:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68087:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78255:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81005:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40444:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47237:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66584:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81337:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80754:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81508:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81684:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79308:1392;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40835:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77483:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32493:639;32578:4;32917:10;32902:25;;:11;:25;;;;:102;;;;32994:10;32979:25;;:11;:25;;;;32902:102;:179;;;;33071:10;33056:25;;:11;:25;;;;32902:179;32882:199;;32493:639;;;:::o;33395:100::-;33449:13;33482:5;33475:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33395:100;:::o;39886:218::-;39962:7;39987:16;39995:7;39987;:16::i;:::-;39982:64;;40012:34;;;;;;;;;;;;;;39982:64;40066:15;:24;40082:7;40066:24;;;;;;;;;;;:30;;;;;;;;;;;;40059:37;;39886:218;;;:::o;39319:408::-;39408:13;39424:16;39432:7;39424;:16::i;:::-;39408:32;;39480:5;39457:28;;:19;:17;:19::i;:::-;:28;;;39453:175;;39505:44;39522:5;39529:19;:17;:19::i;:::-;39505:16;:44::i;:::-;39500:128;;39577:35;;;;;;;;;;;;;;39500:128;39453:175;39673:2;39640:15;:24;39656:7;39640:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;39711:7;39707:2;39691:28;;39700:5;39691:28;;;;;;;;;;;;39397:330;39319:408;;:::o;29146:323::-;29207:7;29435:15;:13;:15::i;:::-;29420:12;;29404:13;;:28;:46;29397:53;;29146:323;:::o;82013:82::-;76463:13;:11;:13::i;:::-;82082:5:::1;82075:4;:12;;;;82013:82:::0;:::o;43525:2825::-;43667:27;43697;43716:7;43697:18;:27::i;:::-;43667:57;;43782:4;43741:45;;43757:19;43741:45;;;43737:86;;43795:28;;;;;;;;;;;;;;43737:86;43837:27;43866:23;43893:35;43920:7;43893:26;:35::i;:::-;43836:92;;;;44028:68;44053:15;44070:4;44076:19;:17;:19::i;:::-;44028:24;:68::i;:::-;44023:180;;44116:43;44133:4;44139:19;:17;:19::i;:::-;44116:16;:43::i;:::-;44111:92;;44168:35;;;;;;;;;;;;;;44111:92;44023:180;44234:1;44220:16;;:2;:16;;;44216:52;;44245:23;;;;;;;;;;;;;;44216:52;44281:43;44303:4;44309:2;44313:7;44322:1;44281:21;:43::i;:::-;44417:15;44414:160;;;44557:1;44536:19;44529:30;44414:160;44954:18;:24;44973:4;44954:24;;;;;;;;;;;;;;;;44952:26;;;;;;;;;;;;45023:18;:22;45042:2;45023:22;;;;;;;;;;;;;;;;45021:24;;;;;;;;;;;45345:146;45382:2;45431:45;45446:4;45452:2;45456:19;45431:14;:45::i;:::-;25545:8;45403:73;45345:18;:146::i;:::-;45316:17;:26;45334:7;45316:26;;;;;;;;;;;:175;;;;45662:1;25545:8;45611:19;:47;:52;45607:627;;45684:19;45716:1;45706:7;:11;45684:33;;45873:1;45839:17;:30;45857:11;45839:30;;;;;;;;;;;;:35;45835:384;;45977:13;;45962:11;:28;45958:242;;46157:19;46124:17;:30;46142:11;46124:30;;;;;;;;;;;:52;;;;45958:242;45835:384;45665:569;45607:627;46281:7;46277:2;46262:27;;46271:4;46262:27;;;;;;;;;;;;46300:42;46321:4;46327:2;46331:7;46340:1;46300:20;:42::i;:::-;43656:2694;;;43525:2825;;;:::o;78344:53::-;;;;;;;;;;;;;;;;;:::o;82327:184::-;76463:13;:11;:13::i;:::-;82378:12:::1;82404;;;;;;;;;;;82396:26;;82438:4;82430:21;;;82396:60;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82377:79;;;82475:7;82467:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;82366:145;82327:184::o:0;46446:193::-;46592:39;46609:4;46615:2;46619:7;46592:39;;;;;;;;;;;;:16;:39::i;:::-;46446:193;;;:::o;81169:104::-;76463:13;:11;:13::i;:::-;81260:5:::1;81245:12;:20;;;;;;:::i;:::-;;81169:104:::0;:::o;67171:528::-;67315:23;67381:22;67406:8;;:15;;67381:40;;67436:34;67494:14;67473:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;67436:73;;67529:9;67524:125;67545:14;67540:1;:19;67524:125;;67601:32;67621:8;;67630:1;67621:11;;;;;;;:::i;:::-;;;;;;;;67601:19;:32::i;:::-;67585:10;67596:1;67585:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;67561:3;;;;;67524:125;;;;67670:10;67663:17;;;;67171:528;;;;:::o;82163:114::-;76463:13;:11;:13::i;:::-;82256::::1;82241:12;;:28;;;;;;;;;;;;;;;;;;82163:114:::0;:::o;34788:152::-;34860:7;34903:27;34922:7;34903:18;:27::i;:::-;34880:52;;34788:152;;;:::o;30330:233::-;30402:7;30443:1;30426:19;;:5;:19;;;30422:60;;30454:28;;;;;;;;;;;;;;30422:60;24489:13;30500:18;:25;30519:5;30500:25;;;;;;;;;;;;;;;;:55;30493:62;;30330:233;;;:::o;77225:103::-;76463:13;:11;:13::i;:::-;77290:30:::1;77317:1;77290:18;:30::i;:::-;77225:103::o:0;81847:110::-;76463:13;:11;:13::i;:::-;81942:7:::1;81923:16;:26;;;;81847:110:::0;:::o;71047:900::-;71125:16;71179:19;71213:25;71253:22;71278:16;71288:5;71278:9;:16::i;:::-;71253:41;;71309:25;71351:14;71337:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71309:57;;71381:31;;:::i;:::-;71432:9;71444:15;:13;:15::i;:::-;71432:27;;71427:472;71476:14;71461:11;:29;71427:472;;71528:15;71541:1;71528:12;:15::i;:::-;71516:27;;71566:9;:16;;;71607:8;71562:73;71683:1;71657:28;;:9;:14;;;:28;;;71653:111;;71730:9;:14;;;71710:34;;71653:111;71807:5;71786:26;;:17;:26;;;71782:102;;71863:1;71837:8;71846:13;;;;;;71837:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;71782:102;71427:472;71492:3;;;;;71427:472;;;;71920:8;71913:15;;;;;;;71047:900;;;:::o;76577:87::-;76623:7;76650:6;;;;;;;;;;;76643:13;;76577:87;:::o;79148:152::-;79234:4;79257:35;79276:5;79282:4;;79287;79257:18;:35::i;:::-;79250:42;;79148:152;;;;:::o;33571:104::-;33627:13;33660:7;33653:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33571:104;:::o;68087:2513::-;68230:16;68297:4;68288:5;:13;68284:45;;68310:19;;;;;;;;;;;;;;68284:45;68344:19;68378:17;68398:14;:12;:14::i;:::-;68378:34;;68498:15;:13;:15::i;:::-;68490:5;:23;68486:87;;;68542:15;:13;:15::i;:::-;68534:23;;68486:87;68649:9;68642:4;:16;68638:73;;;68686:9;68679:16;;68638:73;68725:25;68753:16;68763:5;68753:9;:16::i;:::-;68725:44;;68947:4;68939:5;:12;68935:278;;;68972:19;69001:5;68994:4;:12;68972:34;;69043:17;69029:11;:31;69025:111;;;69105:11;69085:31;;69025:111;68953:198;68935:278;;;69196:1;69176:21;;68935:278;69227:25;69269:17;69255:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69227:60;;69327:1;69306:17;:22;69302:78;;69356:8;69349:15;;;;;;;;69302:78;69524:31;69558:26;69578:5;69558:19;:26::i;:::-;69524:60;;69599:25;69844:9;:16;;;69839:92;;69901:9;:14;;;69881:34;;69839:92;69950:9;69962:5;69950:17;;69945:478;69974:4;69969:1;:9;;:45;;;;;69997:17;69982:11;:32;;69969:45;69945:478;;;70052:15;70065:1;70052:12;:15::i;:::-;70040:27;;70090:9;:16;;;70131:8;70086:73;70207:1;70181:28;;:9;:14;;;:28;;;70177:111;;70254:9;:14;;;70234:34;;70177:111;70331:5;70310:26;;:17;:26;;;70306:102;;70387:1;70361:8;70370:13;;;;;;70361:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;70306:102;69945:478;70016:3;;;;;69945:478;;;;70525:11;70515:8;70508:29;70573:8;70566:15;;;;;;;;68087:2513;;;;;;:::o;78255:43::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;81005:104::-;76463:13;:11;:13::i;:::-;81095:6:::1;81078:14;:23;;;;81005:104:::0;:::o;40444:234::-;40591:8;40539:18;:39;40558:19;:17;:19::i;:::-;40539:39;;;;;;;;;;;;;;;:49;40579:8;40539:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;40651:8;40615:55;;40630:19;:17;:19::i;:::-;40615:55;;;40661:8;40615:55;;;;;;:::i;:::-;;;;;;;;40444:234;;:::o;47237:407::-;47412:31;47425:4;47431:2;47435:7;47412:12;:31::i;:::-;47476:1;47458:2;:14;;;:19;47454:183;;47497:56;47528:4;47534:2;47538:7;47547:5;47497:30;:56::i;:::-;47492:145;;47581:40;;;;;;;;;;;;;;47492:145;47454:183;47237:407;;;;:::o;66584:428::-;66668:21;;:::i;:::-;66702:31;;:::i;:::-;66758:15;:13;:15::i;:::-;66748:7;:25;:54;;;;66788:14;:12;:14::i;:::-;66777:7;:25;;66748:54;66744:103;;;66826:9;66819:16;;;;;66744:103;66869:21;66882:7;66869:12;:21::i;:::-;66857:33;;66905:9;:16;;;66901:65;;;66945:9;66938:16;;;;;66901:65;66983:21;66996:7;66983:12;:21::i;:::-;66976:28;;;66584:428;;;;:::o;81337:112::-;76463:13;:11;:13::i;:::-;81432:9:::1;81414:15;;:27;;;;;;;;;;;;;;;;;;81337:112:::0;:::o;80754:178::-;80833:18;80884:12;80897:9;:18;80907:7;80897:18;;;;;;;;;;;80870:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80863:61;;80754:178;;;:::o;81508:108::-;76463:13;:11;:13::i;:::-;81599:9:::1;81583:13;;:25;;;;;;;;;;;;;;;;;;81508:108:::0;:::o;81684:106::-;76463:13;:11;:13::i;:::-;81774:8:::1;81758:13;;:24;;;;;;;;;;;;;;;;;;81684:106:::0;:::o;79308:1392::-;79495:1;79475:16;;:21;79467:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;79611:10;79570:51;;79579:15;;;;;;;;;;;79570:33;;;79604:2;79570:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;;79562:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;79711:29;79729:5;79735:4;79711:17;:29::i;:::-;79703:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;79856:2;79830:18;:22;79849:2;79830:22;;;;;;;;;;;;79819:8;:33;;;;:::i;:::-;:39;;79811:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;79995:13;;;;;;;;;;;79988:34;;;80023:10;80042:13;;;;;;;;;;;80074:8;80057:14;;:25;;;;:::i;:::-;79988:95;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;80199:18;80220;:22;80239:2;80220:22;;;;;;;;;;;;80199:43;;80253:6;80274:248;80284:8;80280:1;:12;80274:248;;;80308:19;80347:1;80330:14;:12;:14::i;:::-;:18;;;;:::i;:::-;80308:40;;80402:20;80419:2;80402:16;:20::i;:::-;80428:33;80459:1;80445:13;:15;;;;:::i;:::-;80428:16;:33::i;:::-;80388:74;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80363:9;:22;80373:11;80363:22;;;;;;;;;;;:99;;;;;;:::i;:::-;;80477:15;;;;;:::i;:::-;;;;80507:3;;;;;:::i;:::-;;;;80293:229;80274:248;;;80604:8;80578:18;:22;80597:2;80578:22;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;80653:27;80659:10;80671:8;80653:5;:27::i;:::-;79419:1281;;79308:1392;;;;;:::o;40835:164::-;40932:4;40956:18;:25;40975:5;40956:25;;;;;;;;;;;;;;;:35;40982:8;40956:35;;;;;;;;;;;;;;;;;;;;;;;;;40949:42;;40835:164;;;;:::o;77483:201::-;76463:13;:11;:13::i;:::-;77592:1:::1;77572:22;;:8;:22;;::::0;77564:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;77648:28;77667:8;77648:18;:28::i;:::-;77483:201:::0;:::o;41257:282::-;41322:4;41378:7;41359:15;:13;:15::i;:::-;:26;;:66;;;;;41412:13;;41402:7;:23;41359:66;:153;;;;;41511:1;25265:8;41463:17;:26;41481:7;41463:26;;;;;;;;;;;;:44;:49;41359:153;41339:173;;41257:282;;;:::o;63565:105::-;63625:7;63652:10;63645:17;;63565:105;:::o;28662:92::-;28718:7;28662:92;:::o;76742:132::-;76817:12;:10;:12::i;:::-;76806:23;;:7;:5;:7::i;:::-;:23;;;76798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76742:132::o;35943:1275::-;36010:7;36030:12;36045:7;36030:22;;36113:4;36094:15;:13;:15::i;:::-;:23;36090:1061;;36147:13;;36140:4;:20;36136:1015;;;36185:14;36202:17;:23;36220:4;36202:23;;;;;;;;;;;;36185:40;;36319:1;25265:8;36291:6;:24;:29;36287:845;;36956:113;36973:1;36963:6;:11;36956:113;;37016:17;:25;37034:6;;;;;;;37016:25;;;;;;;;;;;;37007:34;;36956:113;;;37102:6;37095:13;;;;;;36287:845;36162:989;36136:1015;36090:1061;37179:31;;;;;;;;;;;;;;35943:1275;;;;:::o;42420:485::-;42522:27;42551:23;42592:38;42633:15;:24;42649:7;42633:24;;;;;;;;;;;42592:65;;42810:18;42787:41;;42867:19;42861:26;42842:45;;42772:126;42420:485;;;:::o;41648:659::-;41797:11;41962:16;41955:5;41951:28;41942:37;;42122:16;42111:9;42107:32;42094:45;;42272:15;42261:9;42258:30;42250:5;42239:9;42236:20;42233:56;42223:66;;41648:659;;;;;:::o;48306:159::-;;;;;:::o;62874:311::-;63009:7;63029:16;25669:3;63055:19;:41;;63029:68;;25669:3;63123:31;63134:4;63140:2;63144:9;63123:10;:31::i;:::-;63115:40;;:62;;63108:69;;;62874:311;;;;;:::o;37766:450::-;37846:14;38014:16;38007:5;38003:28;37994:37;;38191:5;38177:11;38152:23;38148:41;38145:52;38138:5;38135:63;38125:73;;37766:450;;;;:::o;49130:158::-;;;;;:::o;77844:191::-;77918:16;77937:6;;;;;;;;;;;77918:25;;77963:8;77954:6;;:17;;;;;;;;;;;;;;;;;;78018:8;77987:40;;78008:8;77987:40;;;;;;;;;;;;77907:128;77844:191;:::o;35391:161::-;35459:21;;:::i;:::-;35500:44;35519:17;:24;35537:5;35519:24;;;;;;;;;;;;35500:18;:44::i;:::-;35493:51;;35391:161;;;:::o;1219:190::-;1344:4;1397;1368:25;1381:5;1388:4;1368:12;:25::i;:::-;:33;1361:40;;1219:190;;;;;:::o;28833:103::-;28888:7;28915:13;;28908:20;;28833:103;:::o;49728:716::-;49891:4;49937:2;49912:45;;;49958:19;:17;:19::i;:::-;49979:4;49985:7;49994:5;49912:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49908:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50212:1;50195:6;:13;:18;50191:235;;50241:40;;;;;;;;;;;;;;50191:235;50384:6;50378:13;50369:6;50365:2;50361:15;50354:38;49908:529;50081:54;;;50071:64;;;:6;:64;;;;50064:71;;;49728:716;;;;;;:::o;35129:166::-;35199:21;;:::i;:::-;35240:47;35259:27;35278:7;35259:18;:27::i;:::-;35240:18;:47::i;:::-;35233:54;;35129:166;;;:::o;72382:723::-;72438:13;72668:1;72659:5;:10;72655:53;;72686:10;;;;;;;;;;;;;;;;;;;;;72655:53;72718:12;72733:5;72718:20;;72749:14;72774:78;72789:1;72781:4;:9;72774:78;;72807:8;;;;;:::i;:::-;;;;72838:2;72830:10;;;;;:::i;:::-;;;72774:78;;;72862:19;72894:6;72884:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72862:39;;72912:154;72928:1;72919:5;:10;72912:154;;72956:1;72946:11;;;;;:::i;:::-;;;73023:2;73015:5;:10;;;;:::i;:::-;73002:2;:24;;;;:::i;:::-;72989:39;;72972:6;72979;72972:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;73052:2;73043:11;;;;;:::i;:::-;;;72912:154;;;73090:6;73076:21;;;;;72382:723;;;;:::o;50906:2966::-;50979:20;51002:13;;50979:36;;51042:1;51030:8;:13;51026:44;;51052:18;;;;;;;;;;;;;;51026:44;51083:61;51113:1;51117:2;51121:12;51135:8;51083:21;:61::i;:::-;51627:1;24627:2;51597:1;:26;;51596:32;51584:8;:45;51558:18;:22;51577:2;51558:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;51906:139;51943:2;51997:33;52020:1;52024:2;52028:1;51997:14;:33::i;:::-;51964:30;51985:8;51964:20;:30::i;:::-;:66;51906:18;:139::i;:::-;51872:17;:31;51890:12;51872:31;;;;;;;;;;;:173;;;;52062:16;52093:11;52122:8;52107:12;:23;52093:37;;52643:16;52639:2;52635:25;52623:37;;53015:12;52975:8;52934:1;52872:25;52813:1;52752;52725:335;53386:1;53372:12;53368:20;53326:346;53427:3;53418:7;53415:16;53326:346;;53645:7;53635:8;53632:1;53605:25;53602:1;53599;53594:59;53480:1;53471:7;53467:15;53456:26;;53326:346;;;53330:77;53717:1;53705:8;:13;53701:45;;53727:19;;;;;;;;;;;;;;53701:45;53779:3;53763:13;:19;;;;51332:2462;;53804:60;53833:1;53837:2;53841:12;53855:8;53804:20;:60::i;:::-;50968:2904;50906:2966;;:::o;75128:98::-;75181:7;75208:10;75201:17;;75128:98;:::o;62575:147::-;62712:6;62575:147;;;;;:::o;37317:366::-;37383:31;;:::i;:::-;37460:6;37427:9;:14;;:41;;;;;;;;;;;25148:3;37513:6;:33;;37479:9;:24;;:68;;;;;;;;;;;37605:1;25265:8;37577:6;:24;:29;;37558:9;:16;;:48;;;;;;;;;;;25669:3;37646:6;:28;;37617:9;:19;;:58;;;;;;;;;;;37317:366;;;:::o;2086:296::-;2169:7;2189:20;2212:4;2189:27;;2232:9;2227:118;2251:5;:12;2247:1;:16;2227:118;;;2300:33;2310:12;2324:5;2330:1;2324:8;;;;;;;;:::i;:::-;;;;;;;;2300:9;:33::i;:::-;2285:48;;2265:3;;;;;:::i;:::-;;;;2227:118;;;;2362:12;2355:19;;;2086:296;;;;:::o;38318:324::-;38388:14;38621:1;38611:8;38608:15;38582:24;38578:46;38568:56;;38318:324;;;:::o;8293:149::-;8356:7;8387:1;8383;:5;:51;;8414:20;8429:1;8432;8414:14;:20::i;:::-;8383:51;;;8391:20;8406:1;8409;8391:14;:20::i;:::-;8383:51;8376:58;;8293:149;;;;:::o;8450:268::-;8518:13;8625:1;8619:4;8612:15;8654:1;8648:4;8641:15;8695:4;8689;8679:21;8670:30;;8450:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:77::-;5279:7;5308:5;5297:16;;5242:77;;;:::o;5325:122::-;5398:24;5416:5;5398:24;:::i;:::-;5391:5;5388:35;5378:63;;5437:1;5434;5427:12;5378:63;5325:122;:::o;5453:139::-;5499:5;5537:6;5524:20;5515:29;;5553:33;5580:5;5553:33;:::i;:::-;5453:139;;;;:::o;5598:329::-;5657:6;5706:2;5694:9;5685:7;5681:23;5677:32;5674:119;;;5712:79;;:::i;:::-;5674:119;5832:1;5857:53;5902:7;5893:6;5882:9;5878:22;5857:53;:::i;:::-;5847:63;;5803:117;5598:329;;;;:::o;5933:619::-;6010:6;6018;6026;6075:2;6063:9;6054:7;6050:23;6046:32;6043:119;;;6081:79;;:::i;:::-;6043:119;6201:1;6226:53;6271:7;6262:6;6251:9;6247:22;6226:53;:::i;:::-;6216:63;;6172:117;6328:2;6354:53;6399:7;6390:6;6379:9;6375:22;6354:53;:::i;:::-;6344:63;;6299:118;6456:2;6482:53;6527:7;6518:6;6507:9;6503:22;6482:53;:::i;:::-;6472:63;;6427:118;5933:619;;;;;:::o;6558:117::-;6667:1;6664;6657:12;6681:117;6790:1;6787;6780:12;6804:180;6852:77;6849:1;6842:88;6949:4;6946:1;6939:15;6973:4;6970:1;6963:15;6990:281;7073:27;7095:4;7073:27;:::i;:::-;7065:6;7061:40;7203:6;7191:10;7188:22;7167:18;7155:10;7152:34;7149:62;7146:88;;;7214:18;;:::i;:::-;7146:88;7254:10;7250:2;7243:22;7033:238;6990:281;;:::o;7277:129::-;7311:6;7338:20;;:::i;:::-;7328:30;;7367:33;7395:4;7387:6;7367:33;:::i;:::-;7277:129;;;:::o;7412:308::-;7474:4;7564:18;7556:6;7553:30;7550:56;;;7586:18;;:::i;:::-;7550:56;7624:29;7646:6;7624:29;:::i;:::-;7616:37;;7708:4;7702;7698:15;7690:23;;7412:308;;;:::o;7726:146::-;7823:6;7818:3;7813;7800:30;7864:1;7855:6;7850:3;7846:16;7839:27;7726:146;;;:::o;7878:425::-;7956:5;7981:66;7997:49;8039:6;7997:49;:::i;:::-;7981:66;:::i;:::-;7972:75;;8070:6;8063:5;8056:21;8108:4;8101:5;8097:16;8146:3;8137:6;8132:3;8128:16;8125:25;8122:112;;;8153:79;;:::i;:::-;8122:112;8243:54;8290:6;8285:3;8280;8243:54;:::i;:::-;7962:341;7878:425;;;;;:::o;8323:340::-;8379:5;8428:3;8421:4;8413:6;8409:17;8405:27;8395:122;;8436:79;;:::i;:::-;8395:122;8553:6;8540:20;8578:79;8653:3;8645:6;8638:4;8630:6;8626:17;8578:79;:::i;:::-;8569:88;;8385:278;8323:340;;;;:::o;8669:509::-;8738:6;8787:2;8775:9;8766:7;8762:23;8758:32;8755:119;;;8793:79;;:::i;:::-;8755:119;8941:1;8930:9;8926:17;8913:31;8971:18;8963:6;8960:30;8957:117;;;8993:79;;:::i;:::-;8957:117;9098:63;9153:7;9144:6;9133:9;9129:22;9098:63;:::i;:::-;9088:73;;8884:287;8669:509;;;;:::o;9184:117::-;9293:1;9290;9283:12;9307:117;9416:1;9413;9406:12;9447:568;9520:8;9530:6;9580:3;9573:4;9565:6;9561:17;9557:27;9547:122;;9588:79;;:::i;:::-;9547:122;9701:6;9688:20;9678:30;;9731:18;9723:6;9720:30;9717:117;;;9753:79;;:::i;:::-;9717:117;9867:4;9859:6;9855:17;9843:29;;9921:3;9913:4;9905:6;9901:17;9891:8;9887:32;9884:41;9881:128;;;9928:79;;:::i;:::-;9881:128;9447:568;;;;;:::o;10021:559::-;10107:6;10115;10164:2;10152:9;10143:7;10139:23;10135:32;10132:119;;;10170:79;;:::i;:::-;10132:119;10318:1;10307:9;10303:17;10290:31;10348:18;10340:6;10337:30;10334:117;;;10370:79;;:::i;:::-;10334:117;10483:80;10555:7;10546:6;10535:9;10531:22;10483:80;:::i;:::-;10465:98;;;;10261:312;10021:559;;;;;:::o;10586:145::-;10684:6;10718:5;10712:12;10702:22;;10586:145;;;:::o;10737:215::-;10867:11;10901:6;10896:3;10889:19;10941:4;10936:3;10932:14;10917:29;;10737:215;;;;:::o;10958:163::-;11056:4;11079:3;11071:11;;11109:4;11104:3;11100:14;11092:22;;10958:163;;;:::o;11127:108::-;11204:24;11222:5;11204:24;:::i;:::-;11199:3;11192:37;11127:108;;:::o;11241:101::-;11277:7;11317:18;11310:5;11306:30;11295:41;;11241:101;;;:::o;11348:105::-;11423:23;11440:5;11423:23;:::i;:::-;11418:3;11411:36;11348:105;;:::o;11459:99::-;11530:21;11545:5;11530:21;:::i;:::-;11525:3;11518:34;11459:99;;:::o;11564:91::-;11600:7;11640:8;11633:5;11629:20;11618:31;;11564:91;;;:::o;11661:105::-;11736:23;11753:5;11736:23;:::i;:::-;11731:3;11724:36;11661:105;;:::o;11844:864::-;11993:4;11988:3;11984:14;12080:4;12073:5;12069:16;12063:23;12099:63;12156:4;12151:3;12147:14;12133:12;12099:63;:::i;:::-;12008:164;12264:4;12257:5;12253:16;12247:23;12283:61;12338:4;12333:3;12329:14;12315:12;12283:61;:::i;:::-;12182:172;12438:4;12431:5;12427:16;12421:23;12457:57;12508:4;12503:3;12499:14;12485:12;12457:57;:::i;:::-;12364:160;12611:4;12604:5;12600:16;12594:23;12630:61;12685:4;12680:3;12676:14;12662:12;12630:61;:::i;:::-;12534:167;11962:746;11844:864;;:::o;12714:303::-;12845:10;12866:108;12970:3;12962:6;12866:108;:::i;:::-;13006:4;13001:3;12997:14;12983:28;;12714:303;;;;:::o;13023:144::-;13124:4;13156;13151:3;13147:14;13139:22;;13023:144;;;:::o;13249:980::-;13430:3;13459:85;13538:5;13459:85;:::i;:::-;13560:117;13670:6;13665:3;13560:117;:::i;:::-;13553:124;;13701:87;13782:5;13701:87;:::i;:::-;13811:7;13842:1;13827:377;13852:6;13849:1;13846:13;13827:377;;;13928:6;13922:13;13955:125;14076:3;14061:13;13955:125;:::i;:::-;13948:132;;14103:91;14187:6;14103:91;:::i;:::-;14093:101;;13887:317;13874:1;13871;13867:9;13862:14;;13827:377;;;13831:14;14220:3;14213:10;;13435:794;;;13249:980;;;;:::o;14235:497::-;14440:4;14478:2;14467:9;14463:18;14455:26;;14527:9;14521:4;14517:20;14513:1;14502:9;14498:17;14491:47;14555:170;14720:4;14711:6;14555:170;:::i;:::-;14547:178;;14235:497;;;;:::o;14738:329::-;14797:6;14846:2;14834:9;14825:7;14821:23;14817:32;14814:119;;;14852:79;;:::i;:::-;14814:119;14972:1;14997:53;15042:7;15033:6;15022:9;15018:22;14997:53;:::i;:::-;14987:63;;14943:117;14738:329;;;;:::o;15073:114::-;15140:6;15174:5;15168:12;15158:22;;15073:114;;;:::o;15193:184::-;15292:11;15326:6;15321:3;15314:19;15366:4;15361:3;15357:14;15342:29;;15193:184;;;;:::o;15383:132::-;15450:4;15473:3;15465:11;;15503:4;15498:3;15494:14;15486:22;;15383:132;;;:::o;15521:108::-;15598:24;15616:5;15598:24;:::i;:::-;15593:3;15586:37;15521:108;;:::o;15635:179::-;15704:10;15725:46;15767:3;15759:6;15725:46;:::i;:::-;15803:4;15798:3;15794:14;15780:28;;15635:179;;;;:::o;15820:113::-;15890:4;15922;15917:3;15913:14;15905:22;;15820:113;;;:::o;15969:732::-;16088:3;16117:54;16165:5;16117:54;:::i;:::-;16187:86;16266:6;16261:3;16187:86;:::i;:::-;16180:93;;16297:56;16347:5;16297:56;:::i;:::-;16376:7;16407:1;16392:284;16417:6;16414:1;16411:13;16392:284;;;16493:6;16487:13;16520:63;16579:3;16564:13;16520:63;:::i;:::-;16513:70;;16606:60;16659:6;16606:60;:::i;:::-;16596:70;;16452:224;16439:1;16436;16432:9;16427:14;;16392:284;;;16396:14;16692:3;16685:10;;16093:608;;;15969:732;;;;:::o;16707:373::-;16850:4;16888:2;16877:9;16873:18;16865:26;;16937:9;16931:4;16927:20;16923:1;16912:9;16908:17;16901:47;16965:108;17068:4;17059:6;16965:108;:::i;:::-;16957:116;;16707:373;;;;:::o;17086:311::-;17163:4;17253:18;17245:6;17242:30;17239:56;;;17275:18;;:::i;:::-;17239:56;17325:4;17317:6;17313:17;17305:25;;17385:4;17379;17375:15;17367:23;;17086:311;;;:::o;17420:710::-;17516:5;17541:81;17557:64;17614:6;17557:64;:::i;:::-;17541:81;:::i;:::-;17532:90;;17642:5;17671:6;17664:5;17657:21;17705:4;17698:5;17694:16;17687:23;;17758:4;17750:6;17746:17;17738:6;17734:30;17787:3;17779:6;17776:15;17773:122;;;17806:79;;:::i;:::-;17773:122;17921:6;17904:220;17938:6;17933:3;17930:15;17904:220;;;18013:3;18042:37;18075:3;18063:10;18042:37;:::i;:::-;18037:3;18030:50;18109:4;18104:3;18100:14;18093:21;;17980:144;17964:4;17959:3;17955:14;17948:21;;17904:220;;;17908:21;17522:608;;17420:710;;;;;:::o;18153:370::-;18224:5;18273:3;18266:4;18258:6;18254:17;18250:27;18240:122;;18281:79;;:::i;:::-;18240:122;18398:6;18385:20;18423:94;18513:3;18505:6;18498:4;18490:6;18486:17;18423:94;:::i;:::-;18414:103;;18230:293;18153:370;;;;:::o;18529:684::-;18622:6;18630;18679:2;18667:9;18658:7;18654:23;18650:32;18647:119;;;18685:79;;:::i;:::-;18647:119;18833:1;18822:9;18818:17;18805:31;18863:18;18855:6;18852:30;18849:117;;;18885:79;;:::i;:::-;18849:117;18990:78;19060:7;19051:6;19040:9;19036:22;18990:78;:::i;:::-;18980:88;;18776:302;19117:2;19143:53;19188:7;19179:6;19168:9;19164:22;19143:53;:::i;:::-;19133:63;;19088:118;18529:684;;;;;:::o;19219:619::-;19296:6;19304;19312;19361:2;19349:9;19340:7;19336:23;19332:32;19329:119;;;19367:79;;:::i;:::-;19329:119;19487:1;19512:53;19557:7;19548:6;19537:9;19533:22;19512:53;:::i;:::-;19502:63;;19458:117;19614:2;19640:53;19685:7;19676:6;19665:9;19661:22;19640:53;:::i;:::-;19630:63;;19585:118;19742:2;19768:53;19813:7;19804:6;19793:9;19789:22;19768:53;:::i;:::-;19758:63;;19713:118;19219:619;;;;;:::o;19844:116::-;19914:21;19929:5;19914:21;:::i;:::-;19907:5;19904:32;19894:60;;19950:1;19947;19940:12;19894:60;19844:116;:::o;19966:133::-;20009:5;20047:6;20034:20;20025:29;;20063:30;20087:5;20063:30;:::i;:::-;19966:133;;;;:::o;20105:468::-;20170:6;20178;20227:2;20215:9;20206:7;20202:23;20198:32;20195:119;;;20233:79;;:::i;:::-;20195:119;20353:1;20378:53;20423:7;20414:6;20403:9;20399:22;20378:53;:::i;:::-;20368:63;;20324:117;20480:2;20506:50;20548:7;20539:6;20528:9;20524:22;20506:50;:::i;:::-;20496:60;;20451:115;20105:468;;;;;:::o;20579:307::-;20640:4;20730:18;20722:6;20719:30;20716:56;;;20752:18;;:::i;:::-;20716:56;20790:29;20812:6;20790:29;:::i;:::-;20782:37;;20874:4;20868;20864:15;20856:23;;20579:307;;;:::o;20892:423::-;20969:5;20994:65;21010:48;21051:6;21010:48;:::i;:::-;20994:65;:::i;:::-;20985:74;;21082:6;21075:5;21068:21;21120:4;21113:5;21109:16;21158:3;21149:6;21144:3;21140:16;21137:25;21134:112;;;21165:79;;:::i;:::-;21134:112;21255:54;21302:6;21297:3;21292;21255:54;:::i;:::-;20975:340;20892:423;;;;;:::o;21334:338::-;21389:5;21438:3;21431:4;21423:6;21419:17;21415:27;21405:122;;21446:79;;:::i;:::-;21405:122;21563:6;21550:20;21588:78;21662:3;21654:6;21647:4;21639:6;21635:17;21588:78;:::i;:::-;21579:87;;21395:277;21334:338;;;;:::o;21678:943::-;21773:6;21781;21789;21797;21846:3;21834:9;21825:7;21821:23;21817:33;21814:120;;;21853:79;;:::i;:::-;21814:120;21973:1;21998:53;22043:7;22034:6;22023:9;22019:22;21998:53;:::i;:::-;21988:63;;21944:117;22100:2;22126:53;22171:7;22162:6;22151:9;22147:22;22126:53;:::i;:::-;22116:63;;22071:118;22228:2;22254:53;22299:7;22290:6;22279:9;22275:22;22254:53;:::i;:::-;22244:63;;22199:118;22384:2;22373:9;22369:18;22356:32;22415:18;22407:6;22404:30;22401:117;;;22437:79;;:::i;:::-;22401:117;22542:62;22596:7;22587:6;22576:9;22572:22;22542:62;:::i;:::-;22532:72;;22327:287;21678:943;;;;;;;:::o;22699:874::-;22858:4;22853:3;22849:14;22945:4;22938:5;22934:16;22928:23;22964:63;23021:4;23016:3;23012:14;22998:12;22964:63;:::i;:::-;22873:164;23129:4;23122:5;23118:16;23112:23;23148:61;23203:4;23198:3;23194:14;23180:12;23148:61;:::i;:::-;23047:172;23303:4;23296:5;23292:16;23286:23;23322:57;23373:4;23368:3;23364:14;23350:12;23322:57;:::i;:::-;23229:160;23476:4;23469:5;23465:16;23459:23;23495:61;23550:4;23545:3;23541:14;23527:12;23495:61;:::i;:::-;23399:167;22827:746;22699:874;;:::o;23579:347::-;23734:4;23772:3;23761:9;23757:19;23749:27;;23786:133;23916:1;23905:9;23901:17;23892:6;23786:133;:::i;:::-;23579:347;;;;:::o;23932:1121::-;24052:6;24060;24068;24076;24084;24133:3;24121:9;24112:7;24108:23;24104:33;24101:120;;;24140:79;;:::i;:::-;24101:120;24260:1;24285:53;24330:7;24321:6;24310:9;24306:22;24285:53;:::i;:::-;24275:63;;24231:117;24387:2;24413:53;24458:7;24449:6;24438:9;24434:22;24413:53;:::i;:::-;24403:63;;24358:118;24515:2;24541:53;24586:7;24577:6;24566:9;24562:22;24541:53;:::i;:::-;24531:63;;24486:118;24671:2;24660:9;24656:18;24643:32;24702:18;24694:6;24691:30;24688:117;;;24724:79;;:::i;:::-;24688:117;24829:78;24899:7;24890:6;24879:9;24875:22;24829:78;:::i;:::-;24819:88;;24614:303;24956:3;24983:53;25028:7;25019:6;25008:9;25004:22;24983:53;:::i;:::-;24973:63;;24927:119;23932:1121;;;;;;;;:::o;25059:474::-;25127:6;25135;25184:2;25172:9;25163:7;25159:23;25155:32;25152:119;;;25190:79;;:::i;:::-;25152:119;25310:1;25335:53;25380:7;25371:6;25360:9;25356:22;25335:53;:::i;:::-;25325:63;;25281:117;25437:2;25463:53;25508:7;25499:6;25488:9;25484:22;25463:53;:::i;:::-;25453:63;;25408:118;25059:474;;;;;:::o;25539:180::-;25587:77;25584:1;25577:88;25684:4;25681:1;25674:15;25708:4;25705:1;25698:15;25725:320;25769:6;25806:1;25800:4;25796:12;25786:22;;25853:1;25847:4;25843:12;25874:18;25864:81;;25930:4;25922:6;25918:17;25908:27;;25864:81;25992:2;25984:6;25981:14;25961:18;25958:38;25955:84;;26011:18;;:::i;:::-;25955:84;25776:269;25725:320;;;:::o;26051:147::-;26152:11;26189:3;26174:18;;26051:147;;;;:::o;26204:114::-;;:::o;26324:398::-;26483:3;26504:83;26585:1;26580:3;26504:83;:::i;:::-;26497:90;;26596:93;26685:3;26596:93;:::i;:::-;26714:1;26709:3;26705:11;26698:18;;26324:398;;;:::o;26728:379::-;26912:3;26934:147;27077:3;26934:147;:::i;:::-;26927:154;;27098:3;27091:10;;26728:379;;;:::o;27113:166::-;27253:18;27249:1;27241:6;27237:14;27230:42;27113:166;:::o;27285:366::-;27427:3;27448:67;27512:2;27507:3;27448:67;:::i;:::-;27441:74;;27524:93;27613:3;27524:93;:::i;:::-;27642:2;27637:3;27633:12;27626:19;;27285:366;;;:::o;27657:419::-;27823:4;27861:2;27850:9;27846:18;27838:26;;27910:9;27904:4;27900:20;27896:1;27885:9;27881:17;27874:47;27938:131;28064:4;27938:131;:::i;:::-;27930:139;;27657:419;;;:::o;28082:141::-;28131:4;28154:3;28146:11;;28177:3;28174:1;28167:14;28211:4;28208:1;28198:18;28190:26;;28082:141;;;:::o;28229:93::-;28266:6;28313:2;28308;28301:5;28297:14;28293:23;28283:33;;28229:93;;;:::o;28328:107::-;28372:8;28422:5;28416:4;28412:16;28391:37;;28328:107;;;;:::o;28441:393::-;28510:6;28560:1;28548:10;28544:18;28583:97;28613:66;28602:9;28583:97;:::i;:::-;28701:39;28731:8;28720:9;28701:39;:::i;:::-;28689:51;;28773:4;28769:9;28762:5;28758:21;28749:30;;28822:4;28812:8;28808:19;28801:5;28798:30;28788:40;;28517:317;;28441:393;;;;;:::o;28840:60::-;28868:3;28889:5;28882:12;;28840:60;;;:::o;28906:142::-;28956:9;28989:53;29007:34;29016:24;29034:5;29016:24;:::i;:::-;29007:34;:::i;:::-;28989:53;:::i;:::-;28976:66;;28906:142;;;:::o;29054:75::-;29097:3;29118:5;29111:12;;29054:75;;;:::o;29135:269::-;29245:39;29276:7;29245:39;:::i;:::-;29306:91;29355:41;29379:16;29355:41;:::i;:::-;29347:6;29340:4;29334:11;29306:91;:::i;:::-;29300:4;29293:105;29211:193;29135:269;;;:::o;29410:73::-;29455:3;29410:73;:::o;29489:189::-;29566:32;;:::i;:::-;29607:65;29665:6;29657;29651:4;29607:65;:::i;:::-;29542:136;29489:189;;:::o;29684:186::-;29744:120;29761:3;29754:5;29751:14;29744:120;;;29815:39;29852:1;29845:5;29815:39;:::i;:::-;29788:1;29781:5;29777:13;29768:22;;29744:120;;;29684:186;;:::o;29876:543::-;29977:2;29972:3;29969:11;29966:446;;;30011:38;30043:5;30011:38;:::i;:::-;30095:29;30113:10;30095:29;:::i;:::-;30085:8;30081:44;30278:2;30266:10;30263:18;30260:49;;;30299:8;30284:23;;30260:49;30322:80;30378:22;30396:3;30378:22;:::i;:::-;30368:8;30364:37;30351:11;30322:80;:::i;:::-;29981:431;;29966:446;29876:543;;;:::o;30425:117::-;30479:8;30529:5;30523:4;30519:16;30498:37;;30425:117;;;;:::o;30548:169::-;30592:6;30625:51;30673:1;30669:6;30661:5;30658:1;30654:13;30625:51;:::i;:::-;30621:56;30706:4;30700;30696:15;30686:25;;30599:118;30548:169;;;;:::o;30722:295::-;30798:4;30944:29;30969:3;30963:4;30944:29;:::i;:::-;30936:37;;31006:3;31003:1;30999:11;30993:4;30990:21;30982:29;;30722:295;;;;:::o;31022:1395::-;31139:37;31172:3;31139:37;:::i;:::-;31241:18;31233:6;31230:30;31227:56;;;31263:18;;:::i;:::-;31227:56;31307:38;31339:4;31333:11;31307:38;:::i;:::-;31392:67;31452:6;31444;31438:4;31392:67;:::i;:::-;31486:1;31510:4;31497:17;;31542:2;31534:6;31531:14;31559:1;31554:618;;;;32216:1;32233:6;32230:77;;;32282:9;32277:3;32273:19;32267:26;32258:35;;32230:77;32333:67;32393:6;32386:5;32333:67;:::i;:::-;32327:4;32320:81;32189:222;31524:887;;31554:618;31606:4;31602:9;31594:6;31590:22;31640:37;31672:4;31640:37;:::i;:::-;31699:1;31713:208;31727:7;31724:1;31721:14;31713:208;;;31806:9;31801:3;31797:19;31791:26;31783:6;31776:42;31857:1;31849:6;31845:14;31835:24;;31904:2;31893:9;31889:18;31876:31;;31750:4;31747:1;31743:12;31738:17;;31713:208;;;31949:6;31940:7;31937:19;31934:179;;;32007:9;32002:3;31998:19;31992:26;32050:48;32092:4;32084:6;32080:17;32069:9;32050:48;:::i;:::-;32042:6;32035:64;31957:156;31934:179;32159:1;32155;32147:6;32143:14;32139:22;32133:4;32126:36;31561:611;;;31524:887;;31114:1303;;;31022:1395;;:::o;32423:180::-;32471:77;32468:1;32461:88;32568:4;32565:1;32558:15;32592:4;32589:1;32582:15;32609:148;32711:11;32748:3;32733:18;;32609:148;;;;:::o;32787:874::-;32890:3;32927:5;32921:12;32956:36;32982:9;32956:36;:::i;:::-;33008:89;33090:6;33085:3;33008:89;:::i;:::-;33001:96;;33128:1;33117:9;33113:17;33144:1;33139:166;;;;33319:1;33314:341;;;;33106:549;;33139:166;33223:4;33219:9;33208;33204:25;33199:3;33192:38;33285:6;33278:14;33271:22;33263:6;33259:35;33254:3;33250:45;33243:52;;33139:166;;33314:341;33381:38;33413:5;33381:38;:::i;:::-;33441:1;33455:154;33469:6;33466:1;33463:13;33455:154;;;33543:7;33537:14;33533:1;33528:3;33524:11;33517:35;33593:1;33584:7;33580:15;33569:26;;33491:4;33488:1;33484:12;33479:17;;33455:154;;;33638:6;33633:3;33629:16;33622:23;;33321:334;;33106:549;;32894:767;;32787:874;;;;:::o;33667:182::-;33835:7;33830:3;33823:20;33667:182;:::o;33855:687::-;34119:3;34141:92;34229:3;34220:6;34141:92;:::i;:::-;34134:99;;34250:92;34338:3;34329:6;34250:92;:::i;:::-;34243:99;;34352:137;34485:3;34352:137;:::i;:::-;34514:1;34509:3;34505:11;34498:18;;34533:3;34526:10;;33855:687;;;;;:::o;34548:164::-;34688:16;34684:1;34676:6;34672:14;34665:40;34548:164;:::o;34718:366::-;34860:3;34881:67;34945:2;34940:3;34881:67;:::i;:::-;34874:74;;34957:93;35046:3;34957:93;:::i;:::-;35075:2;35070:3;35066:12;35059:19;;34718:366;;;:::o;35090:419::-;35256:4;35294:2;35283:9;35279:18;35271:26;;35343:9;35337:4;35333:20;35329:1;35318:9;35314:17;35307:47;35371:131;35497:4;35371:131;:::i;:::-;35363:139;;35090:419;;;:::o;35515:143::-;35572:5;35603:6;35597:13;35588:22;;35619:33;35646:5;35619:33;:::i;:::-;35515:143;;;;:::o;35664:351::-;35734:6;35783:2;35771:9;35762:7;35758:23;35754:32;35751:119;;;35789:79;;:::i;:::-;35751:119;35909:1;35934:64;35990:7;35981:6;35970:9;35966:22;35934:64;:::i;:::-;35924:74;;35880:128;35664:351;;;;:::o;36021:223::-;36161:34;36157:1;36149:6;36145:14;36138:58;36230:6;36225:2;36217:6;36213:15;36206:31;36021:223;:::o;36250:366::-;36392:3;36413:67;36477:2;36472:3;36413:67;:::i;:::-;36406:74;;36489:93;36578:3;36489:93;:::i;:::-;36607:2;36602:3;36598:12;36591:19;;36250:366;;;:::o;36622:419::-;36788:4;36826:2;36815:9;36811:18;36803:26;;36875:9;36869:4;36865:20;36861:1;36850:9;36846:17;36839:47;36903:131;37029:4;36903:131;:::i;:::-;36895:139;;36622:419;;;:::o;37047:178::-;37187:30;37183:1;37175:6;37171:14;37164:54;37047:178;:::o;37231:366::-;37373:3;37394:67;37458:2;37453:3;37394:67;:::i;:::-;37387:74;;37470:93;37559:3;37470:93;:::i;:::-;37588:2;37583:3;37579:12;37572:19;;37231:366;;;:::o;37603:419::-;37769:4;37807:2;37796:9;37792:18;37784:26;;37856:9;37850:4;37846:20;37842:1;37831:9;37827:17;37820:47;37884:131;38010:4;37884:131;:::i;:::-;37876:139;;37603:419;;;:::o;38028:180::-;38076:77;38073:1;38066:88;38173:4;38170:1;38163:15;38197:4;38194:1;38187:15;38214:191;38254:3;38273:20;38291:1;38273:20;:::i;:::-;38268:25;;38307:20;38325:1;38307:20;:::i;:::-;38302:25;;38350:1;38347;38343:9;38336:16;;38371:3;38368:1;38365:10;38362:36;;;38378:18;;:::i;:::-;38362:36;38214:191;;;;:::o;38411:226::-;38551:34;38547:1;38539:6;38535:14;38528:58;38620:9;38615:2;38607:6;38603:15;38596:34;38411:226;:::o;38643:366::-;38785:3;38806:67;38870:2;38865:3;38806:67;:::i;:::-;38799:74;;38882:93;38971:3;38882:93;:::i;:::-;39000:2;38995:3;38991:12;38984:19;;38643:366;;;:::o;39015:419::-;39181:4;39219:2;39208:9;39204:18;39196:26;;39268:9;39262:4;39258:20;39254:1;39243:9;39239:17;39232:47;39296:131;39422:4;39296:131;:::i;:::-;39288:139;;39015:419;;;:::o;39440:410::-;39480:7;39503:20;39521:1;39503:20;:::i;:::-;39498:25;;39537:20;39555:1;39537:20;:::i;:::-;39532:25;;39592:1;39589;39585:9;39614:30;39632:11;39614:30;:::i;:::-;39603:41;;39793:1;39784:7;39780:15;39777:1;39774:22;39754:1;39747:9;39727:83;39704:139;;39823:18;;:::i;:::-;39704:139;39488:362;39440:410;;;;:::o;39856:442::-;40005:4;40043:2;40032:9;40028:18;40020:26;;40056:71;40124:1;40113:9;40109:17;40100:6;40056:71;:::i;:::-;40137:72;40205:2;40194:9;40190:18;40181:6;40137:72;:::i;:::-;40219;40287:2;40276:9;40272:18;40263:6;40219:72;:::i;:::-;39856:442;;;;;;:::o;40304:137::-;40358:5;40389:6;40383:13;40374:22;;40405:30;40429:5;40405:30;:::i;:::-;40304:137;;;;:::o;40447:345::-;40514:6;40563:2;40551:9;40542:7;40538:23;40534:32;40531:119;;;40569:79;;:::i;:::-;40531:119;40689:1;40714:61;40767:7;40758:6;40747:9;40743:22;40714:61;:::i;:::-;40704:71;;40660:125;40447:345;;;;:::o;40798:390::-;40904:3;40932:39;40965:5;40932:39;:::i;:::-;40987:89;41069:6;41064:3;40987:89;:::i;:::-;40980:96;;41085:65;41143:6;41138:3;41131:4;41124:5;41120:16;41085:65;:::i;:::-;41175:6;41170:3;41166:16;41159:23;;40908:280;40798:390;;;;:::o;41194:178::-;41362:3;41357;41350:16;41194:178;:::o;41378:699::-;41648:3;41670:95;41761:3;41752:6;41670:95;:::i;:::-;41663:102;;41775:137;41908:3;41775:137;:::i;:::-;41937:1;41932:3;41928:11;41921:18;;41956:95;42047:3;42038:6;41956:95;:::i;:::-;41949:102;;42068:3;42061:10;;41378:699;;;;;:::o;42083:233::-;42122:3;42145:24;42163:5;42145:24;:::i;:::-;42136:33;;42191:66;42184:5;42181:77;42178:103;;42261:18;;:::i;:::-;42178:103;42308:1;42301:5;42297:13;42290:20;;42083:233;;;:::o;42322:225::-;42462:34;42458:1;42450:6;42446:14;42439:58;42531:8;42526:2;42518:6;42514:15;42507:33;42322:225;:::o;42553:366::-;42695:3;42716:67;42780:2;42775:3;42716:67;:::i;:::-;42709:74;;42792:93;42881:3;42792:93;:::i;:::-;42910:2;42905:3;42901:12;42894:19;;42553:366;;;:::o;42925:419::-;43091:4;43129:2;43118:9;43114:18;43106:26;;43178:9;43172:4;43168:20;43164:1;43153:9;43149:17;43142:47;43206:131;43332:4;43206:131;:::i;:::-;43198:139;;42925:419;;;:::o;43350:182::-;43490:34;43486:1;43478:6;43474:14;43467:58;43350:182;:::o;43538:366::-;43680:3;43701:67;43765:2;43760:3;43701:67;:::i;:::-;43694:74;;43777:93;43866:3;43777:93;:::i;:::-;43895:2;43890:3;43886:12;43879:19;;43538:366;;;:::o;43910:419::-;44076:4;44114:2;44103:9;44099:18;44091:26;;44163:9;44157:4;44153:20;44149:1;44138:9;44134:17;44127:47;44191:131;44317:4;44191:131;:::i;:::-;44183:139;;43910:419;;;:::o;44335:98::-;44386:6;44420:5;44414:12;44404:22;;44335:98;;;:::o;44439:168::-;44522:11;44556:6;44551:3;44544:19;44596:4;44591:3;44587:14;44572:29;;44439:168;;;;:::o;44613:373::-;44699:3;44727:38;44759:5;44727:38;:::i;:::-;44781:70;44844:6;44839:3;44781:70;:::i;:::-;44774:77;;44860:65;44918:6;44913:3;44906:4;44899:5;44895:16;44860:65;:::i;:::-;44950:29;44972:6;44950:29;:::i;:::-;44945:3;44941:39;44934:46;;44703:283;44613:373;;;;:::o;44992:640::-;45187:4;45225:3;45214:9;45210:19;45202:27;;45239:71;45307:1;45296:9;45292:17;45283:6;45239:71;:::i;:::-;45320:72;45388:2;45377:9;45373:18;45364:6;45320:72;:::i;:::-;45402;45470:2;45459:9;45455:18;45446:6;45402:72;:::i;:::-;45521:9;45515:4;45511:20;45506:2;45495:9;45491:18;45484:48;45549:76;45620:4;45611:6;45549:76;:::i;:::-;45541:84;;44992:640;;;;;;;:::o;45638:141::-;45694:5;45725:6;45719:13;45710:22;;45741:32;45767:5;45741:32;:::i;:::-;45638:141;;;;:::o;45785:349::-;45854:6;45903:2;45891:9;45882:7;45878:23;45874:32;45871:119;;;45909:79;;:::i;:::-;45871:119;46029:1;46054:63;46109:7;46100:6;46089:9;46085:22;46054:63;:::i;:::-;46044:73;;46000:127;45785:349;;;;:::o;46140:180::-;46188:77;46185:1;46178:88;46285:4;46282:1;46275:15;46309:4;46306:1;46299:15;46326:185;46366:1;46383:20;46401:1;46383:20;:::i;:::-;46378:25;;46417:20;46435:1;46417:20;:::i;:::-;46412:25;;46456:1;46446:35;;46461:18;;:::i;:::-;46446:35;46503:1;46500;46496:9;46491:14;;46326:185;;;;:::o;46517:194::-;46557:4;46577:20;46595:1;46577:20;:::i;:::-;46572:25;;46611:20;46629:1;46611:20;:::i;:::-;46606:25;;46655:1;46652;46648:9;46640:17;;46679:1;46673:4;46670:11;46667:37;;;46684:18;;:::i;:::-;46667:37;46517:194;;;;:::o;46717:176::-;46749:1;46766:20;46784:1;46766:20;:::i;:::-;46761:25;;46800:20;46818:1;46800:20;:::i;:::-;46795:25;;46839:1;46829:35;;46844:18;;:::i;:::-;46829:35;46885:1;46882;46878:9;46873:14;;46717:176;;;;:::o
Swarm Source
ipfs://066aaaaf2587b1dd2a0885053653ec957983c45f4cba787790a06471dbe1f8bc
Loading...
Loading
Loading...
Loading
[ 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.