ERC-721
Overview
Max Total Supply
10 HYPNEU
Holders
6
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 HYPNEULoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Hypneusys
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-09 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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); } } // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @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); } } // OpenZeppelin Contracts (last updated v4.5.0) (utils/Base64.sol) /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } } // ERC721A Contracts v4.1.0 // Creator: Chiru Labs /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of 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 through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // 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`. * * 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 calldata data ) external; /** * @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 ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // ERC721A Contracts v4.1.0 // Creator: Chiru Labs /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // 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 tokenId of the next token 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 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @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 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 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 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 returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ 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: 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. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view 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 { 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; } /** * 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 ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * 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); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @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 See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ 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 ''; } /** * @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)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev 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 (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, 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 { _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 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 { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); 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 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _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 { 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 Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(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++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool 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)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { 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 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; } /** * @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 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 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 returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } contract Hypneusys is ERC721A, Pausable, Ownable { using Strings for uint256; uint256 public constant MAX_SUPPLY = 2048; struct Layer { uint256[6] coords; uint256 duration; uint256 numberOfRings; uint256 numberOfSpikes; } struct OnChainArt { mapping(uint => Layer) layers; uint layerCount; } mapping(uint => OnChainArt) artByTokenId; constructor() ERC721A( "Hypneusys", "HYPNEU" ) { } function mint(uint256 count) public payable { uint256 currentTotal = totalSupply(); require(count > 0, "Count must be greater than 0"); require(count < 3, "Count must be less than 3"); require(currentTotal + count <= MAX_SUPPLY, "Requested amount exceeds what is available!"); require(currentTotal <= MAX_SUPPLY, "Not enough available."); _generateArt(count, currentTotal); _safeMint(msg.sender, count); } function contractURI() public pure returns (string memory) { return string( abi.encodePacked( "data:application/json;base64,", Base64.encode( bytes( abi.encodePacked( '{"description": "An on-chain (*)piece.","name":"Hypneusys","image":"<svg viewBox=\\"0 0 128 128\\" xmlns=\\"http://www.w3.org/2000/svg\\"></svg>"}' ) ) ) ) ); } function tokenURI(uint256 tokenId) public view virtual override (ERC721A) returns (string memory) { require(tokenId < totalSupply(), "Token ID does not exist."); bytes memory defs; bytes memory uses; Layer memory thisLayer; uint256 layerIndex = 0; uint256 ringIndex = 0; uint256 spikeIndex = 0; bytes[] memory sections = new bytes[](8); for (layerIndex = 0; layerIndex < artByTokenId[tokenId].layerCount; layerIndex++) { thisLayer = artByTokenId[tokenId].layers[layerIndex]; for (ringIndex = 0; ringIndex < thisLayer.numberOfRings; ringIndex++) { sections[0] = abi.encodePacked( '<path id=\\"r', layerIndex.toString(), '-', ringIndex.toString(), '\\">' ); sections[1] = abi.encodePacked( '<animate id=\\"p', layerIndex.toString(), '-', ringIndex.toString(), '\\" attributeName=\\"d\\" values=\\"m512,512l0,0 0,0;m' ); sections[2] = abi.encodePacked( thisLayer.coords[0].toString(), ',', thisLayer.coords[1].toString(), 'l', thisLayer.coords[2].toString(), ',-', thisLayer.coords[3].toString(), ' ' ); sections[3] = abi.encodePacked( thisLayer.coords[2].toString(), ',', thisLayer.coords[3].toString(), ';m', thisLayer.coords[4].toString(), ',', thisLayer.coords[5].toString(), 'l' ); sections[4] = abi.encodePacked( thisLayer.coords[2].toString(), ',-', thisLayer.coords[3].toString(), ' ', thisLayer.coords[2].toString(), ',', thisLayer.coords[3].toString(), ';m' ); sections[5] = abi.encodePacked( '512,512l0,0 0,0\\" dur=\\"', thisLayer.duration.toString(), 's\\" repeatCount=\\"indefinite\\" ', (ringIndex > 0 ? string(abi.encodePacked('begin=\\"p',layerIndex.toString(),'-0.begin+',ringIndex.toString(),'s\\" ')) : '' ), '/>' ); sections[6] = abi.encodePacked( '<animate attributeName=\\"stroke-width\\" values=\\"0;4;4;4;0\\" dur=\\"', thisLayer.duration.toString(), 's\\" repeatCount=\\"indefinite\\" begin=\\"p', layerIndex.toString(), '-0.begin', (ringIndex > 0 ? string(abi.encodePacked('+',ringIndex.toString(),'s')) : '' ), '\\" /></path>' ); defs = abi.encodePacked( defs, sections[0], sections[1], sections[2], sections[3], sections[4], sections[5], sections[6] ); for (spikeIndex = 0; spikeIndex < thisLayer.numberOfSpikes; spikeIndex++) { sections[7] = abi.encodePacked( '<use href=\\"#r', layerIndex.toString(), '-', ringIndex.toString(), '\\" transform=\\"rotate(', (spikeIndex*(360/thisLayer.numberOfSpikes) + (spikeIndex%2==0?(360/(thisLayer.numberOfSpikes*2)):0)).toString(), ', 512 512)\\" fill=\\"white\\" />' ); uses = abi.encodePacked( uses, sections[7] ); } } } return string( abi.encodePacked( "data:application/json;base64,", Base64.encode( bytes( abi.encodePacked( '{"description":"An on-chain (*)piece.","name":"Hypneusys #', tokenId.toString(), '","image":"<svg viewBox=\\"0 0 1024 1024\\" width=\\"1024\\" height=\\"1024\\" xmlns=\\"http://www.w3.org/2000/svg\\" style=\\"background:white;\\"><defs>', '<filter id=\\"drop\\" color-interpolation-filters=\\"sRGB\\"><feDropShadow dx=\\"4\\" dy=\\"4\\" stdDeviation=\\"2\\" flood-opacity=\\"1\\" flood-color=\\"#CCCCCC\\"/><feDropShadow dx=\\"-4\\" dy=\\"-4\\" stdDeviation=\\"2\\" flood-opacity=\\"1\\" flood-color=\\"#CCCCCC\\"/></filter>', defs, '</defs><g filter=\\"url(#drop)\\"><animateTransform attributeName=\\"transform\\" type=\\"rotate\\" from=\\"0 512 512\\" to=\\"360 512 512\\" dur=\\"30s\\" repeatCount=\\"indefinite\\"/>', uses, '</g><mask id=\\"cut\\"><rect width=\\"100%\\" height=\\"100%\\" fill=\\"white\\"/><circle cx=\\"512\\" cy=\\"512\\" r=\\"512\\" fill=\\"#02075d\\"/></mask><rect x=\\"0\\" y=\\"0\\" width=\\"1024\\" height=\\"1024\\" mask=\\"url(#cut)\\" fill=\\"white\\"/></svg>"}' ) ) ) ) ); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function withdrawAll() public payable onlyOwner { _withdraw(owner(), address(this).balance); } function _withdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); require(success, "Recovery failed."); } function _generateArt(uint256 _quantity, uint256 _tokenId) private { uint256 numLayers = 4; uint256[2][4] memory newStats; uint256[6][4] memory newCoords; uint256 randomHash; for (uint256 i = 0; i < _quantity; i += 1) { uint256 thisTokenId = _tokenId + i; OnChainArt storage newPiece = artByTokenId[thisTokenId]; newPiece.layerCount = numLayers; for (uint x = 0; x < numLayers; x++) { for(uint256 y= 0; y < 2; y++){ randomHash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, thisTokenId, x, y))); newStats[x][y] = randomHash % 8; if (newStats[x][y] % 2 != 0) newStats[x][y] += 1; } for(uint256 y= 0; y < 6; y++){ randomHash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, thisTokenId, x, y))); newCoords[x][y] = randomHash % 256; } newPiece.layers[x] = Layer({ coords: newCoords[x], duration: newStats[x][0] + 8, numberOfSpikes: newStats[x][1] + 4, numberOfRings: 4 }); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060408051808201825260098152684879706e657573797360b81b6020808301918252835180850190945260068452654859504e455560d01b9084015281519192916200006191600291620000f3565b50805162000077906003906020840190620000f3565b506000805550506008805460ff19169055620000933362000099565b620001d6565b600880546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001019062000199565b90600052602060002090601f01602090048101928262000125576000855562000170565b82601f106200014057805160ff191683800117855562000170565b8280016001018555821562000170579182015b828111156200017057825182559160200191906001019062000153565b506200017e92915062000182565b5090565b5b808211156200017e576000815560010162000183565b600181811c90821680620001ae57607f821691505b60208210811415620001d057634e487b7160e01b600052602260045260246000fd5b50919050565b612f6080620001e66000396000f3fe60806040526004361061014b5760003560e01c8063715018a6116100b6578063a22cb4651161006f578063a22cb46514610364578063b88d4fde14610384578063c87b56dd146103a4578063e8a3d485146103c4578063e985e9c5146103d9578063f2fde38b1461042257600080fd5b8063715018a6146102e75780638456cb59146102fc578063853828b6146103115780638da5cb5b1461031957806395d89b411461033c578063a0712d681461035157600080fd5b806332cb6b0c1161010857806332cb6b0c146102445780633f4ba83a1461025a57806342842e0e1461026f5780635c975abb1461028f5780636352211e146102a757806370a08231146102c757600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806318160ddd1461020157806323b872dd14610224575b600080fd5b34801561015c57600080fd5b5061017061016b36600461210b565b610442565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a610494565b60405161017c9190612d3c565b3480156101b357600080fd5b506101c76101c2366004612145565b610526565b6040516001600160a01b03909116815260200161017c565b3480156101eb57600080fd5b506101ff6101fa3660046120e1565b61056a565b005b34801561020d57600080fd5b50600154600054035b60405190815260200161017c565b34801561023057600080fd5b506101ff61023f366004611f8d565b61060a565b34801561025057600080fd5b5061021661080081565b34801561026657600080fd5b506101ff61079b565b34801561027b57600080fd5b506101ff61028a366004611f8d565b6107de565b34801561029b57600080fd5b5060085460ff16610170565b3480156102b357600080fd5b506101c76102c2366004612145565b6107fe565b3480156102d357600080fd5b506102166102e2366004611f3f565b610809565b3480156102f357600080fd5b506101ff610858565b34801561030857600080fd5b506101ff610892565b6101ff6108ca565b34801561032557600080fd5b5060085461010090046001600160a01b03166101c7565b34801561034857600080fd5b5061019a610915565b6101ff61035f366004612145565b610924565b34801561037057600080fd5b506101ff61037f3660046120a5565b610aa6565b34801561039057600080fd5b506101ff61039f366004611fc9565b610b3c565b3480156103b057600080fd5b5061019a6103bf366004612145565b610b86565b3480156103d057600080fd5b5061019a61127d565b3480156103e557600080fd5b506101706103f4366004611f5a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561042e57600080fd5b506101ff61043d366004611f3f565b611362565b60006301ffc9a760e01b6001600160e01b03198316148061047357506380ac58cd60e01b6001600160e01b03198316145b8061048e5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546104a390612e12565b80601f01602080910402602001604051908101604052809291908181526020018280546104cf90612e12565b801561051c5780601f106104f15761010080835404028352916020019161051c565b820191906000526020600020905b8154815290600101906020018083116104ff57829003601f168201915b5050505050905090565b600061053182611403565b61054e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610575826107fe565b9050336001600160a01b038216146105ae5761059181336103f4565b6105ae576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006106158261142a565b9050836001600160a01b0316816001600160a01b0316146106485760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176106955761067886336103f4565b61069557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166106bc57604051633a954ecd60e21b815260040160405180910390fd5b80156106c757600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b831661075257600184016000818152600460205260409020546107505760005481146107505760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6008546001600160a01b036101009091041633146107d45760405162461bcd60e51b81526004016107cb90612d4f565b60405180910390fd5b6107dc611492565b565b6107f983838360405180602001604052806000815250610b3c565b505050565b600061048e8261142a565b60006001600160a01b038216610832576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b036101009091041633146108885760405162461bcd60e51b81526004016107cb90612d4f565b6107dc6000611525565b6008546001600160a01b036101009091041633146108c25760405162461bcd60e51b81526004016107cb90612d4f565b6107dc61157f565b6008546001600160a01b036101009091041633146108fa5760405162461bcd60e51b81526004016107cb90612d4f565b6008546107dc9061010090046001600160a01b0316476115fa565b6060600380546104a390612e12565b60006109336001546000540390565b9050600082116109855760405162461bcd60e51b815260206004820152601c60248201527f436f756e74206d7573742062652067726561746572207468616e20300000000060448201526064016107cb565b600382106109d55760405162461bcd60e51b815260206004820152601960248201527f436f756e74206d757374206265206c657373207468616e20330000000000000060448201526064016107cb565b6108006109e28383612d84565b1115610a445760405162461bcd60e51b815260206004820152602b60248201527f52657175657374656420616d6f756e742065786365656473207768617420697360448201526a20617661696c61626c652160a81b60648201526084016107cb565b610800811115610a8e5760405162461bcd60e51b81526020600482015260156024820152742737ba1032b737bab3b41030bb30b4b630b136329760591b60448201526064016107cb565b610a988282611690565b610aa2338361195e565b5050565b6001600160a01b038216331415610ad05760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b4784848461060a565b6001600160a01b0383163b15610b8057610b6384848484611978565b610b80576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610b956001546000540390565b8210610be35760405162461bcd60e51b815260206004820152601860248201527f546f6b656e20494420646f6573206e6f742065786973742e000000000000000060448201526064016107cb565b606080610bee611e0c565b604080516008808252610120820190925260009182918291829190816020015b6060815260200190600190039081610c0e579050509050600093505b60008981526009602052604090206001015484101561121c576000898152600960209081526040808320878452909152908190208151610140810190925281608081018260068282826020028201915b815481526020019060010190808311610c7a575050505050815260200160068201548152602001600782015481526020016008820154815250509450600092505b846040015183101561120a57610cd084611a70565b610cd984611a70565b604051602001610cea9291906124c6565b60405160208183030381529060405281600081518110610d0c57610d0c612ea8565b6020026020010181905250610d2084611a70565b610d2984611a70565b604051602001610d3a929190612429565b60405160208183030381529060405281600181518110610d5c57610d5c612ea8565b60209081029190910101528451610d7a9060005b6020020151611a70565b8551610d87906001610d70565b8651610d94906002610d70565b8751610da1906003610d70565b604051602001610db49493929190612306565b60405160208183030381529060405281600281518110610dd657610dd6612ea8565b60209081029190910101528451610dee906002610d70565b8551610dfb906003610d70565b8651610e08906004610d70565b8751610e15906005610d70565b604051602001610e28949392919061227a565b60405160208183030381529060405281600381518110610e4a57610e4a612ea8565b60209081029190910101528451610e62906002610d70565b8551610e6f906003610d70565b8651610e7c906002610d70565b8751610e89906003610d70565b604051602001610e9c9493929190612397565b60405160208183030381529060405281600481518110610ebe57610ebe612ea8565b6020026020010181905250610ed68560200151611a70565b60008411610ef35760405180602001604052806000815250610f26565b610efc85611a70565b610f0585611a70565b604051602001610f16929190612bd9565b6040516020818303038152906040525b604051602001610f37929190612c44565b60405160208183030381529060405281600581518110610f5957610f59612ea8565b6020026020010181905250610f718560200151611a70565b610f7a85611a70565b60008511610f975760405180602001604052806000815250610fc0565b610fa085611a70565b604051602001610fb091906126eb565b6040516020818303038152906040525b604051602001610fd2939291906125e4565b60405160208183030381529060405281600681518110610ff457610ff4612ea8565b6020026020010181905250868160008151811061101357611013612ea8565b60200260200101518260018151811061102e5761102e612ea8565b60200260200101518360028151811061104957611049612ea8565b60200260200101518460038151811061106457611064612ea8565b60200260200101518560048151811061107f5761107f612ea8565b60200260200101518660058151811061109a5761109a612ea8565b6020026020010151876006815181106110b5576110b5612ea8565b60200260200101516040516020016110d49897969594939291906121d5565b6040516020818303038152906040529650600091505b84606001518210156111f8576110ff84611a70565b61110884611a70565b611168611116600286612e68565b1561112257600061113e565b6060880151611132906002612db0565b61113e90610168612d9c565b606089015161114f90610168612d9c565b6111599087612db0565b6111639190612d84565b611a70565b60405160200161117a9392919061252b565b6040516020818303038152906040528160078151811061119c5761119c612ea8565b602002602001018190525085816007815181106111bb576111bb612ea8565b60200260200101516040516020016111d49291906121a6565b604051602081830303815290604052955081806111f090612e4d565b9250506110ea565b8261120281612e4d565b935050610cbb565b8361121481612e4d565b945050610c2a565b6112506112288a611a70565b888860405160200161123c9392919061271f565b604051602081830303815290604052611b6e565b6040516020016112609190612b94565b604051602081830303815290604052975050505050505050919050565b606061133e60405160200161123c907f7b226465736372697074696f6e223a2022416e206f6e2d636861696e20282a2981527f70696563652e222c226e616d65223a224879706e6575737973222c22696d616760208201527f65223a223c7376672076696577426f783d5c2230203020313238203132385c2260408201527f20786d6c6e733d5c22687474703a2f2f7777772e77332e6f72672f323030302f60608201526d7376675c223e3c2f7376673e227d60901b6080820152608e0190565b60405160200161134e9190612b94565b604051602081830303815290604052905090565b6008546001600160a01b036101009091041633146113925760405162461bcd60e51b81526004016107cb90612d4f565b6001600160a01b0381166113f75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107cb565b61140081611525565b50565b600080548210801561048e575050600090815260046020526040902054600160e01b161590565b60008160005481101561147957600081815260046020526040902054600160e01b8116611477575b80611470575060001901600081815260046020526040902054611452565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b60085460ff166114db5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107cb565b6008805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600880546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60085460ff16156115c55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107cb565b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115083390565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611647576040519150601f19603f3d011682016040523d82523d6000602084013e61164c565b606091505b50509050806107f95760405162461bcd60e51b815260206004820152601060248201526f2932b1b7bb32b93c903330b4b632b21760811b60448201526064016107cb565b600461169a611e3a565b6116a2611e67565b6000805b868110156119555760006116ba8288612d84565b6000818152600960205260408120600181018990559192505b8781101561193e5760005b60028110156117e1574233858484604051602001611700959493929190612cd4565b60408051601f1981840301815291905280516020909101209550611725600887612e68565b88836004811061173757611737612ea8565b6020020151826002811061174d5761174d612ea8565b6020020152600288836004811061176657611766612ea8565b6020020151826002811061177c5761177c612ea8565b602002015161178b9190612e68565b156117cf5760018883600481106117a4576117a4612ea8565b602002015182600281106117ba576117ba612ea8565b602002018181516117cb9190612d84565b9052505b806117d981612e4d565b9150506116de565b5060005b600681101561186c574233858484604051602001611807959493929190612cd4565b60408051601f198184030181529190528051602090910120955061182d61010087612e68565b87836004811061183f5761183f612ea8565b6020020151826006811061185557611855612ea8565b60200201528061186481612e4d565b9150506117e5565b50604051806080016040528087836004811061188a5761188a612ea8565b602002015181526020018883600481106118a6576118a6612ea8565b6020020151516118b7906008612d84565b8152602001600481526020018883600481106118d5576118d5612ea8565b6020020151600160200201516118ec906004612d84565b90526000828152602084905260409020815161190b9082906006611e94565b5060208201516006820155604082015160078201556060909101516008909101558061193681612e4d565b9150506116d3565b50505060018161194e9190612d84565b90506116a6565b50505050505050565b610aa2828260405180602001604052806000815250611cc2565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119ad903390899088908890600401612d09565b602060405180830381600087803b1580156119c757600080fd5b505af19250505080156119f7575060408051601f3d908101601f191682019092526119f491810190612128565b60015b611a52573d808015611a25576040519150601f19603f3d011682016040523d82523d6000602084013e611a2a565b606091505b508051611a4a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081611a945750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611abe5780611aa881612e4d565b9150611ab79050600a83612d9c565b9150611a98565b60008167ffffffffffffffff811115611ad957611ad9612ebe565b6040519080825280601f01601f191660200182016040528015611b03576020820181803683370190505b5090505b8415611a6857611b18600183612dcf565b9150611b25600a86612e68565b611b30906030612d84565b60f81b818381518110611b4557611b45612ea8565b60200101906001600160f81b031916908160001a905350611b67600a86612d9c565b9450611b07565b6060815160001415611b8e57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612eeb6040913990506000600384516002611bbd9190612d84565b611bc79190612d9c565b611bd2906004612db0565b67ffffffffffffffff811115611bea57611bea612ebe565b6040519080825280601f01601f191660200182016040528015611c14576020820181803683370190505b509050600182016020820185865187015b80821015611c80576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250611c25565b5050600386510660018114611c9c5760028114611caf57611cb7565b603d6001830353603d6002830353611cb7565b603d60018303535b509195945050505050565b611ccc8383611d2f565b6001600160a01b0383163b156107f9576000548281035b611cf66000868380600101945086611978565b611d13576040516368d2bf6b60e11b815260040160405180910390fd5b818110611ce3578160005414611d2857600080fd5b5050505050565b6000546001600160a01b038316611d5857604051622e076360e81b815260040160405180910390fd5b81611d765760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600081815260056020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260046020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611dc05760005550505050565b6040518060800160405280611e1f611ed2565b81526020016000815260200160008152602001600081525090565b60405180608001604052806004905b611e51611ef0565b815260200190600190039081611e495790505090565b60405180608001604052806004905b611e7e611ed2565b815260200190600190039081611e765790505090565b8260068101928215611ec2579160200282015b82811115611ec2578251825591602001919060010190611ea7565b50611ece929150611f0e565b5090565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b5b80821115611ece5760008155600101611f0f565b80356001600160a01b0381168114611f3a57600080fd5b919050565b600060208284031215611f5157600080fd5b61147082611f23565b60008060408385031215611f6d57600080fd5b611f7683611f23565b9150611f8460208401611f23565b90509250929050565b600080600060608486031215611fa257600080fd5b611fab84611f23565b9250611fb960208501611f23565b9150604084013590509250925092565b60008060008060808587031215611fdf57600080fd5b611fe885611f23565b9350611ff660208601611f23565b925060408501359150606085013567ffffffffffffffff8082111561201a57600080fd5b818701915087601f83011261202e57600080fd5b81358181111561204057612040612ebe565b604051601f8201601f19908116603f0116810190838211818310171561206857612068612ebe565b816040528281528a602084870101111561208157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156120b857600080fd5b6120c183611f23565b9150602083013580151581146120d657600080fd5b809150509250929050565b600080604083850312156120f457600080fd5b6120fd83611f23565b946020939093013593505050565b60006020828403121561211d57600080fd5b813561147081612ed4565b60006020828403121561213a57600080fd5b815161147081612ed4565b60006020828403121561215757600080fd5b5035919050565b60008151808452612176816020860160208601612de6565b601f01601f19169290920160200192915050565b6000815161219c818560208601612de6565b9290920192915050565b600083516121b8818460208801612de6565b8351908301906121cc818360208801612de6565b01949350505050565b6000895160206121e88285838f01612de6565b8a51918401916121fb8184848f01612de6565b8a5192019161220d8184848e01612de6565b895192019161221f8184848d01612de6565b88519201916122318184848c01612de6565b87519201916122438184848b01612de6565b86519201916122558184848a01612de6565b85519201916122678184848901612de6565b919091019b9a5050505050505050505050565b6000855161228c818460208a01612de6565b8083019050600b60fa1b80825286516122ac816001850160208b01612de6565b613b6d60f01b6001939091019283015285516122cf816003850160208a01612de6565b600392019182015283516122ea816004840160208801612de6565b601b60fa1b600492909101918201526005019695505050505050565b60008551612318818460208a01612de6565b600b60fa1b9083019081528551612336816001840160208a01612de6565b601b60fa1b600192909101918201528451612358816002840160208901612de6565b612c2d60f01b60029290910191820152835161237b816004840160208801612de6565b600160fd1b600492909101918201526005019695505050505050565b600085516123a9818460208a01612de6565b612c2d60f01b90830190815285516123c8816002840160208a01612de6565b600160fd1b6002929091019182015284516123ea816003840160208901612de6565b600b60fa1b60039290910191820152835161240c816004840160208801612de6565b613b6d60f01b600492909101918201526006019695505050505050565b6e03c616e696d6174652069643d5c227608c1b8152825160009061245481600f850160208801612de6565b602d60f81b600f918401918201528351612475816010840160208801612de6565b7f5c22206174747269627574654e616d653d5c22645c222076616c7565733d5c2260109290910191820152716d3531322c3531326c302c3020302c303b6d60701b6030820152604201949350505050565b6b1e3830ba341034b21eae113960a11b815282516000906124ee81600c850160208801612de6565b602d60f81b600c91840191820152835161250f81600d840160208801612de6565b622e111f60e91b600d9290910191820152601001949350505050565b6d1e3ab9b290343932b31eae1111b960911b8152835160009061255581600e850160208901612de6565b602d60f81b600e91840191820152845161257681600f840160208901612de6565b750b84440e8e4c2dce6ccdee4da7ab844e4dee8c2e8ca560531b600f929091019182015283516125ad816025840160208801612de6565b7f2c2035313220353132295c222066696c6c3d5c2277686974655c22202f3e00006025929091019182015260430195945050505050565b7f3c616e696d617465206174747269627574654e616d653d5c227374726f6b652d81527f77696474685c222076616c7565733d5c22303b343b343b343b305c22206475726020820152621eae1160e91b60408201526000845161264e816043850160208901612de6565b7f735c2220726570656174436f756e743d5c22696e646566696e6974655c2220626043918401918201526706567696e3d5c22760c41b6063820152845161269c81606b840160208901612de6565b671698173132b3b4b760c11b606b929091019182015283516126c5816073840160208801612de6565b6b2e1110179f1e17b830ba341f60a11b60739290910191820152607f0195945050505050565b602b60f81b815260008251612707816001850160208701612de6565b607360f81b6001939091019283015250600201919050565b7f7b226465736372697074696f6e223a22416e206f6e2d636861696e20282a297081527f696563652e222c226e616d65223a224879706e6575737973202300000000000060208201526000845161277d81603a850160208901612de6565b7f222c22696d616765223a223c7376672076696577426f783d5c22302030203130603a918401918201527f323420313032345c222077696474683d5c22313032345c22206865696768743d605a8201527f5c22313032345c2220786d6c6e733d5c22687474703a2f2f7777772e77332e6f607a8201527f72672f323030302f7376675c22207374796c653d5c226261636b67726f756e64609a8201526f1d3bb434ba329dae111f1e3232b3399f60811b60ba8201527f3c66696c7465722069643d5c2264726f705c2220636f6c6f722d696e7465727060ca8201527f6f6c6174696f6e2d66696c746572733d5c22735247425c223e3c666544726f7060ea8201527f536861646f772064783d5c22345c222064793d5c22345c22207374644465766961010a8201527f6174696f6e3d5c22325c2220666c6f6f642d6f7061636974793d5c22315c222061012a8201527f666c6f6f642d636f6c6f723d5c22234343434343435c222f3e3c666544726f7061014a8201527f536861646f772064783d5c222d345c222064793d5c222d345c2220737464446561016a8201527f76696174696f6e3d5c22325c2220666c6f6f642d6f7061636974793d5c22315c61018a8201527f2220666c6f6f642d636f6c6f723d5c22234343434343435c222f3e3c2f66696c6101aa820152633a32b91f60e11b6101ca820152612b8a612a69612a6361298d6101ce85018961218a565b7f3c2f646566733e3c672066696c7465723d5c2275726c282364726f70295c223e81527f3c616e696d6174655472616e73666f726d206174747269627574654e616d653d60208201527f5c227472616e73666f726d5c2220747970653d5c22726f746174655c2220667260408201527f6f6d3d5c223020353132203531325c2220746f3d5c223336302035313220353160608201527f325c22206475723d5c223330735c2220726570656174436f756e743d5c22696e60808201526b3232b334b734ba32ae11179f60a11b60a082015260ac0190565b8661218a565b7f3c2f673e3c6d61736b2069643d5c226375745c223e3c7265637420776964746881527f3d5c22313030255c22206865696768743d5c22313030255c222066696c6c3d5c60208201527f2277686974655c222f3e3c636972636c652063783d5c223531325c222063793d60408201527f5c223531325c2220723d5c223531325c222066696c6c3d5c222330323037356460608201527f5c222f3e3c2f6d61736b3e3c7265637420783d5c22305c2220793d5c22305c2260808201527f2077696474683d5c22313032345c22206865696768743d5c22313032345c222060a08201527f6d61736b3d5c2275726c2823637574295c222066696c6c3d5c2277686974655c60c08201526a222f3e3c2f7376673e227d60a81b60e082015260eb0190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612bcc81601d850160208701612de6565b91909101601d0192915050565b680626567696e3d5c22760bc1b81528251600090612bfe816009850160208801612de6565b682d302e626567696e2b60b81b6009918401918201528351612c27816012840160208801612de6565b63039ae11160e51b60129290910191820152601601949350505050565b7f3531322c3531326c302c3020302c305c22206475723d5c220000000000000000815260008351612c7c816018850160208801612de6565b7f735c2220726570656174436f756e743d5c22696e646566696e6974655c2220006018918401918201528351612cb9816037840160208801612de6565b61179f60f11b60379290910191820152603901949350505050565b94855260609390931b6bffffffffffffffffffffffff1916602085015260348401919091526054830152607482015260940190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b8a9083018461215e565b602081526000611470602083018461215e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115612d9757612d97612e7c565b500190565b600082612dab57612dab612e92565b500490565b6000816000190483118215151615612dca57612dca612e7c565b500290565b600082821015612de157612de1612e7c565b500390565b60005b83811015612e01578181015183820152602001612de9565b83811115610b805750506000910152565b600181811c90821680612e2657607f821691505b60208210811415612e4757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e6157612e61612e7c565b5060010190565b600082612e7757612e77612e92565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461140057600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220884717097ea6f3dd98a8431f578279feabc06e75e3a6439e186b80c006ebf8c564736f6c63430008070033
Deployed Bytecode
0x60806040526004361061014b5760003560e01c8063715018a6116100b6578063a22cb4651161006f578063a22cb46514610364578063b88d4fde14610384578063c87b56dd146103a4578063e8a3d485146103c4578063e985e9c5146103d9578063f2fde38b1461042257600080fd5b8063715018a6146102e75780638456cb59146102fc578063853828b6146103115780638da5cb5b1461031957806395d89b411461033c578063a0712d681461035157600080fd5b806332cb6b0c1161010857806332cb6b0c146102445780633f4ba83a1461025a57806342842e0e1461026f5780635c975abb1461028f5780636352211e146102a757806370a08231146102c757600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806318160ddd1461020157806323b872dd14610224575b600080fd5b34801561015c57600080fd5b5061017061016b36600461210b565b610442565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a610494565b60405161017c9190612d3c565b3480156101b357600080fd5b506101c76101c2366004612145565b610526565b6040516001600160a01b03909116815260200161017c565b3480156101eb57600080fd5b506101ff6101fa3660046120e1565b61056a565b005b34801561020d57600080fd5b50600154600054035b60405190815260200161017c565b34801561023057600080fd5b506101ff61023f366004611f8d565b61060a565b34801561025057600080fd5b5061021661080081565b34801561026657600080fd5b506101ff61079b565b34801561027b57600080fd5b506101ff61028a366004611f8d565b6107de565b34801561029b57600080fd5b5060085460ff16610170565b3480156102b357600080fd5b506101c76102c2366004612145565b6107fe565b3480156102d357600080fd5b506102166102e2366004611f3f565b610809565b3480156102f357600080fd5b506101ff610858565b34801561030857600080fd5b506101ff610892565b6101ff6108ca565b34801561032557600080fd5b5060085461010090046001600160a01b03166101c7565b34801561034857600080fd5b5061019a610915565b6101ff61035f366004612145565b610924565b34801561037057600080fd5b506101ff61037f3660046120a5565b610aa6565b34801561039057600080fd5b506101ff61039f366004611fc9565b610b3c565b3480156103b057600080fd5b5061019a6103bf366004612145565b610b86565b3480156103d057600080fd5b5061019a61127d565b3480156103e557600080fd5b506101706103f4366004611f5a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561042e57600080fd5b506101ff61043d366004611f3f565b611362565b60006301ffc9a760e01b6001600160e01b03198316148061047357506380ac58cd60e01b6001600160e01b03198316145b8061048e5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546104a390612e12565b80601f01602080910402602001604051908101604052809291908181526020018280546104cf90612e12565b801561051c5780601f106104f15761010080835404028352916020019161051c565b820191906000526020600020905b8154815290600101906020018083116104ff57829003601f168201915b5050505050905090565b600061053182611403565b61054e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610575826107fe565b9050336001600160a01b038216146105ae5761059181336103f4565b6105ae576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006106158261142a565b9050836001600160a01b0316816001600160a01b0316146106485760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176106955761067886336103f4565b61069557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166106bc57604051633a954ecd60e21b815260040160405180910390fd5b80156106c757600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b831661075257600184016000818152600460205260409020546107505760005481146107505760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6008546001600160a01b036101009091041633146107d45760405162461bcd60e51b81526004016107cb90612d4f565b60405180910390fd5b6107dc611492565b565b6107f983838360405180602001604052806000815250610b3c565b505050565b600061048e8261142a565b60006001600160a01b038216610832576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b036101009091041633146108885760405162461bcd60e51b81526004016107cb90612d4f565b6107dc6000611525565b6008546001600160a01b036101009091041633146108c25760405162461bcd60e51b81526004016107cb90612d4f565b6107dc61157f565b6008546001600160a01b036101009091041633146108fa5760405162461bcd60e51b81526004016107cb90612d4f565b6008546107dc9061010090046001600160a01b0316476115fa565b6060600380546104a390612e12565b60006109336001546000540390565b9050600082116109855760405162461bcd60e51b815260206004820152601c60248201527f436f756e74206d7573742062652067726561746572207468616e20300000000060448201526064016107cb565b600382106109d55760405162461bcd60e51b815260206004820152601960248201527f436f756e74206d757374206265206c657373207468616e20330000000000000060448201526064016107cb565b6108006109e28383612d84565b1115610a445760405162461bcd60e51b815260206004820152602b60248201527f52657175657374656420616d6f756e742065786365656473207768617420697360448201526a20617661696c61626c652160a81b60648201526084016107cb565b610800811115610a8e5760405162461bcd60e51b81526020600482015260156024820152742737ba1032b737bab3b41030bb30b4b630b136329760591b60448201526064016107cb565b610a988282611690565b610aa2338361195e565b5050565b6001600160a01b038216331415610ad05760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b4784848461060a565b6001600160a01b0383163b15610b8057610b6384848484611978565b610b80576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610b956001546000540390565b8210610be35760405162461bcd60e51b815260206004820152601860248201527f546f6b656e20494420646f6573206e6f742065786973742e000000000000000060448201526064016107cb565b606080610bee611e0c565b604080516008808252610120820190925260009182918291829190816020015b6060815260200190600190039081610c0e579050509050600093505b60008981526009602052604090206001015484101561121c576000898152600960209081526040808320878452909152908190208151610140810190925281608081018260068282826020028201915b815481526020019060010190808311610c7a575050505050815260200160068201548152602001600782015481526020016008820154815250509450600092505b846040015183101561120a57610cd084611a70565b610cd984611a70565b604051602001610cea9291906124c6565b60405160208183030381529060405281600081518110610d0c57610d0c612ea8565b6020026020010181905250610d2084611a70565b610d2984611a70565b604051602001610d3a929190612429565b60405160208183030381529060405281600181518110610d5c57610d5c612ea8565b60209081029190910101528451610d7a9060005b6020020151611a70565b8551610d87906001610d70565b8651610d94906002610d70565b8751610da1906003610d70565b604051602001610db49493929190612306565b60405160208183030381529060405281600281518110610dd657610dd6612ea8565b60209081029190910101528451610dee906002610d70565b8551610dfb906003610d70565b8651610e08906004610d70565b8751610e15906005610d70565b604051602001610e28949392919061227a565b60405160208183030381529060405281600381518110610e4a57610e4a612ea8565b60209081029190910101528451610e62906002610d70565b8551610e6f906003610d70565b8651610e7c906002610d70565b8751610e89906003610d70565b604051602001610e9c9493929190612397565b60405160208183030381529060405281600481518110610ebe57610ebe612ea8565b6020026020010181905250610ed68560200151611a70565b60008411610ef35760405180602001604052806000815250610f26565b610efc85611a70565b610f0585611a70565b604051602001610f16929190612bd9565b6040516020818303038152906040525b604051602001610f37929190612c44565b60405160208183030381529060405281600581518110610f5957610f59612ea8565b6020026020010181905250610f718560200151611a70565b610f7a85611a70565b60008511610f975760405180602001604052806000815250610fc0565b610fa085611a70565b604051602001610fb091906126eb565b6040516020818303038152906040525b604051602001610fd2939291906125e4565b60405160208183030381529060405281600681518110610ff457610ff4612ea8565b6020026020010181905250868160008151811061101357611013612ea8565b60200260200101518260018151811061102e5761102e612ea8565b60200260200101518360028151811061104957611049612ea8565b60200260200101518460038151811061106457611064612ea8565b60200260200101518560048151811061107f5761107f612ea8565b60200260200101518660058151811061109a5761109a612ea8565b6020026020010151876006815181106110b5576110b5612ea8565b60200260200101516040516020016110d49897969594939291906121d5565b6040516020818303038152906040529650600091505b84606001518210156111f8576110ff84611a70565b61110884611a70565b611168611116600286612e68565b1561112257600061113e565b6060880151611132906002612db0565b61113e90610168612d9c565b606089015161114f90610168612d9c565b6111599087612db0565b6111639190612d84565b611a70565b60405160200161117a9392919061252b565b6040516020818303038152906040528160078151811061119c5761119c612ea8565b602002602001018190525085816007815181106111bb576111bb612ea8565b60200260200101516040516020016111d49291906121a6565b604051602081830303815290604052955081806111f090612e4d565b9250506110ea565b8261120281612e4d565b935050610cbb565b8361121481612e4d565b945050610c2a565b6112506112288a611a70565b888860405160200161123c9392919061271f565b604051602081830303815290604052611b6e565b6040516020016112609190612b94565b604051602081830303815290604052975050505050505050919050565b606061133e60405160200161123c907f7b226465736372697074696f6e223a2022416e206f6e2d636861696e20282a2981527f70696563652e222c226e616d65223a224879706e6575737973222c22696d616760208201527f65223a223c7376672076696577426f783d5c2230203020313238203132385c2260408201527f20786d6c6e733d5c22687474703a2f2f7777772e77332e6f72672f323030302f60608201526d7376675c223e3c2f7376673e227d60901b6080820152608e0190565b60405160200161134e9190612b94565b604051602081830303815290604052905090565b6008546001600160a01b036101009091041633146113925760405162461bcd60e51b81526004016107cb90612d4f565b6001600160a01b0381166113f75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107cb565b61140081611525565b50565b600080548210801561048e575050600090815260046020526040902054600160e01b161590565b60008160005481101561147957600081815260046020526040902054600160e01b8116611477575b80611470575060001901600081815260046020526040902054611452565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b60085460ff166114db5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107cb565b6008805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600880546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60085460ff16156115c55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107cb565b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115083390565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611647576040519150601f19603f3d011682016040523d82523d6000602084013e61164c565b606091505b50509050806107f95760405162461bcd60e51b815260206004820152601060248201526f2932b1b7bb32b93c903330b4b632b21760811b60448201526064016107cb565b600461169a611e3a565b6116a2611e67565b6000805b868110156119555760006116ba8288612d84565b6000818152600960205260408120600181018990559192505b8781101561193e5760005b60028110156117e1574233858484604051602001611700959493929190612cd4565b60408051601f1981840301815291905280516020909101209550611725600887612e68565b88836004811061173757611737612ea8565b6020020151826002811061174d5761174d612ea8565b6020020152600288836004811061176657611766612ea8565b6020020151826002811061177c5761177c612ea8565b602002015161178b9190612e68565b156117cf5760018883600481106117a4576117a4612ea8565b602002015182600281106117ba576117ba612ea8565b602002018181516117cb9190612d84565b9052505b806117d981612e4d565b9150506116de565b5060005b600681101561186c574233858484604051602001611807959493929190612cd4565b60408051601f198184030181529190528051602090910120955061182d61010087612e68565b87836004811061183f5761183f612ea8565b6020020151826006811061185557611855612ea8565b60200201528061186481612e4d565b9150506117e5565b50604051806080016040528087836004811061188a5761188a612ea8565b602002015181526020018883600481106118a6576118a6612ea8565b6020020151516118b7906008612d84565b8152602001600481526020018883600481106118d5576118d5612ea8565b6020020151600160200201516118ec906004612d84565b90526000828152602084905260409020815161190b9082906006611e94565b5060208201516006820155604082015160078201556060909101516008909101558061193681612e4d565b9150506116d3565b50505060018161194e9190612d84565b90506116a6565b50505050505050565b610aa2828260405180602001604052806000815250611cc2565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119ad903390899088908890600401612d09565b602060405180830381600087803b1580156119c757600080fd5b505af19250505080156119f7575060408051601f3d908101601f191682019092526119f491810190612128565b60015b611a52573d808015611a25576040519150601f19603f3d011682016040523d82523d6000602084013e611a2a565b606091505b508051611a4a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081611a945750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611abe5780611aa881612e4d565b9150611ab79050600a83612d9c565b9150611a98565b60008167ffffffffffffffff811115611ad957611ad9612ebe565b6040519080825280601f01601f191660200182016040528015611b03576020820181803683370190505b5090505b8415611a6857611b18600183612dcf565b9150611b25600a86612e68565b611b30906030612d84565b60f81b818381518110611b4557611b45612ea8565b60200101906001600160f81b031916908160001a905350611b67600a86612d9c565b9450611b07565b6060815160001415611b8e57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612eeb6040913990506000600384516002611bbd9190612d84565b611bc79190612d9c565b611bd2906004612db0565b67ffffffffffffffff811115611bea57611bea612ebe565b6040519080825280601f01601f191660200182016040528015611c14576020820181803683370190505b509050600182016020820185865187015b80821015611c80576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250611c25565b5050600386510660018114611c9c5760028114611caf57611cb7565b603d6001830353603d6002830353611cb7565b603d60018303535b509195945050505050565b611ccc8383611d2f565b6001600160a01b0383163b156107f9576000548281035b611cf66000868380600101945086611978565b611d13576040516368d2bf6b60e11b815260040160405180910390fd5b818110611ce3578160005414611d2857600080fd5b5050505050565b6000546001600160a01b038316611d5857604051622e076360e81b815260040160405180910390fd5b81611d765760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600081815260056020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260046020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611dc05760005550505050565b6040518060800160405280611e1f611ed2565b81526020016000815260200160008152602001600081525090565b60405180608001604052806004905b611e51611ef0565b815260200190600190039081611e495790505090565b60405180608001604052806004905b611e7e611ed2565b815260200190600190039081611e765790505090565b8260068101928215611ec2579160200282015b82811115611ec2578251825591602001919060010190611ea7565b50611ece929150611f0e565b5090565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b5b80821115611ece5760008155600101611f0f565b80356001600160a01b0381168114611f3a57600080fd5b919050565b600060208284031215611f5157600080fd5b61147082611f23565b60008060408385031215611f6d57600080fd5b611f7683611f23565b9150611f8460208401611f23565b90509250929050565b600080600060608486031215611fa257600080fd5b611fab84611f23565b9250611fb960208501611f23565b9150604084013590509250925092565b60008060008060808587031215611fdf57600080fd5b611fe885611f23565b9350611ff660208601611f23565b925060408501359150606085013567ffffffffffffffff8082111561201a57600080fd5b818701915087601f83011261202e57600080fd5b81358181111561204057612040612ebe565b604051601f8201601f19908116603f0116810190838211818310171561206857612068612ebe565b816040528281528a602084870101111561208157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156120b857600080fd5b6120c183611f23565b9150602083013580151581146120d657600080fd5b809150509250929050565b600080604083850312156120f457600080fd5b6120fd83611f23565b946020939093013593505050565b60006020828403121561211d57600080fd5b813561147081612ed4565b60006020828403121561213a57600080fd5b815161147081612ed4565b60006020828403121561215757600080fd5b5035919050565b60008151808452612176816020860160208601612de6565b601f01601f19169290920160200192915050565b6000815161219c818560208601612de6565b9290920192915050565b600083516121b8818460208801612de6565b8351908301906121cc818360208801612de6565b01949350505050565b6000895160206121e88285838f01612de6565b8a51918401916121fb8184848f01612de6565b8a5192019161220d8184848e01612de6565b895192019161221f8184848d01612de6565b88519201916122318184848c01612de6565b87519201916122438184848b01612de6565b86519201916122558184848a01612de6565b85519201916122678184848901612de6565b919091019b9a5050505050505050505050565b6000855161228c818460208a01612de6565b8083019050600b60fa1b80825286516122ac816001850160208b01612de6565b613b6d60f01b6001939091019283015285516122cf816003850160208a01612de6565b600392019182015283516122ea816004840160208801612de6565b601b60fa1b600492909101918201526005019695505050505050565b60008551612318818460208a01612de6565b600b60fa1b9083019081528551612336816001840160208a01612de6565b601b60fa1b600192909101918201528451612358816002840160208901612de6565b612c2d60f01b60029290910191820152835161237b816004840160208801612de6565b600160fd1b600492909101918201526005019695505050505050565b600085516123a9818460208a01612de6565b612c2d60f01b90830190815285516123c8816002840160208a01612de6565b600160fd1b6002929091019182015284516123ea816003840160208901612de6565b600b60fa1b60039290910191820152835161240c816004840160208801612de6565b613b6d60f01b600492909101918201526006019695505050505050565b6e03c616e696d6174652069643d5c227608c1b8152825160009061245481600f850160208801612de6565b602d60f81b600f918401918201528351612475816010840160208801612de6565b7f5c22206174747269627574654e616d653d5c22645c222076616c7565733d5c2260109290910191820152716d3531322c3531326c302c3020302c303b6d60701b6030820152604201949350505050565b6b1e3830ba341034b21eae113960a11b815282516000906124ee81600c850160208801612de6565b602d60f81b600c91840191820152835161250f81600d840160208801612de6565b622e111f60e91b600d9290910191820152601001949350505050565b6d1e3ab9b290343932b31eae1111b960911b8152835160009061255581600e850160208901612de6565b602d60f81b600e91840191820152845161257681600f840160208901612de6565b750b84440e8e4c2dce6ccdee4da7ab844e4dee8c2e8ca560531b600f929091019182015283516125ad816025840160208801612de6565b7f2c2035313220353132295c222066696c6c3d5c2277686974655c22202f3e00006025929091019182015260430195945050505050565b7f3c616e696d617465206174747269627574654e616d653d5c227374726f6b652d81527f77696474685c222076616c7565733d5c22303b343b343b343b305c22206475726020820152621eae1160e91b60408201526000845161264e816043850160208901612de6565b7f735c2220726570656174436f756e743d5c22696e646566696e6974655c2220626043918401918201526706567696e3d5c22760c41b6063820152845161269c81606b840160208901612de6565b671698173132b3b4b760c11b606b929091019182015283516126c5816073840160208801612de6565b6b2e1110179f1e17b830ba341f60a11b60739290910191820152607f0195945050505050565b602b60f81b815260008251612707816001850160208701612de6565b607360f81b6001939091019283015250600201919050565b7f7b226465736372697074696f6e223a22416e206f6e2d636861696e20282a297081527f696563652e222c226e616d65223a224879706e6575737973202300000000000060208201526000845161277d81603a850160208901612de6565b7f222c22696d616765223a223c7376672076696577426f783d5c22302030203130603a918401918201527f323420313032345c222077696474683d5c22313032345c22206865696768743d605a8201527f5c22313032345c2220786d6c6e733d5c22687474703a2f2f7777772e77332e6f607a8201527f72672f323030302f7376675c22207374796c653d5c226261636b67726f756e64609a8201526f1d3bb434ba329dae111f1e3232b3399f60811b60ba8201527f3c66696c7465722069643d5c2264726f705c2220636f6c6f722d696e7465727060ca8201527f6f6c6174696f6e2d66696c746572733d5c22735247425c223e3c666544726f7060ea8201527f536861646f772064783d5c22345c222064793d5c22345c22207374644465766961010a8201527f6174696f6e3d5c22325c2220666c6f6f642d6f7061636974793d5c22315c222061012a8201527f666c6f6f642d636f6c6f723d5c22234343434343435c222f3e3c666544726f7061014a8201527f536861646f772064783d5c222d345c222064793d5c222d345c2220737464446561016a8201527f76696174696f6e3d5c22325c2220666c6f6f642d6f7061636974793d5c22315c61018a8201527f2220666c6f6f642d636f6c6f723d5c22234343434343435c222f3e3c2f66696c6101aa820152633a32b91f60e11b6101ca820152612b8a612a69612a6361298d6101ce85018961218a565b7f3c2f646566733e3c672066696c7465723d5c2275726c282364726f70295c223e81527f3c616e696d6174655472616e73666f726d206174747269627574654e616d653d60208201527f5c227472616e73666f726d5c2220747970653d5c22726f746174655c2220667260408201527f6f6d3d5c223020353132203531325c2220746f3d5c223336302035313220353160608201527f325c22206475723d5c223330735c2220726570656174436f756e743d5c22696e60808201526b3232b334b734ba32ae11179f60a11b60a082015260ac0190565b8661218a565b7f3c2f673e3c6d61736b2069643d5c226375745c223e3c7265637420776964746881527f3d5c22313030255c22206865696768743d5c22313030255c222066696c6c3d5c60208201527f2277686974655c222f3e3c636972636c652063783d5c223531325c222063793d60408201527f5c223531325c2220723d5c223531325c222066696c6c3d5c222330323037356460608201527f5c222f3e3c2f6d61736b3e3c7265637420783d5c22305c2220793d5c22305c2260808201527f2077696474683d5c22313032345c22206865696768743d5c22313032345c222060a08201527f6d61736b3d5c2275726c2823637574295c222066696c6c3d5c2277686974655c60c08201526a222f3e3c2f7376673e227d60a81b60e082015260eb0190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612bcc81601d850160208701612de6565b91909101601d0192915050565b680626567696e3d5c22760bc1b81528251600090612bfe816009850160208801612de6565b682d302e626567696e2b60b81b6009918401918201528351612c27816012840160208801612de6565b63039ae11160e51b60129290910191820152601601949350505050565b7f3531322c3531326c302c3020302c305c22206475723d5c220000000000000000815260008351612c7c816018850160208801612de6565b7f735c2220726570656174436f756e743d5c22696e646566696e6974655c2220006018918401918201528351612cb9816037840160208801612de6565b61179f60f11b60379290910191820152603901949350505050565b94855260609390931b6bffffffffffffffffffffffff1916602085015260348401919091526054830152607482015260940190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b8a9083018461215e565b602081526000611470602083018461215e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115612d9757612d97612e7c565b500190565b600082612dab57612dab612e92565b500490565b6000816000190483118215151615612dca57612dca612e7c565b500290565b600082821015612de157612de1612e7c565b500390565b60005b83811015612e01578181015183820152602001612de9565b83811115610b805750506000910152565b600181811c90821680612e2657607f821691505b60208210811415612e4757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e6157612e61612e7c565b5060010190565b600082612e7757612e77612e92565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461140057600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220884717097ea6f3dd98a8431f578279feabc06e75e3a6439e186b80c006ebf8c564736f6c63430008070033
Deployed Bytecode Sourcemap
62641:8237:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32509:615;;;;;;;;;;-1:-1:-1;32509:615:0;;;;;:::i;:::-;;:::i;:::-;;;24516:14:1;;24509:22;24491:41;;24479:2;24464:18;32509:615:0;;;;;;;;38156:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40102:204::-;;;;;;;;;;-1:-1:-1;40102:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;23803:32:1;;;23785:51;;23773:2;23758:18;40102:204:0;23639:203:1;39650:386:0;;;;;;;;;;-1:-1:-1;39650:386:0;;;;;:::i;:::-;;:::i;:::-;;31563:315;;;;;;;;;;-1:-1:-1;31829:12:0;;31616:7;31813:13;:28;31563:315;;;28557:25:1;;;28545:2;28530:18;31563:315:0;28411:177:1;49367:2800:0;;;;;;;;;;-1:-1:-1;49367:2800:0;;;;;:::i;:::-;;:::i;62733:41::-;;;;;;;;;;;;62770:4;62733:41;;69365:65;;;;;;;;;;;;;:::i;40992:185::-;;;;;;;;;;-1:-1:-1;40992:185:0;;;;;:::i;:::-;;:::i;4361:86::-;;;;;;;;;;-1:-1:-1;4432:7:0;;;;4361:86;;37945:144;;;;;;;;;;-1:-1:-1;37945:144:0;;;;;:::i;:::-;;:::i;33188:224::-;;;;;;;;;;-1:-1:-1;33188:224:0;;;;;:::i;:::-;;:::i;2501:103::-;;;;;;;;;;;;;:::i;69298:61::-;;;;;;;;;;;;;:::i;69436:111::-;;;:::i;1850:87::-;;;;;;;;;;-1:-1:-1;1923:6:0;;;;;-1:-1:-1;;;;;1923:6:0;1850:87;;38325:104;;;;;;;;;;;;;:::i;63122:477::-;;;;;;:::i;:::-;;:::i;40378:308::-;;;;;;;;;;-1:-1:-1;40378:308:0;;;;;:::i;:::-;;:::i;41248:399::-;;;;;;;;;;-1:-1:-1;41248:399:0;;;;;:::i;:::-;;:::i;64105:5185::-;;;;;;;;;;-1:-1:-1;64105:5185:0;;;;;:::i;:::-;;:::i;63605:492::-;;;;;;;;;;;;;:::i;40757:164::-;;;;;;;;;;-1:-1:-1;40757:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;40878:25:0;;;40854:4;40878:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40757:164;2759:201;;;;;;;;;;-1:-1:-1;2759:201:0;;;;;:::i;:::-;;:::i;32509:615::-;32594:4;-1:-1:-1;;;;;;;;;32894:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;32971:25:0;;;32894:102;:179;;;-1:-1:-1;;;;;;;;;;33048:25:0;;;32894:179;32874:199;32509:615;-1:-1:-1;;32509:615:0:o;38156:100::-;38210:13;38243:5;38236:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38156:100;:::o;40102:204::-;40170:7;40195:16;40203:7;40195;:16::i;:::-;40190:64;;40220:34;;-1:-1:-1;;;40220:34:0;;;;;;;;;;;40190:64;-1:-1:-1;40274:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;40274:24:0;;40102:204::o;39650:386::-;39723:13;39739:16;39747:7;39739;:16::i;:::-;39723:32;-1:-1:-1;60550:10:0;-1:-1:-1;;;;;39772:28:0;;;39768:175;;39820:44;39837:5;60550:10;40757:164;:::i;39820:44::-;39815:128;;39892:35;;-1:-1:-1;;;39892:35:0;;;;;;;;;;;39815:128;39955:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;39955:29:0;-1:-1:-1;;;;;39955:29:0;;;;;;;;;40000:28;;39955:24;;40000:28;;;;;;;39712:324;39650:386;;:::o;49367:2800::-;49501:27;49531;49550:7;49531:18;:27::i;:::-;49501:57;;49616:4;-1:-1:-1;;;;;49575:45:0;49591:19;-1:-1:-1;;;;;49575:45:0;;49571:86;;49629:28;;-1:-1:-1;;;49629:28:0;;;;;;;;;;;49571:86;49671:27;48097:21;;;47924:15;48139:4;48132:36;48221:4;48205:21;;48311:26;;60550:10;49064:30;;;-1:-1:-1;;;;;48762:26:0;;49043:19;;;49040:55;49850:174;;49937:43;49954:4;60550:10;40757:164;:::i;49937:43::-;49932:92;;49989:35;;-1:-1:-1;;;49989:35:0;;;;;;;;;;;49932:92;-1:-1:-1;;;;;50041:16:0;;50037:52;;50066:23;;-1:-1:-1;;;50066:23:0;;;;;;;;;;;50037:52;50238:15;50235:160;;;50378:1;50357:19;50350:30;50235:160;-1:-1:-1;;;;;50773:24:0;;;;;;;:18;:24;;;;;;50771:26;;-1:-1:-1;;50771:26:0;;;50842:22;;;;;;;;;50840:24;;-1:-1:-1;50840:24:0;;;37844:11;37820:22;37816:40;37803:62;-1:-1:-1;;;37803:62:0;51135:26;;;;:17;:26;;;;;:174;-1:-1:-1;;;51429:46:0;;51425:626;;51533:1;51523:11;;51501:19;51656:30;;;:17;:30;;;;;;51652:384;;51794:13;;51779:11;:28;51775:242;;51941:30;;;;:17;:30;;;;;:52;;;51775:242;51482:569;51425:626;52098:7;52094:2;-1:-1:-1;;;;;52079:27:0;52088:4;-1:-1:-1;;;;;52079:27:0;;;;;;;;;;;49490:2677;;;49367:2800;;;:::o;69365:65::-;1923:6;;-1:-1:-1;;;;;1923:6:0;;;;;60550:10;2070:23;2062:68;;;;-1:-1:-1;;;2062:68:0;;;;;;;:::i;:::-;;;;;;;;;69414:10:::1;:8;:10::i;:::-;69365:65::o:0;40992:185::-;41130:39;41147:4;41153:2;41157:7;41130:39;;;;;;;;;;;;:16;:39::i;:::-;40992:185;;;:::o;37945:144::-;38009:7;38052:27;38071:7;38052:18;:27::i;33188:224::-;33252:7;-1:-1:-1;;;;;33276:19:0;;33272:60;;33304:28;;-1:-1:-1;;;33304:28:0;;;;;;;;;;;33272:60;-1:-1:-1;;;;;;33350:25:0;;;;;:18;:25;;;;;;27743:13;33350:54;;33188:224::o;2501:103::-;1923:6;;-1:-1:-1;;;;;1923:6:0;;;;;60550:10;2070:23;2062:68;;;;-1:-1:-1;;;2062:68:0;;;;;;;:::i;:::-;2566:30:::1;2593:1;2566:18;:30::i;69298:61::-:0;1923:6;;-1:-1:-1;;;;;1923:6:0;;;;;60550:10;2070:23;2062:68;;;;-1:-1:-1;;;2062:68:0;;;;;;;:::i;:::-;69345:8:::1;:6;:8::i;69436:111::-:0;1923:6;;-1:-1:-1;;;;;1923:6:0;;;;;60550:10;2070:23;2062:68;;;;-1:-1:-1;;;2062:68:0;;;;;;;:::i;:::-;1923:6;;69500:41:::1;::::0;1923:6;;;-1:-1:-1;;;;;1923:6:0;69519:21:::1;69500:9;:41::i;38325:104::-:0;38381:13;38414:7;38407:14;;;;;:::i;63122:477::-;63179:20;63202:13;31829:12;;31616:7;31813:13;:28;;31563:315;63202:13;63179:36;;63238:1;63230:5;:9;63222:57;;;;-1:-1:-1;;;63222:57:0;;28256:2:1;63222:57:0;;;28238:21:1;28295:2;28275:18;;;28268:30;28334;28314:18;;;28307:58;28382:18;;63222:57:0;28054:352:1;63222:57:0;63302:1;63294:5;:9;63286:54;;;;-1:-1:-1;;;63286:54:0;;27549:2:1;63286:54:0;;;27531:21:1;27588:2;27568:18;;;27561:30;27627:27;27607:18;;;27600:55;27672:18;;63286:54:0;27347:349:1;63286:54:0;62770:4;63355:20;63370:5;63355:12;:20;:::i;:::-;:34;;63347:97;;;;-1:-1:-1;;;63347:97:0;;26776:2:1;63347:97:0;;;26758:21:1;26815:2;26795:18;;;26788:30;26854:34;26834:18;;;26827:62;-1:-1:-1;;;26905:18:1;;;26898:41;26956:19;;63347:97:0;26574:407:1;63347:97:0;62770:4;63459:12;:26;;63451:67;;;;-1:-1:-1;;;63451:67:0;;26426:2:1;63451:67:0;;;26408:21:1;26465:2;26445:18;;;26438:30;-1:-1:-1;;;26484:18:1;;;26477:51;26545:18;;63451:67:0;26224:345:1;63451:67:0;63525:33;63538:5;63545:12;63525;:33::i;:::-;63565:28;63575:10;63587:5;63565:9;:28::i;:::-;63172:427;63122:477;:::o;40378:308::-;-1:-1:-1;;;;;40477:31:0;;60550:10;40477:31;40473:61;;;40517:17;;-1:-1:-1;;;40517:17:0;;;;;;;;;;;40473:61;60550:10;40547:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;40547:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;40547:60:0;;;;;;;;;;40623:55;;24491:41:1;;;40547:49:0;;60550:10;40623:55;;24464:18:1;40623:55:0;;;;;;;40378:308;;:::o;41248:399::-;41415:31;41428:4;41434:2;41438:7;41415:12;:31::i;:::-;-1:-1:-1;;;;;41461:14:0;;;:19;41457:183;;41500:56;41531:4;41537:2;41541:7;41550:5;41500:30;:56::i;:::-;41495:145;;41584:40;;-1:-1:-1;;;41584:40:0;;;;;;;;;;;41495:145;41248:399;;;;:::o;64105:5185::-;64217:13;64265;31829:12;;31616:7;31813:13;:28;;31563:315;64265:13;64255:7;:23;64247:60;;;;-1:-1:-1;;;64247:60:0;;27903:2:1;64247:60:0;;;27885:21:1;27942:2;27922:18;;;27915:30;27981:26;27961:18;;;27954:54;28025:18;;64247:60:0;27701:348:1;64247:60:0;64316:17;64342;64368:22;;:::i;:::-;64517:14;;;64529:1;64517:14;;;;;;;;;64399:18;;;;;;;;64517:14;;;;;;;;;;;;;;;;;;;;;64491:40;;64560:1;64547:14;;64542:3369;64576:21;;;;:12;:21;;;;;:32;;;64563:45;;64542:3369;;;64647:21;;;;:12;:21;;;;;;;;:40;;;;;;;;;;64635:52;;;;;;;;;;;;64647:40;64635:52;;64647:40;64635:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64725:1;64713:13;;64708:3194;64740:9;:23;;;64728:9;:35;64708:3194;;;64866:21;:10;:19;:21::i;:::-;64920:20;:9;:18;:20::i;:::-;64805:169;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64791:8;64800:1;64791:11;;;;;;;;:::i;:::-;;;;;;:183;;;;65065:21;:10;:19;:21::i;:::-;65119:20;:9;:18;:20::i;:::-;65001:222;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64987:8;64996:1;64987:11;;;;;;;;:::i;:::-;;;;;;;;;;:236;65281:16;;:30;;:16;:19;;;;;:28;:30::i;:::-;65344:16;;:30;;65361:1;65344:19;;:30;65407:16;;:30;;65424:1;65407:19;;:30;65471:16;;:30;;65488:1;65471:19;;:30;65250:282;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65236:8;65245:1;65236:11;;;;;;;;:::i;:::-;;;;;;;;;;:296;65590:16;;:30;;65607:1;65590:19;;:30;65653:16;;:30;;65670:1;65653:19;;:30;65717:16;;:30;;65734:1;65717:19;;:30;65780:16;;:30;;65797:1;65780:19;;:30;65559:282;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65545:8;65554:1;65545:11;;;;;;;;:::i;:::-;;;;;;;;;;:296;65899:16;;:30;;65916:1;65899:19;;:30;65963:16;;:30;;65980:1;65963:19;;:30;66026:16;;:30;;66043:1;66026:19;;:30;66089:16;;:30;;66106:1;66089:19;;:30;65868:283;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65854:8;65863:1;65854:11;;;;;;;;:::i;:::-;;;;;;:297;;;;66252:29;:9;:18;;;:27;:29::i;:::-;66360:1;66348:9;:13;:152;;;;;;;;;;;;;;;;;66416:21;:10;:19;:21::i;:::-;66450:20;:9;:18;:20::i;:::-;66386:93;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66348:152;66178:369;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66164:8;66173:1;66164:11;;;;;;;;:::i;:::-;;;;;;:383;;;;66694:29;:9;:18;;;:27;:29::i;:::-;66799:21;:10;:19;:21::i;:::-;66873:1;66861:9;:13;:105;;;;;;;;;;;;;;;;;66920:20;:9;:18;:20::i;:::-;66899:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;66861:105;66574:450;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66560:8;66569:1;66560:11;;;;;;;;:::i;:::-;;;;;;:464;;;;67075:4;67094:8;67103:1;67094:11;;;;;;;;:::i;:::-;;;;;;;67120:8;67129:1;67120:11;;;;;;;;:::i;:::-;;;;;;;67146:8;67155:1;67146:11;;;;;;;;:::i;:::-;;;;;;;67172:8;67181:1;67172:11;;;;;;;;:::i;:::-;;;;;;;67198:8;67207:1;67198:11;;;;;;;;:::i;:::-;;;;;;;67224:8;67233:1;67224:11;;;;;;;;:::i;:::-;;;;;;;67250:8;67259:1;67250:11;;;;;;;;:::i;:::-;;;;;;;67044:230;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67037:237;;67307:1;67294:14;;67289:602;67323:9;:24;;;67310:10;:37;67289:602;;;67459:21;:10;:19;:21::i;:::-;67517:20;:9;:18;:20::i;:::-;67597:111;67643:12;67654:1;67643:10;:12;:::i;:::-;:15;:52;;67694:1;67643:52;;;67665:24;;;;:26;;67690:1;67665:26;:::i;:::-;67660:32;;:3;:32;:::i;:::-;67614:24;;;;67610:28;;:3;:28;:::i;:::-;67598:41;;:10;:41;:::i;:::-;:98;;;;:::i;:::-;67597:109;:111::i;:::-;67392:383;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67378:8;67387:1;67378:11;;;;;;;;:::i;:::-;;;;;;:397;;;;67830:4;67851:8;67860:1;67851:11;;;;;;;;:::i;:::-;;;;;;;67797:80;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67790:87;;67349:12;;;;;:::i;:::-;;;;67289:602;;;64765:11;;;;:::i;:::-;;;;64708:3194;;;64610:12;;;;:::i;:::-;;;;64542:3369;;;68018:1244;68182:18;:7;:16;:18::i;:::-;68699:4;68929;68068:1166;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68018:13;:1244::i;:::-;67945:1328;;;;;;;;:::i;:::-;;;;;;;;;;;;;67921:1361;;;;;;;;;64105:5185;;;:::o;63605:492::-;63664:13;63791:278;63841:200;;;;;;13004:66:1;12992:79;;13101:66;13096:2;13087:12;;13080:88;13198:66;13193:2;13184:12;;13177:88;13295:66;13290:2;13281:12;;13274:88;-1:-1:-1;;;13387:3:1;13378:13;;13371:63;13459:3;13450:13;;12790:679;63791:278:0;63718:362;;;;;;;;:::i;:::-;;;;;;;;;;;;;63694:395;;63605:492;:::o;2759:201::-;1923:6;;-1:-1:-1;;;;;1923:6:0;;;;;60550:10;2070:23;2062:68;;;;-1:-1:-1;;;2062:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2848:22:0;::::1;2840:73;;;::::0;-1:-1:-1;;;2840:73:0;;25329:2:1;2840:73:0::1;::::0;::::1;25311:21:1::0;25368:2;25348:18;;;25341:30;25407:34;25387:18;;;25380:62;-1:-1:-1;;;25458:18:1;;;25451:36;25504:19;;2840:73:0::1;25127:402:1::0;2840:73:0::1;2924:28;2943:8;2924:18;:28::i;:::-;2759:201:::0;:::o;41902:273::-;41959:4;42049:13;;42039:7;:23;41996:152;;;;-1:-1:-1;;42100:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;42100:43:0;:48;;41902:273::o;34862:1129::-;34929:7;34964;35066:13;;35059:4;:20;35055:869;;;35104:14;35121:23;;;:17;:23;;;;;;-1:-1:-1;;;35210:23:0;;35206:699;;35729:113;35736:11;35729:113;;-1:-1:-1;;;35807:6:0;35789:25;;;;:17;:25;;;;;;35729:113;;;35875:6;34862:1129;-1:-1:-1;;;34862:1129:0:o;35206:699::-;35081:843;35055:869;35952:31;;-1:-1:-1;;;35952:31:0;;;;;;;;;;;5420:120;4432:7;;;;4956:41;;;;-1:-1:-1;;;4956:41:0;;24980:2:1;4956:41:0;;;24962:21:1;25019:2;24999:18;;;24992:30;-1:-1:-1;;;25038:18:1;;;25031:50;25098:18;;4956:41:0;24778:344:1;4956:41:0;5479:7:::1;:15:::0;;-1:-1:-1;;5479:15:0::1;::::0;;5510:22:::1;60550:10:::0;5519:12:::1;5510:22;::::0;-1:-1:-1;;;;;23803:32:1;;;23785:51;;23773:2;23758:18;5510:22:0::1;;;;;;;5420:120::o:0;3120:191::-;3213:6;;;-1:-1:-1;;;;;3230:17:0;;;3213:6;3230:17;;;-1:-1:-1;;;;;;3230:17:0;;;;;;3263:40;;3213:6;;;;;;;;3263:40;;3194:16;;3263:40;3183:128;3120:191;:::o;5161:118::-;4432:7;;;;4686:9;4678:38;;;;-1:-1:-1;;;4678:38:0;;26081:2:1;4678:38:0;;;26063:21:1;26120:2;26100:18;;;26093:30;-1:-1:-1;;;26139:18:1;;;26132:46;26195:18;;4678:38:0;25879:340:1;4678:38:0;5221:7:::1;:14:::0;;-1:-1:-1;;5221:14:0::1;5231:4;5221:14;::::0;;5251:20:::1;5258:12;60550:10:::0;;60463:105;69553:173;69626:12;69644:8;-1:-1:-1;;;;;69644:13:0;69665:7;69644:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69625:52;;;69692:7;69684:36;;;;-1:-1:-1;;;69684:36:0;;25736:2:1;69684:36:0;;;25718:21:1;25775:2;25755:18;;;25748:30;-1:-1:-1;;;25794:18:1;;;25787:46;25850:18;;69684:36:0;25534:340:1;69732:1143:0;69832:1;69840:29;;:::i;:::-;69876:30;;:::i;:::-;69913:18;;69940:930;69964:9;69960:1;:13;69940:930;;;69992:19;70014:12;70025:1;70014:8;:12;:::i;:::-;70035:27;70065:25;;;:12;:25;;;;;70099:19;;;:31;;;69992:34;;-1:-1:-1;70141:722:0;70162:9;70158:1;:13;70141:722;;;70193:9;70189:257;70211:1;70207;:5;70189:257;;;70279:15;70296:10;70308:11;70321:1;70324;70262:64;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;70262:64:0;;;;;;;;;70252:75;;70262:64;70252:75;;;;;-1:-1:-1;70358:14:0;70371:1;70252:75;70358:14;:::i;:::-;70341:8;70350:1;70341:11;;;;;;;:::i;:::-;;;;;70353:1;70341:14;;;;;;;:::i;:::-;;;;:31;70406:1;70389:8;70398:1;70389:11;;;;;;;:::i;:::-;;;;;70401:1;70389:14;;;;;;;:::i;:::-;;;;;:18;;;;:::i;:::-;:23;70385:48;;70432:1;70414:8;70423:1;70414:11;;;;;;;:::i;:::-;;;;;70426:1;70414:14;;;;;;;:::i;:::-;;;;:19;;;;;;;:::i;:::-;;;-1:-1:-1;70385:48:0;70214:3;;;;:::i;:::-;;;;70189:257;;;;70460:9;70456:198;70478:1;70474;:5;70456:198;;;70546:15;70563:10;70575:11;70588:1;70591;70529:64;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;70529:64:0;;;;;;;;;70519:75;;70529:64;70519:75;;;;;-1:-1:-1;70626:16:0;70639:3;70519:75;70626:16;:::i;:::-;70608:9;70618:1;70608:12;;;;;;;:::i;:::-;;;;;70621:1;70608:15;;;;;;;:::i;:::-;;;;:34;70481:3;;;;:::i;:::-;;;;70456:198;;;;70685:168;;;;;;;;70712:9;70722:1;70712:12;;;;;;;:::i;:::-;;;;;70685:168;;;;70747:8;70756:1;70747:11;;;;;;;:::i;:::-;;;;;:14;:18;;70764:1;70747:18;:::i;:::-;70685:168;;;;70840:1;70685:168;;;;70794:8;70803:1;70794:11;;;;;;;:::i;:::-;;;;;70806:1;70794:14;;;;:18;;70811:1;70794:18;:::i;:::-;70685:168;;70664:15;:18;;;;;;;;;;:189;;;;:18;;:189;;:::i;:::-;-1:-1:-1;70664:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;70173:3;;;;:::i;:::-;;;;70141:722;;;;69983:887;;69980:1;69975:6;;;;;:::i;:::-;;;69940:930;;;;69805:1070;;;;69732:1143;;:::o;42259:104::-;42328:27;42338:2;42342:8;42328:27;;;;;;;;;;;;:9;:27::i;56118:716::-;56302:88;;-1:-1:-1;;;56302:88:0;;56281:4;;-1:-1:-1;;;;;56302:45:0;;;;;:88;;60550:10;;56369:4;;56375:7;;56384:5;;56302:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56302:88:0;;;;;;;;-1:-1:-1;;56302:88:0;;;;;;;;;;;;:::i;:::-;;;56298:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56585:13:0;;56581:235;;56631:40;;-1:-1:-1;;;56631:40:0;;;;;;;;;;;56581:235;56774:6;56768:13;56759:6;56755:2;56751:15;56744:38;56298:529;-1:-1:-1;;;;;;56461:64:0;-1:-1:-1;;;56461:64:0;;-1:-1:-1;56298:529:0;56118:716;;;;;;:::o;12779:723::-;12835:13;13056:10;13052:53;;-1:-1:-1;;13083:10:0;;;;;;;;;;;;-1:-1:-1;;;13083:10:0;;;;;12779:723::o;13052:53::-;13130:5;13115:12;13171:78;13178:9;;13171:78;;13204:8;;;;:::i;:::-;;-1:-1:-1;13227:10:0;;-1:-1:-1;13235:2:0;13227:10;;:::i;:::-;;;13171:78;;;13259:19;13291:6;13281:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13281:17:0;;13259:39;;13309:154;13316:10;;13309:154;;13343:11;13353:1;13343:11;;:::i;:::-;;-1:-1:-1;13412:10:0;13420:2;13412:5;:10;:::i;:::-;13399:24;;:2;:24;:::i;:::-;13386:39;;13369:6;13376;13369:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;13369:56:0;;;;;;;;-1:-1:-1;13440:11:0;13449:2;13440:11;;:::i;:::-;;;13309:154;;15002:3053;15060:13;15297:4;:11;15312:1;15297:16;15293:31;;;-1:-1:-1;;15315:9:0;;;;;;;;;-1:-1:-1;15315:9:0;;;15002:3053::o;15293:31::-;15377:19;15399:6;;;;;;;;;;;;;;;;;15377:28;;15816:20;15875:1;15856:4;:11;15870:1;15856:15;;;;:::i;:::-;15855:21;;;;:::i;:::-;15850:27;;:1;:27;:::i;:::-;15839:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15839:39:0;;15816:62;;16014:1;16007:5;16003:13;16118:2;16110:6;16106:15;16229:4;16281;16275:11;16269:4;16265:22;16191:1432;16315:6;16306:7;16303:19;16191:1432;;;16421:1;16412:7;16408:15;16397:26;;16460:7;16454:14;17113:4;17105:5;17101:2;17097:14;17093:25;17083:8;17079:40;17073:47;17062:9;17054:67;17167:1;17156:9;17152:17;17139:30;;17259:4;17251:5;17247:2;17243:14;17239:25;17229:8;17225:40;17219:47;17208:9;17200:67;17313:1;17302:9;17298:17;17285:30;;17404:4;17396:5;17393:1;17389:13;17385:24;17375:8;17371:39;17365:46;17354:9;17346:66;17458:1;17447:9;17443:17;17430:30;;17541:4;17534:5;17530:16;17520:8;17516:31;17510:38;17499:9;17491:58;;17595:1;17584:9;17580:17;17567:30;;16191:1432;;;16195:107;;17785:1;17778:4;17772:11;17768:19;17806:1;17801:123;;;;17943:1;17938:73;;;;17761:250;;17801:123;17854:4;17850:1;17839:9;17835:17;17827:32;17904:4;17900:1;17889:9;17885:17;17877:32;17801:123;;17938:73;17991:4;17987:1;17976:9;17972:17;17964:32;17761:250;-1:-1:-1;18041:6:0;;15002:3053;-1:-1:-1;;;;;15002:3053:0:o;42779:681::-;42902:19;42908:2;42912:8;42902:5;:19::i;:::-;-1:-1:-1;;;;;42963:14:0;;;:19;42959:483;;43003:11;43017:13;43065:14;;;43098:233;43129:62;43168:1;43172:2;43176:7;;;;;;43185:5;43129:30;:62::i;:::-;43124:167;;43227:40;;-1:-1:-1;;;43227:40:0;;;;;;;;;;;43124:167;43326:3;43318:5;:11;43098:233;;43413:3;43396:13;;:20;43392:34;;43418:8;;;43392:34;42984:458;;42779:681;;;:::o;43733:1529::-;43798:20;43821:13;-1:-1:-1;;;;;43849:16:0;;43845:48;;43874:19;;-1:-1:-1;;;43874:19:0;;;;;;;;;;;43845:48;43908:13;43904:44;;43930:18;;-1:-1:-1;;;43930:18:0;;;;;;;;;;;43904:44;-1:-1:-1;;;;;44436:22:0;;;;;;:18;:22;;27880:2;44436:22;;:70;;44474:31;44462:44;;44436:70;;;37844:11;37820:22;37816:40;-1:-1:-1;39554:15:0;;39529:23;39525:45;37813:51;37803:62;44749:31;;;;:17;:31;;;;;:173;44767:12;44998:23;;;45036:101;45063:35;;45088:9;;;;;-1:-1:-1;;;;;45063:35:0;;;45080:1;;45063:35;;45080:1;;45063:35;45132:3;45122:7;:13;45036:101;;45153:13;:19;-1:-1:-1;40992:185:0;;;:::o;-1:-1:-1:-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:60;;2437:1;2434;2427:12;2381:60;2460:5;2450:15;;;2124:347;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2476:254:1:o;2735:245::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:52;;;2862:1;2859;2852:12;2814:52;2901:9;2888:23;2920:30;2944:5;2920:30;:::i;2985:249::-;3054:6;3107:2;3095:9;3086:7;3082:23;3078:32;3075:52;;;3123:1;3120;3113:12;3075:52;3155:9;3149:16;3174:30;3198:5;3174:30;:::i;3239:180::-;3298:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;-1:-1:-1;3390:23:1;;3239:180;-1:-1:-1;3239:180:1:o;3424:268::-;3476:3;3514:5;3508:12;3541:6;3536:3;3529:19;3557:63;3613:6;3606:4;3601:3;3597:14;3590:4;3583:5;3579:16;3557:63;:::i;:::-;3674:2;3653:15;-1:-1:-1;;3649:29:1;3640:39;;;;3681:4;3636:50;;3424:268;-1:-1:-1;;3424:268:1:o;3697:184::-;3738:3;3776:5;3770:12;3791:52;3836:6;3831:3;3824:4;3817:5;3813:16;3791:52;:::i;:::-;3859:16;;;;;3697:184;-1:-1:-1;;3697:184:1:o;5330:466::-;5505:3;5543:6;5537:13;5559:53;5605:6;5600:3;5593:4;5585:6;5581:17;5559:53;:::i;:::-;5675:13;;5634:16;;;;5697:57;5675:13;5634:16;5731:4;5719:17;;5697:57;:::i;:::-;5770:20;;5330:466;-1:-1:-1;;;;5330:466:1:o;5801:1625::-;6252:3;6290:6;6284:13;6316:4;6329:51;6373:6;6368:3;6363:2;6355:6;6351:15;6329:51;:::i;:::-;6443:13;;6402:16;;;;6465:55;6443:13;6402:16;6487:15;;;6465:55;:::i;:::-;6587:13;;6542:20;;;6609:55;6587:13;6542:20;6631:15;;;6609:55;:::i;:::-;6731:13;;6686:20;;;6753:55;6731:13;6686:20;6775:15;;;6753:55;:::i;:::-;6875:13;;6830:20;;;6897:55;6875:13;6830:20;6919:15;;;6897:55;:::i;:::-;7019:13;;6974:20;;;7041:55;7019:13;6974:20;7063:15;;;7041:55;:::i;:::-;7163:13;;7118:20;;;7185:55;7163:13;7118:20;7207:15;;;7185:55;:::i;:::-;7307:13;;7262:20;;;7329:55;7307:13;7262:20;7351:15;;;7329:55;:::i;:::-;7400:20;;;;;5801:1625;-1:-1:-1;;;;;;;;;;;5801:1625:1:o;7431:1441::-;8110:3;8148:6;8142:13;8164:53;8210:6;8205:3;8198:4;8190:6;8186:17;8164:53;:::i;:::-;8248:6;8243:3;8239:16;8226:29;;-1:-1:-1;;;8300:2:1;8293:5;8286:17;8334:6;8328:13;8350:65;8406:8;8402:1;8395:5;8391:13;8384:4;8376:6;8372:17;8350:65;:::i;:::-;-1:-1:-1;;;8478:1:1;8434:20;;;;8470:10;;;8463:24;8512:13;;8534:62;8512:13;8583:1;8575:10;;8568:4;8556:17;;8534:62;:::i;:::-;8656:1;8615:17;;8648:10;;;8641:22;8688:13;;8710:62;8688:13;8759:1;8751:10;;8744:4;8732:17;;8710:62;:::i;:::-;-1:-1:-1;;;8832:1:1;8791:17;;;;8824:10;;;8817:23;8864:1;8856:10;;7431:1441;-1:-1:-1;;;;;;7431:1441:1:o;8877:1421::-;9556:3;9594:6;9588:13;9610:53;9656:6;9651:3;9644:4;9636:6;9632:17;9610:53;:::i;:::-;-1:-1:-1;;;9685:16:1;;;9710:18;;;9753:13;;9775:65;9753:13;9827:1;9816:13;;9809:4;9797:17;;9775:65;:::i;:::-;-1:-1:-1;;;9903:1:1;9859:20;;;;9895:10;;;9888:23;9936:13;;9958:62;9936:13;10007:1;9999:10;;9992:4;9980:17;;9958:62;:::i;:::-;-1:-1:-1;;;10080:1:1;10039:17;;;;10072:10;;;10065:24;10114:13;;10136:62;10114:13;10185:1;10177:10;;10170:4;10158:17;;10136:62;:::i;:::-;-1:-1:-1;;;10258:1:1;10217:17;;;;10250:10;;;10243:23;10290:1;10282:10;;8877:1421;-1:-1:-1;;;;;;8877:1421:1:o;10303:1422::-;10982:3;11020:6;11014:13;11036:53;11082:6;11077:3;11070:4;11062:6;11058:17;11036:53;:::i;:::-;-1:-1:-1;;;11111:16:1;;;11136:19;;;11180:13;;11202:65;11180:13;11254:1;11243:13;;11236:4;11224:17;;11202:65;:::i;:::-;-1:-1:-1;;;11330:1:1;11286:20;;;;11322:10;;;11315:23;11363:13;;11385:62;11363:13;11434:1;11426:10;;11419:4;11407:17;;11385:62;:::i;:::-;-1:-1:-1;;;11507:1:1;11466:17;;;;11499:10;;;11492:23;11540:13;;11562:62;11540:13;11611:1;11603:10;;11596:4;11584:17;;11562:62;:::i;:::-;-1:-1:-1;;;11684:1:1;11643:17;;;;11676:10;;;11669:24;11717:1;11709:10;;10303:1422;-1:-1:-1;;;;;;10303:1422:1:o;11730:1055::-;-1:-1:-1;;;12230:55:1;;12308:13;;12212:3;;12330:62;12308:13;12380:2;12371:12;;12364:4;12352:17;;12330:62;:::i;:::-;-1:-1:-1;;;12451:2:1;12411:16;;;12443:11;;;12436:24;12485:13;;12507:63;12485:13;12556:2;12548:11;;12541:4;12529:17;;12507:63;:::i;:::-;12635:66;12630:2;12589:17;;;;12622:11;;;12615:87;-1:-1:-1;;;12726:2:1;12718:11;;12711:41;12776:2;12768:11;;11730:1055;-1:-1:-1;;;;11730:1055:1:o;13474:950::-;-1:-1:-1;;;13974:49:1;;14046:13;;13956:3;;14068:62;14046:13;14118:2;14109:12;;14102:4;14090:17;;14068:62;:::i;:::-;-1:-1:-1;;;14189:2:1;14149:16;;;14181:11;;;14174:24;14223:13;;14245:63;14223:13;14294:2;14286:11;;14279:4;14267:17;;14245:63;:::i;:::-;-1:-1:-1;;;14368:2:1;14327:17;;;;14360:11;;;14353:38;14415:2;14407:11;;13474:950;-1:-1:-1;;;;13474:950:1:o;14429:1383::-;-1:-1:-1;;;15078:53:1;;15154:13;;15060:3;;15176:62;15154:13;15226:2;15217:12;;15210:4;15198:17;;15176:62;:::i;:::-;-1:-1:-1;;;15297:2:1;15257:16;;;15289:11;;;15282:24;15331:13;;15353:63;15331:13;15402:2;15394:11;;15387:4;15375:17;;15353:63;:::i;:::-;-1:-1:-1;;;15476:2:1;15435:17;;;;15468:11;;;15461:76;15562:13;;15584:63;15562:13;15633:2;15625:11;;15618:4;15606:17;;15584:63;:::i;:::-;15712:66;15707:2;15666:17;;;;15699:11;;;15692:87;15803:2;15795:11;;14429:1383;-1:-1:-1;;;;;14429:1383:1:o;15817:1599::-;16478:66;16473:3;16466:79;16575:66;16570:2;16565:3;16561:12;16554:88;16681:7;16676:3;16672:17;16667:2;16662:3;16658:12;16651:39;16448:3;16719:6;16713:13;16735:60;16788:6;16783:2;16778:3;16774:12;16769:2;16761:6;16757:15;16735:60;:::i;:::-;16859:66;16854:2;16814:16;;;16846:11;;;16839:87;-1:-1:-1;;;16950:2:1;16942:11;;16935:49;17009:13;;17031:62;17009:13;17078:3;17070:12;;17065:2;17053:15;;17031:62;:::i;:::-;-1:-1:-1;;;17153:3:1;17112:17;;;;17145:12;;;17138:32;17195:13;;17217:62;17195:13;17264:3;17256:12;;17251:2;17239:15;;17217:62;:::i;:::-;-1:-1:-1;;;17339:3:1;17298:17;;;;17331:12;;;17324:58;17406:3;17398:12;;15817:1599;-1:-1:-1;;;;;15817:1599:1:o;17421:572::-;-1:-1:-1;;;17779:3:1;17772:16;17754:3;17817:6;17811:13;17833:61;17887:6;17883:1;17878:3;17874:11;17867:4;17859:6;17855:17;17833:61;:::i;:::-;-1:-1:-1;;;17953:1:1;17913:16;;;;17945:10;;;17938:23;-1:-1:-1;17985:1:1;17977:10;;17421:572;-1:-1:-1;17421:572:1:o;17998:2484::-;18756:66;18751:3;18744:79;18853:66;18848:2;18843:3;18839:12;18832:88;18726:3;18949:6;18943:13;18965:60;19018:6;19013:2;19008:3;19004:12;18999:2;18991:6;18987:15;18965:60;:::i;:::-;19089:66;19084:2;19044:16;;;19076:11;;;19069:87;19185:66;19180:2;19172:11;;19165:87;19282:66;19276:3;19268:12;;19261:88;19379:66;19373:3;19365:12;;19358:88;-1:-1:-1;;;19470:3:1;19462:12;;19455:66;19551;19545:3;19537:12;;19530:88;19648:66;19642:3;19634:12;;19627:88;19745:66;19739:3;19731:12;;19724:88;19842:66;19836:3;19828:12;;19821:88;19939:66;19933:3;19925:12;;19918:88;20036:66;20030:3;20022:12;;20015:88;20133:66;20127:3;20119:12;;20112:88;20230:66;20224:3;20216:12;;20209:88;-1:-1:-1;;;20321:3:1;20313:12;;20306:28;20350:126;20380:95;20405:69;20435:38;20468:3;20460:12;;20452:6;20435:38;:::i;:::-;3963:66;3951:79;;4060:34;4055:2;4046:12;;4039:56;4125:66;4120:2;4111:12;;4104:88;4222:66;4217:2;4208:12;;4201:88;4320:66;4314:3;4305:13;;4298:89;-1:-1:-1;;;4412:3:1;4403:13;;4396:59;4480:3;4471:13;;3886:604;20405:69;20397:6;20380:95;:::i;:::-;4572:66;4560:79;;4669:66;4664:2;4655:12;;4648:88;4766:66;4761:2;4752:12;;4745:88;4863:66;4858:2;4849:12;;4842:88;4961:66;4955:3;4946:13;;4939:89;5059:66;5053:3;5044:13;;5037:89;5157:66;5151:3;5142:13;;5135:89;-1:-1:-1;;;5249:3:1;5240:13;;5233:57;5315:3;5306:13;;4495:830;20350:126;20343:133;17998:2484;-1:-1:-1;;;;;;17998:2484:1:o;20487:448::-;20749:31;20744:3;20737:44;20719:3;20810:6;20804:13;20826:62;20881:6;20876:2;20871:3;20867:12;20860:4;20852:6;20848:17;20826:62;:::i;:::-;20908:16;;;;20926:2;20904:25;;20487:448;-1:-1:-1;;20487:448:1:o;21150:953::-;-1:-1:-1;;;21650:43:1;;21716:13;;21632:3;;21738:61;21716:13;21788:1;21779:11;;21772:4;21760:17;;21738:61;:::i;:::-;-1:-1:-1;;;21858:1:1;21818:16;;;21850:10;;;21843:31;21899:13;;21921:63;21899:13;21970:2;21962:11;;21955:4;21943:17;;21921:63;:::i;:::-;-1:-1:-1;;;22044:2:1;22003:17;;;;22036:11;;;22029:41;22094:2;22086:11;;21150:953;-1:-1:-1;;;;21150:953:1:o;22108:1030::-;22620:66;22615:3;22608:79;22590:3;22716:6;22710:13;22732:62;22787:6;22782:2;22777:3;22773:12;22766:4;22758:6;22754:17;22732:62;:::i;:::-;22858:66;22853:2;22813:16;;;22845:11;;;22838:87;22950:13;;22972:63;22950:13;23021:2;23013:11;;23006:4;22994:17;;22972:63;:::i;:::-;-1:-1:-1;;;23095:2:1;23054:17;;;;23087:11;;;23080:25;23129:2;23121:11;;22108:1030;-1:-1:-1;;;;22108:1030:1:o;23143:491::-;23384:19;;;23441:2;23437:15;;;;-1:-1:-1;;23433:53:1;23428:2;23419:12;;23412:75;23512:2;23503:12;;23496:28;;;;23549:2;23540:12;;23533:28;23586:3;23577:13;;23570:29;23624:3;23615:13;;23143:491::o;23847:499::-;-1:-1:-1;;;;;24116:15:1;;;24098:34;;24168:15;;24163:2;24148:18;;24141:43;24215:2;24200:18;;24193:34;;;24263:3;24258:2;24243:18;;24236:31;;;24041:4;;24284:56;;24320:19;;24312:6;24284:56;:::i;24543:230::-;24692:2;24681:9;24674:21;24655:4;24712:55;24763:2;24752:9;24748:18;24740:6;24712:55;:::i;26986:356::-;27188:2;27170:21;;;27207:18;;;27200:30;27266:34;27261:2;27246:18;;27239:62;27333:2;27318:18;;26986:356::o;28593:128::-;28633:3;28664:1;28660:6;28657:1;28654:13;28651:39;;;28670:18;;:::i;:::-;-1:-1:-1;28706:9:1;;28593:128::o;28726:120::-;28766:1;28792;28782:35;;28797:18;;:::i;:::-;-1:-1:-1;28831:9:1;;28726:120::o;28851:168::-;28891:7;28957:1;28953;28949:6;28945:14;28942:1;28939:21;28934:1;28927:9;28920:17;28916:45;28913:71;;;28964:18;;:::i;:::-;-1:-1:-1;29004:9:1;;28851:168::o;29024:125::-;29064:4;29092:1;29089;29086:8;29083:34;;;29097:18;;:::i;:::-;-1:-1:-1;29134:9:1;;29024:125::o;29154:258::-;29226:1;29236:113;29250:6;29247:1;29244:13;29236:113;;;29326:11;;;29320:18;29307:11;;;29300:39;29272:2;29265:10;29236:113;;;29367:6;29364:1;29361:13;29358:48;;;-1:-1:-1;;29402:1:1;29384:16;;29377:27;29154:258::o;29417:380::-;29496:1;29492:12;;;;29539;;;29560:61;;29614:4;29606:6;29602:17;29592:27;;29560:61;29667:2;29659:6;29656:14;29636:18;29633:38;29630:161;;;29713:10;29708:3;29704:20;29701:1;29694:31;29748:4;29745:1;29738:15;29776:4;29773:1;29766:15;29630:161;;29417:380;;;:::o;29802:135::-;29841:3;-1:-1:-1;;29862:17:1;;29859:43;;;29882:18;;:::i;:::-;-1:-1:-1;29929:1:1;29918:13;;29802:135::o;29942:112::-;29974:1;30000;29990:35;;30005:18;;:::i;:::-;-1:-1:-1;30039:9:1;;29942:112::o;30059:127::-;30120:10;30115:3;30111:20;30108:1;30101:31;30151:4;30148:1;30141:15;30175:4;30172:1;30165:15;30191:127;30252:10;30247:3;30243:20;30240:1;30233:31;30283:4;30280:1;30273:15;30307:4;30304:1;30297:15;30323:127;30384:10;30379:3;30375:20;30372:1;30365:31;30415:4;30412:1;30405:15;30439:4;30436:1;30429:15;30455:127;30516:10;30511:3;30507:20;30504:1;30497:31;30547:4;30544:1;30537:15;30571:4;30568:1;30561:15;30587:131;-1:-1:-1;;;;;;30661:32:1;;30651:43;;30641:71;;30708:1;30705;30698:12
Swarm Source
ipfs://884717097ea6f3dd98a8431f578279feabc06e75e3a6439e186b80c006ebf8c5
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.