Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
500 yDogens
Holders
92
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 yDogensLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
DogensNft
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-08 */ // File: @openzeppelin/contracts/utils/Strings.sol /** Shiba Doge Killer, We Never FOGET 11/9 A group of people who are related through their experiences website https://www.dogens.io twitter https://twitter.com/DogensToken telegram https://t.me/dogenstoken **/ // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: contracts/DogensNft.sol pragma solidity ^0.8.4; contract DogensNft is ERC721A, Ownable { uint256 MAX_MINTS = 500; uint256 MAX_SUPPLY = 500; uint256 public mintRate = 0.05 ether; bool public saleEnable = true; mapping(address => uint) public ref; // Royalties address address public royaltyAddress = 0x4321cADc9435738B999d50a1F947c540E7641156; // Royalties basis points (percentage using 2 decimals - 1000 = 100, 500 = 50, 0 = 0) 10% artist 90% flipper uint256 private royaltyBasisPoints = 100; // 10% event RoyaltyBasisPoints(uint256 indexed _royaltyBasisPoints); event MintedNft(uint256 indexed _quantity, address add); string public baseURI = "ipfs://bafybeian7s22weqfozkarj4462oefrilnvqwtwfpqig4ajg4mh25amzwne/"; address signerAddress = 0xb22E21F3A676d7Dfc02208709F42856eC9774978; constructor() ERC721A("Dogens NFT", "yDogens") {} // Token Id start from 1 function _startTokenId() internal pure override returns (uint256) { return 1; } function TotalBurned() public view returns (uint256) { return _totalBurned(); } function next() public view returns (uint256) { return _nextTokenId(); } function toggleSale(bool status) public onlyOwner { require(saleEnable != status); saleEnable = status; } function getSigner( address _toAddress, uint _quantity, address _refAddrses, bytes memory signature ) internal pure returns (address) { bytes32 hash = keccak256( abi.encodePacked(_toAddress, _quantity, _refAddrses) ); bytes32 message = ECDSA.toEthSignedMessageHash(hash); address signer = ECDSA.recover(message, signature); return signer; } function mint(uint256 quantity) external payable { require(saleEnable, "Sale is not Enabled"); // _safeMint's second argument now takes in a quantity, not a tokenId. require( quantity + _numberMinted(_msgSender()) <= MAX_MINTS, "Exceeded the limit" ); require( totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left" ); require(msg.value >= (mintRate * quantity), "Not enough ether sent"); _safeMint(_msgSender(), quantity); emit MintedNft(quantity, _msgSender()); } function mintbyref( address _toAddress, uint256 _quantity, address _refAddress, bytes memory _signature ) external payable { require(saleEnable, "Sale is not Enabled"); // _safeMint's second argument now takes in a quantity, not a tokenId. require( _quantity + _numberMinted(_msgSender()) <= MAX_MINTS, "Exceeded the limit" ); require( totalSupply() + _quantity <= MAX_SUPPLY, "Not enough tokens left" ); require(msg.value >= (mintRate * _quantity), "Not enough ether sent"); require( _refAddress != _toAddress && _toAddress == msg.sender, "Don't cheat" ); require( getSigner(_toAddress, _quantity, _refAddress, _signature) == signerAddress, "Don't cheat" ); _safeMint(_msgSender(), _quantity); ref[_refAddress] += _quantity; emit MintedNft(_quantity, _msgSender()); } function vipmint(uint256 _quantity, address add) external onlyOwner { require(saleEnable, "Sale is not Enabled"); // _safeMint's second argument now takes in a quantity, not a tokenId. require( _quantity + _numberMinted(_msgSender()) <= MAX_MINTS, "Exceeded the limit" ); require( totalSupply() + _quantity <= MAX_SUPPLY, "Not enough tokens left" ); _safeMint(add, _quantity); emit MintedNft(_quantity, add); } function withdraw() external payable onlyOwner { payable(owner()).transfer(address(this).balance); } // returns base uri function _baseURI() internal view override returns (string memory) { return baseURI; } function setMintRate(uint256 _mintRate) public onlyOwner { mintRate = _mintRate; } // Set royalty address function setRoyaltyAddress(address _address) external onlyOwner { royaltyAddress = _address; } // Set base URI function setBaseURI(string memory _uri) external onlyOwner { baseURI = _uri; } // Set royalty basis points function setRoyaltyBasisPoints(uint256 _basisPoints) external onlyOwner { royaltyBasisPoints = _basisPoints; emit RoyaltyBasisPoints(_basisPoints); } // TokenURI function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "Nonexistent token"); return string(abi.encodePacked(_baseURI(), _toString(tokenId), ".json")); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"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":"uint256","name":"_quantity","type":"uint256"},{"indexed":false,"internalType":"address","name":"add","type":"address"}],"name":"MintedNft","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":"uint256","name":"_royaltyBasisPoints","type":"uint256"}],"name":"RoyaltyBasisPoints","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":"TotalBurned","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"address","name":"_refAddress","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mintbyref","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"next","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ref","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"saleEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_mintRate","type":"uint256"}],"name":"setMintRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_basisPoints","type":"uint256"}],"name":"setRoyaltyBasisPoints","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":"bool","name":"status","type":"bool"}],"name":"toggleSale","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"address","name":"add","type":"address"}],"name":"vipmint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526101f46009556101f4600a5566b1a2bc2ec50000600b556001600c60006101000a81548160ff021916908315150217905550734321cadc9435738b999d50a1f947c540e7641156600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506064600f5560405180608001604052806043815260200162003e1e6043913960109080519060200190620000c1929190620002d8565b5073b22e21f3a676d7dfc02208709f42856ec9774978601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200012457600080fd5b506040518060400160405280600a81526020017f446f67656e73204e4654000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f79446f67656e73000000000000000000000000000000000000000000000000008152508160029080519060200190620001a9929190620002d8565b508060039080519060200190620001c2929190620002d8565b50620001d36200020160201b60201c565b6000819055505050620001fb620001ef6200020a60201b60201c565b6200021260201b60201c565b620003ed565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002e69062000388565b90600052602060002090601f0160209004810192826200030a576000855562000356565b82601f106200032557805160ff191683800117855562000356565b8280016001018555821562000356579182015b828111156200035557825182559160200191906001019062000338565b5b50905062000365919062000369565b5090565b5b80821115620003845760008160009055506001016200036a565b5090565b60006002820490506001821680620003a157607f821691505b60208210811415620003b857620003b7620003be565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613a2180620003fd6000396000f3fe6080604052600436106101ee5760003560e01c8063715018a61161010d578063b88d4fde116100a0578063dbe2193f1161006f578063dbe2193f1461067a578063e985e9c5146106a3578063f2fde38b146106e0578063fc72789514610709578063fe4ca84714610732576101ee565b8063b88d4fde146105b9578063c4b6ebdf146105d5578063c87b56dd14610612578063ca0dcf161461064f576101ee565b8063a22cb465116100dc578063a22cb46514610513578063aab402e51461053c578063ad2f852a14610565578063b6b8194014610590576101ee565b8063715018a61461048a5780638da5cb5b146104a157806395d89b41146104cc578063a0712d68146104f7576101ee565b80632d6fd3c61161018557806355f804b31161015457806355f804b3146103bc5780636352211e146103e55780636c0360eb1461042257806370a082311461044d576101ee565b80632d6fd3c61461034f5780633ccfd60b1461036b57806342842e0e146103755780634c8fe52614610391576101ee565b8063095ea7b3116101c1578063095ea7b3146102c157806315bfafcd146102dd57806318160ddd1461030857806323b872dd14610333576101ee565b806301ffc9a7146101f357806306d254da1461023057806306fdde0314610259578063081812fc14610284575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612bcc565b61075d565b60405161022791906130f2565b60405180910390f35b34801561023c57600080fd5b5061025760048036038101906102529190612959565b6107ef565b005b34801561026557600080fd5b5061026e61083b565b60405161027b9190613152565b60405180910390f35b34801561029057600080fd5b506102ab60048036038101906102a69190612c6f565b6108cd565b6040516102b8919061308b565b60405180910390f35b6102db60048036038101906102d69190612adc565b61094c565b005b3480156102e957600080fd5b506102f2610a90565b6040516102ff91906132f4565b60405180910390f35b34801561031457600080fd5b5061031d610a9f565b60405161032a91906132f4565b60405180910390f35b61034d600480360381019061034891906129c6565b610ab6565b005b61036960048036038101906103649190612b1c565b610ddb565b005b61037361111d565b005b61038f600480360381019061038a91906129c6565b611175565b005b34801561039d57600080fd5b506103a6611195565b6040516103b391906132f4565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de9190612c26565b6111a4565b005b3480156103f157600080fd5b5061040c60048036038101906104079190612c6f565b6111c6565b604051610419919061308b565b60405180910390f35b34801561042e57600080fd5b506104376111d8565b6040516104449190613152565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190612959565b611266565b60405161048191906132f4565b60405180910390f35b34801561049657600080fd5b5061049f61131f565b005b3480156104ad57600080fd5b506104b6611333565b6040516104c3919061308b565b60405180910390f35b3480156104d857600080fd5b506104e161135d565b6040516104ee9190613152565b60405180910390f35b610511600480360381019061050c9190612c6f565b6113ef565b005b34801561051f57600080fd5b5061053a60048036038101906105359190612a9c565b611597565b005b34801561054857600080fd5b50610563600480360381019061055e9190612b9f565b6116a2565b005b34801561057157600080fd5b5061057a6116e7565b604051610587919061308b565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190612c6f565b61170d565b005b6105d360048036038101906105ce9190612a19565b61174c565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190612959565b6117bf565b60405161060991906132f4565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190612c6f565b6117d7565b6040516106469190613152565b60405180910390f35b34801561065b57600080fd5b50610664611859565b60405161067191906132f4565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190612c6f565b61185f565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190612986565b611871565b6040516106d791906130f2565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190612959565b611905565b005b34801561071557600080fd5b50610730600480360381019061072b9190612c9c565b611989565b005b34801561073e57600080fd5b50610747611adc565b60405161075491906130f2565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e85750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6107f7611aef565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606002805461084a90613556565b80601f016020809104026020016040519081016040528092919081815260200182805461087690613556565b80156108c35780601f10610898576101008083540402835291602001916108c3565b820191906000526020600020905b8154815290600101906020018083116108a657829003601f168201915b5050505050905090565b60006108d882611b6d565b61090e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610957826111c6565b90508073ffffffffffffffffffffffffffffffffffffffff16610978611bcc565b73ffffffffffffffffffffffffffffffffffffffff16146109db576109a48161099f611bcc565b611871565b6109da576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a9a611bd4565b905090565b6000610aa9611bde565b6001546000540303905090565b6000610ac182611be7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b28576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b3484611cb5565b91509150610b4a8187610b45611bcc565b611cdc565b610b9657610b5f86610b5a611bcc565b611871565b610b95576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610bfd576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c0a8686866001611d20565b8015610c1557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ce385610cbf888887611d26565b7c020000000000000000000000000000000000000000000000000000000017611d4e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d6b576000600185019050600060046000838152602001908152602001600020541415610d69576000548114610d68578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dd38686866001611d79565b505050505050565b600c60009054906101000a900460ff16610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e21906131d4565b60405180910390fd5b600954610e3d610e38611d7f565b611d87565b84610e4891906133d9565b1115610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e80906131f4565b60405180910390fd5b600a5483610e95610a9f565b610e9f91906133d9565b1115610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790613254565b60405180910390fd5b82600b54610eee919061342f565b341015610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f27906132d4565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610f9757503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90613294565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661101b85858585611dde565b73ffffffffffffffffffffffffffffffffffffffff1614611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890613294565b60405180910390fd5b61108261107c611d7f565b84611e37565b82600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110d191906133d9565b92505081905550827fb069a28fab2f4a275fc364c15d220c5884271a144db6d116d13dcb79c8181c6c611102611d7f565b60405161110f919061308b565b60405180910390a250505050565b611125611aef565b61112d611333565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611172573d6000803e3d6000fd5b50565b6111908383836040518060200160405280600081525061174c565b505050565b600061119f611e55565b905090565b6111ac611aef565b80601090805190602001906111c292919061276d565b5050565b60006111d182611be7565b9050919050565b601080546111e590613556565b80601f016020809104026020016040519081016040528092919081815260200182805461121190613556565b801561125e5780601f106112335761010080835404028352916020019161125e565b820191906000526020600020905b81548152906001019060200180831161124157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ce576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611327611aef565b6113316000611e5e565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461136c90613556565b80601f016020809104026020016040519081016040528092919081815260200182805461139890613556565b80156113e55780601f106113ba576101008083540402835291602001916113e5565b820191906000526020600020905b8154815290600101906020018083116113c857829003601f168201915b5050505050905090565b600c60009054906101000a900460ff1661143e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611435906131d4565b60405180910390fd5b60095461145161144c611d7f565b611d87565b8261145c91906133d9565b111561149d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611494906131f4565b60405180910390fd5b600a54816114a9610a9f565b6114b391906133d9565b11156114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90613254565b60405180910390fd5b80600b54611502919061342f565b341015611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b906132d4565b60405180910390fd5b61155561154f611d7f565b82611e37565b807fb069a28fab2f4a275fc364c15d220c5884271a144db6d116d13dcb79c8181c6c61157f611d7f565b60405161158c919061308b565b60405180910390a250565b80600760006115a4611bcc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611651611bcc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169691906130f2565b60405180910390a35050565b6116aa611aef565b801515600c60009054906101000a900460ff16151514156116ca57600080fd5b80600c60006101000a81548160ff02191690831515021790555050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611715611aef565b80600f81905550807fce3498f3236889c7e9256b3643e0f7fae5a1b912f2ac0daa1d89236c70b522c660405160405180910390a250565b611757848484610ab6565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117b95761178284848484611f24565b6117b8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600d6020528060005260406000206000915090505481565b60606117e282611b6d565b611821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181890613234565b60405180910390fd5b611829612084565b61183283612116565b604051602001611843929190613036565b6040516020818303038152906040529050919050565b600b5481565b611867611aef565b80600b8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61190d611aef565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561197d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611974906131b4565b60405180910390fd5b61198681611e5e565b50565b611991611aef565b600c60009054906101000a900460ff166119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d7906131d4565b60405180910390fd5b6009546119f36119ee611d7f565b611d87565b836119fe91906133d9565b1115611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a36906131f4565b60405180910390fd5b600a5482611a4b610a9f565b611a5591906133d9565b1115611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90613254565b60405180910390fd5b611aa08183611e37565b817fb069a28fab2f4a275fc364c15d220c5884271a144db6d116d13dcb79c8181c6c82604051611ad0919061308b565b60405180910390a25050565b600c60009054906101000a900460ff1681565b611af7611d7f565b73ffffffffffffffffffffffffffffffffffffffff16611b15611333565b73ffffffffffffffffffffffffffffffffffffffff1614611b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b62906132b4565b60405180910390fd5b565b600081611b78611bde565b11158015611b87575060005482105b8015611bc5575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6000600154905090565b60006001905090565b60008082905080611bf6611bde565b11611c7e57600054811015611c7d5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611c7b575b6000811415611c71576004600083600190039350838152602001908152602001600020549050611c46565b8092505050611cb0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611d3d86868461216f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600080858585604051602001611df693929190612ff9565b6040516020818303038152906040528051906020012090506000611e1982612178565b90506000611e2782866121a8565b9050809350505050949350505050565b611e518282604051806020016040528060008152506121cf565b5050565b60008054905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f4a611bcc565b8786866040518563ffffffff1660e01b8152600401611f6c94939291906130a6565b602060405180830381600087803b158015611f8657600080fd5b505af1925050508015611fb757506040513d601f19601f82011682018060405250810190611fb49190612bf9565b60015b612031573d8060008114611fe7576040519150601f19603f3d011682016040523d82523d6000602084013e611fec565b606091505b50600081511415612029576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461209390613556565b80601f01602080910402602001604051908101604052809291908181526020018280546120bf90613556565b801561210c5780601f106120e15761010080835404028352916020019161210c565b820191906000526020600020905b8154815290600101906020018083116120ef57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561215a57600184039350600a81066030018453600a81049050806121555761215a565b61212f565b50828103602084039350808452505050919050565b60009392505050565b60008160405160200161218b9190613065565b604051602081830303815290604052805190602001209050919050565b60008060006121b7858561226c565b915091506121c4816122be565b819250505092915050565b6121d98383612493565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461226757600080549050600083820390505b6122196000868380600101945086611f24565b61224f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061220657816000541461226457600080fd5b50505b505050565b6000806041835114156122ae5760008060006020860151925060408601519150606086015160001a90506122a287828585612650565b945094505050506122b7565b60006002915091505b9250929050565b600060048111156122d2576122d1613620565b5b8160048111156122e5576122e4613620565b5b14156122f057612490565b6001600481111561230457612303613620565b5b81600481111561231757612316613620565b5b1415612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f90613174565b60405180910390fd5b6002600481111561236c5761236b613620565b5b81600481111561237f5761237e613620565b5b14156123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b790613194565b60405180910390fd5b600360048111156123d4576123d3613620565b5b8160048111156123e7576123e6613620565b5b1415612428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241f90613214565b60405180910390fd5b60048081111561243b5761243a613620565b5b81600481111561244e5761244d613620565b5b141561248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690613274565b60405180910390fd5b5b50565b60008054905060008214156124d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124e16000848385611d20565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612558836125496000866000611d26565b6125528561275d565b17611d4e565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146125f957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125be565b506000821415612635576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061264b6000848385611d79565b505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561268b576000600391509150612754565b601b8560ff16141580156126a35750601c8560ff1614155b156126b5576000600491509150612754565b6000600187878787604051600081526020016040526040516126da949392919061310d565b6020604051602081039080840390855afa1580156126fc573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561274b57600060019250925050612754565b80600092509250505b94509492505050565b60006001821460e11b9050919050565b82805461277990613556565b90600052602060002090601f01602090048101928261279b57600085556127e2565b82601f106127b457805160ff19168380011785556127e2565b828001600101855582156127e2579182015b828111156127e15782518255916020019190600101906127c6565b5b5090506127ef91906127f3565b5090565b5b8082111561280c5760008160009055506001016127f4565b5090565b600061282361281e84613334565b61330f565b90508281526020810184848401111561283f5761283e6136b2565b5b61284a848285613514565b509392505050565b600061286561286084613365565b61330f565b905082815260208101848484011115612881576128806136b2565b5b61288c848285613514565b509392505050565b6000813590506128a38161398f565b92915050565b6000813590506128b8816139a6565b92915050565b6000813590506128cd816139bd565b92915050565b6000815190506128e2816139bd565b92915050565b600082601f8301126128fd576128fc6136ad565b5b813561290d848260208601612810565b91505092915050565b600082601f83011261292b5761292a6136ad565b5b813561293b848260208601612852565b91505092915050565b600081359050612953816139d4565b92915050565b60006020828403121561296f5761296e6136bc565b5b600061297d84828501612894565b91505092915050565b6000806040838503121561299d5761299c6136bc565b5b60006129ab85828601612894565b92505060206129bc85828601612894565b9150509250929050565b6000806000606084860312156129df576129de6136bc565b5b60006129ed86828701612894565b93505060206129fe86828701612894565b9250506040612a0f86828701612944565b9150509250925092565b60008060008060808587031215612a3357612a326136bc565b5b6000612a4187828801612894565b9450506020612a5287828801612894565b9350506040612a6387828801612944565b925050606085013567ffffffffffffffff811115612a8457612a836136b7565b5b612a90878288016128e8565b91505092959194509250565b60008060408385031215612ab357612ab26136bc565b5b6000612ac185828601612894565b9250506020612ad2858286016128a9565b9150509250929050565b60008060408385031215612af357612af26136bc565b5b6000612b0185828601612894565b9250506020612b1285828601612944565b9150509250929050565b60008060008060808587031215612b3657612b356136bc565b5b6000612b4487828801612894565b9450506020612b5587828801612944565b9350506040612b6687828801612894565b925050606085013567ffffffffffffffff811115612b8757612b866136b7565b5b612b93878288016128e8565b91505092959194509250565b600060208284031215612bb557612bb46136bc565b5b6000612bc3848285016128a9565b91505092915050565b600060208284031215612be257612be16136bc565b5b6000612bf0848285016128be565b91505092915050565b600060208284031215612c0f57612c0e6136bc565b5b6000612c1d848285016128d3565b91505092915050565b600060208284031215612c3c57612c3b6136bc565b5b600082013567ffffffffffffffff811115612c5a57612c596136b7565b5b612c6684828501612916565b91505092915050565b600060208284031215612c8557612c846136bc565b5b6000612c9384828501612944565b91505092915050565b60008060408385031215612cb357612cb26136bc565b5b6000612cc185828601612944565b9250506020612cd285828601612894565b9150509250929050565b612ce581613489565b82525050565b612cfc612cf782613489565b6135b9565b82525050565b612d0b8161349b565b82525050565b612d1a816134a7565b82525050565b612d31612d2c826134a7565b6135cb565b82525050565b6000612d4282613396565b612d4c81856133ac565b9350612d5c818560208601613523565b612d65816136c1565b840191505092915050565b6000612d7b826133a1565b612d8581856133bd565b9350612d95818560208601613523565b612d9e816136c1565b840191505092915050565b6000612db4826133a1565b612dbe81856133ce565b9350612dce818560208601613523565b80840191505092915050565b6000612de76018836133bd565b9150612df2826136df565b602082019050919050565b6000612e0a601f836133bd565b9150612e1582613708565b602082019050919050565b6000612e2d601c836133ce565b9150612e3882613731565b601c82019050919050565b6000612e506026836133bd565b9150612e5b8261375a565b604082019050919050565b6000612e736013836133bd565b9150612e7e826137a9565b602082019050919050565b6000612e966012836133bd565b9150612ea1826137d2565b602082019050919050565b6000612eb96022836133bd565b9150612ec4826137fb565b604082019050919050565b6000612edc6011836133bd565b9150612ee78261384a565b602082019050919050565b6000612eff6016836133bd565b9150612f0a82613873565b602082019050919050565b6000612f226022836133bd565b9150612f2d8261389c565b604082019050919050565b6000612f45600b836133bd565b9150612f50826138eb565b602082019050919050565b6000612f686005836133ce565b9150612f7382613914565b600582019050919050565b6000612f8b6020836133bd565b9150612f968261393d565b602082019050919050565b6000612fae6015836133bd565b9150612fb982613966565b602082019050919050565b612fcd816134fd565b82525050565b612fe4612fdf826134fd565b6135e7565b82525050565b612ff381613507565b82525050565b60006130058286612ceb565b6014820191506130158285612fd3565b6020820191506130258284612ceb565b601482019150819050949350505050565b60006130428285612da9565b915061304e8284612da9565b915061305982612f5b565b91508190509392505050565b600061307082612e20565b915061307c8284612d20565b60208201915081905092915050565b60006020820190506130a06000830184612cdc565b92915050565b60006080820190506130bb6000830187612cdc565b6130c86020830186612cdc565b6130d56040830185612fc4565b81810360608301526130e78184612d37565b905095945050505050565b60006020820190506131076000830184612d02565b92915050565b60006080820190506131226000830187612d11565b61312f6020830186612fea565b61313c6040830185612d11565b6131496060830184612d11565b95945050505050565b6000602082019050818103600083015261316c8184612d70565b905092915050565b6000602082019050818103600083015261318d81612dda565b9050919050565b600060208201905081810360008301526131ad81612dfd565b9050919050565b600060208201905081810360008301526131cd81612e43565b9050919050565b600060208201905081810360008301526131ed81612e66565b9050919050565b6000602082019050818103600083015261320d81612e89565b9050919050565b6000602082019050818103600083015261322d81612eac565b9050919050565b6000602082019050818103600083015261324d81612ecf565b9050919050565b6000602082019050818103600083015261326d81612ef2565b9050919050565b6000602082019050818103600083015261328d81612f15565b9050919050565b600060208201905081810360008301526132ad81612f38565b9050919050565b600060208201905081810360008301526132cd81612f7e565b9050919050565b600060208201905081810360008301526132ed81612fa1565b9050919050565b60006020820190506133096000830184612fc4565b92915050565b600061331961332a565b90506133258282613588565b919050565b6000604051905090565b600067ffffffffffffffff82111561334f5761334e61367e565b5b613358826136c1565b9050602081019050919050565b600067ffffffffffffffff8211156133805761337f61367e565b5b613389826136c1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006133e4826134fd565b91506133ef836134fd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613424576134236135f1565b5b828201905092915050565b600061343a826134fd565b9150613445836134fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561347e5761347d6135f1565b5b828202905092915050565b6000613494826134dd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613541578082015181840152602081019050613526565b83811115613550576000848401525b50505050565b6000600282049050600182168061356e57607f821691505b602082108114156135825761358161364f565b5b50919050565b613591826136c1565b810181811067ffffffffffffffff821117156135b0576135af61367e565b5b80604052505050565b60006135c4826135d5565b9050919050565b6000819050919050565b60006135e0826136d2565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f7420456e61626c656400000000000000000000000000600082015250565b7f457863656564656420746865206c696d69740000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f446f6e2774206368656174000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b61399881613489565b81146139a357600080fd5b50565b6139af8161349b565b81146139ba57600080fd5b50565b6139c6816134b1565b81146139d157600080fd5b50565b6139dd816134fd565b81146139e857600080fd5b5056fea264697066735822122097964de2d0e9e991a876ebfcd05c0f85b52d6c5ef2286d6d7930844a842e0e4864736f6c63430008070033697066733a2f2f62616679626569616e37733232776571666f7a6b61726a343436326f656672696c6e7671777477667071696734616a67346d683235616d7a776e652f
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c8063715018a61161010d578063b88d4fde116100a0578063dbe2193f1161006f578063dbe2193f1461067a578063e985e9c5146106a3578063f2fde38b146106e0578063fc72789514610709578063fe4ca84714610732576101ee565b8063b88d4fde146105b9578063c4b6ebdf146105d5578063c87b56dd14610612578063ca0dcf161461064f576101ee565b8063a22cb465116100dc578063a22cb46514610513578063aab402e51461053c578063ad2f852a14610565578063b6b8194014610590576101ee565b8063715018a61461048a5780638da5cb5b146104a157806395d89b41146104cc578063a0712d68146104f7576101ee565b80632d6fd3c61161018557806355f804b31161015457806355f804b3146103bc5780636352211e146103e55780636c0360eb1461042257806370a082311461044d576101ee565b80632d6fd3c61461034f5780633ccfd60b1461036b57806342842e0e146103755780634c8fe52614610391576101ee565b8063095ea7b3116101c1578063095ea7b3146102c157806315bfafcd146102dd57806318160ddd1461030857806323b872dd14610333576101ee565b806301ffc9a7146101f357806306d254da1461023057806306fdde0314610259578063081812fc14610284575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612bcc565b61075d565b60405161022791906130f2565b60405180910390f35b34801561023c57600080fd5b5061025760048036038101906102529190612959565b6107ef565b005b34801561026557600080fd5b5061026e61083b565b60405161027b9190613152565b60405180910390f35b34801561029057600080fd5b506102ab60048036038101906102a69190612c6f565b6108cd565b6040516102b8919061308b565b60405180910390f35b6102db60048036038101906102d69190612adc565b61094c565b005b3480156102e957600080fd5b506102f2610a90565b6040516102ff91906132f4565b60405180910390f35b34801561031457600080fd5b5061031d610a9f565b60405161032a91906132f4565b60405180910390f35b61034d600480360381019061034891906129c6565b610ab6565b005b61036960048036038101906103649190612b1c565b610ddb565b005b61037361111d565b005b61038f600480360381019061038a91906129c6565b611175565b005b34801561039d57600080fd5b506103a6611195565b6040516103b391906132f4565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de9190612c26565b6111a4565b005b3480156103f157600080fd5b5061040c60048036038101906104079190612c6f565b6111c6565b604051610419919061308b565b60405180910390f35b34801561042e57600080fd5b506104376111d8565b6040516104449190613152565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190612959565b611266565b60405161048191906132f4565b60405180910390f35b34801561049657600080fd5b5061049f61131f565b005b3480156104ad57600080fd5b506104b6611333565b6040516104c3919061308b565b60405180910390f35b3480156104d857600080fd5b506104e161135d565b6040516104ee9190613152565b60405180910390f35b610511600480360381019061050c9190612c6f565b6113ef565b005b34801561051f57600080fd5b5061053a60048036038101906105359190612a9c565b611597565b005b34801561054857600080fd5b50610563600480360381019061055e9190612b9f565b6116a2565b005b34801561057157600080fd5b5061057a6116e7565b604051610587919061308b565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190612c6f565b61170d565b005b6105d360048036038101906105ce9190612a19565b61174c565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190612959565b6117bf565b60405161060991906132f4565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190612c6f565b6117d7565b6040516106469190613152565b60405180910390f35b34801561065b57600080fd5b50610664611859565b60405161067191906132f4565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190612c6f565b61185f565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190612986565b611871565b6040516106d791906130f2565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190612959565b611905565b005b34801561071557600080fd5b50610730600480360381019061072b9190612c9c565b611989565b005b34801561073e57600080fd5b50610747611adc565b60405161075491906130f2565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e85750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6107f7611aef565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606002805461084a90613556565b80601f016020809104026020016040519081016040528092919081815260200182805461087690613556565b80156108c35780601f10610898576101008083540402835291602001916108c3565b820191906000526020600020905b8154815290600101906020018083116108a657829003601f168201915b5050505050905090565b60006108d882611b6d565b61090e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610957826111c6565b90508073ffffffffffffffffffffffffffffffffffffffff16610978611bcc565b73ffffffffffffffffffffffffffffffffffffffff16146109db576109a48161099f611bcc565b611871565b6109da576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a9a611bd4565b905090565b6000610aa9611bde565b6001546000540303905090565b6000610ac182611be7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b28576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b3484611cb5565b91509150610b4a8187610b45611bcc565b611cdc565b610b9657610b5f86610b5a611bcc565b611871565b610b95576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610bfd576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c0a8686866001611d20565b8015610c1557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ce385610cbf888887611d26565b7c020000000000000000000000000000000000000000000000000000000017611d4e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d6b576000600185019050600060046000838152602001908152602001600020541415610d69576000548114610d68578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dd38686866001611d79565b505050505050565b600c60009054906101000a900460ff16610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e21906131d4565b60405180910390fd5b600954610e3d610e38611d7f565b611d87565b84610e4891906133d9565b1115610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e80906131f4565b60405180910390fd5b600a5483610e95610a9f565b610e9f91906133d9565b1115610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790613254565b60405180910390fd5b82600b54610eee919061342f565b341015610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f27906132d4565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610f9757503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90613294565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661101b85858585611dde565b73ffffffffffffffffffffffffffffffffffffffff1614611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890613294565b60405180910390fd5b61108261107c611d7f565b84611e37565b82600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110d191906133d9565b92505081905550827fb069a28fab2f4a275fc364c15d220c5884271a144db6d116d13dcb79c8181c6c611102611d7f565b60405161110f919061308b565b60405180910390a250505050565b611125611aef565b61112d611333565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611172573d6000803e3d6000fd5b50565b6111908383836040518060200160405280600081525061174c565b505050565b600061119f611e55565b905090565b6111ac611aef565b80601090805190602001906111c292919061276d565b5050565b60006111d182611be7565b9050919050565b601080546111e590613556565b80601f016020809104026020016040519081016040528092919081815260200182805461121190613556565b801561125e5780601f106112335761010080835404028352916020019161125e565b820191906000526020600020905b81548152906001019060200180831161124157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ce576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611327611aef565b6113316000611e5e565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461136c90613556565b80601f016020809104026020016040519081016040528092919081815260200182805461139890613556565b80156113e55780601f106113ba576101008083540402835291602001916113e5565b820191906000526020600020905b8154815290600101906020018083116113c857829003601f168201915b5050505050905090565b600c60009054906101000a900460ff1661143e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611435906131d4565b60405180910390fd5b60095461145161144c611d7f565b611d87565b8261145c91906133d9565b111561149d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611494906131f4565b60405180910390fd5b600a54816114a9610a9f565b6114b391906133d9565b11156114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90613254565b60405180910390fd5b80600b54611502919061342f565b341015611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b906132d4565b60405180910390fd5b61155561154f611d7f565b82611e37565b807fb069a28fab2f4a275fc364c15d220c5884271a144db6d116d13dcb79c8181c6c61157f611d7f565b60405161158c919061308b565b60405180910390a250565b80600760006115a4611bcc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611651611bcc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169691906130f2565b60405180910390a35050565b6116aa611aef565b801515600c60009054906101000a900460ff16151514156116ca57600080fd5b80600c60006101000a81548160ff02191690831515021790555050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611715611aef565b80600f81905550807fce3498f3236889c7e9256b3643e0f7fae5a1b912f2ac0daa1d89236c70b522c660405160405180910390a250565b611757848484610ab6565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117b95761178284848484611f24565b6117b8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600d6020528060005260406000206000915090505481565b60606117e282611b6d565b611821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181890613234565b60405180910390fd5b611829612084565b61183283612116565b604051602001611843929190613036565b6040516020818303038152906040529050919050565b600b5481565b611867611aef565b80600b8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61190d611aef565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561197d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611974906131b4565b60405180910390fd5b61198681611e5e565b50565b611991611aef565b600c60009054906101000a900460ff166119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d7906131d4565b60405180910390fd5b6009546119f36119ee611d7f565b611d87565b836119fe91906133d9565b1115611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a36906131f4565b60405180910390fd5b600a5482611a4b610a9f565b611a5591906133d9565b1115611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90613254565b60405180910390fd5b611aa08183611e37565b817fb069a28fab2f4a275fc364c15d220c5884271a144db6d116d13dcb79c8181c6c82604051611ad0919061308b565b60405180910390a25050565b600c60009054906101000a900460ff1681565b611af7611d7f565b73ffffffffffffffffffffffffffffffffffffffff16611b15611333565b73ffffffffffffffffffffffffffffffffffffffff1614611b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b62906132b4565b60405180910390fd5b565b600081611b78611bde565b11158015611b87575060005482105b8015611bc5575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6000600154905090565b60006001905090565b60008082905080611bf6611bde565b11611c7e57600054811015611c7d5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611c7b575b6000811415611c71576004600083600190039350838152602001908152602001600020549050611c46565b8092505050611cb0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611d3d86868461216f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600080858585604051602001611df693929190612ff9565b6040516020818303038152906040528051906020012090506000611e1982612178565b90506000611e2782866121a8565b9050809350505050949350505050565b611e518282604051806020016040528060008152506121cf565b5050565b60008054905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f4a611bcc565b8786866040518563ffffffff1660e01b8152600401611f6c94939291906130a6565b602060405180830381600087803b158015611f8657600080fd5b505af1925050508015611fb757506040513d601f19601f82011682018060405250810190611fb49190612bf9565b60015b612031573d8060008114611fe7576040519150601f19603f3d011682016040523d82523d6000602084013e611fec565b606091505b50600081511415612029576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461209390613556565b80601f01602080910402602001604051908101604052809291908181526020018280546120bf90613556565b801561210c5780601f106120e15761010080835404028352916020019161210c565b820191906000526020600020905b8154815290600101906020018083116120ef57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561215a57600184039350600a81066030018453600a81049050806121555761215a565b61212f565b50828103602084039350808452505050919050565b60009392505050565b60008160405160200161218b9190613065565b604051602081830303815290604052805190602001209050919050565b60008060006121b7858561226c565b915091506121c4816122be565b819250505092915050565b6121d98383612493565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461226757600080549050600083820390505b6122196000868380600101945086611f24565b61224f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061220657816000541461226457600080fd5b50505b505050565b6000806041835114156122ae5760008060006020860151925060408601519150606086015160001a90506122a287828585612650565b945094505050506122b7565b60006002915091505b9250929050565b600060048111156122d2576122d1613620565b5b8160048111156122e5576122e4613620565b5b14156122f057612490565b6001600481111561230457612303613620565b5b81600481111561231757612316613620565b5b1415612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f90613174565b60405180910390fd5b6002600481111561236c5761236b613620565b5b81600481111561237f5761237e613620565b5b14156123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b790613194565b60405180910390fd5b600360048111156123d4576123d3613620565b5b8160048111156123e7576123e6613620565b5b1415612428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241f90613214565b60405180910390fd5b60048081111561243b5761243a613620565b5b81600481111561244e5761244d613620565b5b141561248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690613274565b60405180910390fd5b5b50565b60008054905060008214156124d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124e16000848385611d20565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612558836125496000866000611d26565b6125528561275d565b17611d4e565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146125f957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125be565b506000821415612635576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061264b6000848385611d79565b505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561268b576000600391509150612754565b601b8560ff16141580156126a35750601c8560ff1614155b156126b5576000600491509150612754565b6000600187878787604051600081526020016040526040516126da949392919061310d565b6020604051602081039080840390855afa1580156126fc573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561274b57600060019250925050612754565b80600092509250505b94509492505050565b60006001821460e11b9050919050565b82805461277990613556565b90600052602060002090601f01602090048101928261279b57600085556127e2565b82601f106127b457805160ff19168380011785556127e2565b828001600101855582156127e2579182015b828111156127e15782518255916020019190600101906127c6565b5b5090506127ef91906127f3565b5090565b5b8082111561280c5760008160009055506001016127f4565b5090565b600061282361281e84613334565b61330f565b90508281526020810184848401111561283f5761283e6136b2565b5b61284a848285613514565b509392505050565b600061286561286084613365565b61330f565b905082815260208101848484011115612881576128806136b2565b5b61288c848285613514565b509392505050565b6000813590506128a38161398f565b92915050565b6000813590506128b8816139a6565b92915050565b6000813590506128cd816139bd565b92915050565b6000815190506128e2816139bd565b92915050565b600082601f8301126128fd576128fc6136ad565b5b813561290d848260208601612810565b91505092915050565b600082601f83011261292b5761292a6136ad565b5b813561293b848260208601612852565b91505092915050565b600081359050612953816139d4565b92915050565b60006020828403121561296f5761296e6136bc565b5b600061297d84828501612894565b91505092915050565b6000806040838503121561299d5761299c6136bc565b5b60006129ab85828601612894565b92505060206129bc85828601612894565b9150509250929050565b6000806000606084860312156129df576129de6136bc565b5b60006129ed86828701612894565b93505060206129fe86828701612894565b9250506040612a0f86828701612944565b9150509250925092565b60008060008060808587031215612a3357612a326136bc565b5b6000612a4187828801612894565b9450506020612a5287828801612894565b9350506040612a6387828801612944565b925050606085013567ffffffffffffffff811115612a8457612a836136b7565b5b612a90878288016128e8565b91505092959194509250565b60008060408385031215612ab357612ab26136bc565b5b6000612ac185828601612894565b9250506020612ad2858286016128a9565b9150509250929050565b60008060408385031215612af357612af26136bc565b5b6000612b0185828601612894565b9250506020612b1285828601612944565b9150509250929050565b60008060008060808587031215612b3657612b356136bc565b5b6000612b4487828801612894565b9450506020612b5587828801612944565b9350506040612b6687828801612894565b925050606085013567ffffffffffffffff811115612b8757612b866136b7565b5b612b93878288016128e8565b91505092959194509250565b600060208284031215612bb557612bb46136bc565b5b6000612bc3848285016128a9565b91505092915050565b600060208284031215612be257612be16136bc565b5b6000612bf0848285016128be565b91505092915050565b600060208284031215612c0f57612c0e6136bc565b5b6000612c1d848285016128d3565b91505092915050565b600060208284031215612c3c57612c3b6136bc565b5b600082013567ffffffffffffffff811115612c5a57612c596136b7565b5b612c6684828501612916565b91505092915050565b600060208284031215612c8557612c846136bc565b5b6000612c9384828501612944565b91505092915050565b60008060408385031215612cb357612cb26136bc565b5b6000612cc185828601612944565b9250506020612cd285828601612894565b9150509250929050565b612ce581613489565b82525050565b612cfc612cf782613489565b6135b9565b82525050565b612d0b8161349b565b82525050565b612d1a816134a7565b82525050565b612d31612d2c826134a7565b6135cb565b82525050565b6000612d4282613396565b612d4c81856133ac565b9350612d5c818560208601613523565b612d65816136c1565b840191505092915050565b6000612d7b826133a1565b612d8581856133bd565b9350612d95818560208601613523565b612d9e816136c1565b840191505092915050565b6000612db4826133a1565b612dbe81856133ce565b9350612dce818560208601613523565b80840191505092915050565b6000612de76018836133bd565b9150612df2826136df565b602082019050919050565b6000612e0a601f836133bd565b9150612e1582613708565b602082019050919050565b6000612e2d601c836133ce565b9150612e3882613731565b601c82019050919050565b6000612e506026836133bd565b9150612e5b8261375a565b604082019050919050565b6000612e736013836133bd565b9150612e7e826137a9565b602082019050919050565b6000612e966012836133bd565b9150612ea1826137d2565b602082019050919050565b6000612eb96022836133bd565b9150612ec4826137fb565b604082019050919050565b6000612edc6011836133bd565b9150612ee78261384a565b602082019050919050565b6000612eff6016836133bd565b9150612f0a82613873565b602082019050919050565b6000612f226022836133bd565b9150612f2d8261389c565b604082019050919050565b6000612f45600b836133bd565b9150612f50826138eb565b602082019050919050565b6000612f686005836133ce565b9150612f7382613914565b600582019050919050565b6000612f8b6020836133bd565b9150612f968261393d565b602082019050919050565b6000612fae6015836133bd565b9150612fb982613966565b602082019050919050565b612fcd816134fd565b82525050565b612fe4612fdf826134fd565b6135e7565b82525050565b612ff381613507565b82525050565b60006130058286612ceb565b6014820191506130158285612fd3565b6020820191506130258284612ceb565b601482019150819050949350505050565b60006130428285612da9565b915061304e8284612da9565b915061305982612f5b565b91508190509392505050565b600061307082612e20565b915061307c8284612d20565b60208201915081905092915050565b60006020820190506130a06000830184612cdc565b92915050565b60006080820190506130bb6000830187612cdc565b6130c86020830186612cdc565b6130d56040830185612fc4565b81810360608301526130e78184612d37565b905095945050505050565b60006020820190506131076000830184612d02565b92915050565b60006080820190506131226000830187612d11565b61312f6020830186612fea565b61313c6040830185612d11565b6131496060830184612d11565b95945050505050565b6000602082019050818103600083015261316c8184612d70565b905092915050565b6000602082019050818103600083015261318d81612dda565b9050919050565b600060208201905081810360008301526131ad81612dfd565b9050919050565b600060208201905081810360008301526131cd81612e43565b9050919050565b600060208201905081810360008301526131ed81612e66565b9050919050565b6000602082019050818103600083015261320d81612e89565b9050919050565b6000602082019050818103600083015261322d81612eac565b9050919050565b6000602082019050818103600083015261324d81612ecf565b9050919050565b6000602082019050818103600083015261326d81612ef2565b9050919050565b6000602082019050818103600083015261328d81612f15565b9050919050565b600060208201905081810360008301526132ad81612f38565b9050919050565b600060208201905081810360008301526132cd81612f7e565b9050919050565b600060208201905081810360008301526132ed81612fa1565b9050919050565b60006020820190506133096000830184612fc4565b92915050565b600061331961332a565b90506133258282613588565b919050565b6000604051905090565b600067ffffffffffffffff82111561334f5761334e61367e565b5b613358826136c1565b9050602081019050919050565b600067ffffffffffffffff8211156133805761337f61367e565b5b613389826136c1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006133e4826134fd565b91506133ef836134fd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613424576134236135f1565b5b828201905092915050565b600061343a826134fd565b9150613445836134fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561347e5761347d6135f1565b5b828202905092915050565b6000613494826134dd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613541578082015181840152602081019050613526565b83811115613550576000848401525b50505050565b6000600282049050600182168061356e57607f821691505b602082108114156135825761358161364f565b5b50919050565b613591826136c1565b810181811067ffffffffffffffff821117156135b0576135af61367e565b5b80604052505050565b60006135c4826135d5565b9050919050565b6000819050919050565b60006135e0826136d2565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f7420456e61626c656400000000000000000000000000600082015250565b7f457863656564656420746865206c696d69740000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f446f6e2774206368656174000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b61399881613489565b81146139a357600080fd5b50565b6139af8161349b565b81146139ba57600080fd5b50565b6139c6816134b1565b81146139d157600080fd5b50565b6139dd816134fd565b81146139e857600080fd5b5056fea264697066735822122097964de2d0e9e991a876ebfcd05c0f85b52d6c5ef2286d6d7930844a842e0e4864736f6c63430008070033
Deployed Bytecode Sourcemap
66793:5202:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33693:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71224:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34595:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41086:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40519:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67808:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30346:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44725:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69216:1065;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70836:114;;;:::i;:::-;;47646:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67909:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71361:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35988:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67434:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31530:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14472:103;;;;;;;;;;;;;:::i;:::-;;13824:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34771:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68591:617;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41644:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68003:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67049:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71494:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48437:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66979:35;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71691:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66900:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71091:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42035:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14730:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70289:539;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66943:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33693:639;33778:4;34117:10;34102:25;;:11;:25;;;;:102;;;;34194:10;34179:25;;:11;:25;;;;34102:102;:179;;;;34271:10;34256:25;;:11;:25;;;;34102:179;34082:199;;33693:639;;;:::o;71224:108::-;13710:13;:11;:13::i;:::-;71316:8:::1;71299:14;;:25;;;;;;;;;;;;;;;;;;71224:108:::0;:::o;34595:100::-;34649:13;34682:5;34675:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34595:100;:::o;41086:218::-;41162:7;41187:16;41195:7;41187;:16::i;:::-;41182:64;;41212:34;;;;;;;;;;;;;;41182:64;41266:15;:24;41282:7;41266:24;;;;;;;;;;;:30;;;;;;;;;;;;41259:37;;41086:218;;;:::o;40519:408::-;40608:13;40624:16;40632:7;40624;:16::i;:::-;40608:32;;40680:5;40657:28;;:19;:17;:19::i;:::-;:28;;;40653:175;;40705:44;40722:5;40729:19;:17;:19::i;:::-;40705:16;:44::i;:::-;40700:128;;40777:35;;;;;;;;;;;;;;40700:128;40653:175;40873:2;40840:15;:24;40856:7;40840:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40911:7;40907:2;40891:28;;40900:5;40891:28;;;;;;;;;;;;40597:330;40519:408;;:::o;67808:93::-;67852:7;67879:14;:12;:14::i;:::-;67872:21;;67808:93;:::o;30346:323::-;30407:7;30635:15;:13;:15::i;:::-;30620:12;;30604:13;;:28;:46;30597:53;;30346:323;:::o;44725:2825::-;44867:27;44897;44916:7;44897:18;:27::i;:::-;44867:57;;44982:4;44941:45;;44957:19;44941:45;;;44937:86;;44995:28;;;;;;;;;;;;;;44937:86;45037:27;45066:23;45093:35;45120:7;45093:26;:35::i;:::-;45036:92;;;;45228:68;45253:15;45270:4;45276:19;:17;:19::i;:::-;45228:24;:68::i;:::-;45223:180;;45316:43;45333:4;45339:19;:17;:19::i;:::-;45316:16;:43::i;:::-;45311:92;;45368:35;;;;;;;;;;;;;;45311:92;45223:180;45434:1;45420:16;;:2;:16;;;45416:52;;;45445:23;;;;;;;;;;;;;;45416:52;45481:43;45503:4;45509:2;45513:7;45522:1;45481:21;:43::i;:::-;45617:15;45614:160;;;45757:1;45736:19;45729:30;45614:160;46154:18;:24;46173:4;46154:24;;;;;;;;;;;;;;;;46152:26;;;;;;;;;;;;46223:18;:22;46242:2;46223:22;;;;;;;;;;;;;;;;46221:24;;;;;;;;;;;46545:146;46582:2;46631:45;46646:4;46652:2;46656:19;46631:14;:45::i;:::-;26745:8;46603:73;46545:18;:146::i;:::-;46516:17;:26;46534:7;46516:26;;;;;;;;;;;:175;;;;46862:1;26745:8;46811:19;:47;:52;46807:627;;;46884:19;46916:1;46906:7;:11;46884:33;;47073:1;47039:17;:30;47057:11;47039:30;;;;;;;;;;;;:35;47035:384;;;47177:13;;47162:11;:28;47158:242;;47357:19;47324:17;:30;47342:11;47324:30;;;;;;;;;;;:52;;;;47158:242;47035:384;46865:569;46807:627;47481:7;47477:2;47462:27;;47471:4;47462:27;;;;;;;;;;;;47500:42;47521:4;47527:2;47531:7;47540:1;47500:20;:42::i;:::-;44856:2694;;;44725:2825;;;:::o;69216:1065::-;69399:10;;;;;;;;;;;69391:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;69589:9;;69558:27;69572:12;:10;:12::i;:::-;69558:13;:27::i;:::-;69546:9;:39;;;;:::i;:::-;:52;;69524:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;69706:10;;69693:9;69677:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;69655:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;69810:9;69799:8;;:20;;;;:::i;:::-;69785:9;:35;;69777:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;69894:10;69879:25;;:11;:25;;;;:53;;;;;69922:10;69908:24;;:10;:24;;;69879:53;69857:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;70082:13;;;;;;;;;;;70004:91;;:57;70014:10;70026:9;70037:11;70050:10;70004:9;:57::i;:::-;:91;;;69982:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;70147:34;70157:12;:10;:12::i;:::-;70171:9;70147;:34::i;:::-;70212:9;70192:3;:16;70196:11;70192:16;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;70249:9;70239:34;70260:12;:10;:12::i;:::-;70239:34;;;;;;:::i;:::-;;;;;;;;69216:1065;;;;:::o;70836:114::-;13710:13;:11;:13::i;:::-;70902:7:::1;:5;:7::i;:::-;70894:25;;:48;70920:21;70894:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;70836:114::o:0;47646:193::-;47792:39;47809:4;47815:2;47819:7;47792:39;;;;;;;;;;;;:16;:39::i;:::-;47646:193;;;:::o;67909:86::-;67946:7;67973:14;:12;:14::i;:::-;67966:21;;67909:86;:::o;71361:92::-;13710:13;:11;:13::i;:::-;71441:4:::1;71431:7;:14;;;;;;;;;;;;:::i;:::-;;71361:92:::0;:::o;35988:152::-;36060:7;36103:27;36122:7;36103:18;:27::i;:::-;36080:52;;35988:152;;;:::o;67434:102::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31530:233::-;31602:7;31643:1;31626:19;;:5;:19;;;31622:60;;;31654:28;;;;;;;;;;;;;;31622:60;25689:13;31700:18;:25;31719:5;31700:25;;;;;;;;;;;;;;;;:55;31693:62;;31530:233;;;:::o;14472:103::-;13710:13;:11;:13::i;:::-;14537:30:::1;14564:1;14537:18;:30::i;:::-;14472:103::o:0;13824:87::-;13870:7;13897:6;;;;;;;;;;;13890:13;;13824:87;:::o;34771:104::-;34827:13;34860:7;34853:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34771:104;:::o;68591:617::-;68659:10;;;;;;;;;;;68651:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;68848:9;;68817:27;68831:12;:10;:12::i;:::-;68817:13;:27::i;:::-;68806:8;:38;;;;:::i;:::-;:51;;68784:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;68964:10;;68952:8;68936:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;68914:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;69068:8;69057;;:19;;;;:::i;:::-;69043:9;:34;;69035:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69116:33;69126:12;:10;:12::i;:::-;69140:8;69116:9;:33::i;:::-;69177:8;69167:33;69187:12;:10;:12::i;:::-;69167:33;;;;;;:::i;:::-;;;;;;;;68591:617;:::o;41644:234::-;41791:8;41739:18;:39;41758:19;:17;:19::i;:::-;41739:39;;;;;;;;;;;;;;;:49;41779:8;41739:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;41851:8;41815:55;;41830:19;:17;:19::i;:::-;41815:55;;;41861:8;41815:55;;;;;;:::i;:::-;;;;;;;;41644:234;;:::o;68003:128::-;13710:13;:11;:13::i;:::-;68086:6:::1;68072:20;;:10;;;;;;;;;;;:20;;;;68064:29;;;::::0;::::1;;68117:6;68104:10;;:19;;;;;;;;;;;;;;;;;;68003:128:::0;:::o;67049:74::-;;;;;;;;;;;;;:::o;71494:172::-;13710:13;:11;:13::i;:::-;71598:12:::1;71577:18;:33;;;;71645:12;71626:32;;;;;;;;;;71494:172:::0;:::o;48437:407::-;48612:31;48625:4;48631:2;48635:7;48612:12;:31::i;:::-;48676:1;48658:2;:14;;;:19;48654:183;;48697:56;48728:4;48734:2;48738:7;48747:5;48697:30;:56::i;:::-;48692:145;;48781:40;;;;;;;;;;;;;;48692:145;48654:183;48437:407;;;;:::o;66979:35::-;;;;;;;;;;;;;;;;;:::o;71691:301::-;71809:13;71848:16;71856:7;71848;:16::i;:::-;71840:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;71943:10;:8;:10::i;:::-;71955:18;71965:7;71955:9;:18::i;:::-;71926:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71899:85;;71691:301;;;:::o;66900:36::-;;;;:::o;71091:96::-;13710:13;:11;:13::i;:::-;71170:9:::1;71159:8;:20;;;;71091:96:::0;:::o;42035:164::-;42132:4;42156:18;:25;42175:5;42156:25;;;;;;;;;;;;;;;:35;42182:8;42156:35;;;;;;;;;;;;;;;;;;;;;;;;;42149:42;;42035:164;;;;:::o;14730:201::-;13710:13;:11;:13::i;:::-;14839:1:::1;14819:22;;:8;:22;;;;14811:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14895:28;14914:8;14895:18;:28::i;:::-;14730:201:::0;:::o;70289:539::-;13710:13;:11;:13::i;:::-;70376:10:::1;;;;;;;;;;;70368:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;70566:9;;70535:27;70549:12;:10;:12::i;:::-;70535:13;:27::i;:::-;70523:9;:39;;;;:::i;:::-;:52;;70501:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;70683:10;;70670:9;70654:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;70632:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;70754:25;70764:3;70769:9;70754;:25::i;:::-;70805:9;70795:25;70816:3;70795:25;;;;;;:::i;:::-;;;;;;;;70289:539:::0;;:::o;66943:29::-;;;;;;;;;;;;;:::o;13989:132::-;14064:12;:10;:12::i;:::-;14053:23;;:7;:5;:7::i;:::-;:23;;;14045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13989:132::o;42457:282::-;42522:4;42578:7;42559:15;:13;:15::i;:::-;:26;;:66;;;;;42612:13;;42602:7;:23;42559:66;:153;;;;;42711:1;26465:8;42663:17;:26;42681:7;42663:26;;;;;;;;;;;;:44;:49;42559:153;42539:173;;42457:282;;;:::o;64765:105::-;64825:7;64852:10;64845:17;;64765:105;:::o;31145:102::-;31200:7;31227:12;;31220:19;;31145:102;:::o;67707:93::-;67764:7;67791:1;67784:8;;67707:93;:::o;37143:1275::-;37210:7;37230:12;37245:7;37230:22;;37313:4;37294:15;:13;:15::i;:::-;:23;37290:1061;;37347:13;;37340:4;:20;37336:1015;;;37385:14;37402:17;:23;37420:4;37402:23;;;;;;;;;;;;37385:40;;37519:1;26465:8;37491:6;:24;:29;37487:845;;;38156:113;38173:1;38163:6;:11;38156:113;;;38216:17;:25;38234:6;;;;;;;38216:25;;;;;;;;;;;;38207:34;;38156:113;;;38302:6;38295:13;;;;;;37487:845;37362:989;37336:1015;37290:1061;38379:31;;;;;;;;;;;;;;37143:1275;;;;:::o;43620:485::-;43722:27;43751:23;43792:38;43833:15;:24;43849:7;43833:24;;;;;;;;;;;43792:65;;44010:18;43987:41;;44067:19;44061:26;44042:45;;43972:126;43620:485;;;:::o;42848:659::-;42997:11;43162:16;43155:5;43151:28;43142:37;;43322:16;43311:9;43307:32;43294:45;;43472:15;43461:9;43458:30;43450:5;43439:9;43436:20;43433:56;43423:66;;42848:659;;;;;:::o;49506:159::-;;;;;:::o;64074:311::-;64209:7;64229:16;26869:3;64255:19;:41;;64229:68;;26869:3;64323:31;64334:4;64340:2;64344:9;64323:10;:31::i;:::-;64315:40;;:62;;64308:69;;;64074:311;;;;;:::o;38966:450::-;39046:14;39214:16;39207:5;39203:28;39194:37;;39391:5;39377:11;39352:23;39348:41;39345:52;39338:5;39335:63;39325:73;;38966:450;;;;:::o;50330:158::-;;;;;:::o;12375:98::-;12428:7;12455:10;12448:17;;12375:98;:::o;31845:178::-;31906:7;25689:13;25827:2;31934:18;:25;31953:5;31934:25;;;;;;;;;;;;;;;;:50;;31933:82;31926:89;;31845:178;;;:::o;68139:444::-;68305:7;68325:12;68381:10;68393:9;68404:11;68364:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68340:87;;;;;;68325:102;;68438:15;68456:34;68485:4;68456:28;:34::i;:::-;68438:52;;68501:14;68518:33;68532:7;68541:9;68518:13;:33::i;:::-;68501:50;;68569:6;68562:13;;;;;68139:444;;;;;;:::o;58597:112::-;58674:27;58684:2;58688:8;58674:27;;;;;;;;;;;;:9;:27::i;:::-;58597:112;;:::o;30033:103::-;30088:7;30115:13;;30108:20;;30033:103;:::o;15091:191::-;15165:16;15184:6;;;;;;;;;;;15165:25;;15210:8;15201:6;;:17;;;;;;;;;;;;;;;;;;15265:8;15234:40;;15255:8;15234:40;;;;;;;;;;;;15154:128;15091:191;:::o;50928:716::-;51091:4;51137:2;51112:45;;;51158:19;:17;:19::i;:::-;51179:4;51185:7;51194:5;51112:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51108:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51412:1;51395:6;:13;:18;51391:235;;;51441:40;;;;;;;;;;;;;;51391:235;51584:6;51578:13;51569:6;51565:2;51561:15;51554:38;51108:529;51281:54;;;51271:64;;;:6;:64;;;;51264:71;;;50928:716;;;;;;:::o;70983:100::-;71035:13;71068:7;71061:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70983:100;:::o;64972:1745::-;65037:17;65471:4;65464;65458:11;65454:22;65563:1;65557:4;65550:15;65638:4;65635:1;65631:12;65624:19;;65720:1;65715:3;65708:14;65824:3;66063:5;66045:428;66071:1;66045:428;;;66111:1;66106:3;66102:11;66095:18;;66282:2;66276:4;66272:13;66268:2;66264:22;66259:3;66251:36;66376:2;66370:4;66366:13;66358:21;;66443:4;66433:25;;66451:5;;66433:25;66045:428;;;66049:21;66512:3;66507;66503:13;66627:4;66622:3;66618:14;66611:21;;66692:6;66687:3;66680:19;65076:1634;;;64972:1745;;;:::o;63775:147::-;63912:6;63775:147;;;;;:::o;10381:269::-;10450:7;10636:4;10583:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;10573:69;;;;;;10566:76;;10381:269;;;:::o;6579:231::-;6657:7;6678:17;6697:18;6719:27;6730:4;6736:9;6719:10;:27::i;:::-;6677:69;;;;6757:18;6769:5;6757:11;:18::i;:::-;6793:9;6786:16;;;;6579:231;;;;:::o;57824:689::-;57955:19;57961:2;57965:8;57955:5;:19::i;:::-;58034:1;58016:2;:14;;;:19;58012:483;;58056:11;58070:13;;58056:27;;58102:13;58124:8;58118:3;:14;58102:30;;58151:233;58182:62;58221:1;58225:2;58229:7;;;;;;58238:5;58182:30;:62::i;:::-;58177:167;;58280:40;;;;;;;;;;;;;;58177:167;58379:3;58371:5;:11;58151:233;;58466:3;58449:13;;:20;58445:34;;58471:8;;;58445:34;58037:458;;58012:483;57824:689;;;:::o;5030:747::-;5111:7;5120:12;5169:2;5149:9;:16;:22;5145:625;;;5188:9;5212;5236:7;5493:4;5482:9;5478:20;5472:27;5467:32;;5543:4;5532:9;5528:20;5522:27;5517:32;;5601:4;5590:9;5586:20;5580:27;5577:1;5572:36;5567:41;;5644:25;5655:4;5661:1;5664;5667;5644:10;:25::i;:::-;5637:32;;;;;;;;;5145:625;5718:1;5722:35;5702:56;;;;5030:747;;;;;;:::o;3301:643::-;3379:20;3370:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;3366:571;;;3416:7;;3366:571;3477:29;3468:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;3464:473;;;3523:34;;;;;;;;;;:::i;:::-;;;;;;;;3464:473;3588:35;3579:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;3575:362;;;3640:41;;;;;;;;;;:::i;:::-;;;;;;;;3575:362;3712:30;3703:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3699:238;;;3759:44;;;;;;;;;;:::i;:::-;;;;;;;;3699:238;3834:30;3825:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3821:116;;;3881:44;;;;;;;;;;:::i;:::-;;;;;;;;3821:116;3301:643;;:::o;52106:2966::-;52179:20;52202:13;;52179:36;;52242:1;52230:8;:13;52226:44;;;52252:18;;;;;;;;;;;;;;52226:44;52283:61;52313:1;52317:2;52321:12;52335:8;52283:21;:61::i;:::-;52827:1;25827:2;52797:1;:26;;52796:32;52784:8;:45;52758:18;:22;52777:2;52758:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;53106:139;53143:2;53197:33;53220:1;53224:2;53228:1;53197:14;:33::i;:::-;53164:30;53185:8;53164:20;:30::i;:::-;:66;53106:18;:139::i;:::-;53072:17;:31;53090:12;53072:31;;;;;;;;;;;:173;;;;53262:16;53293:11;53322:8;53307:12;:23;53293:37;;53843:16;53839:2;53835:25;53823:37;;54215:12;54175:8;54134:1;54072:25;54013:1;53952;53925:335;54586:1;54572:12;54568:20;54526:346;54627:3;54618:7;54615:16;54526:346;;54845:7;54835:8;54832:1;54805:25;54802:1;54799;54794:59;54680:1;54671:7;54667:15;54656:26;;54526:346;;;54530:77;54917:1;54905:8;:13;54901:45;;;54927:19;;;;;;;;;;;;;;54901:45;54979:3;54963:13;:19;;;;52532:2462;;55004:60;55033:1;55037:2;55041:12;55055:8;55004:20;:60::i;:::-;52168:2904;52106:2966;;:::o;8031:1632::-;8162:7;8171:12;9096:66;9091:1;9083:10;;:79;9079:163;;;9195:1;9199:30;9179:51;;;;;;9079:163;9261:2;9256:1;:7;;;;:18;;;;;9272:2;9267:1;:7;;;;9256:18;9252:102;;;9307:1;9311:30;9291:51;;;;;;9252:102;9451:14;9468:24;9478:4;9484:1;9487;9490;9468:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9451:41;;9525:1;9507:20;;:6;:20;;;9503:103;;;9560:1;9564:29;9544:50;;;;;;;9503:103;9626:6;9634:20;9618:37;;;;;8031:1632;;;;;;;;:::o;39518:324::-;39588:14;39821:1;39811:8;39808:15;39782:24;39778:46;39768:56;;39518:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:943::-;5715:6;5723;5731;5739;5788:3;5776:9;5767:7;5763:23;5759:33;5756:120;;;5795:79;;:::i;:::-;5756:120;5915:1;5940:53;5985:7;5976:6;5965:9;5961:22;5940:53;:::i;:::-;5930:63;;5886:117;6042:2;6068:53;6113:7;6104:6;6093:9;6089:22;6068:53;:::i;:::-;6058:63;;6013:118;6170:2;6196:53;6241:7;6232:6;6221:9;6217:22;6196:53;:::i;:::-;6186:63;;6141:118;6326:2;6315:9;6311:18;6298:32;6357:18;6349:6;6346:30;6343:117;;;6379:79;;:::i;:::-;6343:117;6484:62;6538:7;6529:6;6518:9;6514:22;6484:62;:::i;:::-;6474:72;;6269:287;5620:943;;;;;;;:::o;6569:323::-;6625:6;6674:2;6662:9;6653:7;6649:23;6645:32;6642:119;;;6680:79;;:::i;:::-;6642:119;6800:1;6825:50;6867:7;6858:6;6847:9;6843:22;6825:50;:::i;:::-;6815:60;;6771:114;6569:323;;;;:::o;6898:327::-;6956:6;7005:2;6993:9;6984:7;6980:23;6976:32;6973:119;;;7011:79;;:::i;:::-;6973:119;7131:1;7156:52;7200:7;7191:6;7180:9;7176:22;7156:52;:::i;:::-;7146:62;;7102:116;6898:327;;;;:::o;7231:349::-;7300:6;7349:2;7337:9;7328:7;7324:23;7320:32;7317:119;;;7355:79;;:::i;:::-;7317:119;7475:1;7500:63;7555:7;7546:6;7535:9;7531:22;7500:63;:::i;:::-;7490:73;;7446:127;7231:349;;;;:::o;7586:509::-;7655:6;7704:2;7692:9;7683:7;7679:23;7675:32;7672:119;;;7710:79;;:::i;:::-;7672:119;7858:1;7847:9;7843:17;7830:31;7888:18;7880:6;7877:30;7874:117;;;7910:79;;:::i;:::-;7874:117;8015:63;8070:7;8061:6;8050:9;8046:22;8015:63;:::i;:::-;8005:73;;7801:287;7586:509;;;;:::o;8101:329::-;8160:6;8209:2;8197:9;8188:7;8184:23;8180:32;8177:119;;;8215:79;;:::i;:::-;8177:119;8335:1;8360:53;8405:7;8396:6;8385:9;8381:22;8360:53;:::i;:::-;8350:63;;8306:117;8101:329;;;;:::o;8436:474::-;8504:6;8512;8561:2;8549:9;8540:7;8536:23;8532:32;8529:119;;;8567:79;;:::i;:::-;8529:119;8687:1;8712:53;8757:7;8748:6;8737:9;8733:22;8712:53;:::i;:::-;8702:63;;8658:117;8814:2;8840:53;8885:7;8876:6;8865:9;8861:22;8840:53;:::i;:::-;8830:63;;8785:118;8436:474;;;;;:::o;8916:118::-;9003:24;9021:5;9003:24;:::i;:::-;8998:3;8991:37;8916:118;;:::o;9040:157::-;9145:45;9165:24;9183:5;9165:24;:::i;:::-;9145:45;:::i;:::-;9140:3;9133:58;9040:157;;:::o;9203:109::-;9284:21;9299:5;9284:21;:::i;:::-;9279:3;9272:34;9203:109;;:::o;9318:118::-;9405:24;9423:5;9405:24;:::i;:::-;9400:3;9393:37;9318:118;;:::o;9442:157::-;9547:45;9567:24;9585:5;9567:24;:::i;:::-;9547:45;:::i;:::-;9542:3;9535:58;9442:157;;:::o;9605:360::-;9691:3;9719:38;9751:5;9719:38;:::i;:::-;9773:70;9836:6;9831:3;9773:70;:::i;:::-;9766:77;;9852:52;9897:6;9892:3;9885:4;9878:5;9874:16;9852:52;:::i;:::-;9929:29;9951:6;9929:29;:::i;:::-;9924:3;9920:39;9913:46;;9695:270;9605:360;;;;:::o;9971:364::-;10059:3;10087:39;10120:5;10087:39;:::i;:::-;10142:71;10206:6;10201:3;10142:71;:::i;:::-;10135:78;;10222:52;10267:6;10262:3;10255:4;10248:5;10244:16;10222:52;:::i;:::-;10299:29;10321:6;10299:29;:::i;:::-;10294:3;10290:39;10283:46;;10063:272;9971:364;;;;:::o;10341:377::-;10447:3;10475:39;10508:5;10475:39;:::i;:::-;10530:89;10612:6;10607:3;10530:89;:::i;:::-;10523:96;;10628:52;10673:6;10668:3;10661:4;10654:5;10650:16;10628:52;:::i;:::-;10705:6;10700:3;10696:16;10689:23;;10451:267;10341:377;;;;:::o;10724:366::-;10866:3;10887:67;10951:2;10946:3;10887:67;:::i;:::-;10880:74;;10963:93;11052:3;10963:93;:::i;:::-;11081:2;11076:3;11072:12;11065:19;;10724:366;;;:::o;11096:::-;11238:3;11259:67;11323:2;11318:3;11259:67;:::i;:::-;11252:74;;11335:93;11424:3;11335:93;:::i;:::-;11453:2;11448:3;11444:12;11437:19;;11096:366;;;:::o;11468:402::-;11628:3;11649:85;11731:2;11726:3;11649:85;:::i;:::-;11642:92;;11743:93;11832:3;11743:93;:::i;:::-;11861:2;11856:3;11852:12;11845:19;;11468:402;;;:::o;11876:366::-;12018:3;12039:67;12103:2;12098:3;12039:67;:::i;:::-;12032:74;;12115:93;12204:3;12115:93;:::i;:::-;12233:2;12228:3;12224:12;12217:19;;11876:366;;;:::o;12248:::-;12390:3;12411:67;12475:2;12470:3;12411:67;:::i;:::-;12404:74;;12487:93;12576:3;12487:93;:::i;:::-;12605:2;12600:3;12596:12;12589:19;;12248:366;;;:::o;12620:::-;12762:3;12783:67;12847:2;12842:3;12783:67;:::i;:::-;12776:74;;12859:93;12948:3;12859:93;:::i;:::-;12977:2;12972:3;12968:12;12961:19;;12620:366;;;:::o;12992:::-;13134:3;13155:67;13219:2;13214:3;13155:67;:::i;:::-;13148:74;;13231:93;13320:3;13231:93;:::i;:::-;13349:2;13344:3;13340:12;13333:19;;12992:366;;;:::o;13364:::-;13506:3;13527:67;13591:2;13586:3;13527:67;:::i;:::-;13520:74;;13603:93;13692:3;13603:93;:::i;:::-;13721:2;13716:3;13712:12;13705:19;;13364:366;;;:::o;13736:::-;13878:3;13899:67;13963:2;13958:3;13899:67;:::i;:::-;13892:74;;13975:93;14064:3;13975:93;:::i;:::-;14093:2;14088:3;14084:12;14077:19;;13736:366;;;:::o;14108:::-;14250:3;14271:67;14335:2;14330:3;14271:67;:::i;:::-;14264:74;;14347:93;14436:3;14347:93;:::i;:::-;14465:2;14460:3;14456:12;14449:19;;14108:366;;;:::o;14480:::-;14622:3;14643:67;14707:2;14702:3;14643:67;:::i;:::-;14636:74;;14719:93;14808:3;14719:93;:::i;:::-;14837:2;14832:3;14828:12;14821:19;;14480:366;;;:::o;14852:400::-;15012:3;15033:84;15115:1;15110:3;15033:84;:::i;:::-;15026:91;;15126:93;15215:3;15126:93;:::i;:::-;15244:1;15239:3;15235:11;15228:18;;14852:400;;;:::o;15258:366::-;15400:3;15421:67;15485:2;15480:3;15421:67;:::i;:::-;15414:74;;15497:93;15586:3;15497:93;:::i;:::-;15615:2;15610:3;15606:12;15599:19;;15258:366;;;:::o;15630:::-;15772:3;15793:67;15857:2;15852:3;15793:67;:::i;:::-;15786:74;;15869:93;15958:3;15869:93;:::i;:::-;15987:2;15982:3;15978:12;15971:19;;15630:366;;;:::o;16002:118::-;16089:24;16107:5;16089:24;:::i;:::-;16084:3;16077:37;16002:118;;:::o;16126:157::-;16231:45;16251:24;16269:5;16251:24;:::i;:::-;16231:45;:::i;:::-;16226:3;16219:58;16126:157;;:::o;16289:112::-;16372:22;16388:5;16372:22;:::i;:::-;16367:3;16360:35;16289:112;;:::o;16407:538::-;16575:3;16590:75;16661:3;16652:6;16590:75;:::i;:::-;16690:2;16685:3;16681:12;16674:19;;16703:75;16774:3;16765:6;16703:75;:::i;:::-;16803:2;16798:3;16794:12;16787:19;;16816:75;16887:3;16878:6;16816:75;:::i;:::-;16916:2;16911:3;16907:12;16900:19;;16936:3;16929:10;;16407:538;;;;;;:::o;16951:701::-;17232:3;17254:95;17345:3;17336:6;17254:95;:::i;:::-;17247:102;;17366:95;17457:3;17448:6;17366:95;:::i;:::-;17359:102;;17478:148;17622:3;17478:148;:::i;:::-;17471:155;;17643:3;17636:10;;16951:701;;;;;:::o;17658:522::-;17871:3;17893:148;18037:3;17893:148;:::i;:::-;17886:155;;18051:75;18122:3;18113:6;18051:75;:::i;:::-;18151:2;18146:3;18142:12;18135:19;;18171:3;18164:10;;17658:522;;;;:::o;18186:222::-;18279:4;18317:2;18306:9;18302:18;18294:26;;18330:71;18398:1;18387:9;18383:17;18374:6;18330:71;:::i;:::-;18186:222;;;;:::o;18414:640::-;18609:4;18647:3;18636:9;18632:19;18624:27;;18661:71;18729:1;18718:9;18714:17;18705:6;18661:71;:::i;:::-;18742:72;18810:2;18799:9;18795:18;18786:6;18742:72;:::i;:::-;18824;18892:2;18881:9;18877:18;18868:6;18824:72;:::i;:::-;18943:9;18937:4;18933:20;18928:2;18917:9;18913:18;18906:48;18971:76;19042:4;19033:6;18971:76;:::i;:::-;18963:84;;18414:640;;;;;;;:::o;19060:210::-;19147:4;19185:2;19174:9;19170:18;19162:26;;19198:65;19260:1;19249:9;19245:17;19236:6;19198:65;:::i;:::-;19060:210;;;;:::o;19276:545::-;19449:4;19487:3;19476:9;19472:19;19464:27;;19501:71;19569:1;19558:9;19554:17;19545:6;19501:71;:::i;:::-;19582:68;19646:2;19635:9;19631:18;19622:6;19582:68;:::i;:::-;19660:72;19728:2;19717:9;19713:18;19704:6;19660:72;:::i;:::-;19742;19810:2;19799:9;19795:18;19786:6;19742:72;:::i;:::-;19276:545;;;;;;;:::o;19827:313::-;19940:4;19978:2;19967:9;19963:18;19955:26;;20027:9;20021:4;20017:20;20013:1;20002:9;19998:17;19991:47;20055:78;20128:4;20119:6;20055:78;:::i;:::-;20047:86;;19827:313;;;;:::o;20146:419::-;20312:4;20350:2;20339:9;20335:18;20327:26;;20399:9;20393:4;20389:20;20385:1;20374:9;20370:17;20363:47;20427:131;20553:4;20427:131;:::i;:::-;20419:139;;20146:419;;;:::o;20571:::-;20737:4;20775:2;20764:9;20760:18;20752:26;;20824:9;20818:4;20814:20;20810:1;20799:9;20795:17;20788:47;20852:131;20978:4;20852:131;:::i;:::-;20844:139;;20571:419;;;:::o;20996:::-;21162:4;21200:2;21189:9;21185:18;21177:26;;21249:9;21243:4;21239:20;21235:1;21224:9;21220:17;21213:47;21277:131;21403:4;21277:131;:::i;:::-;21269:139;;20996:419;;;:::o;21421:::-;21587:4;21625:2;21614:9;21610:18;21602:26;;21674:9;21668:4;21664:20;21660:1;21649:9;21645:17;21638:47;21702:131;21828:4;21702:131;:::i;:::-;21694:139;;21421:419;;;:::o;21846:::-;22012:4;22050:2;22039:9;22035:18;22027:26;;22099:9;22093:4;22089:20;22085:1;22074:9;22070:17;22063:47;22127:131;22253:4;22127:131;:::i;:::-;22119:139;;21846:419;;;:::o;22271:::-;22437:4;22475:2;22464:9;22460:18;22452:26;;22524:9;22518:4;22514:20;22510:1;22499:9;22495:17;22488:47;22552:131;22678:4;22552:131;:::i;:::-;22544:139;;22271:419;;;:::o;22696:::-;22862:4;22900:2;22889:9;22885:18;22877:26;;22949:9;22943:4;22939:20;22935:1;22924:9;22920:17;22913:47;22977:131;23103:4;22977:131;:::i;:::-;22969:139;;22696:419;;;:::o;23121:::-;23287:4;23325:2;23314:9;23310:18;23302:26;;23374:9;23368:4;23364:20;23360:1;23349:9;23345:17;23338:47;23402:131;23528:4;23402:131;:::i;:::-;23394:139;;23121:419;;;:::o;23546:::-;23712:4;23750:2;23739:9;23735:18;23727:26;;23799:9;23793:4;23789:20;23785:1;23774:9;23770:17;23763:47;23827:131;23953:4;23827:131;:::i;:::-;23819:139;;23546:419;;;:::o;23971:::-;24137:4;24175:2;24164:9;24160:18;24152:26;;24224:9;24218:4;24214:20;24210:1;24199:9;24195:17;24188:47;24252:131;24378:4;24252:131;:::i;:::-;24244:139;;23971:419;;;:::o;24396:::-;24562:4;24600:2;24589:9;24585:18;24577:26;;24649:9;24643:4;24639:20;24635:1;24624:9;24620:17;24613:47;24677:131;24803:4;24677:131;:::i;:::-;24669:139;;24396:419;;;:::o;24821:::-;24987:4;25025:2;25014:9;25010:18;25002:26;;25074:9;25068:4;25064:20;25060:1;25049:9;25045:17;25038:47;25102:131;25228:4;25102:131;:::i;:::-;25094:139;;24821:419;;;:::o;25246:222::-;25339:4;25377:2;25366:9;25362:18;25354:26;;25390:71;25458:1;25447:9;25443:17;25434:6;25390:71;:::i;:::-;25246:222;;;;:::o;25474:129::-;25508:6;25535:20;;:::i;:::-;25525:30;;25564:33;25592:4;25584:6;25564:33;:::i;:::-;25474:129;;;:::o;25609:75::-;25642:6;25675:2;25669:9;25659:19;;25609:75;:::o;25690:307::-;25751:4;25841:18;25833:6;25830:30;25827:56;;;25863:18;;:::i;:::-;25827:56;25901:29;25923:6;25901:29;:::i;:::-;25893:37;;25985:4;25979;25975:15;25967:23;;25690:307;;;:::o;26003:308::-;26065:4;26155:18;26147:6;26144:30;26141:56;;;26177:18;;:::i;:::-;26141:56;26215:29;26237:6;26215:29;:::i;:::-;26207:37;;26299:4;26293;26289:15;26281:23;;26003:308;;;:::o;26317:98::-;26368:6;26402:5;26396:12;26386:22;;26317:98;;;:::o;26421:99::-;26473:6;26507:5;26501:12;26491:22;;26421:99;;;:::o;26526:168::-;26609:11;26643:6;26638:3;26631:19;26683:4;26678:3;26674:14;26659:29;;26526:168;;;;:::o;26700:169::-;26784:11;26818:6;26813:3;26806:19;26858:4;26853:3;26849:14;26834:29;;26700:169;;;;:::o;26875:148::-;26977:11;27014:3;26999:18;;26875:148;;;;:::o;27029:305::-;27069:3;27088:20;27106:1;27088:20;:::i;:::-;27083:25;;27122:20;27140:1;27122:20;:::i;:::-;27117:25;;27276:1;27208:66;27204:74;27201:1;27198:81;27195:107;;;27282:18;;:::i;:::-;27195:107;27326:1;27323;27319:9;27312:16;;27029:305;;;;:::o;27340:348::-;27380:7;27403:20;27421:1;27403:20;:::i;:::-;27398:25;;27437:20;27455:1;27437:20;:::i;:::-;27432:25;;27625:1;27557:66;27553:74;27550:1;27547:81;27542:1;27535:9;27528:17;27524:105;27521:131;;;27632:18;;:::i;:::-;27521:131;27680:1;27677;27673:9;27662:20;;27340:348;;;;:::o;27694:96::-;27731:7;27760:24;27778:5;27760:24;:::i;:::-;27749:35;;27694:96;;;:::o;27796:90::-;27830:7;27873:5;27866:13;27859:21;27848:32;;27796:90;;;:::o;27892:77::-;27929:7;27958:5;27947:16;;27892:77;;;:::o;27975:149::-;28011:7;28051:66;28044:5;28040:78;28029:89;;27975:149;;;:::o;28130:126::-;28167:7;28207:42;28200:5;28196:54;28185:65;;28130:126;;;:::o;28262:77::-;28299:7;28328:5;28317:16;;28262:77;;;:::o;28345:86::-;28380:7;28420:4;28413:5;28409:16;28398:27;;28345:86;;;:::o;28437:154::-;28521:6;28516:3;28511;28498:30;28583:1;28574:6;28569:3;28565:16;28558:27;28437:154;;;:::o;28597:307::-;28665:1;28675:113;28689:6;28686:1;28683:13;28675:113;;;28774:1;28769:3;28765:11;28759:18;28755:1;28750:3;28746:11;28739:39;28711:2;28708:1;28704:10;28699:15;;28675:113;;;28806:6;28803:1;28800:13;28797:101;;;28886:1;28877:6;28872:3;28868:16;28861:27;28797:101;28646:258;28597:307;;;:::o;28910:320::-;28954:6;28991:1;28985:4;28981:12;28971:22;;29038:1;29032:4;29028:12;29059:18;29049:81;;29115:4;29107:6;29103:17;29093:27;;29049:81;29177:2;29169:6;29166:14;29146:18;29143:38;29140:84;;;29196:18;;:::i;:::-;29140:84;28961:269;28910:320;;;:::o;29236:281::-;29319:27;29341:4;29319:27;:::i;:::-;29311:6;29307:40;29449:6;29437:10;29434:22;29413:18;29401:10;29398:34;29395:62;29392:88;;;29460:18;;:::i;:::-;29392:88;29500:10;29496:2;29489:22;29279:238;29236:281;;:::o;29523:100::-;29562:7;29591:26;29611:5;29591:26;:::i;:::-;29580:37;;29523:100;;;:::o;29629:79::-;29668:7;29697:5;29686:16;;29629:79;;;:::o;29714:94::-;29753:7;29782:20;29796:5;29782:20;:::i;:::-;29771:31;;29714:94;;;:::o;29814:79::-;29853:7;29882:5;29871:16;;29814:79;;;:::o;29899:180::-;29947:77;29944:1;29937:88;30044:4;30041:1;30034:15;30068:4;30065:1;30058:15;30085:180;30133:77;30130:1;30123:88;30230:4;30227:1;30220:15;30254:4;30251:1;30244:15;30271:180;30319:77;30316:1;30309:88;30416:4;30413:1;30406:15;30440:4;30437:1;30430:15;30457:180;30505:77;30502:1;30495:88;30602:4;30599:1;30592:15;30626:4;30623:1;30616:15;30643:117;30752:1;30749;30742:12;30766:117;30875:1;30872;30865:12;30889:117;30998:1;30995;30988:12;31012:117;31121:1;31118;31111:12;31135:102;31176:6;31227:2;31223:7;31218:2;31211:5;31207:14;31203:28;31193:38;;31135:102;;;:::o;31243:94::-;31276:8;31324:5;31320:2;31316:14;31295:35;;31243:94;;;:::o;31343:174::-;31483:26;31479:1;31471:6;31467:14;31460:50;31343:174;:::o;31523:181::-;31663:33;31659:1;31651:6;31647:14;31640:57;31523:181;:::o;31710:214::-;31850:66;31846:1;31838:6;31834:14;31827:90;31710:214;:::o;31930:225::-;32070:34;32066:1;32058:6;32054:14;32047:58;32139:8;32134:2;32126:6;32122:15;32115:33;31930:225;:::o;32161:169::-;32301:21;32297:1;32289:6;32285:14;32278:45;32161:169;:::o;32336:168::-;32476:20;32472:1;32464:6;32460:14;32453:44;32336:168;:::o;32510:221::-;32650:34;32646:1;32638:6;32634:14;32627:58;32719:4;32714:2;32706:6;32702:15;32695:29;32510:221;:::o;32737:167::-;32877:19;32873:1;32865:6;32861:14;32854:43;32737:167;:::o;32910:172::-;33050:24;33046:1;33038:6;33034:14;33027:48;32910:172;:::o;33088:221::-;33228:34;33224:1;33216:6;33212:14;33205:58;33297:4;33292:2;33284:6;33280:15;33273:29;33088:221;:::o;33315:161::-;33455:13;33451:1;33443:6;33439:14;33432:37;33315:161;:::o;33482:155::-;33622:7;33618:1;33610:6;33606:14;33599:31;33482:155;:::o;33643:182::-;33783:34;33779:1;33771:6;33767:14;33760:58;33643:182;:::o;33831:171::-;33971:23;33967:1;33959:6;33955:14;33948:47;33831:171;:::o;34008:122::-;34081:24;34099:5;34081:24;:::i;:::-;34074:5;34071:35;34061:63;;34120:1;34117;34110:12;34061:63;34008:122;:::o;34136:116::-;34206:21;34221:5;34206:21;:::i;:::-;34199:5;34196:32;34186:60;;34242:1;34239;34232:12;34186:60;34136:116;:::o;34258:120::-;34330:23;34347:5;34330:23;:::i;:::-;34323:5;34320:34;34310:62;;34368:1;34365;34358:12;34310:62;34258:120;:::o;34384:122::-;34457:24;34475:5;34457:24;:::i;:::-;34450:5;34447:35;34437:63;;34496:1;34493;34486:12;34437:63;34384:122;:::o
Swarm Source
ipfs://97964de2d0e9e991a876ebfcd05c0f85b52d6c5ef2286d6d7930844a842e0e48
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.