ERC-721
Overview
Max Total Supply
58 NOJI
Holders
31
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 NOJILoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Noji
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-24 */ 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/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/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: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // 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: @openzeppelin/contracts/interfaces/IERC20.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; // File: Noji/IERC721A.sol // ERC721A Contracts v4.2.2 // 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(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * 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; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @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; /** * @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; /** * @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: Noji/ERC721A.sol // ERC721A Contracts v4.2.2 // 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 { // Reference type for token approval. 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 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 { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _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 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 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 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`. ) 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 0x80 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // 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: Noji/Noji.sol pragma solidity ^0.8.4; contract Noji is ERC721A, IERC2981, Ownable { using Strings for uint256; uint256 public MAX_SUPPLY = 3000; uint256 public MAX_SALE_SUPPLY = 1500; uint256 public MAX_NOJI_PER_WALLET = 2; uint256 public OGLIST_SALE_PRICE = 0.059 ether; uint256 public WHITELIST_SALE_PRICE = 0.059 ether; uint256 public PUBLIC_SALE_PRICE = 0.059 ether; uint96 public royaltyFeesInBips = 700; address public royaltyAddress; string baseURI; string public placeholderTokenUri; bool public isRevealed = false; bool public isPaused = true; bool public isOGListMintActive = false; bool public isWhiteListMintActive = false; bool public isPublicMintActive = false; bool public isTeamMintActive = false; bool public isAirdropClaimActive = false; bytes32 public ogListMerkleRoot; bytes32 public whiteListMerkleRoot; bytes32 public teamListMerkleRoot; struct airdropData { uint256 qty; bool hasClaimed; } mapping(address => bool) public teamListClaimed; mapping(address => uint256) nojiPerAddress; mapping(address => airdropData) airdropList; modifier callerIsUser() { require(tx.origin == msg.sender, "Caller is another contract"); _; } modifier mintIsActive(bool category) { require(!isPaused, "Minting paused"); require(category, "List minting not active"); _; } modifier canAfford(uint256 categoryPrice, uint256 qty) { require(msg.value >= categoryPrice * qty, "Insufficient Funds"); _; } modifier canMint(uint256 qty) { require(qty > 0, "Mint at least 1 Noji"); require( totalSupply() + qty <= MAX_SALE_SUPPLY, "Cannot mint beyound Max Supply" ); require( nojiPerAddress[msg.sender] + qty <= MAX_NOJI_PER_WALLET, "Max Noji per Wallet exceded" ); _; } modifier isValidMerkleProof( bytes32[] calldata merkleProof, bytes32 merkleRoot ) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require( MerkleProof.verify(merkleProof, merkleRoot, leaf), "Address not listed" ); _; } constructor() ERC721A("Noji", "NOJI") { royaltyAddress = owner(); _safeMint(owner(), 15); } function publicMint(uint256 qty) public payable callerIsUser mintIsActive(isPublicMintActive) canAfford(PUBLIC_SALE_PRICE, qty) canMint(qty) { _safeMint(msg.sender, qty); } function oglistMint(uint256 qty, bytes32[] calldata merkleProof) public payable callerIsUser mintIsActive(isOGListMintActive) canAfford(OGLIST_SALE_PRICE, qty) canMint(qty) isValidMerkleProof(merkleProof, ogListMerkleRoot) { _safeMint(msg.sender, qty); } function whitelistMint(uint256 qty, bytes32[] calldata merkleProof) public payable callerIsUser mintIsActive(isWhiteListMintActive) canAfford(WHITELIST_SALE_PRICE, qty) canMint(qty) isValidMerkleProof(merkleProof, whiteListMerkleRoot) { _safeMint(msg.sender, qty); } function teamMint(bytes32[] calldata merkleProof) public callerIsUser mintIsActive(isTeamMintActive) canMint(1) isValidMerkleProof(merkleProof, teamListMerkleRoot) { require(!teamListClaimed[msg.sender], "Noji already claimed"); teamListClaimed[msg.sender] = true; _safeMint(msg.sender, 1); } function claimAirdrop() public callerIsUser mintIsActive(isAirdropClaimActive) { require(airdropList[msg.sender].qty > 0, "No airdrop to claim"); require(!airdropList[msg.sender].hasClaimed, "Airdrop already claimed"); _safeMint(msg.sender, airdropList[msg.sender].qty); } function togglePause() external onlyOwner { isPaused = !isPaused; } function toggleOGListMint() external onlyOwner { isOGListMintActive = !isOGListMintActive; } function toggleWhiteListMint() external onlyOwner { isWhiteListMintActive = !isWhiteListMintActive; } function togglePublicMint() external onlyOwner { isPublicMintActive = !isPublicMintActive; } function toggleTeamMint() external onlyOwner { isTeamMintActive = !isTeamMintActive; } function toggleAirdopClaim() external onlyOwner { isAirdropClaimActive = !isAirdropClaimActive; } function _baseURI() internal view override returns (string memory) { return baseURI; } function setBaseURI(string memory uri) public onlyOwner { baseURI = uri; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "nonexistent token"); if (!isRevealed) { return placeholderTokenUri; } return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : ""; } function setPlaceHolderTokenUri(string memory uri) external onlyOwner { placeholderTokenUri = uri; } function toggleReveal() public onlyOwner { isRevealed = !isRevealed; } function setMaxSupply(uint256 supply) external onlyOwner { MAX_SUPPLY = supply; } function setMaxSaleSupply(uint256 supply) external onlyOwner { MAX_SALE_SUPPLY = supply; } function setOGListMerkleRoot(bytes32 merkleRoot) external onlyOwner { ogListMerkleRoot = merkleRoot; } function setWhiteListMerkleRoot(bytes32 merkleRoot) external onlyOwner { whiteListMerkleRoot = merkleRoot; } function setTeamListMerkleRoot(bytes32 merkleRoot) external onlyOwner { teamListMerkleRoot = merkleRoot; } function setMaxNojiPerWallet(uint256 num) public onlyOwner { MAX_NOJI_PER_WALLET = num; } function setAirdropList(address[] memory addresses, uint256[] memory qtys) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { require(addresses[i] != address(0), "ZERO_ADDRESS"); if (airdropList[addresses[i]].qty == 0) { airdropData memory data; data.qty = qtys[i]; data.hasClaimed = false; airdropList[addresses[i]] = data; } } } function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual override returns (address receiver, uint256 royaltyAmount) { return (royaltyAddress, (salePrice * royaltyFeesInBips) / 10000); } function setRoyaltyInfo(address receiver, uint8 _royaltyFeesInBips) public onlyOwner { require(_royaltyFeesInBips <= 10000, "Royalty fee high"); royaltyAddress = receiver; royaltyFeesInBips = _royaltyFeesInBips; } function withdraw() external onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "No payout to withdraw"); (bool success, ) = payable(msg.sender).call{value: balance}(""); require(success, "Withdrawal failed"); } function withdrawTokens(IERC20 token) public onlyOwner { uint256 balance = token.balanceOf(address(this)); token.transfer(msg.sender, balance); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } receive() 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":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NOJI_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OGLIST_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAirdropClaimActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOGListMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTeamMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhiteListMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"oglistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyFeesInBips","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"qtys","type":"uint256[]"}],"name":"setAirdropList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setMaxNojiPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxSaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setOGListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setPlaceHolderTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint8","name":"_royaltyFeesInBips","type":"uint8"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setTeamListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhiteListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"teamListClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleAirdopClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleOGListMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleTeamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteListMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052610bb86009556105dc600a556002600b5566d19c2ff9bf8000600c5566d19c2ff9bf8000600d5566d19c2ff9bf8000600e556102bc600f60006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506000601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff0219169083151502179055506000601260026101000a81548160ff0219169083151502179055506000601260036101000a81548160ff0219169083151502179055506000601260046101000a81548160ff0219169083151502179055506000601260056101000a81548160ff0219169083151502179055506000601260066101000a81548160ff0219169083151502179055503480156200013357600080fd5b506040518060400160405280600481526020017f4e6f6a69000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e4f4a49000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001b892919062000826565b508060039080519060200190620001d192919062000826565b50620001e26200028260201b60201c565b60008190555050506200020a620001fe6200028760201b60201c565b6200028f60201b60201c565b6200021a6200035560201b60201c565b600f600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200027c6200026e6200035560201b60201c565b600f6200037f60201b60201c565b62000b26565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620003a1828260405180602001604052806000815250620003a560201b60201c565b5050565b620003b783836200045660201b60201c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146200045157600080549050600083820390505b6200040060008683806001019450866200063d60201b60201c565b62000437576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110620003e55781600054146200044e57600080fd5b50505b505050565b6000805490506000820362000497576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620004ac60008483856200079e60201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506200053b836200051d6000866000620007a460201b60201c565b6200052e85620007d460201b60201c565b17620007e460201b60201c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114620005de57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050620005a1565b50600082036200061a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506200063860008483856200080f60201b60201c565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200066b6200081560201b60201c565b8786866040518563ffffffff1660e01b81526004016200068f9493929190620009da565b6020604051808303816000875af1925050508015620006ce57506040513d601f19601f82011682018060405250810190620006cb919062000a90565b60015b6200074b573d806000811462000701576040519150601f19603f3d011682016040523d82523d6000602084013e62000706565b606091505b50600081510362000743576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b60008060e883901c905060e8620007c38686846200081d60201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b828054620008349062000af1565b90600052602060002090601f016020900481019282620008585760008555620008a4565b82601f106200087357805160ff1916838001178555620008a4565b82800160010185558215620008a4579182015b82811115620008a357825182559160200191906001019062000886565b5b509050620008b39190620008b7565b5090565b5b80821115620008d2576000816000905550600101620008b8565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200090382620008d6565b9050919050565b6200091581620008f6565b82525050565b6000819050919050565b62000930816200091b565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156200097257808201518184015260208101905062000955565b8381111562000982576000848401525b50505050565b6000601f19601f8301169050919050565b6000620009a68262000936565b620009b2818562000941565b9350620009c481856020860162000952565b620009cf8162000988565b840191505092915050565b6000608082019050620009f160008301876200090a565b62000a0060208301866200090a565b62000a0f604083018562000925565b818103606083015262000a23818462000999565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000a6a8162000a33565b811462000a7657600080fd5b50565b60008151905062000a8a8162000a5f565b92915050565b60006020828403121562000aa95762000aa862000a2e565b5b600062000ab98482850162000a79565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b0a57607f821691505b60208210810362000b205762000b1f62000ac2565b5b50919050565b61567b8062000b366000396000f3fe6080604052600436106103b15760003560e01c80636352211e116101e7578063b0d5f8a21161010d578063cf0ea25e116100a0578063e985e9c51161006f578063e985e9c514610cd1578063ea75127614610d0e578063f2fde38b14610d4b578063fb6800d114610d74576103b8565b8063cf0ea25e14610c4a578063d2a87a0014610c61578063d2cab05614610c8c578063e08e65ea14610ca8576103b8565b8063c4ae3168116100dc578063c4ae316814610ba2578063c519ae2b14610bb9578063c87b56dd14610be4578063cb30bc2e14610c21576103b8565b8063b0d5f8a214610af8578063b187bd2614610b23578063b88d4fde14610b4e578063bc912e1a14610b77576103b8565b80638c5ccdf611610185578063a3f832a611610154578063a3f832a614610a52578063a9a10d8214610a7b578063aa1906e714610aa4578063ad2f852a14610acd576103b8565b80638c5ccdf6146109bc5780638da5cb5b146109d357806395d89b41146109fe578063a22cb46514610a29576103b8565b8063715018a6116101c1578063715018a61461092657806373c7400e1461093d5780637a067977146109685780638361330214610993576103b8565b80636352211e146108835780636f8b44b0146108c057806370a08231146108e9576103b8565b80632d6b6224116102d757806349df728c1161026a578063571fe01611610239578063571fe0161461080157806357a174111461082c5780635b88349d146108555780635b8ad4291461086c576103b8565b806349df728c146107595780634cf5f7a41461078257806354214f69146107ad57806355f804b3146107d8576103b8565b806334b6ab1a116102a657806334b6ab1a146106d75780633ccfd60b146107025780634047638d1461071957806342842e0e14610730576103b8565b80632d6b62241461063c5780632d7ac7dd146106675780632db115441461069057806332cb6b0c146106ac576103b8565b8063106466f31161034f57806318160ddd1161031e57806318160ddd1461057f57806323b872dd146105aa5780632a55205a146105d35780632cb952d314610611576103b8565b8063106466f3146104fb5780631113ba581461051257806311bd4c8a1461053d578063167ae36214610554576103b8565b806307e89ec01161038b57806307e89ec01461044e578063081812fc1461047957806308bac694146104b6578063095ea7b3146104d2576103b8565b806301a21756146103bd57806301ffc9a7146103e657806306fdde0314610423576103b8565b366103b857005b600080fd5b3480156103c957600080fd5b506103e460048036038101906103df9190613d88565b610d9f565b005b3480156103f257600080fd5b5061040d60048036038101906104089190613e20565b610e68565b60405161041a9190613e68565b60405180910390f35b34801561042f57600080fd5b50610438610ee2565b6040516104459190613f1c565b60405180910390f35b34801561045a57600080fd5b50610463610f74565b6040516104709190613f57565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b9190613f9e565b610f7a565b6040516104ad9190613fda565b60405180910390f35b6104d060048036038101906104cb919061405a565b610ff9565b005b3480156104de57600080fd5b506104f960048036038101906104f491906140ba565b611355565b005b34801561050757600080fd5b50610510611499565b005b34801561051e57600080fd5b506105276114cd565b6040516105349190613f57565b60405180910390f35b34801561054957600080fd5b506105526114d3565b005b34801561056057600080fd5b50610569611507565b6040516105769190614113565b60405180910390f35b34801561058b57600080fd5b5061059461150d565b6040516105a19190613f57565b60405180910390f35b3480156105b657600080fd5b506105d160048036038101906105cc919061412e565b611524565b005b3480156105df57600080fd5b506105fa60048036038101906105f59190614181565b611846565b6040516106089291906141c1565b60405180910390f35b34801561061d57600080fd5b506106266118b8565b6040516106339190613e68565b60405180910390f35b34801561064857600080fd5b506106516118cb565b60405161065e9190613e68565b60405180910390f35b34801561067357600080fd5b5061068e600480360381019061068991906143eb565b6118de565b005b6106aa60048036038101906106a59190613f9e565b611abd565b005b3480156106b857600080fd5b506106c1611d58565b6040516106ce9190613f57565b60405180910390f35b3480156106e357600080fd5b506106ec611d5e565b6040516106f99190614113565b60405180910390f35b34801561070e57600080fd5b50610717611d64565b005b34801561072557600080fd5b5061072e611e64565b005b34801561073c57600080fd5b506107576004803603810190610752919061412e565b611e98565b005b34801561076557600080fd5b50610780600480360381019061077b91906144a1565b611eb8565b005b34801561078e57600080fd5b50610797611fc1565b6040516107a49190613f1c565b60405180910390f35b3480156107b957600080fd5b506107c261204f565b6040516107cf9190613e68565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa9190614583565b612062565b005b34801561080d57600080fd5b50610816612084565b6040516108239190613f57565b60405180910390f35b34801561083857600080fd5b50610853600480360381019061084e9190614583565b61208a565b005b34801561086157600080fd5b5061086a6120ac565b005b34801561087857600080fd5b5061088161231e565b005b34801561088f57600080fd5b506108aa60048036038101906108a59190613f9e565b612352565b6040516108b79190613fda565b60405180910390f35b3480156108cc57600080fd5b506108e760048036038101906108e29190613f9e565b612364565b005b3480156108f557600080fd5b50610910600480360381019061090b91906145cc565b612376565b60405161091d9190613f57565b60405180910390f35b34801561093257600080fd5b5061093b61242e565b005b34801561094957600080fd5b50610952612442565b60405161095f9190614620565b60405180910390f35b34801561097457600080fd5b5061097d612460565b60405161098a9190613f57565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190614667565b612466565b005b3480156109c857600080fd5b506109d1612478565b005b3480156109df57600080fd5b506109e86124ac565b6040516109f59190613fda565b60405180910390f35b348015610a0a57600080fd5b50610a136124d6565b604051610a209190613f1c565b60405180910390f35b348015610a3557600080fd5b50610a506004803603810190610a4b91906146c0565b612568565b005b348015610a5e57600080fd5b50610a796004803603810190610a749190613f9e565b6126df565b005b348015610a8757600080fd5b50610aa26004803603810190610a9d9190614667565b6126f1565b005b348015610ab057600080fd5b50610acb6004803603810190610ac69190613f9e565b612703565b005b348015610ad957600080fd5b50610ae2612715565b604051610aef9190613fda565b60405180910390f35b348015610b0457600080fd5b50610b0d61273b565b604051610b1a9190613e68565b60405180910390f35b348015610b2f57600080fd5b50610b3861274e565b604051610b459190613e68565b60405180910390f35b348015610b5a57600080fd5b50610b756004803603810190610b7091906147a1565b612761565b005b348015610b8357600080fd5b50610b8c6127d4565b604051610b999190613f57565b60405180910390f35b348015610bae57600080fd5b50610bb76127da565b005b348015610bc557600080fd5b50610bce61280e565b604051610bdb9190613e68565b60405180910390f35b348015610bf057600080fd5b50610c0b6004803603810190610c069190613f9e565b612821565b604051610c189190613f1c565b60405180910390f35b348015610c2d57600080fd5b50610c486004803603810190610c439190614824565b612970565b005b348015610c5657600080fd5b50610c5f612d5e565b005b348015610c6d57600080fd5b50610c76612d92565b604051610c839190613e68565b60405180910390f35b610ca66004803603810190610ca1919061405a565b612da5565b005b348015610cb457600080fd5b50610ccf6004803603810190610cca9190614667565b613101565b005b348015610cdd57600080fd5b50610cf86004803603810190610cf39190614871565b613113565b604051610d059190613e68565b60405180910390f35b348015610d1a57600080fd5b50610d356004803603810190610d3091906145cc565b6131a7565b604051610d429190613e68565b60405180910390f35b348015610d5757600080fd5b50610d726004803603810190610d6d91906145cc565b6131c7565b005b348015610d8057600080fd5b50610d8961324a565b604051610d969190614113565b60405180910390f35b610da7613250565b6127108160ff161115610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de6906148fd565b60405180910390fd5b81600f600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060ff16600f60006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610edb5750610eda826132ce565b5b9050919050565b606060028054610ef19061494c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1d9061494c565b8015610f6a5780601f10610f3f57610100808354040283529160200191610f6a565b820191906000526020600020905b815481529060010190602001808311610f4d57829003601f168201915b5050505050905090565b600e5481565b6000610f8582613360565b610fbb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e906149c9565b60405180910390fd5b601260029054906101000a900460ff16601260019054906101000a900460ff16156110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be90614a35565b60405180910390fd5b80611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe90614aa1565b60405180910390fd5b600c548480826111179190614af0565b341015611159576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115090614b96565b60405180910390fd5b856000811161119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490614c02565b60405180910390fd5b600a54816111a961150d565b6111b39190614c22565b11156111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90614cc4565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112429190614c22565b1115611283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127a90614d30565b60405180910390fd5b858560135460003360405160200161129b9190614d98565b6040516020818303038152906040528051906020012090506112ff848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083836133bf565b61133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590614dff565b60405180910390fd5b611348338c6133d6565b5050505050505050505050565b600061136082612352565b90508073ffffffffffffffffffffffffffffffffffffffff166113816133f4565b73ffffffffffffffffffffffffffffffffffffffff16146113e4576113ad816113a86133f4565b613113565b6113e3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6114a1613250565b601260039054906101000a900460ff1615601260036101000a81548160ff021916908315150217905550565b600c5481565b6114db613250565b601260069054906101000a900460ff1615601260066101000a81548160ff021916908315150217905550565b60155481565b60006115176133fc565b6001546000540303905090565b600061152f82613401565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611596576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806115a2846134cd565b915091506115b881876115b36133f4565b6134f4565b611604576115cd866115c86133f4565b613113565b611603576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361166a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116778686866001613538565b801561168257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506117508561172c88888761353e565b7c020000000000000000000000000000000000000000000000000000000017613566565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036117d657600060018501905060006004600083815260200190815260200160002054036117d45760005481146117d3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461183e8686866001613591565b505050505050565b600080600f600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600f60009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16856118a39190614af0565b6118ad9190614e4e565b915091509250929050565b601260069054906101000a900460ff1681565b601260049054906101000a900460ff1681565b6118e6613250565b60005b8251811015611ab857600073ffffffffffffffffffffffffffffffffffffffff1683828151811061191d5761191c614e7f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290614efa565b60405180910390fd5b60006018600085848151811061199457611993614e7f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403611aa5576119e7613c1e565b8282815181106119fa576119f9614e7f565b5b602002602001015181600001818152505060008160200190151590811515815250508060186000868581518110611a3457611a33614e7f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908315150217905550905050505b8080611ab090614f1a565b9150506118e9565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b22906149c9565b60405180910390fd5b601260049054906101000a900460ff16601260019054906101000a900460ff1615611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290614a35565b60405180910390fd5b80611bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc290614aa1565b60405180910390fd5b600e54828082611bdb9190614af0565b341015611c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1490614b96565b60405180910390fd5b8360008111611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5890614c02565b60405180910390fd5b600a5481611c6d61150d565b611c779190614c22565b1115611cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caf90614cc4565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d069190614c22565b1115611d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e90614d30565b60405180910390fd5b611d5133866133d6565b5050505050565b60095481565b60145481565b611d6c613250565b600047905060008111611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab90614fae565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051611dda90614fff565b60006040518083038185875af1925050503d8060008114611e17576040519150601f19603f3d011682016040523d82523d6000602084013e611e1c565b606091505b5050905080611e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5790615060565b60405180910390fd5b5050565b611e6c613250565b601260049054906101000a900460ff1615601260046101000a81548160ff021916908315150217905550565b611eb383838360405180602001604052806000815250612761565b505050565b611ec0613250565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611efb9190613fda565b602060405180830381865afa158015611f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3c9190615095565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611f799291906141c1565b6020604051808303816000875af1158015611f98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fbc91906150d7565b505050565b60118054611fce9061494c565b80601f0160208091040260200160405190810160405280929190818152602001828054611ffa9061494c565b80156120475780601f1061201c57610100808354040283529160200191612047565b820191906000526020600020905b81548152906001019060200180831161202a57829003601f168201915b505050505081565b601260009054906101000a900460ff1681565b61206a613250565b8060109080519060200190612080929190613c3a565b5050565b600a5481565b612092613250565b80601190805190602001906120a8929190613c3a565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461211a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612111906149c9565b60405180910390fd5b601260069054906101000a900460ff16601260019054906101000a900460ff161561217a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217190614a35565b60405180910390fd5b806121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b190614aa1565b60405180910390fd5b6000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541161223f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223690615150565b60405180910390fd5b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16156122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c6906151bc565b60405180910390fd5b61231b33601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546133d6565b50565b612326613250565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b600061235d82613401565b9050919050565b61236c613250565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123dd576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b612436613250565b6124406000613597565b565b600f60009054906101000a90046bffffffffffffffffffffffff1681565b600b5481565b61246e613250565b8060158190555050565b612480613250565b601260059054906101000a900460ff1615601260056101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546124e59061494c565b80601f01602080910402602001604051908101604052809291908181526020018280546125119061494c565b801561255e5780601f106125335761010080835404028352916020019161255e565b820191906000526020600020905b81548152906001019060200180831161254157829003601f168201915b5050505050905090565b6125706133f4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125d4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006125e16133f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661268e6133f4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126d39190613e68565b60405180910390a35050565b6126e7613250565b80600b8190555050565b6126f9613250565b8060138190555050565b61270b613250565b80600a8190555050565b600f600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260029054906101000a900460ff1681565b601260019054906101000a900460ff1681565b61276c848484611524565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127ce576127978484848461365d565b6127cd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600d5481565b6127e2613250565b601260019054906101000a900460ff1615601260016101000a81548160ff021916908315150217905550565b601260039054906101000a900460ff1681565b606061282c82613360565b61286b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286290615228565b60405180910390fd5b601260009054906101000a900460ff16612911576011805461288c9061494c565b80601f01602080910402602001604051908101604052809291908181526020018280546128b89061494c565b80156129055780601f106128da57610100808354040283529160200191612905565b820191906000526020600020905b8154815290600101906020018083116128e857829003601f168201915b5050505050905061296b565b6000601080546129209061494c565b90501161293c5760405180602001604052806000815250612968565b6010612947836137ad565b604051602001612958929190615364565b6040516020818303038152906040525b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146129de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d5906149c9565b60405180910390fd5b601260059054906101000a900460ff16601260019054906101000a900460ff1615612a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3590614a35565b60405180910390fd5b80612a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7590614aa1565b60405180910390fd5b600160008111612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba90614c02565b60405180910390fd5b600a5481612acf61150d565b612ad99190614c22565b1115612b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1190614cc4565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b689190614c22565b1115612ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba090614d30565b60405180910390fd5b8383601554600033604051602001612bc19190614d98565b604051602081830303815290604052805190602001209050612c25848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083836133bf565b612c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5b90614dff565b60405180910390fd5b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce8906153df565b60405180910390fd5b6001601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612d543360016133d6565b5050505050505050565b612d66613250565b601260029054906101000a900460ff1615601260026101000a81548160ff021916908315150217905550565b601260059054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a906149c9565b60405180910390fd5b601260039054906101000a900460ff16601260019054906101000a900460ff1615612e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6a90614a35565b60405180910390fd5b80612eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eaa90614aa1565b60405180910390fd5b600d54848082612ec39190614af0565b341015612f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efc90614b96565b60405180910390fd5b8560008111612f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4090614c02565b60405180910390fd5b600a5481612f5561150d565b612f5f9190614c22565b1115612fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9790614cc4565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fee9190614c22565b111561302f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302690614d30565b60405180910390fd5b85856014546000336040516020016130479190614d98565b6040516020818303038152906040528051906020012090506130ab848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083836133bf565b6130ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e190614dff565b60405180910390fd5b6130f4338c6133d6565b5050505050505050505050565b613109613250565b8060148190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60166020528060005260406000206000915054906101000a900460ff1681565b6131cf613250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361323e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323590615471565b60405180910390fd5b61324781613597565b50565b60135481565b61325861390d565b73ffffffffffffffffffffffffffffffffffffffff166132766124ac565b73ffffffffffffffffffffffffffffffffffffffff16146132cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c3906154dd565b60405180910390fd5b565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061332957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133595750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008161336b6133fc565b1115801561337a575060005482105b80156133b8575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000826133cc8584613915565b1490509392505050565b6133f082826040518060200160405280600081525061396b565b5050565b600033905090565b600090565b600080829050806134106133fc565b11613496576000548110156134955760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603613493575b6000810361348957600460008360019003935083815260200190815260200160002054905061345f565b80925050506134c8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613555868684613a08565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136836133f4565b8786866040518563ffffffff1660e01b81526004016136a59493929190615552565b6020604051808303816000875af19250505080156136e157506040513d601f19601f820116820180604052508101906136de91906155b3565b60015b61375a573d8060008114613711576040519150601f19603f3d011682016040523d82523d6000602084013e613716565b606091505b506000815103613752576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082036137f4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613908565b600082905060005b6000821461382657808061380f90614f1a565b915050600a8261381f9190614e4e565b91506137fc565b60008167ffffffffffffffff811115613842576138416141ea565b5b6040519080825280601f01601f1916602001820160405280156138745781602001600182028036833780820191505090505b5090505b600085146139015760018261388d91906155e0565b9150600a8561389c9190615614565b60306138a89190614c22565b60f81b8183815181106138be576138bd614e7f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138fa9190614e4e565b9450613878565b8093505050505b919050565b600033905090565b60008082905060005b84518110156139605761394b8286838151811061393e5761393d614e7f565b5b6020026020010151613a11565b9150808061395890614f1a565b91505061391e565b508091505092915050565b6139758383613a3c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613a0357600080549050600083820390505b6139b5600086838060010194508661365d565b6139eb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106139a2578160005414613a0057600080fd5b50505b505050565b60009392505050565b6000818310613a2957613a248284613bf7565b613a34565b613a338383613bf7565b5b905092915050565b60008054905060008203613a7c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613a896000848385613538565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613b0083613af1600086600061353e565b613afa85613c0e565b17613566565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613ba157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613b66565b5060008203613bdc576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613bf26000848385613591565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6040518060400160405280600081526020016000151581525090565b828054613c469061494c565b90600052602060002090601f016020900481019282613c685760008555613caf565b82601f10613c8157805160ff1916838001178555613caf565b82800160010185558215613caf579182015b82811115613cae578251825591602001919060010190613c93565b5b509050613cbc9190613cc0565b5090565b5b80821115613cd9576000816000905550600101613cc1565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d1c82613cf1565b9050919050565b613d2c81613d11565b8114613d3757600080fd5b50565b600081359050613d4981613d23565b92915050565b600060ff82169050919050565b613d6581613d4f565b8114613d7057600080fd5b50565b600081359050613d8281613d5c565b92915050565b60008060408385031215613d9f57613d9e613ce7565b5b6000613dad85828601613d3a565b9250506020613dbe85828601613d73565b9150509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dfd81613dc8565b8114613e0857600080fd5b50565b600081359050613e1a81613df4565b92915050565b600060208284031215613e3657613e35613ce7565b5b6000613e4484828501613e0b565b91505092915050565b60008115159050919050565b613e6281613e4d565b82525050565b6000602082019050613e7d6000830184613e59565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ebd578082015181840152602081019050613ea2565b83811115613ecc576000848401525b50505050565b6000601f19601f8301169050919050565b6000613eee82613e83565b613ef88185613e8e565b9350613f08818560208601613e9f565b613f1181613ed2565b840191505092915050565b60006020820190508181036000830152613f368184613ee3565b905092915050565b6000819050919050565b613f5181613f3e565b82525050565b6000602082019050613f6c6000830184613f48565b92915050565b613f7b81613f3e565b8114613f8657600080fd5b50565b600081359050613f9881613f72565b92915050565b600060208284031215613fb457613fb3613ce7565b5b6000613fc284828501613f89565b91505092915050565b613fd481613d11565b82525050565b6000602082019050613fef6000830184613fcb565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261401a57614019613ff5565b5b8235905067ffffffffffffffff81111561403757614036613ffa565b5b60208301915083602082028301111561405357614052613fff565b5b9250929050565b60008060006040848603121561407357614072613ce7565b5b600061408186828701613f89565b935050602084013567ffffffffffffffff8111156140a2576140a1613cec565b5b6140ae86828701614004565b92509250509250925092565b600080604083850312156140d1576140d0613ce7565b5b60006140df85828601613d3a565b92505060206140f085828601613f89565b9150509250929050565b6000819050919050565b61410d816140fa565b82525050565b60006020820190506141286000830184614104565b92915050565b60008060006060848603121561414757614146613ce7565b5b600061415586828701613d3a565b935050602061416686828701613d3a565b925050604061417786828701613f89565b9150509250925092565b6000806040838503121561419857614197613ce7565b5b60006141a685828601613f89565b92505060206141b785828601613f89565b9150509250929050565b60006040820190506141d66000830185613fcb565b6141e36020830184613f48565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61422282613ed2565b810181811067ffffffffffffffff82111715614241576142406141ea565b5b80604052505050565b6000614254613cdd565b90506142608282614219565b919050565b600067ffffffffffffffff8211156142805761427f6141ea565b5b602082029050602081019050919050565b60006142a461429f84614265565b61424a565b905080838252602082019050602084028301858111156142c7576142c6613fff565b5b835b818110156142f057806142dc8882613d3a565b8452602084019350506020810190506142c9565b5050509392505050565b600082601f83011261430f5761430e613ff5565b5b813561431f848260208601614291565b91505092915050565b600067ffffffffffffffff821115614343576143426141ea565b5b602082029050602081019050919050565b600061436761436284614328565b61424a565b9050808382526020820190506020840283018581111561438a57614389613fff565b5b835b818110156143b3578061439f8882613f89565b84526020840193505060208101905061438c565b5050509392505050565b600082601f8301126143d2576143d1613ff5565b5b81356143e2848260208601614354565b91505092915050565b6000806040838503121561440257614401613ce7565b5b600083013567ffffffffffffffff8111156144205761441f613cec565b5b61442c858286016142fa565b925050602083013567ffffffffffffffff81111561444d5761444c613cec565b5b614459858286016143bd565b9150509250929050565b600061446e82613d11565b9050919050565b61447e81614463565b811461448957600080fd5b50565b60008135905061449b81614475565b92915050565b6000602082840312156144b7576144b6613ce7565b5b60006144c58482850161448c565b91505092915050565b600080fd5b600067ffffffffffffffff8211156144ee576144ed6141ea565b5b6144f782613ed2565b9050602081019050919050565b82818337600083830152505050565b6000614526614521846144d3565b61424a565b905082815260208101848484011115614542576145416144ce565b5b61454d848285614504565b509392505050565b600082601f83011261456a57614569613ff5565b5b813561457a848260208601614513565b91505092915050565b60006020828403121561459957614598613ce7565b5b600082013567ffffffffffffffff8111156145b7576145b6613cec565b5b6145c384828501614555565b91505092915050565b6000602082840312156145e2576145e1613ce7565b5b60006145f084828501613d3a565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b61461a816145f9565b82525050565b60006020820190506146356000830184614611565b92915050565b614644816140fa565b811461464f57600080fd5b50565b6000813590506146618161463b565b92915050565b60006020828403121561467d5761467c613ce7565b5b600061468b84828501614652565b91505092915050565b61469d81613e4d565b81146146a857600080fd5b50565b6000813590506146ba81614694565b92915050565b600080604083850312156146d7576146d6613ce7565b5b60006146e585828601613d3a565b92505060206146f6858286016146ab565b9150509250929050565b600067ffffffffffffffff82111561471b5761471a6141ea565b5b61472482613ed2565b9050602081019050919050565b600061474461473f84614700565b61424a565b9050828152602081018484840111156147605761475f6144ce565b5b61476b848285614504565b509392505050565b600082601f83011261478857614787613ff5565b5b8135614798848260208601614731565b91505092915050565b600080600080608085870312156147bb576147ba613ce7565b5b60006147c987828801613d3a565b94505060206147da87828801613d3a565b93505060406147eb87828801613f89565b925050606085013567ffffffffffffffff81111561480c5761480b613cec565b5b61481887828801614773565b91505092959194509250565b6000806020838503121561483b5761483a613ce7565b5b600083013567ffffffffffffffff81111561485957614858613cec565b5b61486585828601614004565b92509250509250929050565b6000806040838503121561488857614887613ce7565b5b600061489685828601613d3a565b92505060206148a785828601613d3a565b9150509250929050565b7f526f79616c747920666565206869676800000000000000000000000000000000600082015250565b60006148e7601083613e8e565b91506148f2826148b1565b602082019050919050565b60006020820190508181036000830152614916816148da565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061496457607f821691505b6020821081036149775761497661491d565b5b50919050565b7f43616c6c657220697320616e6f7468657220636f6e7472616374000000000000600082015250565b60006149b3601a83613e8e565b91506149be8261497d565b602082019050919050565b600060208201905081810360008301526149e2816149a6565b9050919050565b7f4d696e74696e6720706175736564000000000000000000000000000000000000600082015250565b6000614a1f600e83613e8e565b9150614a2a826149e9565b602082019050919050565b60006020820190508181036000830152614a4e81614a12565b9050919050565b7f4c697374206d696e74696e67206e6f7420616374697665000000000000000000600082015250565b6000614a8b601783613e8e565b9150614a9682614a55565b602082019050919050565b60006020820190508181036000830152614aba81614a7e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614afb82613f3e565b9150614b0683613f3e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b3f57614b3e614ac1565b5b828202905092915050565b7f496e73756666696369656e742046756e64730000000000000000000000000000600082015250565b6000614b80601283613e8e565b9150614b8b82614b4a565b602082019050919050565b60006020820190508181036000830152614baf81614b73565b9050919050565b7f4d696e74206174206c656173742031204e6f6a69000000000000000000000000600082015250565b6000614bec601483613e8e565b9150614bf782614bb6565b602082019050919050565b60006020820190508181036000830152614c1b81614bdf565b9050919050565b6000614c2d82613f3e565b9150614c3883613f3e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c6d57614c6c614ac1565b5b828201905092915050565b7f43616e6e6f74206d696e74206265796f756e64204d617820537570706c790000600082015250565b6000614cae601e83613e8e565b9150614cb982614c78565b602082019050919050565b60006020820190508181036000830152614cdd81614ca1565b9050919050565b7f4d6178204e6f6a69207065722057616c6c657420657863656465640000000000600082015250565b6000614d1a601b83613e8e565b9150614d2582614ce4565b602082019050919050565b60006020820190508181036000830152614d4981614d0d565b9050919050565b60008160601b9050919050565b6000614d6882614d50565b9050919050565b6000614d7a82614d5d565b9050919050565b614d92614d8d82613d11565b614d6f565b82525050565b6000614da48284614d81565b60148201915081905092915050565b7f41646472657373206e6f74206c69737465640000000000000000000000000000600082015250565b6000614de9601283613e8e565b9150614df482614db3565b602082019050919050565b60006020820190508181036000830152614e1881614ddc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e5982613f3e565b9150614e6483613f3e565b925082614e7457614e73614e1f565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5a45524f5f414444524553530000000000000000000000000000000000000000600082015250565b6000614ee4600c83613e8e565b9150614eef82614eae565b602082019050919050565b60006020820190508181036000830152614f1381614ed7565b9050919050565b6000614f2582613f3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f5757614f56614ac1565b5b600182019050919050565b7f4e6f207061796f757420746f2077697468647261770000000000000000000000600082015250565b6000614f98601583613e8e565b9150614fa382614f62565b602082019050919050565b60006020820190508181036000830152614fc781614f8b565b9050919050565b600081905092915050565b50565b6000614fe9600083614fce565b9150614ff482614fd9565b600082019050919050565b600061500a82614fdc565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b600061504a601183613e8e565b915061505582615014565b602082019050919050565b600060208201905081810360008301526150798161503d565b9050919050565b60008151905061508f81613f72565b92915050565b6000602082840312156150ab576150aa613ce7565b5b60006150b984828501615080565b91505092915050565b6000815190506150d181614694565b92915050565b6000602082840312156150ed576150ec613ce7565b5b60006150fb848285016150c2565b91505092915050565b7f4e6f2061697264726f7020746f20636c61696d00000000000000000000000000600082015250565b600061513a601383613e8e565b915061514582615104565b602082019050919050565b600060208201905081810360008301526151698161512d565b9050919050565b7f41697264726f7020616c726561647920636c61696d6564000000000000000000600082015250565b60006151a6601783613e8e565b91506151b182615170565b602082019050919050565b600060208201905081810360008301526151d581615199565b9050919050565b7f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000615212601183613e8e565b915061521d826151dc565b602082019050919050565b6000602082019050818103600083015261524181615205565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546152758161494c565b61527f8186615248565b9450600182166000811461529a57600181146152ab576152de565b60ff198316865281860193506152de565b6152b485615253565b60005b838110156152d6578154818901526001820191506020810190506152b7565b838801955050505b50505092915050565b60006152f282613e83565b6152fc8185615248565b935061530c818560208601613e9f565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061534e600583615248565b915061535982615318565b600582019050919050565b60006153708285615268565b915061537c82846152e7565b915061538782615341565b91508190509392505050565b7f4e6f6a6920616c726561647920636c61696d6564000000000000000000000000600082015250565b60006153c9601483613e8e565b91506153d482615393565b602082019050919050565b600060208201905081810360008301526153f8816153bc565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061545b602683613e8e565b9150615466826153ff565b604082019050919050565b6000602082019050818103600083015261548a8161544e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006154c7602083613e8e565b91506154d282615491565b602082019050919050565b600060208201905081810360008301526154f6816154ba565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615524826154fd565b61552e8185615508565b935061553e818560208601613e9f565b61554781613ed2565b840191505092915050565b60006080820190506155676000830187613fcb565b6155746020830186613fcb565b6155816040830185613f48565b81810360608301526155938184615519565b905095945050505050565b6000815190506155ad81613df4565b92915050565b6000602082840312156155c9576155c8613ce7565b5b60006155d78482850161559e565b91505092915050565b60006155eb82613f3e565b91506155f683613f3e565b92508282101561560957615608614ac1565b5b828203905092915050565b600061561f82613f3e565b915061562a83613f3e565b92508261563a57615639614e1f565b5b82820690509291505056fea264697066735822122098baa5194fd4f1cb74ef409d4a36dd007f574465e7619700540172b6eb1101ae64736f6c634300080d0033
Deployed Bytecode
0x6080604052600436106103b15760003560e01c80636352211e116101e7578063b0d5f8a21161010d578063cf0ea25e116100a0578063e985e9c51161006f578063e985e9c514610cd1578063ea75127614610d0e578063f2fde38b14610d4b578063fb6800d114610d74576103b8565b8063cf0ea25e14610c4a578063d2a87a0014610c61578063d2cab05614610c8c578063e08e65ea14610ca8576103b8565b8063c4ae3168116100dc578063c4ae316814610ba2578063c519ae2b14610bb9578063c87b56dd14610be4578063cb30bc2e14610c21576103b8565b8063b0d5f8a214610af8578063b187bd2614610b23578063b88d4fde14610b4e578063bc912e1a14610b77576103b8565b80638c5ccdf611610185578063a3f832a611610154578063a3f832a614610a52578063a9a10d8214610a7b578063aa1906e714610aa4578063ad2f852a14610acd576103b8565b80638c5ccdf6146109bc5780638da5cb5b146109d357806395d89b41146109fe578063a22cb46514610a29576103b8565b8063715018a6116101c1578063715018a61461092657806373c7400e1461093d5780637a067977146109685780638361330214610993576103b8565b80636352211e146108835780636f8b44b0146108c057806370a08231146108e9576103b8565b80632d6b6224116102d757806349df728c1161026a578063571fe01611610239578063571fe0161461080157806357a174111461082c5780635b88349d146108555780635b8ad4291461086c576103b8565b806349df728c146107595780634cf5f7a41461078257806354214f69146107ad57806355f804b3146107d8576103b8565b806334b6ab1a116102a657806334b6ab1a146106d75780633ccfd60b146107025780634047638d1461071957806342842e0e14610730576103b8565b80632d6b62241461063c5780632d7ac7dd146106675780632db115441461069057806332cb6b0c146106ac576103b8565b8063106466f31161034f57806318160ddd1161031e57806318160ddd1461057f57806323b872dd146105aa5780632a55205a146105d35780632cb952d314610611576103b8565b8063106466f3146104fb5780631113ba581461051257806311bd4c8a1461053d578063167ae36214610554576103b8565b806307e89ec01161038b57806307e89ec01461044e578063081812fc1461047957806308bac694146104b6578063095ea7b3146104d2576103b8565b806301a21756146103bd57806301ffc9a7146103e657806306fdde0314610423576103b8565b366103b857005b600080fd5b3480156103c957600080fd5b506103e460048036038101906103df9190613d88565b610d9f565b005b3480156103f257600080fd5b5061040d60048036038101906104089190613e20565b610e68565b60405161041a9190613e68565b60405180910390f35b34801561042f57600080fd5b50610438610ee2565b6040516104459190613f1c565b60405180910390f35b34801561045a57600080fd5b50610463610f74565b6040516104709190613f57565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b9190613f9e565b610f7a565b6040516104ad9190613fda565b60405180910390f35b6104d060048036038101906104cb919061405a565b610ff9565b005b3480156104de57600080fd5b506104f960048036038101906104f491906140ba565b611355565b005b34801561050757600080fd5b50610510611499565b005b34801561051e57600080fd5b506105276114cd565b6040516105349190613f57565b60405180910390f35b34801561054957600080fd5b506105526114d3565b005b34801561056057600080fd5b50610569611507565b6040516105769190614113565b60405180910390f35b34801561058b57600080fd5b5061059461150d565b6040516105a19190613f57565b60405180910390f35b3480156105b657600080fd5b506105d160048036038101906105cc919061412e565b611524565b005b3480156105df57600080fd5b506105fa60048036038101906105f59190614181565b611846565b6040516106089291906141c1565b60405180910390f35b34801561061d57600080fd5b506106266118b8565b6040516106339190613e68565b60405180910390f35b34801561064857600080fd5b506106516118cb565b60405161065e9190613e68565b60405180910390f35b34801561067357600080fd5b5061068e600480360381019061068991906143eb565b6118de565b005b6106aa60048036038101906106a59190613f9e565b611abd565b005b3480156106b857600080fd5b506106c1611d58565b6040516106ce9190613f57565b60405180910390f35b3480156106e357600080fd5b506106ec611d5e565b6040516106f99190614113565b60405180910390f35b34801561070e57600080fd5b50610717611d64565b005b34801561072557600080fd5b5061072e611e64565b005b34801561073c57600080fd5b506107576004803603810190610752919061412e565b611e98565b005b34801561076557600080fd5b50610780600480360381019061077b91906144a1565b611eb8565b005b34801561078e57600080fd5b50610797611fc1565b6040516107a49190613f1c565b60405180910390f35b3480156107b957600080fd5b506107c261204f565b6040516107cf9190613e68565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa9190614583565b612062565b005b34801561080d57600080fd5b50610816612084565b6040516108239190613f57565b60405180910390f35b34801561083857600080fd5b50610853600480360381019061084e9190614583565b61208a565b005b34801561086157600080fd5b5061086a6120ac565b005b34801561087857600080fd5b5061088161231e565b005b34801561088f57600080fd5b506108aa60048036038101906108a59190613f9e565b612352565b6040516108b79190613fda565b60405180910390f35b3480156108cc57600080fd5b506108e760048036038101906108e29190613f9e565b612364565b005b3480156108f557600080fd5b50610910600480360381019061090b91906145cc565b612376565b60405161091d9190613f57565b60405180910390f35b34801561093257600080fd5b5061093b61242e565b005b34801561094957600080fd5b50610952612442565b60405161095f9190614620565b60405180910390f35b34801561097457600080fd5b5061097d612460565b60405161098a9190613f57565b60405180910390f35b34801561099f57600080fd5b506109ba60048036038101906109b59190614667565b612466565b005b3480156109c857600080fd5b506109d1612478565b005b3480156109df57600080fd5b506109e86124ac565b6040516109f59190613fda565b60405180910390f35b348015610a0a57600080fd5b50610a136124d6565b604051610a209190613f1c565b60405180910390f35b348015610a3557600080fd5b50610a506004803603810190610a4b91906146c0565b612568565b005b348015610a5e57600080fd5b50610a796004803603810190610a749190613f9e565b6126df565b005b348015610a8757600080fd5b50610aa26004803603810190610a9d9190614667565b6126f1565b005b348015610ab057600080fd5b50610acb6004803603810190610ac69190613f9e565b612703565b005b348015610ad957600080fd5b50610ae2612715565b604051610aef9190613fda565b60405180910390f35b348015610b0457600080fd5b50610b0d61273b565b604051610b1a9190613e68565b60405180910390f35b348015610b2f57600080fd5b50610b3861274e565b604051610b459190613e68565b60405180910390f35b348015610b5a57600080fd5b50610b756004803603810190610b7091906147a1565b612761565b005b348015610b8357600080fd5b50610b8c6127d4565b604051610b999190613f57565b60405180910390f35b348015610bae57600080fd5b50610bb76127da565b005b348015610bc557600080fd5b50610bce61280e565b604051610bdb9190613e68565b60405180910390f35b348015610bf057600080fd5b50610c0b6004803603810190610c069190613f9e565b612821565b604051610c189190613f1c565b60405180910390f35b348015610c2d57600080fd5b50610c486004803603810190610c439190614824565b612970565b005b348015610c5657600080fd5b50610c5f612d5e565b005b348015610c6d57600080fd5b50610c76612d92565b604051610c839190613e68565b60405180910390f35b610ca66004803603810190610ca1919061405a565b612da5565b005b348015610cb457600080fd5b50610ccf6004803603810190610cca9190614667565b613101565b005b348015610cdd57600080fd5b50610cf86004803603810190610cf39190614871565b613113565b604051610d059190613e68565b60405180910390f35b348015610d1a57600080fd5b50610d356004803603810190610d3091906145cc565b6131a7565b604051610d429190613e68565b60405180910390f35b348015610d5757600080fd5b50610d726004803603810190610d6d91906145cc565b6131c7565b005b348015610d8057600080fd5b50610d8961324a565b604051610d969190614113565b60405180910390f35b610da7613250565b6127108160ff161115610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de6906148fd565b60405180910390fd5b81600f600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060ff16600f60006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610edb5750610eda826132ce565b5b9050919050565b606060028054610ef19061494c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1d9061494c565b8015610f6a5780601f10610f3f57610100808354040283529160200191610f6a565b820191906000526020600020905b815481529060010190602001808311610f4d57829003601f168201915b5050505050905090565b600e5481565b6000610f8582613360565b610fbb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105e906149c9565b60405180910390fd5b601260029054906101000a900460ff16601260019054906101000a900460ff16156110c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110be90614a35565b60405180910390fd5b80611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe90614aa1565b60405180910390fd5b600c548480826111179190614af0565b341015611159576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115090614b96565b60405180910390fd5b856000811161119d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119490614c02565b60405180910390fd5b600a54816111a961150d565b6111b39190614c22565b11156111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90614cc4565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112429190614c22565b1115611283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127a90614d30565b60405180910390fd5b858560135460003360405160200161129b9190614d98565b6040516020818303038152906040528051906020012090506112ff848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083836133bf565b61133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590614dff565b60405180910390fd5b611348338c6133d6565b5050505050505050505050565b600061136082612352565b90508073ffffffffffffffffffffffffffffffffffffffff166113816133f4565b73ffffffffffffffffffffffffffffffffffffffff16146113e4576113ad816113a86133f4565b613113565b6113e3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6114a1613250565b601260039054906101000a900460ff1615601260036101000a81548160ff021916908315150217905550565b600c5481565b6114db613250565b601260069054906101000a900460ff1615601260066101000a81548160ff021916908315150217905550565b60155481565b60006115176133fc565b6001546000540303905090565b600061152f82613401565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611596576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806115a2846134cd565b915091506115b881876115b36133f4565b6134f4565b611604576115cd866115c86133f4565b613113565b611603576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361166a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116778686866001613538565b801561168257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506117508561172c88888761353e565b7c020000000000000000000000000000000000000000000000000000000017613566565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036117d657600060018501905060006004600083815260200190815260200160002054036117d45760005481146117d3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461183e8686866001613591565b505050505050565b600080600f600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600f60009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16856118a39190614af0565b6118ad9190614e4e565b915091509250929050565b601260069054906101000a900460ff1681565b601260049054906101000a900460ff1681565b6118e6613250565b60005b8251811015611ab857600073ffffffffffffffffffffffffffffffffffffffff1683828151811061191d5761191c614e7f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290614efa565b60405180910390fd5b60006018600085848151811061199457611993614e7f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403611aa5576119e7613c1e565b8282815181106119fa576119f9614e7f565b5b602002602001015181600001818152505060008160200190151590811515815250508060186000868581518110611a3457611a33614e7f565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908315150217905550905050505b8080611ab090614f1a565b9150506118e9565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b22906149c9565b60405180910390fd5b601260049054906101000a900460ff16601260019054906101000a900460ff1615611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290614a35565b60405180910390fd5b80611bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc290614aa1565b60405180910390fd5b600e54828082611bdb9190614af0565b341015611c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1490614b96565b60405180910390fd5b8360008111611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5890614c02565b60405180910390fd5b600a5481611c6d61150d565b611c779190614c22565b1115611cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caf90614cc4565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d069190614c22565b1115611d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e90614d30565b60405180910390fd5b611d5133866133d6565b5050505050565b60095481565b60145481565b611d6c613250565b600047905060008111611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab90614fae565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051611dda90614fff565b60006040518083038185875af1925050503d8060008114611e17576040519150601f19603f3d011682016040523d82523d6000602084013e611e1c565b606091505b5050905080611e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5790615060565b60405180910390fd5b5050565b611e6c613250565b601260049054906101000a900460ff1615601260046101000a81548160ff021916908315150217905550565b611eb383838360405180602001604052806000815250612761565b505050565b611ec0613250565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611efb9190613fda565b602060405180830381865afa158015611f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3c9190615095565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611f799291906141c1565b6020604051808303816000875af1158015611f98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fbc91906150d7565b505050565b60118054611fce9061494c565b80601f0160208091040260200160405190810160405280929190818152602001828054611ffa9061494c565b80156120475780601f1061201c57610100808354040283529160200191612047565b820191906000526020600020905b81548152906001019060200180831161202a57829003601f168201915b505050505081565b601260009054906101000a900460ff1681565b61206a613250565b8060109080519060200190612080929190613c3a565b5050565b600a5481565b612092613250565b80601190805190602001906120a8929190613c3a565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461211a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612111906149c9565b60405180910390fd5b601260069054906101000a900460ff16601260019054906101000a900460ff161561217a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217190614a35565b60405180910390fd5b806121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b190614aa1565b60405180910390fd5b6000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541161223f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223690615150565b60405180910390fd5b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16156122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c6906151bc565b60405180910390fd5b61231b33601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546133d6565b50565b612326613250565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b600061235d82613401565b9050919050565b61236c613250565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123dd576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b612436613250565b6124406000613597565b565b600f60009054906101000a90046bffffffffffffffffffffffff1681565b600b5481565b61246e613250565b8060158190555050565b612480613250565b601260059054906101000a900460ff1615601260056101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546124e59061494c565b80601f01602080910402602001604051908101604052809291908181526020018280546125119061494c565b801561255e5780601f106125335761010080835404028352916020019161255e565b820191906000526020600020905b81548152906001019060200180831161254157829003601f168201915b5050505050905090565b6125706133f4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036125d4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006125e16133f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661268e6133f4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126d39190613e68565b60405180910390a35050565b6126e7613250565b80600b8190555050565b6126f9613250565b8060138190555050565b61270b613250565b80600a8190555050565b600f600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260029054906101000a900460ff1681565b601260019054906101000a900460ff1681565b61276c848484611524565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127ce576127978484848461365d565b6127cd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600d5481565b6127e2613250565b601260019054906101000a900460ff1615601260016101000a81548160ff021916908315150217905550565b601260039054906101000a900460ff1681565b606061282c82613360565b61286b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286290615228565b60405180910390fd5b601260009054906101000a900460ff16612911576011805461288c9061494c565b80601f01602080910402602001604051908101604052809291908181526020018280546128b89061494c565b80156129055780601f106128da57610100808354040283529160200191612905565b820191906000526020600020905b8154815290600101906020018083116128e857829003601f168201915b5050505050905061296b565b6000601080546129209061494c565b90501161293c5760405180602001604052806000815250612968565b6010612947836137ad565b604051602001612958929190615364565b6040516020818303038152906040525b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146129de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d5906149c9565b60405180910390fd5b601260059054906101000a900460ff16601260019054906101000a900460ff1615612a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3590614a35565b60405180910390fd5b80612a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7590614aa1565b60405180910390fd5b600160008111612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba90614c02565b60405180910390fd5b600a5481612acf61150d565b612ad99190614c22565b1115612b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1190614cc4565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b689190614c22565b1115612ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba090614d30565b60405180910390fd5b8383601554600033604051602001612bc19190614d98565b604051602081830303815290604052805190602001209050612c25848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083836133bf565b612c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5b90614dff565b60405180910390fd5b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce8906153df565b60405180910390fd5b6001601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612d543360016133d6565b5050505050505050565b612d66613250565b601260029054906101000a900460ff1615601260026101000a81548160ff021916908315150217905550565b601260059054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a906149c9565b60405180910390fd5b601260039054906101000a900460ff16601260019054906101000a900460ff1615612e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6a90614a35565b60405180910390fd5b80612eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eaa90614aa1565b60405180910390fd5b600d54848082612ec39190614af0565b341015612f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efc90614b96565b60405180910390fd5b8560008111612f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4090614c02565b60405180910390fd5b600a5481612f5561150d565b612f5f9190614c22565b1115612fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9790614cc4565b60405180910390fd5b600b5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fee9190614c22565b111561302f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302690614d30565b60405180910390fd5b85856014546000336040516020016130479190614d98565b6040516020818303038152906040528051906020012090506130ab848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083836133bf565b6130ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e190614dff565b60405180910390fd5b6130f4338c6133d6565b5050505050505050505050565b613109613250565b8060148190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60166020528060005260406000206000915054906101000a900460ff1681565b6131cf613250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361323e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323590615471565b60405180910390fd5b61324781613597565b50565b60135481565b61325861390d565b73ffffffffffffffffffffffffffffffffffffffff166132766124ac565b73ffffffffffffffffffffffffffffffffffffffff16146132cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c3906154dd565b60405180910390fd5b565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061332957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133595750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008161336b6133fc565b1115801561337a575060005482105b80156133b8575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000826133cc8584613915565b1490509392505050565b6133f082826040518060200160405280600081525061396b565b5050565b600033905090565b600090565b600080829050806134106133fc565b11613496576000548110156134955760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603613493575b6000810361348957600460008360019003935083815260200190815260200160002054905061345f565b80925050506134c8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613555868684613a08565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136836133f4565b8786866040518563ffffffff1660e01b81526004016136a59493929190615552565b6020604051808303816000875af19250505080156136e157506040513d601f19601f820116820180604052508101906136de91906155b3565b60015b61375a573d8060008114613711576040519150601f19603f3d011682016040523d82523d6000602084013e613716565b606091505b506000815103613752576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082036137f4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613908565b600082905060005b6000821461382657808061380f90614f1a565b915050600a8261381f9190614e4e565b91506137fc565b60008167ffffffffffffffff811115613842576138416141ea565b5b6040519080825280601f01601f1916602001820160405280156138745781602001600182028036833780820191505090505b5090505b600085146139015760018261388d91906155e0565b9150600a8561389c9190615614565b60306138a89190614c22565b60f81b8183815181106138be576138bd614e7f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138fa9190614e4e565b9450613878565b8093505050505b919050565b600033905090565b60008082905060005b84518110156139605761394b8286838151811061393e5761393d614e7f565b5b6020026020010151613a11565b9150808061395890614f1a565b91505061391e565b508091505092915050565b6139758383613a3c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613a0357600080549050600083820390505b6139b5600086838060010194508661365d565b6139eb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106139a2578160005414613a0057600080fd5b50505b505050565b60009392505050565b6000818310613a2957613a248284613bf7565b613a34565b613a338383613bf7565b5b905092915050565b60008054905060008203613a7c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613a896000848385613538565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613b0083613af1600086600061353e565b613afa85613c0e565b17613566565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613ba157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613b66565b5060008203613bdc576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613bf26000848385613591565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6040518060400160405280600081526020016000151581525090565b828054613c469061494c565b90600052602060002090601f016020900481019282613c685760008555613caf565b82601f10613c8157805160ff1916838001178555613caf565b82800160010185558215613caf579182015b82811115613cae578251825591602001919060010190613c93565b5b509050613cbc9190613cc0565b5090565b5b80821115613cd9576000816000905550600101613cc1565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d1c82613cf1565b9050919050565b613d2c81613d11565b8114613d3757600080fd5b50565b600081359050613d4981613d23565b92915050565b600060ff82169050919050565b613d6581613d4f565b8114613d7057600080fd5b50565b600081359050613d8281613d5c565b92915050565b60008060408385031215613d9f57613d9e613ce7565b5b6000613dad85828601613d3a565b9250506020613dbe85828601613d73565b9150509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dfd81613dc8565b8114613e0857600080fd5b50565b600081359050613e1a81613df4565b92915050565b600060208284031215613e3657613e35613ce7565b5b6000613e4484828501613e0b565b91505092915050565b60008115159050919050565b613e6281613e4d565b82525050565b6000602082019050613e7d6000830184613e59565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ebd578082015181840152602081019050613ea2565b83811115613ecc576000848401525b50505050565b6000601f19601f8301169050919050565b6000613eee82613e83565b613ef88185613e8e565b9350613f08818560208601613e9f565b613f1181613ed2565b840191505092915050565b60006020820190508181036000830152613f368184613ee3565b905092915050565b6000819050919050565b613f5181613f3e565b82525050565b6000602082019050613f6c6000830184613f48565b92915050565b613f7b81613f3e565b8114613f8657600080fd5b50565b600081359050613f9881613f72565b92915050565b600060208284031215613fb457613fb3613ce7565b5b6000613fc284828501613f89565b91505092915050565b613fd481613d11565b82525050565b6000602082019050613fef6000830184613fcb565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261401a57614019613ff5565b5b8235905067ffffffffffffffff81111561403757614036613ffa565b5b60208301915083602082028301111561405357614052613fff565b5b9250929050565b60008060006040848603121561407357614072613ce7565b5b600061408186828701613f89565b935050602084013567ffffffffffffffff8111156140a2576140a1613cec565b5b6140ae86828701614004565b92509250509250925092565b600080604083850312156140d1576140d0613ce7565b5b60006140df85828601613d3a565b92505060206140f085828601613f89565b9150509250929050565b6000819050919050565b61410d816140fa565b82525050565b60006020820190506141286000830184614104565b92915050565b60008060006060848603121561414757614146613ce7565b5b600061415586828701613d3a565b935050602061416686828701613d3a565b925050604061417786828701613f89565b9150509250925092565b6000806040838503121561419857614197613ce7565b5b60006141a685828601613f89565b92505060206141b785828601613f89565b9150509250929050565b60006040820190506141d66000830185613fcb565b6141e36020830184613f48565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61422282613ed2565b810181811067ffffffffffffffff82111715614241576142406141ea565b5b80604052505050565b6000614254613cdd565b90506142608282614219565b919050565b600067ffffffffffffffff8211156142805761427f6141ea565b5b602082029050602081019050919050565b60006142a461429f84614265565b61424a565b905080838252602082019050602084028301858111156142c7576142c6613fff565b5b835b818110156142f057806142dc8882613d3a565b8452602084019350506020810190506142c9565b5050509392505050565b600082601f83011261430f5761430e613ff5565b5b813561431f848260208601614291565b91505092915050565b600067ffffffffffffffff821115614343576143426141ea565b5b602082029050602081019050919050565b600061436761436284614328565b61424a565b9050808382526020820190506020840283018581111561438a57614389613fff565b5b835b818110156143b3578061439f8882613f89565b84526020840193505060208101905061438c565b5050509392505050565b600082601f8301126143d2576143d1613ff5565b5b81356143e2848260208601614354565b91505092915050565b6000806040838503121561440257614401613ce7565b5b600083013567ffffffffffffffff8111156144205761441f613cec565b5b61442c858286016142fa565b925050602083013567ffffffffffffffff81111561444d5761444c613cec565b5b614459858286016143bd565b9150509250929050565b600061446e82613d11565b9050919050565b61447e81614463565b811461448957600080fd5b50565b60008135905061449b81614475565b92915050565b6000602082840312156144b7576144b6613ce7565b5b60006144c58482850161448c565b91505092915050565b600080fd5b600067ffffffffffffffff8211156144ee576144ed6141ea565b5b6144f782613ed2565b9050602081019050919050565b82818337600083830152505050565b6000614526614521846144d3565b61424a565b905082815260208101848484011115614542576145416144ce565b5b61454d848285614504565b509392505050565b600082601f83011261456a57614569613ff5565b5b813561457a848260208601614513565b91505092915050565b60006020828403121561459957614598613ce7565b5b600082013567ffffffffffffffff8111156145b7576145b6613cec565b5b6145c384828501614555565b91505092915050565b6000602082840312156145e2576145e1613ce7565b5b60006145f084828501613d3a565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b61461a816145f9565b82525050565b60006020820190506146356000830184614611565b92915050565b614644816140fa565b811461464f57600080fd5b50565b6000813590506146618161463b565b92915050565b60006020828403121561467d5761467c613ce7565b5b600061468b84828501614652565b91505092915050565b61469d81613e4d565b81146146a857600080fd5b50565b6000813590506146ba81614694565b92915050565b600080604083850312156146d7576146d6613ce7565b5b60006146e585828601613d3a565b92505060206146f6858286016146ab565b9150509250929050565b600067ffffffffffffffff82111561471b5761471a6141ea565b5b61472482613ed2565b9050602081019050919050565b600061474461473f84614700565b61424a565b9050828152602081018484840111156147605761475f6144ce565b5b61476b848285614504565b509392505050565b600082601f83011261478857614787613ff5565b5b8135614798848260208601614731565b91505092915050565b600080600080608085870312156147bb576147ba613ce7565b5b60006147c987828801613d3a565b94505060206147da87828801613d3a565b93505060406147eb87828801613f89565b925050606085013567ffffffffffffffff81111561480c5761480b613cec565b5b61481887828801614773565b91505092959194509250565b6000806020838503121561483b5761483a613ce7565b5b600083013567ffffffffffffffff81111561485957614858613cec565b5b61486585828601614004565b92509250509250929050565b6000806040838503121561488857614887613ce7565b5b600061489685828601613d3a565b92505060206148a785828601613d3a565b9150509250929050565b7f526f79616c747920666565206869676800000000000000000000000000000000600082015250565b60006148e7601083613e8e565b91506148f2826148b1565b602082019050919050565b60006020820190508181036000830152614916816148da565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061496457607f821691505b6020821081036149775761497661491d565b5b50919050565b7f43616c6c657220697320616e6f7468657220636f6e7472616374000000000000600082015250565b60006149b3601a83613e8e565b91506149be8261497d565b602082019050919050565b600060208201905081810360008301526149e2816149a6565b9050919050565b7f4d696e74696e6720706175736564000000000000000000000000000000000000600082015250565b6000614a1f600e83613e8e565b9150614a2a826149e9565b602082019050919050565b60006020820190508181036000830152614a4e81614a12565b9050919050565b7f4c697374206d696e74696e67206e6f7420616374697665000000000000000000600082015250565b6000614a8b601783613e8e565b9150614a9682614a55565b602082019050919050565b60006020820190508181036000830152614aba81614a7e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614afb82613f3e565b9150614b0683613f3e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b3f57614b3e614ac1565b5b828202905092915050565b7f496e73756666696369656e742046756e64730000000000000000000000000000600082015250565b6000614b80601283613e8e565b9150614b8b82614b4a565b602082019050919050565b60006020820190508181036000830152614baf81614b73565b9050919050565b7f4d696e74206174206c656173742031204e6f6a69000000000000000000000000600082015250565b6000614bec601483613e8e565b9150614bf782614bb6565b602082019050919050565b60006020820190508181036000830152614c1b81614bdf565b9050919050565b6000614c2d82613f3e565b9150614c3883613f3e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c6d57614c6c614ac1565b5b828201905092915050565b7f43616e6e6f74206d696e74206265796f756e64204d617820537570706c790000600082015250565b6000614cae601e83613e8e565b9150614cb982614c78565b602082019050919050565b60006020820190508181036000830152614cdd81614ca1565b9050919050565b7f4d6178204e6f6a69207065722057616c6c657420657863656465640000000000600082015250565b6000614d1a601b83613e8e565b9150614d2582614ce4565b602082019050919050565b60006020820190508181036000830152614d4981614d0d565b9050919050565b60008160601b9050919050565b6000614d6882614d50565b9050919050565b6000614d7a82614d5d565b9050919050565b614d92614d8d82613d11565b614d6f565b82525050565b6000614da48284614d81565b60148201915081905092915050565b7f41646472657373206e6f74206c69737465640000000000000000000000000000600082015250565b6000614de9601283613e8e565b9150614df482614db3565b602082019050919050565b60006020820190508181036000830152614e1881614ddc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e5982613f3e565b9150614e6483613f3e565b925082614e7457614e73614e1f565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5a45524f5f414444524553530000000000000000000000000000000000000000600082015250565b6000614ee4600c83613e8e565b9150614eef82614eae565b602082019050919050565b60006020820190508181036000830152614f1381614ed7565b9050919050565b6000614f2582613f3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f5757614f56614ac1565b5b600182019050919050565b7f4e6f207061796f757420746f2077697468647261770000000000000000000000600082015250565b6000614f98601583613e8e565b9150614fa382614f62565b602082019050919050565b60006020820190508181036000830152614fc781614f8b565b9050919050565b600081905092915050565b50565b6000614fe9600083614fce565b9150614ff482614fd9565b600082019050919050565b600061500a82614fdc565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b600061504a601183613e8e565b915061505582615014565b602082019050919050565b600060208201905081810360008301526150798161503d565b9050919050565b60008151905061508f81613f72565b92915050565b6000602082840312156150ab576150aa613ce7565b5b60006150b984828501615080565b91505092915050565b6000815190506150d181614694565b92915050565b6000602082840312156150ed576150ec613ce7565b5b60006150fb848285016150c2565b91505092915050565b7f4e6f2061697264726f7020746f20636c61696d00000000000000000000000000600082015250565b600061513a601383613e8e565b915061514582615104565b602082019050919050565b600060208201905081810360008301526151698161512d565b9050919050565b7f41697264726f7020616c726561647920636c61696d6564000000000000000000600082015250565b60006151a6601783613e8e565b91506151b182615170565b602082019050919050565b600060208201905081810360008301526151d581615199565b9050919050565b7f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000615212601183613e8e565b915061521d826151dc565b602082019050919050565b6000602082019050818103600083015261524181615205565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546152758161494c565b61527f8186615248565b9450600182166000811461529a57600181146152ab576152de565b60ff198316865281860193506152de565b6152b485615253565b60005b838110156152d6578154818901526001820191506020810190506152b7565b838801955050505b50505092915050565b60006152f282613e83565b6152fc8185615248565b935061530c818560208601613e9f565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061534e600583615248565b915061535982615318565b600582019050919050565b60006153708285615268565b915061537c82846152e7565b915061538782615341565b91508190509392505050565b7f4e6f6a6920616c726561647920636c61696d6564000000000000000000000000600082015250565b60006153c9601483613e8e565b91506153d482615393565b602082019050919050565b600060208201905081810360008301526153f8816153bc565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061545b602683613e8e565b9150615466826153ff565b604082019050919050565b6000602082019050818103600083015261548a8161544e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006154c7602083613e8e565b91506154d282615491565b602082019050919050565b600060208201905081810360008301526154f6816154ba565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615524826154fd565b61552e8185615508565b935061553e818560208601613e9f565b61554781613ed2565b840191505092915050565b60006080820190506155676000830187613fcb565b6155746020830186613fcb565b6155816040830185613f48565b81810360608301526155938184615519565b905095945050505050565b6000815190506155ad81613df4565b92915050565b6000602082840312156155c9576155c8613ce7565b5b60006155d78482850161559e565b91505092915050565b60006155eb82613f3e565b91506155f683613f3e565b92508282101561560957615608614ac1565b5b828203905092915050565b600061561f82613f3e565b915061562a83613f3e565b92508261563a57615639614e1f565b5b82820690509291505056fea264697066735822122098baa5194fd4f1cb74ef409d4a36dd007f574465e7619700540172b6eb1101ae64736f6c634300080d0033
Deployed Bytecode Sourcemap
70669:8243:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77845:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78580:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38840:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70991:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45323:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73382:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44764:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75011:115;;;;;;;;;;;;;:::i;:::-;;70882:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75356:111;;;;;;;;;;;;;:::i;:::-;;71571:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34591:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49036:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77566:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;71443:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71355:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77056:502;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73129:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70754:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71530:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78121:275;;;;;;;;;;;;;:::i;:::-;;75134:106;;;;;;;;;;;;;:::i;:::-;;51949:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78404:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71149:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71191:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75583:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70793:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76134:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74464:336;;;;;;;;;;;;;:::i;:::-;;76256:84;;;;;;;;;;;;;:::i;:::-;;40233:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76348:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35775:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13871:103;;;;;;;;;;;;;:::i;:::-;;71044:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70837:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76817:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75248:100;;;;;;;;;;;;;:::i;:::-;;13223:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39016:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45881:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76945:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76563:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76451:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71090:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71262:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71228:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52732:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70935:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74808:81;;;;;;;;;;;;;:::i;:::-;;71307:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75679:447;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74082:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74897:106;;;;;;;;;;;;;:::i;:::-;;71400:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73726:348;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76687:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46346:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71696:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14129:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71492:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77845:268;13109:13;:11;:13::i;:::-;77994:5:::1;77972:18;:27;;;;77964:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;78048:8;78031:14;;:25;;;;;;;;;;;;;;;;;;78087:18;78067:38;;:17;;:38;;;;;;;;;;;;;;;;;;77845:268:::0;;:::o;78580:292::-;78728:4;78785:26;78770:41;;;:11;:41;;;;:94;;;;78828:36;78852:11;78828:23;:36::i;:::-;78770:94;78750:114;;78580:292;;;:::o;38840:100::-;38894:13;38927:5;38920:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38840:100;:::o;70991:46::-;;;;:::o;45323:218::-;45399:7;45424:16;45432:7;45424;:16::i;:::-;45419:64;;45449:34;;;;;;;;;;;;;;45419:64;45503:15;:24;45519:7;45503:24;;;;;;;;;;;:30;;;;;;;;;;;;45496:37;;45323:218;;;:::o;73382:336::-;71907:10;71894:23;;:9;:23;;;71886:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;73524:18:::1;;;;;;;;;;;72033:8;;;;;;;;;;;72032:9;72024:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72079:8;72071:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;73563:17:::2;;73582:3;72246;72230:13;:19;;;;:::i;:::-;72217:9;:32;;72209:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;73604:3:::3;72355:1;72349:3;:7;72341:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;72437:15;;72430:3;72414:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:38;;72392:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;72579:19;;72572:3;72543:14;:26;72558:10;72543:26;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:55;;72521:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;73637:11:::4;;73650:16;;72797:12;72839:10;72822:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;72812:39;;;;;;72797:54;;72884:49;72903:11;;72884:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72916:10;72928:4;72884:18;:49::i;:::-;72862:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;73684:26:::5;73694:10;73706:3;73684:9;:26::i;:::-;72786:213:::4;72664:1;;;72283::::3;72126::::2;;71959::::1;73382:336:::0;;;:::o;44764:400::-;44845:13;44861:16;44869:7;44861;:16::i;:::-;44845:32;;44917:5;44894:28;;:19;:17;:19::i;:::-;:28;;;44890:175;;44942:44;44959:5;44966:19;:17;:19::i;:::-;44942:16;:44::i;:::-;44937:128;;45014:35;;;;;;;;;;;;;;44937:128;44890:175;45110:2;45077:15;:24;45093:7;45077:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45148:7;45144:2;45128:28;;45137:5;45128:28;;;;;;;;;;;;44834:330;44764:400;;:::o;75011:115::-;13109:13;:11;:13::i;:::-;75097:21:::1;;;;;;;;;;;75096:22;75072:21;;:46;;;;;;;;;;;;;;;;;;75011:115::o:0;70882:46::-;;;;:::o;75356:111::-;13109:13;:11;:13::i;:::-;75439:20:::1;;;;;;;;;;;75438:21;75415:20;;:44;;;;;;;;;;;;;;;;;;75356:111::o:0;71571:33::-;;;;:::o;34591:323::-;34652:7;34880:15;:13;:15::i;:::-;34865:12;;34849:13;;:28;:46;34842:53;;34591:323;:::o;49036:2817::-;49170:27;49200;49219:7;49200:18;:27::i;:::-;49170:57;;49285:4;49244:45;;49260:19;49244:45;;;49240:86;;49298:28;;;;;;;;;;;;;;49240:86;49340:27;49369:23;49396:35;49423:7;49396:26;:35::i;:::-;49339:92;;;;49531:68;49556:15;49573:4;49579:19;:17;:19::i;:::-;49531:24;:68::i;:::-;49526:180;;49619:43;49636:4;49642:19;:17;:19::i;:::-;49619:16;:43::i;:::-;49614:92;;49671:35;;;;;;;;;;;;;;49614:92;49526:180;49737:1;49723:16;;:2;:16;;;49719:52;;49748:23;;;;;;;;;;;;;;49719:52;49784:43;49806:4;49812:2;49816:7;49825:1;49784:21;:43::i;:::-;49920:15;49917:160;;;50060:1;50039:19;50032:30;49917:160;50457:18;:24;50476:4;50457:24;;;;;;;;;;;;;;;;50455:26;;;;;;;;;;;;50526:18;:22;50545:2;50526:22;;;;;;;;;;;;;;;;50524:24;;;;;;;;;;;50848:146;50885:2;50934:45;50949:4;50955:2;50959:19;50934:14;:45::i;:::-;30990:8;50906:73;50848:18;:146::i;:::-;50819:17;:26;50837:7;50819:26;;;;;;;;;;;:175;;;;51165:1;30990:8;51114:19;:47;:52;51110:627;;51187:19;51219:1;51209:7;:11;51187:33;;51376:1;51342:17;:30;51360:11;51342:30;;;;;;;;;;;;:35;51338:384;;51480:13;;51465:11;:28;51461:242;;51660:19;51627:17;:30;51645:11;51627:30;;;;;;;;;;;:52;;;;51461:242;51338:384;51168:569;51110:627;51784:7;51780:2;51765:27;;51774:4;51765:27;;;;;;;;;;;;51803:42;51824:4;51830:2;51834:7;51843:1;51803:20;:42::i;:::-;49159:2694;;;49036:2817;;;:::o;77566:271::-;77708:16;77726:21;77773:14;;;;;;;;;;;77823:5;77802:17;;;;;;;;;;;77790:29;;:9;:29;;;;:::i;:::-;77789:39;;;;:::i;:::-;77765:64;;;;77566:271;;;;;:::o;71443:40::-;;;;;;;;;;;;;:::o;71355:38::-;;;;;;;;;;;;;:::o;77056:502::-;13109:13;:11;:13::i;:::-;77189:9:::1;77184:367;77208:9;:16;77204:1;:20;77184:367;;;77278:1;77254:26;;:9;77264:1;77254:12;;;;;;;;:::i;:::-;;;;;;;;:26;;::::0;77246:51:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;77349:1;77316:11;:25;77328:9;77338:1;77328:12;;;;;;;;:::i;:::-;;;;;;;;77316:25;;;;;;;;;;;;;;;:29;;;:34:::0;77312:228:::1;;77371:23;;:::i;:::-;77424:4;77429:1;77424:7;;;;;;;;:::i;:::-;;;;;;;;77413:4;:8;;:18;;;::::0;::::1;77468:5;77450:4;:15;;:23;;;;;;;;;::::0;::::1;77520:4;77492:11;:25;77504:9;77514:1;77504:12;;;;;;;;:::i;:::-;;;;;;;;77492:25;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77352:188;77312:228;77226:3;;;;;:::i;:::-;;;;77184:367;;;;77056:502:::0;;:::o;73129:245::-;71907:10;71894:23;;:9;:23;;;71886:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;73239:18:::1;;;;;;;;;;;72033:8;;;;;;;;;;;72032:9;72024:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72079:8;72071:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;73278:17:::2;;73297:3;72246;72230:13;:19;;;;:::i;:::-;72217:9;:32;;72209:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;73319:3:::3;72355:1;72349:3;:7;72341:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;72437:15;;72430:3;72414:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:38;;72392:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;72579:19;;72572:3;72543:14;:26;72558:10;72543:26;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:55;;72521:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;73340:26:::4;73350:10;73362:3;73340:9;:26::i;:::-;72283:1:::3;72126::::2;;71959::::1;73129:245:::0;:::o;70754:32::-;;;;:::o;71530:34::-;;;;:::o;78121:275::-;13109:13;:11;:13::i;:::-;78171:15:::1;78189:21;78171:39;;78239:1;78229:7;:11;78221:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;78278:12;78304:10;78296:24;;78328:7;78296:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78277:63;;;78359:7;78351:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;78160:236;;78121:275::o:0;75134:106::-;13109:13;:11;:13::i;:::-;75214:18:::1;;;;;;;;;;;75213:19;75192:18;;:40;;;;;;;;;;;;;;;;;;75134:106::o:0;51949:185::-;52087:39;52104:4;52110:2;52114:7;52087:39;;;;;;;;;;;;:16;:39::i;:::-;51949:185;;;:::o;78404:168::-;13109:13;:11;:13::i;:::-;78470:15:::1;78488:5;:15;;;78512:4;78488:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78470:48;;78529:5;:14;;;78544:10;78556:7;78529:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;78459:113;78404:168:::0;:::o;71149:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71191:30::-;;;;;;;;;;;;;:::o;75583:88::-;13109:13;:11;:13::i;:::-;75660:3:::1;75650:7;:13;;;;;;;;;;;;:::i;:::-;;75583:88:::0;:::o;70793:37::-;;;;:::o;76134:114::-;13109:13;:11;:13::i;:::-;76237:3:::1;76215:19;:25;;;;;;;;;;;;:::i;:::-;;76134:114:::0;:::o;74464:336::-;71907:10;71894:23;;:9;:23;;;71886:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;74548:20:::1;;;;;;;;;;;72033:8;;;;;;;;;;;72032:9;72024:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72079:8;72071:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;74624:1:::2;74594:11;:23;74606:10;74594:23;;;;;;;;;;;;;;;:27;;;:31;74586:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;74669:11;:23;74681:10;74669:23;;;;;;;;;;;;;;;:34;;;;;;;;;;;;74668:35;74660:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;74742:50;74752:10;74764:11;:23;74776:10;74764:23;;;;;;;;;;;;;;;:27;;;74742:9;:50::i;:::-;71959:1:::1;74464:336::o:0;76256:84::-;13109:13;:11;:13::i;:::-;76322:10:::1;;;;;;;;;;;76321:11;76308:10;;:24;;;;;;;;;;;;;;;;;;76256:84::o:0;40233:152::-;40305:7;40348:27;40367:7;40348:18;:27::i;:::-;40325:52;;40233:152;;;:::o;76348:95::-;13109:13;:11;:13::i;:::-;76429:6:::1;76416:10;:19;;;;76348:95:::0;:::o;35775:233::-;35847:7;35888:1;35871:19;;:5;:19;;;35867:60;;35899:28;;;;;;;;;;;;;;35867:60;29934:13;35945:18;:25;35964:5;35945:25;;;;;;;;;;;;;;;;:55;35938:62;;35775:233;;;:::o;13871:103::-;13109:13;:11;:13::i;:::-;13936:30:::1;13963:1;13936:18;:30::i;:::-;13871:103::o:0;71044:37::-;;;;;;;;;;;;;:::o;70837:38::-;;;;:::o;76817:120::-;13109:13;:11;:13::i;:::-;76919:10:::1;76898:18;:31;;;;76817:120:::0;:::o;75248:100::-;13109:13;:11;:13::i;:::-;75324:16:::1;;;;;;;;;;;75323:17;75304:16;;:36;;;;;;;;;;;;;;;;;;75248:100::o:0;13223:87::-;13269:7;13296:6;;;;;;;;;;;13289:13;;13223:87;:::o;39016:104::-;39072:13;39105:7;39098:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39016:104;:::o;45881:308::-;45992:19;:17;:19::i;:::-;45980:31;;:8;:31;;;45976:61;;46020:17;;;;;;;;;;;;;;45976:61;46102:8;46050:18;:39;46069:19;:17;:19::i;:::-;46050:39;;;;;;;;;;;;;;;:49;46090:8;46050:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;46162:8;46126:55;;46141:19;:17;:19::i;:::-;46126:55;;;46172:8;46126:55;;;;;;:::i;:::-;;;;;;;;45881:308;;:::o;76945:103::-;13109:13;:11;:13::i;:::-;77037:3:::1;77015:19;:25;;;;76945:103:::0;:::o;76563:116::-;13109:13;:11;:13::i;:::-;76661:10:::1;76642:16;:29;;;;76563:116:::0;:::o;76451:104::-;13109:13;:11;:13::i;:::-;76541:6:::1;76523:15;:24;;;;76451:104:::0;:::o;71090:29::-;;;;;;;;;;;;;:::o;71262:38::-;;;;;;;;;;;;;:::o;71228:27::-;;;;;;;;;;;;;:::o;52732:399::-;52899:31;52912:4;52918:2;52922:7;52899:12;:31::i;:::-;52963:1;52945:2;:14;;;:19;52941:183;;52984:56;53015:4;53021:2;53025:7;53034:5;52984:30;:56::i;:::-;52979:145;;53068:40;;;;;;;;;;;;;;52979:145;52941:183;52732:399;;;;:::o;70935:49::-;;;;:::o;74808:81::-;13109:13;:11;:13::i;:::-;74873:8:::1;;;;;;;;;;;74872:9;74861:8;;:20;;;;;;;;;;;;;;;;;;74808:81::o:0;71307:41::-;;;;;;;;;;;;;:::o;75679:447::-;75797:13;75836:16;75844:7;75836;:16::i;:::-;75828:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;75892:10;;;;;;;;;;;75887:70;;75926:19;75919:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75887:70;76013:1;75995:7;75989:21;;;;;:::i;:::-;;;:25;:129;;;;;;;;;;;;;;;;;76058:7;76067:18;:7;:16;:18::i;:::-;76041:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75989:129;75969:149;;75679:447;;;;:::o;74082:374::-;71907:10;71894:23;;:9;:23;;;71886:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;74192:16:::1;;;;;;;;;;;72033:8;;;;;;;;;;;72032:9;72024:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72079:8;72071:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;74227:1:::2;72355;72349:3;:7;72341:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;72437:15;;72430:3;72414:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:38;;72392:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;72579:19;;72572:3;72543:14;:26;72558:10;72543:26;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:55;;72521:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;74258:11:::3;;74271:18;;72797:12;72839:10;72822:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;72812:39;;;;;;72797:54;;72884:49;72903:11;;72884:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72916:10;72928:4;72884:18;:49::i;:::-;72862:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;74316:15:::4;:27;74332:10;74316:27;;;;;;;;;;;;;;;;;;;;;;;;;74315:28;74307:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;74409:4;74379:15;:27;74395:10;74379:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;74424:24;74434:10;74446:1;74424:9;:24::i;:::-;72786:213:::3;72664:1;;;72126::::2;71959::::1;74082:374:::0;;:::o;74897:106::-;13109:13;:11;:13::i;:::-;74977:18:::1;;;;;;;;;;;74976:19;74955:18;;:40;;;;;;;;;;;;;;;;;;74897:106::o:0;71400:36::-;;;;;;;;;;;;;:::o;73726:348::-;71907:10;71894:23;;:9;:23;;;71886:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;73871:21:::1;;;;;;;;;;;72033:8;;;;;;;;;;;72032:9;72024:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;72079:8;72071:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;73913:20:::2;;73935:3;72246;72230:13;:19;;;;:::i;:::-;72217:9;:32;;72209:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;73957:3:::3;72355:1;72349:3;:7;72341:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;72437:15;;72430:3;72414:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:38;;72392:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;72579:19;;72572:3;72543:14;:26;72558:10;72543:26;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:55;;72521:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;73990:11:::4;;74003:19;;72797:12;72839:10;72822:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;72812:39;;;;;;72797:54;;72884:49;72903:11;;72884:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72916:10;72928:4;72884:18;:49::i;:::-;72862:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;74040:26:::5;74050:10;74062:3;74040:9;:26::i;:::-;72786:213:::4;72664:1;;;72283::::3;72126::::2;;71959::::1;73726:348:::0;;;:::o;76687:122::-;13109:13;:11;:13::i;:::-;76791:10:::1;76769:19;:32;;;;76687:122:::0;:::o;46346:164::-;46443:4;46467:18;:25;46486:5;46467:25;;;;;;;;;;;;;;;:35;46493:8;46467:35;;;;;;;;;;;;;;;;;;;;;;;;;46460:42;;46346:164;;;;:::o;71696:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;14129:201::-;13109:13;:11;:13::i;:::-;14238:1:::1;14218:22;;:8;:22;;::::0;14210:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14294:28;14313:8;14294:18;:28::i;:::-;14129:201:::0;:::o;71492:31::-;;;;:::o;13388:132::-;13463:12;:10;:12::i;:::-;13452:23;;:7;:5;:7::i;:::-;:23;;;13444:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13388:132::o;37938:639::-;38023:4;38362:10;38347:25;;:11;:25;;;;:102;;;;38439:10;38424:25;;:11;:25;;;;38347:102;:179;;;;38516:10;38501:25;;:11;:25;;;;38347:179;38327:199;;37938:639;;;:::o;46768:282::-;46833:4;46889:7;46870:15;:13;:15::i;:::-;:26;;:66;;;;;46923:13;;46913:7;:23;46870:66;:153;;;;;47022:1;30710:8;46974:17;:26;46992:7;46974:26;;;;;;;;;;;;:44;:49;46870:153;46850:173;;46768:282;;;:::o;3589:190::-;3714:4;3767;3738:25;3751:5;3758:4;3738:12;:25::i;:::-;:33;3731:40;;3589:190;;;;;:::o;62638:112::-;62715:27;62725:2;62729:8;62715:27;;;;;;;;;;;;:9;:27::i;:::-;62638:112;;:::o;68806:105::-;68866:7;68893:10;68886:17;;68806:105;:::o;34107:92::-;34163:7;34107:92;:::o;41388:1275::-;41455:7;41475:12;41490:7;41475:22;;41558:4;41539:15;:13;:15::i;:::-;:23;41535:1061;;41592:13;;41585:4;:20;41581:1015;;;41630:14;41647:17;:23;41665:4;41647:23;;;;;;;;;;;;41630:40;;41764:1;30710:8;41736:6;:24;:29;41732:845;;42401:113;42418:1;42408:6;:11;42401:113;;42461:17;:25;42479:6;;;;;;;42461:25;;;;;;;;;;;;42452:34;;42401:113;;;42547:6;42540:13;;;;;;41732:845;41607:989;41581:1015;41535:1061;42624:31;;;;;;;;;;;;;;41388:1275;;;;:::o;47931:485::-;48033:27;48062:23;48103:38;48144:15;:24;48160:7;48144:24;;;;;;;;;;;48103:65;;48321:18;48298:41;;48378:19;48372:26;48353:45;;48283:126;47931:485;;;:::o;47159:659::-;47308:11;47473:16;47466:5;47462:28;47453:37;;47633:16;47622:9;47618:32;47605:45;;47783:15;47772:9;47769:30;47761:5;47750:9;47747:20;47744:56;47734:66;;47159:659;;;;;:::o;53793:159::-;;;;;:::o;68115:311::-;68250:7;68270:16;31114:3;68296:19;:41;;68270:68;;31114:3;68364:31;68375:4;68381:2;68385:9;68364:10;:31::i;:::-;68356:40;;:62;;68349:69;;;68115:311;;;;;:::o;43211:450::-;43291:14;43459:16;43452:5;43448:28;43439:37;;43636:5;43622:11;43597:23;43593:41;43590:52;43583:5;43580:63;43570:73;;43211:450;;;;:::o;54617:158::-;;;;;:::o;14490:191::-;14564:16;14583:6;;;;;;;;;;;14564:25;;14609:8;14600:6;;:17;;;;;;;;;;;;;;;;;;14664:8;14633:40;;14654:8;14633:40;;;;;;;;;;;;14553:128;14490:191;:::o;55215:716::-;55378:4;55424:2;55399:45;;;55445:19;:17;:19::i;:::-;55466:4;55472:7;55481:5;55399:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55395:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55699:1;55682:6;:13;:18;55678:235;;55728:40;;;;;;;;;;;;;;55678:235;55871:6;55865:13;55856:6;55852:2;55848:15;55841:38;55395:529;55568:54;;;55558:64;;;:6;:64;;;;55551:71;;;55215:716;;;;;;:::o;303:723::-;359:13;589:1;580:5;:10;576:53;;607:10;;;;;;;;;;;;;;;;;;;;;576:53;639:12;654:5;639:20;;670:14;695:78;710:1;702:4;:9;695:78;;728:8;;;;;:::i;:::-;;;;759:2;751:10;;;;;:::i;:::-;;;695:78;;;783:19;815:6;805:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;783:39;;833:154;849:1;840:5;:10;833:154;;877:1;867:11;;;;;:::i;:::-;;;944:2;936:5;:10;;;;:::i;:::-;923:2;:24;;;;:::i;:::-;910:39;;893:6;900;893:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;973:2;964:11;;;;;:::i;:::-;;;833:154;;;1011:6;997:21;;;;;303:723;;;;:::o;11774:98::-;11827:7;11854:10;11847:17;;11774:98;:::o;4456:296::-;4539:7;4559:20;4582:4;4559:27;;4602:9;4597:118;4621:5;:12;4617:1;:16;4597:118;;;4670:33;4680:12;4694:5;4700:1;4694:8;;;;;;;;:::i;:::-;;;;;;;;4670:9;:33::i;:::-;4655:48;;4635:3;;;;;:::i;:::-;;;;4597:118;;;;4732:12;4725:19;;;4456:296;;;;:::o;61865:689::-;61996:19;62002:2;62006:8;61996:5;:19::i;:::-;62075:1;62057:2;:14;;;:19;62053:483;;62097:11;62111:13;;62097:27;;62143:13;62165:8;62159:3;:14;62143:30;;62192:233;62223:62;62262:1;62266:2;62270:7;;;;;;62279:5;62223:30;:62::i;:::-;62218:167;;62321:40;;;;;;;;;;;;;;62218:167;62420:3;62412:5;:11;62192:233;;62507:3;62490:13;;:20;62486:34;;62512:8;;;62486:34;62078:458;;62053:483;61865:689;;;:::o;67816:147::-;67953:6;67816:147;;;;;:::o;10663:149::-;10726:7;10757:1;10753;:5;:51;;10784:20;10799:1;10802;10784:14;:20::i;:::-;10753:51;;;10761:20;10776:1;10779;10761:14;:20::i;:::-;10753:51;10746:58;;10663:149;;;;:::o;56393:2720::-;56466:20;56489:13;;56466:36;;56529:1;56517:8;:13;56513:44;;56539:18;;;;;;;;;;;;;;56513:44;56570:61;56600:1;56604:2;56608:12;56622:8;56570:21;:61::i;:::-;57114:1;30072:2;57084:1;:26;;57083:32;57071:8;:45;57045:18;:22;57064:2;57045:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;57393:139;57430:2;57484:33;57507:1;57511:2;57515:1;57484:14;:33::i;:::-;57451:30;57472:8;57451:20;:30::i;:::-;:66;57393:18;:139::i;:::-;57359:17;:31;57377:12;57359:31;;;;;;;;;;;:173;;;;57549:16;57580:11;57609:8;57594:12;:23;57580:37;;58130:16;58126:2;58122:25;58110:37;;58502:12;58462:8;58421:1;58359:25;58300:1;58239;58212:335;58627:1;58613:12;58609:20;58567:346;58668:3;58659:7;58656:16;58567:346;;58886:7;58876:8;58873:1;58846:25;58843:1;58840;58835:59;58721:1;58712:7;58708:15;58697:26;;58567:346;;;58571:77;58958:1;58946:8;:13;58942:45;;58968:19;;;;;;;;;;;;;;58942:45;59020:3;59004:13;:19;;;;56819:2216;;59045:60;59074:1;59078:2;59082:12;59096:8;59045:20;:60::i;:::-;56455:2658;56393:2720;;:::o;10820:268::-;10888:13;10995:1;10989:4;10982:15;11024:1;11018:4;11011:15;11065:4;11059;11049:21;11040:30;;10820:268;;;;:::o;43763:324::-;43833:14;44066:1;44056:8;44053:15;44027:24;44023:46;44013:56;;43763:324;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:86::-;876:7;916:4;909:5;905:16;894:27;;841:86;;;:::o;933:118::-;1004:22;1020:5;1004:22;:::i;:::-;997:5;994:33;984:61;;1041:1;1038;1031:12;984:61;933:118;:::o;1057:135::-;1101:5;1139:6;1126:20;1117:29;;1155:31;1180:5;1155:31;:::i;:::-;1057:135;;;;:::o;1198:470::-;1264:6;1272;1321:2;1309:9;1300:7;1296:23;1292:32;1289:119;;;1327:79;;:::i;:::-;1289:119;1447:1;1472:53;1517:7;1508:6;1497:9;1493:22;1472:53;:::i;:::-;1462:63;;1418:117;1574:2;1600:51;1643:7;1634:6;1623:9;1619:22;1600:51;:::i;:::-;1590:61;;1545:116;1198:470;;;;;:::o;1674:149::-;1710:7;1750:66;1743:5;1739:78;1728:89;;1674:149;;;:::o;1829:120::-;1901:23;1918:5;1901:23;:::i;:::-;1894:5;1891:34;1881:62;;1939:1;1936;1929:12;1881:62;1829:120;:::o;1955:137::-;2000:5;2038:6;2025:20;2016:29;;2054:32;2080:5;2054:32;:::i;:::-;1955:137;;;;:::o;2098:327::-;2156:6;2205:2;2193:9;2184:7;2180:23;2176:32;2173:119;;;2211:79;;:::i;:::-;2173:119;2331:1;2356:52;2400:7;2391:6;2380:9;2376:22;2356:52;:::i;:::-;2346:62;;2302:116;2098:327;;;;:::o;2431:90::-;2465:7;2508:5;2501:13;2494:21;2483:32;;2431:90;;;:::o;2527:109::-;2608:21;2623:5;2608:21;:::i;:::-;2603:3;2596:34;2527:109;;:::o;2642:210::-;2729:4;2767:2;2756:9;2752:18;2744:26;;2780:65;2842:1;2831:9;2827:17;2818:6;2780:65;:::i;:::-;2642:210;;;;:::o;2858:99::-;2910:6;2944:5;2938:12;2928:22;;2858:99;;;:::o;2963:169::-;3047:11;3081:6;3076:3;3069:19;3121:4;3116:3;3112:14;3097:29;;2963:169;;;;:::o;3138:307::-;3206:1;3216:113;3230:6;3227:1;3224:13;3216:113;;;3315:1;3310:3;3306:11;3300:18;3296:1;3291:3;3287:11;3280:39;3252:2;3249:1;3245:10;3240:15;;3216:113;;;3347:6;3344:1;3341:13;3338:101;;;3427:1;3418:6;3413:3;3409:16;3402:27;3338:101;3187:258;3138:307;;;:::o;3451:102::-;3492:6;3543:2;3539:7;3534:2;3527:5;3523:14;3519:28;3509:38;;3451:102;;;:::o;3559:364::-;3647:3;3675:39;3708:5;3675:39;:::i;:::-;3730:71;3794:6;3789:3;3730:71;:::i;:::-;3723:78;;3810:52;3855:6;3850:3;3843:4;3836:5;3832:16;3810:52;:::i;:::-;3887:29;3909:6;3887:29;:::i;:::-;3882:3;3878:39;3871:46;;3651:272;3559:364;;;;:::o;3929:313::-;4042:4;4080:2;4069:9;4065:18;4057:26;;4129:9;4123:4;4119:20;4115:1;4104:9;4100:17;4093:47;4157:78;4230:4;4221:6;4157:78;:::i;:::-;4149:86;;3929:313;;;;:::o;4248:77::-;4285:7;4314:5;4303:16;;4248:77;;;:::o;4331:118::-;4418:24;4436:5;4418:24;:::i;:::-;4413:3;4406:37;4331:118;;:::o;4455:222::-;4548:4;4586:2;4575:9;4571:18;4563:26;;4599:71;4667:1;4656:9;4652:17;4643:6;4599:71;:::i;:::-;4455:222;;;;:::o;4683:122::-;4756:24;4774:5;4756:24;:::i;:::-;4749:5;4746:35;4736:63;;4795:1;4792;4785:12;4736:63;4683:122;:::o;4811:139::-;4857:5;4895:6;4882:20;4873:29;;4911:33;4938:5;4911:33;:::i;:::-;4811:139;;;;:::o;4956:329::-;5015:6;5064:2;5052:9;5043:7;5039:23;5035:32;5032:119;;;5070:79;;:::i;:::-;5032:119;5190:1;5215:53;5260:7;5251:6;5240:9;5236:22;5215:53;:::i;:::-;5205:63;;5161:117;4956:329;;;;:::o;5291:118::-;5378:24;5396:5;5378:24;:::i;:::-;5373:3;5366:37;5291:118;;:::o;5415:222::-;5508:4;5546:2;5535:9;5531:18;5523:26;;5559:71;5627:1;5616:9;5612:17;5603:6;5559:71;:::i;:::-;5415:222;;;;:::o;5643:117::-;5752:1;5749;5742:12;5766:117;5875:1;5872;5865:12;5889:117;5998:1;5995;5988:12;6029:568;6102:8;6112:6;6162:3;6155:4;6147:6;6143:17;6139:27;6129:122;;6170:79;;:::i;:::-;6129:122;6283:6;6270:20;6260:30;;6313:18;6305:6;6302:30;6299:117;;;6335:79;;:::i;:::-;6299:117;6449:4;6441:6;6437:17;6425:29;;6503:3;6495:4;6487:6;6483:17;6473:8;6469:32;6466:41;6463:128;;;6510:79;;:::i;:::-;6463:128;6029:568;;;;;:::o;6603:704::-;6698:6;6706;6714;6763:2;6751:9;6742:7;6738:23;6734:32;6731:119;;;6769:79;;:::i;:::-;6731:119;6889:1;6914:53;6959:7;6950:6;6939:9;6935:22;6914:53;:::i;:::-;6904:63;;6860:117;7044:2;7033:9;7029:18;7016:32;7075:18;7067:6;7064:30;7061:117;;;7097:79;;:::i;:::-;7061:117;7210:80;7282:7;7273:6;7262:9;7258:22;7210:80;:::i;:::-;7192:98;;;;6987:313;6603:704;;;;;:::o;7313:474::-;7381:6;7389;7438:2;7426:9;7417:7;7413:23;7409:32;7406:119;;;7444:79;;:::i;:::-;7406:119;7564:1;7589:53;7634:7;7625:6;7614:9;7610:22;7589:53;:::i;:::-;7579:63;;7535:117;7691:2;7717:53;7762:7;7753:6;7742:9;7738:22;7717:53;:::i;:::-;7707:63;;7662:118;7313:474;;;;;:::o;7793:77::-;7830:7;7859:5;7848:16;;7793:77;;;:::o;7876:118::-;7963:24;7981:5;7963:24;:::i;:::-;7958:3;7951:37;7876:118;;:::o;8000:222::-;8093:4;8131:2;8120:9;8116:18;8108:26;;8144:71;8212:1;8201:9;8197:17;8188:6;8144:71;:::i;:::-;8000:222;;;;:::o;8228:619::-;8305:6;8313;8321;8370:2;8358:9;8349:7;8345:23;8341:32;8338:119;;;8376:79;;:::i;:::-;8338:119;8496:1;8521:53;8566:7;8557:6;8546:9;8542:22;8521:53;:::i;:::-;8511:63;;8467:117;8623:2;8649:53;8694:7;8685:6;8674:9;8670:22;8649:53;:::i;:::-;8639:63;;8594:118;8751:2;8777:53;8822:7;8813:6;8802:9;8798:22;8777:53;:::i;:::-;8767:63;;8722:118;8228:619;;;;;:::o;8853:474::-;8921:6;8929;8978:2;8966:9;8957:7;8953:23;8949:32;8946:119;;;8984:79;;:::i;:::-;8946:119;9104:1;9129:53;9174:7;9165:6;9154:9;9150:22;9129:53;:::i;:::-;9119:63;;9075:117;9231:2;9257:53;9302:7;9293:6;9282:9;9278:22;9257:53;:::i;:::-;9247:63;;9202:118;8853:474;;;;;:::o;9333:332::-;9454:4;9492:2;9481:9;9477:18;9469:26;;9505:71;9573:1;9562:9;9558:17;9549:6;9505:71;:::i;:::-;9586:72;9654:2;9643:9;9639:18;9630:6;9586:72;:::i;:::-;9333:332;;;;;:::o;9671:180::-;9719:77;9716:1;9709:88;9816:4;9813:1;9806:15;9840:4;9837:1;9830:15;9857:281;9940:27;9962:4;9940:27;:::i;:::-;9932:6;9928:40;10070:6;10058:10;10055:22;10034:18;10022:10;10019:34;10016:62;10013:88;;;10081:18;;:::i;:::-;10013:88;10121:10;10117:2;10110:22;9900:238;9857:281;;:::o;10144:129::-;10178:6;10205:20;;:::i;:::-;10195:30;;10234:33;10262:4;10254:6;10234:33;:::i;:::-;10144:129;;;:::o;10279:311::-;10356:4;10446:18;10438:6;10435:30;10432:56;;;10468:18;;:::i;:::-;10432:56;10518:4;10510:6;10506:17;10498:25;;10578:4;10572;10568:15;10560:23;;10279:311;;;:::o;10613:710::-;10709:5;10734:81;10750:64;10807:6;10750:64;:::i;:::-;10734:81;:::i;:::-;10725:90;;10835:5;10864:6;10857:5;10850:21;10898:4;10891:5;10887:16;10880:23;;10951:4;10943:6;10939:17;10931:6;10927:30;10980:3;10972:6;10969:15;10966:122;;;10999:79;;:::i;:::-;10966:122;11114:6;11097:220;11131:6;11126:3;11123:15;11097:220;;;11206:3;11235:37;11268:3;11256:10;11235:37;:::i;:::-;11230:3;11223:50;11302:4;11297:3;11293:14;11286:21;;11173:144;11157:4;11152:3;11148:14;11141:21;;11097:220;;;11101:21;10715:608;;10613:710;;;;;:::o;11346:370::-;11417:5;11466:3;11459:4;11451:6;11447:17;11443:27;11433:122;;11474:79;;:::i;:::-;11433:122;11591:6;11578:20;11616:94;11706:3;11698:6;11691:4;11683:6;11679:17;11616:94;:::i;:::-;11607:103;;11423:293;11346:370;;;;:::o;11722:311::-;11799:4;11889:18;11881:6;11878:30;11875:56;;;11911:18;;:::i;:::-;11875:56;11961:4;11953:6;11949:17;11941:25;;12021:4;12015;12011:15;12003:23;;11722:311;;;:::o;12056:710::-;12152:5;12177:81;12193:64;12250:6;12193:64;:::i;:::-;12177:81;:::i;:::-;12168:90;;12278:5;12307:6;12300:5;12293:21;12341:4;12334:5;12330:16;12323:23;;12394:4;12386:6;12382:17;12374:6;12370:30;12423:3;12415:6;12412:15;12409:122;;;12442:79;;:::i;:::-;12409:122;12557:6;12540:220;12574:6;12569:3;12566:15;12540:220;;;12649:3;12678:37;12711:3;12699:10;12678:37;:::i;:::-;12673:3;12666:50;12745:4;12740:3;12736:14;12729:21;;12616:144;12600:4;12595:3;12591:14;12584:21;;12540:220;;;12544:21;12158:608;;12056:710;;;;;:::o;12789:370::-;12860:5;12909:3;12902:4;12894:6;12890:17;12886:27;12876:122;;12917:79;;:::i;:::-;12876:122;13034:6;13021:20;13059:94;13149:3;13141:6;13134:4;13126:6;13122:17;13059:94;:::i;:::-;13050:103;;12866:293;12789:370;;;;:::o;13165:894::-;13283:6;13291;13340:2;13328:9;13319:7;13315:23;13311:32;13308:119;;;13346:79;;:::i;:::-;13308:119;13494:1;13483:9;13479:17;13466:31;13524:18;13516:6;13513:30;13510:117;;;13546:79;;:::i;:::-;13510:117;13651:78;13721:7;13712:6;13701:9;13697:22;13651:78;:::i;:::-;13641:88;;13437:302;13806:2;13795:9;13791:18;13778:32;13837:18;13829:6;13826:30;13823:117;;;13859:79;;:::i;:::-;13823:117;13964:78;14034:7;14025:6;14014:9;14010:22;13964:78;:::i;:::-;13954:88;;13749:303;13165:894;;;;;:::o;14065:110::-;14116:7;14145:24;14163:5;14145:24;:::i;:::-;14134:35;;14065:110;;;:::o;14181:150::-;14268:38;14300:5;14268:38;:::i;:::-;14261:5;14258:49;14248:77;;14321:1;14318;14311:12;14248:77;14181:150;:::o;14337:167::-;14397:5;14435:6;14422:20;14413:29;;14451:47;14492:5;14451:47;:::i;:::-;14337:167;;;;:::o;14510:357::-;14583:6;14632:2;14620:9;14611:7;14607:23;14603:32;14600:119;;;14638:79;;:::i;:::-;14600:119;14758:1;14783:67;14842:7;14833:6;14822:9;14818:22;14783:67;:::i;:::-;14773:77;;14729:131;14510:357;;;;:::o;14873:117::-;14982:1;14979;14972:12;14996:308;15058:4;15148:18;15140:6;15137:30;15134:56;;;15170:18;;:::i;:::-;15134:56;15208:29;15230:6;15208:29;:::i;:::-;15200:37;;15292:4;15286;15282:15;15274:23;;14996:308;;;:::o;15310:154::-;15394:6;15389:3;15384;15371:30;15456:1;15447:6;15442:3;15438:16;15431:27;15310:154;;;:::o;15470:412::-;15548:5;15573:66;15589:49;15631:6;15589:49;:::i;:::-;15573:66;:::i;:::-;15564:75;;15662:6;15655:5;15648:21;15700:4;15693:5;15689:16;15738:3;15729:6;15724:3;15720:16;15717:25;15714:112;;;15745:79;;:::i;:::-;15714:112;15835:41;15869:6;15864:3;15859;15835:41;:::i;:::-;15554:328;15470:412;;;;;:::o;15902:340::-;15958:5;16007:3;16000:4;15992:6;15988:17;15984:27;15974:122;;16015:79;;:::i;:::-;15974:122;16132:6;16119:20;16157:79;16232:3;16224:6;16217:4;16209:6;16205:17;16157:79;:::i;:::-;16148:88;;15964:278;15902:340;;;;:::o;16248:509::-;16317:6;16366:2;16354:9;16345:7;16341:23;16337:32;16334:119;;;16372:79;;:::i;:::-;16334:119;16520:1;16509:9;16505:17;16492:31;16550:18;16542:6;16539:30;16536:117;;;16572:79;;:::i;:::-;16536:117;16677:63;16732:7;16723:6;16712:9;16708:22;16677:63;:::i;:::-;16667:73;;16463:287;16248:509;;;;:::o;16763:329::-;16822:6;16871:2;16859:9;16850:7;16846:23;16842:32;16839:119;;;16877:79;;:::i;:::-;16839:119;16997:1;17022:53;17067:7;17058:6;17047:9;17043:22;17022:53;:::i;:::-;17012:63;;16968:117;16763:329;;;;:::o;17098:109::-;17134:7;17174:26;17167:5;17163:38;17152:49;;17098:109;;;:::o;17213:115::-;17298:23;17315:5;17298:23;:::i;:::-;17293:3;17286:36;17213:115;;:::o;17334:218::-;17425:4;17463:2;17452:9;17448:18;17440:26;;17476:69;17542:1;17531:9;17527:17;17518:6;17476:69;:::i;:::-;17334:218;;;;:::o;17558:122::-;17631:24;17649:5;17631:24;:::i;:::-;17624:5;17621:35;17611:63;;17670:1;17667;17660:12;17611:63;17558:122;:::o;17686:139::-;17732:5;17770:6;17757:20;17748:29;;17786:33;17813:5;17786:33;:::i;:::-;17686:139;;;;:::o;17831:329::-;17890:6;17939:2;17927:9;17918:7;17914:23;17910:32;17907:119;;;17945:79;;:::i;:::-;17907:119;18065:1;18090:53;18135:7;18126:6;18115:9;18111:22;18090:53;:::i;:::-;18080:63;;18036:117;17831:329;;;;:::o;18166:116::-;18236:21;18251:5;18236:21;:::i;:::-;18229:5;18226:32;18216:60;;18272:1;18269;18262:12;18216:60;18166:116;:::o;18288:133::-;18331:5;18369:6;18356:20;18347:29;;18385:30;18409:5;18385:30;:::i;:::-;18288:133;;;;:::o;18427:468::-;18492:6;18500;18549:2;18537:9;18528:7;18524:23;18520:32;18517:119;;;18555:79;;:::i;:::-;18517:119;18675:1;18700:53;18745:7;18736:6;18725:9;18721:22;18700:53;:::i;:::-;18690:63;;18646:117;18802:2;18828:50;18870:7;18861:6;18850:9;18846:22;18828:50;:::i;:::-;18818:60;;18773:115;18427:468;;;;;:::o;18901:307::-;18962:4;19052:18;19044:6;19041:30;19038:56;;;19074:18;;:::i;:::-;19038:56;19112:29;19134:6;19112:29;:::i;:::-;19104:37;;19196:4;19190;19186:15;19178:23;;18901:307;;;:::o;19214:410::-;19291:5;19316:65;19332:48;19373:6;19332:48;:::i;:::-;19316:65;:::i;:::-;19307:74;;19404:6;19397:5;19390:21;19442:4;19435:5;19431:16;19480:3;19471:6;19466:3;19462:16;19459:25;19456:112;;;19487:79;;:::i;:::-;19456:112;19577:41;19611:6;19606:3;19601;19577:41;:::i;:::-;19297:327;19214:410;;;;;:::o;19643:338::-;19698:5;19747:3;19740:4;19732:6;19728:17;19724:27;19714:122;;19755:79;;:::i;:::-;19714:122;19872:6;19859:20;19897:78;19971:3;19963:6;19956:4;19948:6;19944:17;19897:78;:::i;:::-;19888:87;;19704:277;19643:338;;;;:::o;19987:943::-;20082:6;20090;20098;20106;20155:3;20143:9;20134:7;20130:23;20126:33;20123:120;;;20162:79;;:::i;:::-;20123:120;20282:1;20307:53;20352:7;20343:6;20332:9;20328:22;20307:53;:::i;:::-;20297:63;;20253:117;20409:2;20435:53;20480:7;20471:6;20460:9;20456:22;20435:53;:::i;:::-;20425:63;;20380:118;20537:2;20563:53;20608:7;20599:6;20588:9;20584:22;20563:53;:::i;:::-;20553:63;;20508:118;20693:2;20682:9;20678:18;20665:32;20724:18;20716:6;20713:30;20710:117;;;20746:79;;:::i;:::-;20710:117;20851:62;20905:7;20896:6;20885:9;20881:22;20851:62;:::i;:::-;20841:72;;20636:287;19987:943;;;;;;;:::o;20936:559::-;21022:6;21030;21079:2;21067:9;21058:7;21054:23;21050:32;21047:119;;;21085:79;;:::i;:::-;21047:119;21233:1;21222:9;21218:17;21205:31;21263:18;21255:6;21252:30;21249:117;;;21285:79;;:::i;:::-;21249:117;21398:80;21470:7;21461:6;21450:9;21446:22;21398:80;:::i;:::-;21380:98;;;;21176:312;20936:559;;;;;:::o;21501:474::-;21569:6;21577;21626:2;21614:9;21605:7;21601:23;21597:32;21594:119;;;21632:79;;:::i;:::-;21594:119;21752:1;21777:53;21822:7;21813:6;21802:9;21798:22;21777:53;:::i;:::-;21767:63;;21723:117;21879:2;21905:53;21950:7;21941:6;21930:9;21926:22;21905:53;:::i;:::-;21895:63;;21850:118;21501:474;;;;;:::o;21981:166::-;22121:18;22117:1;22109:6;22105:14;22098:42;21981:166;:::o;22153:366::-;22295:3;22316:67;22380:2;22375:3;22316:67;:::i;:::-;22309:74;;22392:93;22481:3;22392:93;:::i;:::-;22510:2;22505:3;22501:12;22494:19;;22153:366;;;:::o;22525:419::-;22691:4;22729:2;22718:9;22714:18;22706:26;;22778:9;22772:4;22768:20;22764:1;22753:9;22749:17;22742:47;22806:131;22932:4;22806:131;:::i;:::-;22798:139;;22525:419;;;:::o;22950:180::-;22998:77;22995:1;22988:88;23095:4;23092:1;23085:15;23119:4;23116:1;23109:15;23136:320;23180:6;23217:1;23211:4;23207:12;23197:22;;23264:1;23258:4;23254:12;23285:18;23275:81;;23341:4;23333:6;23329:17;23319:27;;23275:81;23403:2;23395:6;23392:14;23372:18;23369:38;23366:84;;23422:18;;:::i;:::-;23366:84;23187:269;23136:320;;;:::o;23462:176::-;23602:28;23598:1;23590:6;23586:14;23579:52;23462:176;:::o;23644:366::-;23786:3;23807:67;23871:2;23866:3;23807:67;:::i;:::-;23800:74;;23883:93;23972:3;23883:93;:::i;:::-;24001:2;23996:3;23992:12;23985:19;;23644:366;;;:::o;24016:419::-;24182:4;24220:2;24209:9;24205:18;24197:26;;24269:9;24263:4;24259:20;24255:1;24244:9;24240:17;24233:47;24297:131;24423:4;24297:131;:::i;:::-;24289:139;;24016:419;;;:::o;24441:164::-;24581:16;24577:1;24569:6;24565:14;24558:40;24441:164;:::o;24611:366::-;24753:3;24774:67;24838:2;24833:3;24774:67;:::i;:::-;24767:74;;24850:93;24939:3;24850:93;:::i;:::-;24968:2;24963:3;24959:12;24952:19;;24611:366;;;:::o;24983:419::-;25149:4;25187:2;25176:9;25172:18;25164:26;;25236:9;25230:4;25226:20;25222:1;25211:9;25207:17;25200:47;25264:131;25390:4;25264:131;:::i;:::-;25256:139;;24983:419;;;:::o;25408:173::-;25548:25;25544:1;25536:6;25532:14;25525:49;25408:173;:::o;25587:366::-;25729:3;25750:67;25814:2;25809:3;25750:67;:::i;:::-;25743:74;;25826:93;25915:3;25826:93;:::i;:::-;25944:2;25939:3;25935:12;25928:19;;25587:366;;;:::o;25959:419::-;26125:4;26163:2;26152:9;26148:18;26140:26;;26212:9;26206:4;26202:20;26198:1;26187:9;26183:17;26176:47;26240:131;26366:4;26240:131;:::i;:::-;26232:139;;25959:419;;;:::o;26384:180::-;26432:77;26429:1;26422:88;26529:4;26526:1;26519:15;26553:4;26550:1;26543:15;26570:348;26610:7;26633:20;26651:1;26633:20;:::i;:::-;26628:25;;26667:20;26685:1;26667:20;:::i;:::-;26662:25;;26855:1;26787:66;26783:74;26780:1;26777:81;26772:1;26765:9;26758:17;26754:105;26751:131;;;26862:18;;:::i;:::-;26751:131;26910:1;26907;26903:9;26892:20;;26570:348;;;;:::o;26924:168::-;27064:20;27060:1;27052:6;27048:14;27041:44;26924:168;:::o;27098:366::-;27240:3;27261:67;27325:2;27320:3;27261:67;:::i;:::-;27254:74;;27337:93;27426:3;27337:93;:::i;:::-;27455:2;27450:3;27446:12;27439:19;;27098:366;;;:::o;27470:419::-;27636:4;27674:2;27663:9;27659:18;27651:26;;27723:9;27717:4;27713:20;27709:1;27698:9;27694:17;27687:47;27751:131;27877:4;27751:131;:::i;:::-;27743:139;;27470:419;;;:::o;27895:170::-;28035:22;28031:1;28023:6;28019:14;28012:46;27895:170;:::o;28071:366::-;28213:3;28234:67;28298:2;28293:3;28234:67;:::i;:::-;28227:74;;28310:93;28399:3;28310:93;:::i;:::-;28428:2;28423:3;28419:12;28412:19;;28071:366;;;:::o;28443:419::-;28609:4;28647:2;28636:9;28632:18;28624:26;;28696:9;28690:4;28686:20;28682:1;28671:9;28667:17;28660:47;28724:131;28850:4;28724:131;:::i;:::-;28716:139;;28443:419;;;:::o;28868:305::-;28908:3;28927:20;28945:1;28927:20;:::i;:::-;28922:25;;28961:20;28979:1;28961:20;:::i;:::-;28956:25;;29115:1;29047:66;29043:74;29040:1;29037:81;29034:107;;;29121:18;;:::i;:::-;29034:107;29165:1;29162;29158:9;29151:16;;28868:305;;;;:::o;29179:180::-;29319:32;29315:1;29307:6;29303:14;29296:56;29179:180;:::o;29365:366::-;29507:3;29528:67;29592:2;29587:3;29528:67;:::i;:::-;29521:74;;29604:93;29693:3;29604:93;:::i;:::-;29722:2;29717:3;29713:12;29706:19;;29365:366;;;:::o;29737:419::-;29903:4;29941:2;29930:9;29926:18;29918:26;;29990:9;29984:4;29980:20;29976:1;29965:9;29961:17;29954:47;30018:131;30144:4;30018:131;:::i;:::-;30010:139;;29737:419;;;:::o;30162:177::-;30302:29;30298:1;30290:6;30286:14;30279:53;30162:177;:::o;30345:366::-;30487:3;30508:67;30572:2;30567:3;30508:67;:::i;:::-;30501:74;;30584:93;30673:3;30584:93;:::i;:::-;30702:2;30697:3;30693:12;30686:19;;30345:366;;;:::o;30717:419::-;30883:4;30921:2;30910:9;30906:18;30898:26;;30970:9;30964:4;30960:20;30956:1;30945:9;30941:17;30934:47;30998:131;31124:4;30998:131;:::i;:::-;30990:139;;30717:419;;;:::o;31142:94::-;31175:8;31223:5;31219:2;31215:14;31194:35;;31142:94;;;:::o;31242:::-;31281:7;31310:20;31324:5;31310:20;:::i;:::-;31299:31;;31242:94;;;:::o;31342:100::-;31381:7;31410:26;31430:5;31410:26;:::i;:::-;31399:37;;31342:100;;;:::o;31448:157::-;31553:45;31573:24;31591:5;31573:24;:::i;:::-;31553:45;:::i;:::-;31548:3;31541:58;31448:157;;:::o;31611:256::-;31723:3;31738:75;31809:3;31800:6;31738:75;:::i;:::-;31838:2;31833:3;31829:12;31822:19;;31858:3;31851:10;;31611:256;;;;:::o;31873:168::-;32013:20;32009:1;32001:6;31997:14;31990:44;31873:168;:::o;32047:366::-;32189:3;32210:67;32274:2;32269:3;32210:67;:::i;:::-;32203:74;;32286:93;32375:3;32286:93;:::i;:::-;32404:2;32399:3;32395:12;32388:19;;32047:366;;;:::o;32419:419::-;32585:4;32623:2;32612:9;32608:18;32600:26;;32672:9;32666:4;32662:20;32658:1;32647:9;32643:17;32636:47;32700:131;32826:4;32700:131;:::i;:::-;32692:139;;32419:419;;;:::o;32844:180::-;32892:77;32889:1;32882:88;32989:4;32986:1;32979:15;33013:4;33010:1;33003:15;33030:185;33070:1;33087:20;33105:1;33087:20;:::i;:::-;33082:25;;33121:20;33139:1;33121:20;:::i;:::-;33116:25;;33160:1;33150:35;;33165:18;;:::i;:::-;33150:35;33207:1;33204;33200:9;33195:14;;33030:185;;;;:::o;33221:180::-;33269:77;33266:1;33259:88;33366:4;33363:1;33356:15;33390:4;33387:1;33380:15;33407:162;33547:14;33543:1;33535:6;33531:14;33524:38;33407:162;:::o;33575:366::-;33717:3;33738:67;33802:2;33797:3;33738:67;:::i;:::-;33731:74;;33814:93;33903:3;33814:93;:::i;:::-;33932:2;33927:3;33923:12;33916:19;;33575:366;;;:::o;33947:419::-;34113:4;34151:2;34140:9;34136:18;34128:26;;34200:9;34194:4;34190:20;34186:1;34175:9;34171:17;34164:47;34228:131;34354:4;34228:131;:::i;:::-;34220:139;;33947:419;;;:::o;34372:233::-;34411:3;34434:24;34452:5;34434:24;:::i;:::-;34425:33;;34480:66;34473:5;34470:77;34467:103;;34550:18;;:::i;:::-;34467:103;34597:1;34590:5;34586:13;34579:20;;34372:233;;;:::o;34611:171::-;34751:23;34747:1;34739:6;34735:14;34728:47;34611:171;:::o;34788:366::-;34930:3;34951:67;35015:2;35010:3;34951:67;:::i;:::-;34944:74;;35027:93;35116:3;35027:93;:::i;:::-;35145:2;35140:3;35136:12;35129:19;;34788:366;;;:::o;35160:419::-;35326:4;35364:2;35353:9;35349:18;35341:26;;35413:9;35407:4;35403:20;35399:1;35388:9;35384:17;35377:47;35441:131;35567:4;35441:131;:::i;:::-;35433:139;;35160:419;;;:::o;35585:147::-;35686:11;35723:3;35708:18;;35585:147;;;;:::o;35738:114::-;;:::o;35858:398::-;36017:3;36038:83;36119:1;36114:3;36038:83;:::i;:::-;36031:90;;36130:93;36219:3;36130:93;:::i;:::-;36248:1;36243:3;36239:11;36232:18;;35858:398;;;:::o;36262:379::-;36446:3;36468:147;36611:3;36468:147;:::i;:::-;36461:154;;36632:3;36625:10;;36262:379;;;:::o;36647:167::-;36787:19;36783:1;36775:6;36771:14;36764:43;36647:167;:::o;36820:366::-;36962:3;36983:67;37047:2;37042:3;36983:67;:::i;:::-;36976:74;;37059:93;37148:3;37059:93;:::i;:::-;37177:2;37172:3;37168:12;37161:19;;36820:366;;;:::o;37192:419::-;37358:4;37396:2;37385:9;37381:18;37373:26;;37445:9;37439:4;37435:20;37431:1;37420:9;37416:17;37409:47;37473:131;37599:4;37473:131;:::i;:::-;37465:139;;37192:419;;;:::o;37617:143::-;37674:5;37705:6;37699:13;37690:22;;37721:33;37748:5;37721:33;:::i;:::-;37617:143;;;;:::o;37766:351::-;37836:6;37885:2;37873:9;37864:7;37860:23;37856:32;37853:119;;;37891:79;;:::i;:::-;37853:119;38011:1;38036:64;38092:7;38083:6;38072:9;38068:22;38036:64;:::i;:::-;38026:74;;37982:128;37766:351;;;;:::o;38123:137::-;38177:5;38208:6;38202:13;38193:22;;38224:30;38248:5;38224:30;:::i;:::-;38123:137;;;;:::o;38266:345::-;38333:6;38382:2;38370:9;38361:7;38357:23;38353:32;38350:119;;;38388:79;;:::i;:::-;38350:119;38508:1;38533:61;38586:7;38577:6;38566:9;38562:22;38533:61;:::i;:::-;38523:71;;38479:125;38266:345;;;;:::o;38617:169::-;38757:21;38753:1;38745:6;38741:14;38734:45;38617:169;:::o;38792:366::-;38934:3;38955:67;39019:2;39014:3;38955:67;:::i;:::-;38948:74;;39031:93;39120:3;39031:93;:::i;:::-;39149:2;39144:3;39140:12;39133:19;;38792:366;;;:::o;39164:419::-;39330:4;39368:2;39357:9;39353:18;39345:26;;39417:9;39411:4;39407:20;39403:1;39392:9;39388:17;39381:47;39445:131;39571:4;39445:131;:::i;:::-;39437:139;;39164:419;;;:::o;39589:173::-;39729:25;39725:1;39717:6;39713:14;39706:49;39589:173;:::o;39768:366::-;39910:3;39931:67;39995:2;39990:3;39931:67;:::i;:::-;39924:74;;40007:93;40096:3;40007:93;:::i;:::-;40125:2;40120:3;40116:12;40109:19;;39768:366;;;:::o;40140:419::-;40306:4;40344:2;40333:9;40329:18;40321:26;;40393:9;40387:4;40383:20;40379:1;40368:9;40364:17;40357:47;40421:131;40547:4;40421:131;:::i;:::-;40413:139;;40140:419;;;:::o;40565:167::-;40705:19;40701:1;40693:6;40689:14;40682:43;40565:167;:::o;40738:366::-;40880:3;40901:67;40965:2;40960:3;40901:67;:::i;:::-;40894:74;;40977:93;41066:3;40977:93;:::i;:::-;41095:2;41090:3;41086:12;41079:19;;40738:366;;;:::o;41110:419::-;41276:4;41314:2;41303:9;41299:18;41291:26;;41363:9;41357:4;41353:20;41349:1;41338:9;41334:17;41327:47;41391:131;41517:4;41391:131;:::i;:::-;41383:139;;41110:419;;;:::o;41535:148::-;41637:11;41674:3;41659:18;;41535:148;;;;:::o;41689:141::-;41738:4;41761:3;41753:11;;41784:3;41781:1;41774:14;41818:4;41815:1;41805:18;41797:26;;41689:141;;;:::o;41860:845::-;41963:3;42000:5;41994:12;42029:36;42055:9;42029:36;:::i;:::-;42081:89;42163:6;42158:3;42081:89;:::i;:::-;42074:96;;42201:1;42190:9;42186:17;42217:1;42212:137;;;;42363:1;42358:341;;;;42179:520;;42212:137;42296:4;42292:9;42281;42277:25;42272:3;42265:38;42332:6;42327:3;42323:16;42316:23;;42212:137;;42358:341;42425:38;42457:5;42425:38;:::i;:::-;42485:1;42499:154;42513:6;42510:1;42507:13;42499:154;;;42587:7;42581:14;42577:1;42572:3;42568:11;42561:35;42637:1;42628:7;42624:15;42613:26;;42535:4;42532:1;42528:12;42523:17;;42499:154;;;42682:6;42677:3;42673:16;42666:23;;42365:334;;42179:520;;41967:738;;41860:845;;;;:::o;42711:377::-;42817:3;42845:39;42878:5;42845:39;:::i;:::-;42900:89;42982:6;42977:3;42900:89;:::i;:::-;42893:96;;42998:52;43043:6;43038:3;43031:4;43024:5;43020:16;42998:52;:::i;:::-;43075:6;43070:3;43066:16;43059:23;;42821:267;42711:377;;;;:::o;43094:155::-;43234:7;43230:1;43222:6;43218:14;43211:31;43094:155;:::o;43255:400::-;43415:3;43436:84;43518:1;43513:3;43436:84;:::i;:::-;43429:91;;43529:93;43618:3;43529:93;:::i;:::-;43647:1;43642:3;43638:11;43631:18;;43255:400;;;:::o;43661:695::-;43939:3;43961:92;44049:3;44040:6;43961:92;:::i;:::-;43954:99;;44070:95;44161:3;44152:6;44070:95;:::i;:::-;44063:102;;44182:148;44326:3;44182:148;:::i;:::-;44175:155;;44347:3;44340:10;;43661:695;;;;;:::o;44362:170::-;44502:22;44498:1;44490:6;44486:14;44479:46;44362:170;:::o;44538:366::-;44680:3;44701:67;44765:2;44760:3;44701:67;:::i;:::-;44694:74;;44777:93;44866:3;44777:93;:::i;:::-;44895:2;44890:3;44886:12;44879:19;;44538:366;;;:::o;44910:419::-;45076:4;45114:2;45103:9;45099:18;45091:26;;45163:9;45157:4;45153:20;45149:1;45138:9;45134:17;45127:47;45191:131;45317:4;45191:131;:::i;:::-;45183:139;;44910:419;;;:::o;45335:225::-;45475:34;45471:1;45463:6;45459:14;45452:58;45544:8;45539:2;45531:6;45527:15;45520:33;45335:225;:::o;45566:366::-;45708:3;45729:67;45793:2;45788:3;45729:67;:::i;:::-;45722:74;;45805:93;45894:3;45805:93;:::i;:::-;45923:2;45918:3;45914:12;45907:19;;45566:366;;;:::o;45938:419::-;46104:4;46142:2;46131:9;46127:18;46119:26;;46191:9;46185:4;46181:20;46177:1;46166:9;46162:17;46155:47;46219:131;46345:4;46219:131;:::i;:::-;46211:139;;45938:419;;;:::o;46363:182::-;46503:34;46499:1;46491:6;46487:14;46480:58;46363:182;:::o;46551:366::-;46693:3;46714:67;46778:2;46773:3;46714:67;:::i;:::-;46707:74;;46790:93;46879:3;46790:93;:::i;:::-;46908:2;46903:3;46899:12;46892:19;;46551:366;;;:::o;46923:419::-;47089:4;47127:2;47116:9;47112:18;47104:26;;47176:9;47170:4;47166:20;47162:1;47151:9;47147:17;47140:47;47204:131;47330:4;47204:131;:::i;:::-;47196:139;;46923:419;;;:::o;47348:98::-;47399:6;47433:5;47427:12;47417:22;;47348:98;;;:::o;47452:168::-;47535:11;47569:6;47564:3;47557:19;47609:4;47604:3;47600:14;47585:29;;47452:168;;;;:::o;47626:360::-;47712:3;47740:38;47772:5;47740:38;:::i;:::-;47794:70;47857:6;47852:3;47794:70;:::i;:::-;47787:77;;47873:52;47918:6;47913:3;47906:4;47899:5;47895:16;47873:52;:::i;:::-;47950:29;47972:6;47950:29;:::i;:::-;47945:3;47941:39;47934:46;;47716:270;47626:360;;;;:::o;47992:640::-;48187:4;48225:3;48214:9;48210:19;48202:27;;48239:71;48307:1;48296:9;48292:17;48283:6;48239:71;:::i;:::-;48320:72;48388:2;48377:9;48373:18;48364:6;48320:72;:::i;:::-;48402;48470:2;48459:9;48455:18;48446:6;48402:72;:::i;:::-;48521:9;48515:4;48511:20;48506:2;48495:9;48491:18;48484:48;48549:76;48620:4;48611:6;48549:76;:::i;:::-;48541:84;;47992:640;;;;;;;:::o;48638:141::-;48694:5;48725:6;48719:13;48710:22;;48741:32;48767:5;48741:32;:::i;:::-;48638:141;;;;:::o;48785:349::-;48854:6;48903:2;48891:9;48882:7;48878:23;48874:32;48871:119;;;48909:79;;:::i;:::-;48871:119;49029:1;49054:63;49109:7;49100:6;49089:9;49085:22;49054:63;:::i;:::-;49044:73;;49000:127;48785:349;;;;:::o;49140:191::-;49180:4;49200:20;49218:1;49200:20;:::i;:::-;49195:25;;49234:20;49252:1;49234:20;:::i;:::-;49229:25;;49273:1;49270;49267:8;49264:34;;;49278:18;;:::i;:::-;49264:34;49323:1;49320;49316:9;49308:17;;49140:191;;;;:::o;49337:176::-;49369:1;49386:20;49404:1;49386:20;:::i;:::-;49381:25;;49420:20;49438:1;49420:20;:::i;:::-;49415:25;;49459:1;49449:35;;49464:18;;:::i;:::-;49449:35;49505:1;49502;49498:9;49493:14;;49337:176;;;;:::o
Swarm Source
ipfs://98baa5194fd4f1cb74ef409d4a36dd007f574465e7619700540172b6eb1101ae
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.