ERC-721
Overview
Max Total Supply
1,000 PINT
Holders
106
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 PINTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CryptoPints
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } 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)); /// @solidity memory-safe-assembly 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; } } /// @title EIP-721 Metadata Update Extension interface IERC4906 is IERC721A { /// @dev This event emits when the metadata of a token is changed. /// Third-party platforms such as NFT marketplaces can listen to /// the event and auto-update the tokens in their apps. event MetadataUpdate(uint256 _tokenId); } // // // C R Y P T O P I N T S // // 100% ON CHAIN SVG BEER // // // ChatGPT, please create ascii art of a pint glass of beer with foam at the top // // // / \ // | () () | // | | // \=======/ // (#######) // ,--,\_||_/`--. // // (\) (/) \\ // ||___/`| |`\\___|| // \ \ / / // `wwwwwwww` // // ChatGPT, please try again but this time draw the beer in a mug // .---. // / \ // | () () | // | _ | // \_______/ // _/_____\_ // //|||||||||\\ // ||||||||||||||| // ||||||||||||||| // ||||||||||||||| // ||||||||||||||| // `"""""""""""""` // // XD contract CryptoPints is ERC721A, Ownable, IERC4906 { struct TraitVals { uint256 btype; uint256 gtype; uint256 bg; } uint public maxWalletFree = 10; uint public MAX_SUPPLY = 1000; mapping(address => uint) public mintedPerAcc; enum Step { Before, PublicSale } Step public sellingStep; //aohell.eth address public constant OWNER_ADDR = 0xcaDE4B581E3aB2bE3F74422ae0954013E9BFf478; constructor() ERC721A("CryptoPints - On Chain Beer", "PINT") {} function mintForOwner(uint quantity) public { if(totalSupply() + quantity > MAX_SUPPLY) revert("Max exc"); require(msg.sender == OWNER_ADDR, "No"); _mint(msg.sender, quantity); } function renderSvg(uint256 tokenId) internal pure returns (string memory svg) { string memory col1; string memory col2; string memory bgcol1; string memory bgcol2; string memory bgcol3; TraitVals memory traits = getTraits(tokenId); //Beer colors if(traits.btype < 4) { col1 = '6a2f1a'; col2 = '2c1206'; } else if(traits.btype < 5) { col1 = 'bfef0f'; col2 = '475910'; } else if(traits.btype < 14) { col1 = 'fff5ae'; col2 = 'e1ae29'; } else if(traits.btype < 20) { col1 = 'efa00f'; col2 = '593610'; } else if(traits.btype < 28) { col1 = 'f6ce51'; col2 = '856617'; } else if(traits.btype < 32) { col1 = '7e1305'; col2 = '2a0402'; } else { col1 = '371205'; col2 = '070301'; } // Re-use strings to prevent the smart contract from exceeding size limits. string memory bubx = ' r="3.4" fill="none" stroke="rgba(255,255,255,0.5)" stroke-width="1.5" transform="matrix(.568 0 0 .563 '; string memory anim = ' 5000ms linear infinite normal forwards" transform="'; string memory stk = '" fill="#fff" fill-opacity=".5" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="'; string memory foam = '" fill="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" d="m'; string memory line = '" stroke-linecap="round" stroke-linejoin="round" stroke-width="'; string memory fill = '" fill="#fff" stroke-width="0" opacity=".5" rx="'; string memory cub = ';animation-timing-function:cubic-bezier(.42,0,.58,1)}'; string memory tt = '{transform:translate(250.0px,226.3px) rotate(0deg) scale(1,1'; svg = string(abi.encodePacked('<svg xmlns="http://www.w3.org/2000/svg" id="g" width="512" height="512"><style>@keyframes g-u-fgts{0%',tt,');',cub,'26%,70%',tt,'.15);',cub)); svg = string(abi.encodePacked(svg, '50%',tt,'.1);',cub,'to',tt,');}}@keyframes b2t{0%{transform:translate(252.4px,350.7px)}60%{transform:translate(252.1px,335.5px)}to{transform:translate(240.9px,176.6px)}}@keyframes b2c{0%,60%,to{opacity:0}90%{opacity:1}}@keyframes b1t{0%{transform:translate(256px,350.7px)}40%,to{transform:translate(265.4px,180px)}}@keyframes b1c{0%,40%,to{opacity:0}30%{opacity:1}}@keyframes b3t{0%{transform:translate(257.5px,326.9px)}28%{transform:translate(252.3px,328.1px)}68%,to{transform:translate(249.2px,174.1px)}}@keyframes b3c{0%,28%,68%,to{opacity:0}58%{opacity:1}}</style><defs><linearGradient id="gf" x1=".5" x2=".5" y1="0" y2="1" gradientUnits="objectBoundingBox" spreadMethod="pad"><stop id="gf-0" offset="0%" stop-color="#')); svg = string(abi.encodePacked(svg, col1, '"/><stop id="g1-1" offset="100%" stop-color="#', col2, '"/></linearGradient></defs>')); if(traits.bg == 0) {//british bgcol1 = '252320'; bgcol2 = '472525'; bgcol3 = '321515'; } else if(traits.bg == 1) {//dive bgcol1 = '825f3f'; bgcol2 = '724c28'; bgcol3 = '58391c'; } else { //irish bgcol1 = '2d3e2d'; bgcol2 = '49331e'; bgcol2 = '352618'; } svg = string(abi.encodePacked(svg, '<g id="g-u-bg"><rect id="r10" width="512" height="512" fill="#',bgcol1,'"/><rect id="r11" width="512" height="213.7" fill="#',bgcol2,'" transform="translate(0 298.3)"/><rect id="r12" width="512" height="213.7" fill="#',bgcol3,'" transform="matrix(1 0 0 .161 0 477.6)"/>')); //shadow svg = string(abi.encodePacked(svg, '</g><ellipse id="g-u-sw" fill="#050505" fill-opacity=".1" rx="73.2" ry="22.8" transform="matrix(1.154 .21 -.244 1.34 218 350.7)"/><g style="animation:g-u-fgts',anim,'rotate(-.2 54708 -60181.4)"><g id="g-u-fg" transform="translate(-250.6 -219.4)">')); //Glassware - Boot is 2x rare if(traits.gtype < 4) { //American and Imperial Pint svg = string(abi.encodePacked(svg, '<path id="j-pint',foam,'18.7 71.4 122.7.8-1.5-22.3c.6-17.7-120.3-16.5-120.5 0v13.8l-.7 7.7Z" transform="matrix(1 0 0 1.512 172.3 67.8)"/></g></g><g id="g-u-mp" transform="translate(172.4 100)"><path id="g-u-og',stk,'5" d="M34.8 267.1C29.5 202.8 23.3 135 22.5 127c-.3-3.5-')); if(traits.gtype < 2) svg = string(abi.encodePacked(svg, '9-14.5-10-26.7-.7-11.3 6.4-23.8 5.9-27.5l1-30 120.5.2v30.4c0 2 7.6 15.6 6.5 29.1-1.2 15.5-11 31.2-11.3 33.7')); else svg = string(abi.encodePacked(svg, '3.6-50.5-4.1-54.2l1-30 120.5.2v30.4c0 2-4.6 60.3-4.8 62.8')); svg = string(abi.encodePacked(svg, 'l-9.6 130.4c.7 10.8-20.2 18.2-43.9 18.4-14.4-.4-49-6-46.8-17.9" transform="translate(.2)"/><path id="g-u-ig" fill="url(#gf)" stroke="#000',line,'5" d="m28.6 74.2 102.8.5')); if(traits.gtype < 2) svg = string(abi.encodePacked(svg, 'c-.2 1.6 6 13.5 5 25.7-1.2 13.1-9.5 26.8-9.7 30.2')); else svg = string(abi.encodePacked(svg, 'a4901 4901 0 0 0-4.7 56')); svg = string(abi.encodePacked(svg, 'l-4 72.7-3.8 44.7c-.9 8-11.5 12.8-19.3 12.8-9.9 1.7-31 1-42.5-.4-6-.4-13.4-7-14.1-14.4-4.5-50.2-8.8-86-11.2-114.2-.5-5.8-')); if(traits.gtype < 2) svg = string(abi.encodePacked(svg, '9-19.6-9.6-32.2-.7-12.8 6.4-24.3 6.4-25.4Z')); else svg = string(abi.encodePacked(svg, '3.2-56.5-3.2-57.6Z')); svg = string(abi.encodePacked(svg, '" transform="translate(0 -.3)"/><ellipse id="ke1',fill,'4" ry="22.3" transform="matrix(.653 -.06 .214 2.316 47.2 191.1)"/><ellipse id="ke2',fill,'4" ry="22.3" transform="matrix(.962 -.03 .015 .49 33.4 98.1)"/></g>')); } else if(traits.gtype < 6) {//Pilsner svg = string(abi.encodePacked(svg, '<path id="j-p',foam,'208.9 133.2c-1.3-20 94.5-19 94.7-1.3l-1.1 23a399.2 399.2 0 0 1-93.2.7l-.4-22.4Z" transform="matrix(1 0 0 1.01 0 -1.4)"/></g></g><g id="g-u-p" transform="matrix(1.004 0 0 .997 -1 .7)"><path id="g-u-og2',stk,'5" d="m212.4 130 88.2-.2c1 19.6-12.3 122.5-21.4 205.8-4.4 15-2.2 32.2 6.5 31.8l-4.8-5.5c6.9-.3 16.4 4.7 20.5 8.7-24.3 10.5-69 11.6-92-.9 1.7-3.2 10-7.5 20.5-8L224 367c7.9-2 12.3-17.1 8-31.2-9.6-95.9-22-195.4-19.7-205.7Z" transform="matrix(1.066 0 0 1.038 -17 -9.4)"/><path id="g-u-ig" fill="url(#gf)" stroke="#000',line,'4" d="M221.5 167.3c32.3 1.7 58.8 1 66.2-.7 8.1 3.4-7.2 89.3-15 168.3-9.3 4.8-27.7 5.9-36.4-.2L219.7 181c-.4-6.8.2-14.7 1.8-13.7Z" transform="matrix(1 0 0 1.052 .3 -20.8)"/><ellipse id="ke3',fill,'4" ry="22.3" transform="matrix(.713 -.066 .305 3.297 236.3 241.2)"/></g>')); } else if(traits.gtype < 8) {//Stange svg = string(abi.encodePacked(svg, '<path id="j-l',foam,'208.9 133.2c-1.3-20 94.5-19 94.7-1.3l-1.1 23a399.2 399.2 0 0 1-93.2.7l-.4-22.4Z" transform="matrix(.81 0 0 1.387 47.7 -46.7)"/></g></g><g id="g-u-l"><path id="g-u-og4',stk,'4" d="M215.6 373.2c19.2 10.4 58 10.3 77.8 1.4v-51.1l.3-197.8c-21 2.9-59.7 4-78 0v247.5Z"/><path id="g-u-ig" fill="url(#gf)" stroke="#040303',line,'4" d="M222.3 171c16 2.6 49 2.4 66.3 0l-1.8 183.4c-11.8 7.8-41.2 11.2-64.6 0V171Z" transform="matrix(1 0 0 .999 0 .3)"/><ellipse id="ke8',fill,'2.3" ry="52.2" transform="matrix(.937 0 0 1.484 230.4 264.1)"/></g>')); } else if(traits.gtype < 10) {//Weizen svg = string(abi.encodePacked(svg, '<path id="j-w',foam,'207 130c5.1-9.8 95-9.6 97.7.3a57.4 57.4 0 0 1 6.3 34.8c-23.7 3.2-88 3.5-111 .4.2-9.8 3-27.4 7-35.5Z" transform="matrix(.81 0 0 1.387 47.7 -46.7)"/></g></g><g id="g-u-w"><path id="g-u-og5',stk,'4" d="M215.6 373.2c15.8 7 58 6.6 77.3 0-.5-36.7-6.4-94.8 0-141.7 6-43.8 12.8-62.7 1.7-103.2-21 2.9-61.2 4-79.5 0-7.6 40.5-7 61.1-1.6 103.2 6.4 49.5 1.6 106.9 2.1 141.7Z"/><path id="g-u-ig" fill="url(#gf)" stroke="#040303',line,'4" d="M219.7 185.2c15.9 2.6 53 3 70.3.6-3.6 21-8 62.2-8.6 82.4v91.4c-15.9 6-41.1 4-54.4 0l-.3-91.4c.2-20.9-3.4-62.4-7-83Z" transform="matrix(1 0 0 .999 0 .8)"/><ellipse id="ke9',fill,'2.3" ry="52.2" transform="translate(235.4 300.1)"/></g>')); } else if(traits.gtype < 11) {//Boot (rare) svg = string(abi.encodePacked(svg, '<path id="j-b',foam,'207 130c5.1-9.8 95-9.6 97.7.3a57.4 57.4 0 0 1 6.3 34.8c-23.7 3.2-88 3.5-111 .4.2-9.8 3-27.4 7-35.5Z" transform="matrix(.94 0 0 .91 15.3 25.4)"/></g></g><g id="g-u-b"><path id="g-u-og6" fill="#fff" fill-opacity=".5" stroke="#000" stroke-width="5" d="M207.3 142.5c24.8 3.9 73 4.5 96.5 0 5 21.8 4 67.2-.6 94.5-4.1 18.7-10.5 90.2 1.5 119.5 3.2 12.8-2.4 30.2-13.4 27.7h-29.8c-6.2-10-29-.7-46.6-.7l-53.2.3c-20.6-1.5-21.8-32.1 6.8-38.7 33-8.9 58.2-23.8 44-82.2-8-35-13-95.7-5.2-120.4Z" transform="translate(.3 .3)"/><path id="g-u-ig" fill="url(#gf)" stroke="#000" stroke-width="4" d="m217.2 176.4 80.5.4c4.3 1.2 3.4 19.3 1 37.4l-6.3 35.8c-8 29.7-7 78.4 0 90 5.8 13 6.5 31-12.1 30.5-12-1.8-34.6-1.4-45.3 1.5-23 3.3-58.7 4.2-70 1.6-11-3.1-11.2-16.4 0-19.9a205 205 0 0 1 28.4-7.3c28.7-5.5 37.7-44.5 31.3-78.4l-11.3-51.4c-2-15.5-3-38.7 3.8-40.2Z" transform="translate(0 .4)"/><ellipse id="ke10',fill,'3" ry="4.1" transform="translate(165.2 364.1)"/><ellipse id="ke11',fill,'3.6" ry="18.5" transform="translate(221.5 204.3)"/></g>')); } else if(traits.gtype < 13) {//Tulip svg = string(abi.encodePacked(svg, '<path id="j-t',foam,'204.6 128.6c5.1-9.7 99.1-9.4 101.8.5 1.5 9.7 3 28.4 5.5 35.9-23.8.5-89.2.2-114.2.5a190 190 0 0 0 6.9-36.9Z" transform="matrix(.81 0 0 .876 47.7 65.5)"/></g></g><g id="g-u-t"><path id="kp4',stk,'5" d="M212.6 179.4c20 5.5 62 5.2 84.2.9-.5 30.4 7 40.6 12.7 55.7 18.9 50.6-13.3 84.1-54.2 84.1-47.2 0-73.7-36.4-56.5-83.9 7.3-19.9 16-34.7 13.8-56.8Z"/><path id="kp5',stk)); svg = string(abi.encodePacked(svg, '5" d="M275 364.8c-8-7.7-12.4-26.5-7.1-44.7H242c9.1 20-8.3 46.7-5.9 44.7-13.9 0-31.7 2.8-32.3 7.3-.2 9 101.5 8.5 101.5 0 0-3.3-19.4-8.2-30.3-7.3Z" transform="translate(-1)"/><path id="kp6" fill="none" stroke="#000',line,'3" d="M276.7 369.4c2.8 3.6 10.6 7 16.2 5.9" transform="translate(-2.6 -3.9)"/><path id="kp7" fill="none" stroke="#000',line,'3" d="M236.1 366c-.9 3.4-8.8 5.6-16 4.9" transform="translate(0 -.2)"/><path id="kp8" fill="url(#gf)" stroke="#000" stroke-width="4" d="M215.4 217.3h76.4c4.9 9.7 12 26.9 13.5 35 7 33.6-20 57.6-48.5 58.8-27 .5-58.8-19.7-53.7-58.7 1.9-8.7 8-26.2 12.3-35.1Z" transform="matrix(.986 0 0 .98 3.7 5.1)"/><ellipse id="ke12',fill,'4.4" ry="15.2" transform="translate(212 265.4)"/></g>')); } else {//Goblet svg = string(abi.encodePacked(svg, '<path id="j-g',foam,'203.5 125.8c13.1-11.1 92-7.6 100.6-.3 8 6.6 8.9 31.4 9 39.6-24 .5-117.4.7-117.4.7s-.7-33.3 7.8-40Z" transform="matrix(1.085 0 0 .542 -23 120)"/></g></g><g id="g-u-g"><path id="kp9',stk,'5" d="M191.1 197.4c20 5.4 100.5 5.3 122.7 1 7.8 24.2 9 47.9 9 66.5 0 31-24 56-67.5 55.2-47.2 0-68.7-30-69.3-56-.4-20.7 2.1-47.3 5.1-66.7Z" transform="translate(-1 .5)"/><path id="kp10',stk)); svg = string(abi.encodePacked(svg, '5" d="M275.1 365.7c-10.4-7.6-12.8-25.5-10.4-44.8l-22.9.2c6.1 19.2-7.2 46.5-4.7 44.6-14.1-1.3-33.6 2.3-33.4 6-.2 8 101.6 9 101.6.4 0-3.3-19.3-7.5-30.2-6.4Z" transform="translate(-2.2 -.2)"/><path id="kp11" fill="none" stroke="#000',line,'3" d="M276.7 369.4c1.8 3.4 10.6 7 16.2 5.9" transform="translate(-5.1 -4.2)"/><path id="kp12" fill="none" stroke="#000',line,'3" d="M236.1 366c-1.7 3.7-8.2 5.8-16 4.9" transform="translate(-1 -.8)"/><path id="kp13" fill="url(#gf)" stroke="#000" stroke-width="4" d="M200.5 218.2H307c4.5 9.4 7 33 6.5 43.8 0 31.7-21.7 50.3-59.5 50.3-35.6 0-59.3-21.6-58.8-55 .2-10.5 1.1-29.3 5.3-39.1Z" transform="matrix(.986 0 0 .98 2.7 3.1)"/><ellipse id="ke13',fill,'4" ry="22.5" transform="translate(208.9 251)"/></g>')); } svg = string(abi.encodePacked(svg, '<g style="animation:b2t',anim,'translate(252.5 350.7)"><g opacity="0" style="animation:b2c',anim,'matrix(2.036 0 0 2.1 -199.3 -517)"><circle id="ke15"',bubx,'100.6 250.2)"/><circle id="ke16"',bubx)); svg = string(abi.encodePacked(svg, '94 244.9)"/><circle id="ke17"',bubx,'101.8 242.2)"/></g></g><g style="animation:b1t',anim,'translate(256 350.7)"><g opacity="0" style="animation:b1c',anim,'matrix(1.651 0 0 1.588 -161.6 -390.9)"><circle id="ke18"',bubx)); svg = string(abi.encodePacked(svg, '100.6 250.2)"/><circle id="ke19"',bubx,'94 244.9)"/><circle id="ke20"',bubx,'101.8 242.2)"/></g></g><g style="animation:b3t',anim)); svg = string(abi.encodePacked(svg, 'translate(257.6 326.9)"><g opacity="0" style="animation:b3c',anim,'matrix(2.036 0 0 2.1 -199.3 -517)"><circle id="ke21"',bubx,'95.7 255)"/><circle id="ke22"',bubx,'94 244.9)"/></g></g><ellipse id="g-u-r',fill,'15" ry="2.6" transform="translate(')); if(traits.gtype == 10) // Boot, move reflection svg = string(abi.encodePacked(svg, '282 377)"/></svg>')); else svg = string(abi.encodePacked(svg, '253.7 371.4)"/></svg>')); return svg; } function uint2str( uint _i ) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } function getTraits(uint256 _tokenId) internal pure returns (TraitVals memory) { uint256 btype = uint256(keccak256(abi.encodePacked(_tokenId, "b1"))) % 35; uint256 gtype = uint256(keccak256(abi.encodePacked(_tokenId, "g1"))) % 15; //rare boot uint256 bg = uint256(keccak256(abi.encodePacked(_tokenId, "bkg1"))) % 3; return TraitVals(btype, gtype, bg); } function mint(uint quantity) public { if(sellingStep != Step.PublicSale) revert("Not Live"); if(mintedPerAcc[msg.sender] + quantity > maxWalletFree) revert("Max exc"); if(totalSupply() + quantity > MAX_SUPPLY) revert("Max exc"); require(tx.origin == msg.sender, "No"); _mint(msg.sender, quantity); mintedPerAcc[msg.sender] += quantity; } function setStep(uint _step) external onlyOwner { sellingStep = Step(_step); } function generateAttributes(uint256 tokenId) internal pure returns (string memory) { TraitVals memory traits = getTraits(tokenId); string memory btypeName; string memory gtypeName; string memory bgName; if(traits.btype == 0) { btypeName = "Brown Ale"; } else if(traits.btype == 1) { btypeName = "Barley Wine"; } else if(traits.btype == 2) { btypeName = "Oxidized Homebrew"; } else if(traits.btype == 3) { btypeName = "Porter"; } else if(traits.btype == 4) { btypeName = "Dyed Green Lager"; } else if(traits.btype == 5) { btypeName = "German Pilsner"; } else if(traits.btype == 6) { btypeName = "Vanilla Cream Ale"; } else if(traits.btype == 7) { btypeName = "American Lager"; } else if(traits.btype == 8) { btypeName = "Cerveza"; } else if(traits.btype == 9) { btypeName = "Hazy IPA"; } else if(traits.btype == 10) { btypeName = "Pale Ale"; } else if(traits.btype == 11) { btypeName = "Munich Helles"; } else if(traits.btype == 12) { btypeName = "Kolsch"; } else if(traits.btype == 13) { btypeName = "Czech Lager"; } else if(traits.btype == 14) { btypeName = "Octoberfest"; } else if(traits.btype == 15) { btypeName = "Amber Lager"; } else if(traits.btype == 16) { btypeName = "Dopplebock"; } else if(traits.btype == 17) { btypeName = "English Bitter"; } else if(traits.btype == 18) { btypeName = "Strong Ale"; } else if(traits.btype == 19) { btypeName = "Marzen"; } else if(traits.btype == 20) { btypeName = "IPA"; } else if(traits.btype == 21) { btypeName = "Double IPA"; } else if(traits.btype == 22) { btypeName = "Belgian Tripel"; } else if(traits.btype == 23) { btypeName = "Blond"; } else if(traits.btype == 24) { btypeName = "Saison"; } else if(traits.btype == 25) { btypeName = "Gose"; } else if(traits.btype == 26) { btypeName = "Vienna Lager"; } else if(traits.btype == 27) { btypeName = "Triple IPA"; } else if(traits.btype == 28) { btypeName = "Sour"; } else if(traits.btype == 29) { btypeName = "Red Ale"; } else if(traits.btype == 30) { btypeName = "Lambic"; } else if(traits.btype == 31) { btypeName = "Wild Ale"; } else if(traits.btype == 32) { btypeName = "Dry Irish Stout"; } else if(traits.btype == 33) { btypeName = "Imperial Stout"; } else if(traits.btype == 34) { btypeName = "Oatmeal Stout"; } else { btypeName = "Porter"; } if(traits.gtype < 2) { gtypeName = "Imperial Pint"; } else if(traits.gtype < 4) { gtypeName = "American Pint"; } else if(traits.gtype < 6) { gtypeName = "Pilsner"; } else if(traits.gtype < 8) { gtypeName = "Stange"; } else if(traits.gtype < 10) { gtypeName = "Weizen"; } else if(traits.gtype < 11) { //boot is rare gtypeName = "Das Boot"; } else if(traits.gtype < 13) { gtypeName = "Tulip"; } else { gtypeName = "Goblet"; } if(traits.bg == 0) { bgName = "British"; } else if(traits.bg == 1) { bgName = "Dive"; } else { bgName = "Irish"; } string memory attributes = string( abi.encodePacked( '{"name": "CryptoPints #', uint2str(tokenId), ' - ',btypeName, '", "description": "100% on-chain SVG beer.", "attributes":[', '{"trait_type": "Beer", "value": "',btypeName,'"},', '{"trait_type": "Glass", "value": "',gtypeName,'"},', '{"trait_type": "Pub", "value": "',bgName,'"}' ) ); return attributes; } function tokenURI(uint256 tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory) { // Get the attribute values string memory attributes = generateAttributes(tokenId); string memory json; json = string(abi.encodePacked( attributes, '], "image": "data:image/svg+xml;base64,', Base64.encode(bytes(renderSvg(tokenId))), '"}' )); return string(abi.encodePacked( "data:application/json;base64,", Base64.encode(bytes(json)) )); } }
{ "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "CryptoPints.sol": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OWNER_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPerAcc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sellingStep","outputs":[{"internalType":"enum CryptoPints.Step","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_step","type":"uint256"}],"name":"setStep","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600a6009556103e8600a553480156200001c57600080fd5b506040518060400160405280601b81526020017f43727970746f50696e7473202d204f6e20436861696e20426565720000000000815250604051806040016040528060048152602001631412539560e21b8152508160029081620000819190620001a0565b506003620000908282620001a0565b5050600160005550620000a333620000a9565b6200026c565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200012657607f821691505b6020821081036200014757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019b57600081815260208120601f850160051c81016020861015620001765750805b601f850160051c820191505b81811015620001975782815560010162000182565b5050505b505050565b81516001600160401b03811115620001bc57620001bc620000fb565b620001d481620001cd845462000111565b846200014d565b602080601f8311600181146200020c5760008415620001f35750858301515b600019600386901b1c1916600185901b17855562000197565b600085815260208120601f198616915b828110156200023d578886015182559484019460019091019084016200021c565b50858210156200025c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615fb6806200027c6000396000f3fe6080604052600436106101665760003560e01c806370a08231116100d1578063b88d4fde1161008a578063cbccefb211610064578063cbccefb2146103fc578063e985e9c514610423578063f2fde38b14610443578063f8dcbddb1461046357600080fd5b8063b88d4fde1461039c578063c87b56dd146103af578063cad45358146103cf57600080fd5b806370a08231146102f4578063715018a6146103145780638da5cb5b1461032957806395d89b4114610347578063a0712d681461035c578063a22cb4651461037c57600080fd5b806323b872dd1161012357806323b872dd1461025057806332cb6b0c1461026357806342842e0e14610279578063632e1dfe1461028c5780636352211e146102b457806363bc312a146102d457600080fd5b806301ffc9a71461016b57806306fdde03146101a0578063081812fc146101c2578063095ea7b3146101fa5780630bc7a2de1461020f57806318160ddd14610233575b600080fd5b34801561017757600080fd5b5061018b6101863660046125d8565b610483565b60405190151581526020015b60405180910390f35b3480156101ac57600080fd5b506101b56104d5565b6040516101979190612645565b3480156101ce57600080fd5b506101e26101dd366004612658565b610567565b6040516001600160a01b039091168152602001610197565b61020d61020836600461268d565b6105ab565b005b34801561021b57600080fd5b5061022560095481565b604051908152602001610197565b34801561023f57600080fd5b506001546000540360001901610225565b61020d61025e3660046126b7565b61064b565b34801561026f57600080fd5b50610225600a5481565b61020d6102873660046126b7565b6107e3565b34801561029857600080fd5b506101e273cade4b581e3ab2be3f74422ae0954013e9bff47881565b3480156102c057600080fd5b506101e26102cf366004612658565b610803565b3480156102e057600080fd5b5061020d6102ef366004612658565b61080e565b34801561030057600080fd5b5061022561030f3660046126f3565b6108a5565b34801561032057600080fd5b5061020d6108f4565b34801561033557600080fd5b506008546001600160a01b03166101e2565b34801561035357600080fd5b506101b5610908565b34801561036857600080fd5b5061020d610377366004612658565b610917565b34801561038857600080fd5b5061020d61039736600461270e565b610a42565b61020d6103aa366004612760565b610aae565b3480156103bb57600080fd5b506101b56103ca366004612658565b610af8565b3480156103db57600080fd5b506102256103ea3660046126f3565b600b6020526000908152604090205481565b34801561040857600080fd5b50600c546104169060ff1681565b6040516101979190612852565b34801561042f57600080fd5b5061018b61043e36600461287a565b610b6e565b34801561044f57600080fd5b5061020d61045e3660046126f3565b610b9c565b34801561046f57600080fd5b5061020d61047e366004612658565b610c12565b60006301ffc9a760e01b6001600160e01b0319831614806104b457506380ac58cd60e01b6001600160e01b03198316145b806104cf5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546104e4906128ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610510906128ad565b801561055d5780601f106105325761010080835404028352916020019161055d565b820191906000526020600020905b81548152906001019060200180831161054057829003601f168201915b5050505050905090565b600061057282610c4f565b61058f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006105b682610803565b9050336001600160a01b038216146105ef576105d28133610b6e565b6105ef576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061065682610c84565b9050836001600160a01b0316816001600160a01b0316146106895760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176106d6576106b98633610b6e565b6106d657604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166106fd57604051633a954ecd60e21b815260040160405180910390fd5b801561070857600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b8416900361079a576001840160008181526004602052604081205490036107985760005481146107985760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6107fe83838360405180602001604052806000815250610aae565b505050565b60006104cf82610c84565b600a54600154600054839190036000190161082991906128fd565b11156108505760405162461bcd60e51b815260040161084790612910565b60405180910390fd5b3373cade4b581e3ab2be3f74422ae0954013e9bff478146108985760405162461bcd60e51b81526020600482015260026024820152614e6f60f01b6044820152606401610847565b6108a23382610cfa565b50565b60006001600160a01b0382166108ce576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6108fc610df8565b6109066000610e52565b565b6060600380546104e4906128ad565b6001600c5460ff1660018111156109305761093061283c565b146109685760405162461bcd60e51b81526020600482015260086024820152674e6f74204c69766560c01b6044820152606401610847565b600954336000908152600b60205260409020546109869083906128fd565b11156109a45760405162461bcd60e51b815260040161084790612910565b600a5460015460005483919003600019016109bf91906128fd565b11156109dd5760405162461bcd60e51b815260040161084790612910565b323314610a115760405162461bcd60e51b81526020600482015260026024820152614e6f60f01b6044820152606401610847565b610a1b3382610cfa565b336000908152600b602052604081208054839290610a3a9084906128fd565b909155505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ab984848461064b565b6001600160a01b0383163b15610af257610ad584848484610ea4565b610af2576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606000610b0583610f8f565b9050606081610b1b610b1686611911565b612227565b604051602001610b2c92919061294d565b6040516020818303038152906040529050610b4681612227565b604051602001610b5691906129c5565b60405160208183030381529060405292505050919050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b610ba4610df8565b6001600160a01b038116610c095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610847565b6108a281610e52565b610c1a610df8565b806001811115610c2c57610c2c61283c565b600c805460ff191660018381811115610c4757610c4761283c565b021790555050565b600081600111158015610c63575060005482105b80156104cf575050600090815260046020526040902054600160e01b161590565b60008180600111610ce157600054811015610ce15760008181526004602052604081205490600160e01b82169003610cdf575b80600003610cd8575060001901600081815260046020526040902054610cb7565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b6000805490829003610d1f5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114610dce57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101610d96565b5081600003610def57604051622e076360e81b815260040160405180910390fd5b60005550505050565b6008546001600160a01b031633146109065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610847565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610ed9903390899088908890600401612a0a565b6020604051808303816000875af1925050508015610f14575060408051601f3d908101601f19168201909252610f1191810190612a47565b60015b610f72573d808015610f42576040519150601f19603f3d011682016040523d82523d6000602084013e610f47565b606091505b508051600003610f6a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60606000610f9c8361237a565b905060608060608360000151600003610fd8576040518060400160405280600981526020016842726f776e20416c6560b81b81525092506116c1565b835160010361100c576040518060400160405280600b81526020016a4261726c65792057696e6560a81b81525092506116c1565b835160020361104657604051806040016040528060118152602001704f786964697a656420486f6d656272657760781b81525092506116c1565b835160030361107557604051806040016040528060068152602001652837b93a32b960d11b81525092506116c1565b83516004036110ae576040518060400160405280601081526020016f223cb2b21023b932b2b7102630b3b2b960811b81525092506116c1565b83516005036110e5576040518060400160405280600e81526020016d23b2b936b0b7102834b639b732b960911b81525092506116c1565b835160060361111f576040518060400160405280601181526020017056616e696c6c6120437265616d20416c6560781b81525092506116c1565b8351600703611156576040518060400160405280600e81526020016d20b6b2b934b1b0b7102630b3b2b960911b81525092506116c1565b8351600803611186576040518060400160405280600781526020016643657276657a6160c81b81525092506116c1565b83516009036111b7576040518060400160405280600881526020016748617a792049504160c01b81525092506116c1565b8351600a036111e8576040518060400160405280600881526020016750616c6520416c6560c01b81525092506116c1565b8351600b0361121e576040518060400160405280600d81526020016c4d756e6963682048656c6c657360981b81525092506116c1565b8351600c0361124d5760405180604001604052806006815260200165096ded8e6c6d60d31b81525092506116c1565b8351600d03611281576040518060400160405280600b81526020016a21bd32b1b4102630b3b2b960a91b81525092506116c1565b8351600e036112b5576040518060400160405280600b81526020016a13d8dd1bd8995c99995cdd60aa1b81525092506116c1565b8351600f036112e9576040518060400160405280600b81526020016a20b6b132b9102630b3b2b960a91b81525092506116c1565b835160100361131c576040518060400160405280600a815260200169446f70706c65626f636b60b01b81525092506116c1565b8351601103611353576040518060400160405280600e81526020016d22b733b634b9b4102134ba3a32b960911b81525092506116c1565b8351601203611386576040518060400160405280600a8152602001695374726f6e6720416c6560b01b81525092506116c1565b83516013036113b5576040518060400160405280600681526020016526b0b93d32b760d11b81525092506116c1565b83516014036113e1576040518060400160405280600381526020016249504160e81b81525092506116c1565b8351601503611414576040518060400160405280600a815260200169446f75626c652049504160b01b81525092506116c1565b835160160361144b576040518060400160405280600e81526020016d10995b19da585b88151c9a5c195b60921b81525092506116c1565b83516017036114795760405180604001604052806005815260200164109b1bdb9960da1b81525092506116c1565b83516018036114a8576040518060400160405280600681526020016529b0b4b9b7b760d11b81525092506116c1565b83516019036114d55760405180604001604052806004815260200163476f736560e01b81525092506116c1565b8351601a0361150a576040518060400160405280600c81526020016b2b34b2b73730902630b3b2b960a11b81525092506116c1565b8351601b0361153d576040518060400160405280600a815260200169547269706c652049504160b01b81525092506116c1565b8351601c0361156a576040518060400160405280600481526020016329b7bab960e11b81525092506116c1565b8351601d0361159a576040518060400160405280600781526020016652656420416c6560c81b81525092506116c1565b8351601e036115c957604051806040016040528060068152602001654c616d62696360d01b81525092506116c1565b8351601f036115fa576040518060400160405280600881526020016757696c6420416c6560c01b81525092506116c1565b8351602003611632576040518060400160405280600f81526020016e111c9e48125c9a5cda0814dd1bdd5d608a1b81525092506116c1565b8351602103611669576040518060400160405280600e81526020016d125b5c195c9a585b0814dd1bdd5d60921b81525092506116c1565b835160220361169f576040518060400160405280600d81526020016c13d85d1b59585b0814dd1bdd5d609a1b81525092506116c1565b604051806040016040528060068152602001652837b93a32b960d11b81525092505b6002846020015110156116fb576040518060400160405280600d81526020016c125b5c195c9a585b08141a5b9d609a1b8152509150611858565b600484602001511015611735576040518060400160405280600d81526020016c105b595c9a58d85b88141a5b9d609a1b8152509150611858565b60068460200151101561176957604051806040016040528060078152602001662834b639b732b960c91b8152509150611858565b60088460200151101561179c57604051806040016040528060068152602001655374616e676560d01b8152509150611858565b600a846020015110156117cf57604051806040016040528060068152602001652bb2b4bd32b760d11b8152509150611858565b600b84602001511015611804576040518060400160405280600881526020016711185cc8109bdbdd60c21b8152509150611858565b600d846020015110156118365760405180604001604052806005815260200164054756c69760dc1b8152509150611858565b6040518060400160405280600681526020016511dbd89b195d60d21b81525091505b83604001516000036118885750604080518082019091526007815266084e4d2e8d2e6d60cb1b60208201526118d3565b83604001516001036118b557506040805180820190915260048152634469766560e01b60208201526118d3565b50604080518082019091526005815264092e4d2e6d60db1b60208201525b60006118de87612496565b848585856040516020016118f6959493929190612a64565b60408051601f19818403018152919052979650505050505050565b60608060608060608060006119258861237a565b905060048160000151101561197b576040518060400160405280600681526020016536613266316160d01b81525095506040518060400160405280600681526020016519319899181b60d11b8152509450611b53565b8051600511156119cc5760405180604001604052806006815260200165313332b3183360d11b81525095506040518060400160405280600681526020016503437353931360d41b8152509450611b53565b8051600e1115611a1d576040518060400160405280600681526020016566666635616560d01b81525095506040518060400160405280600681526020016565316165323960d01b8152509450611b53565b805160141115611a6e576040518060400160405280600681526020016532b33098183360d11b81525095506040518060400160405280600681526020016503539333631360d41b8152509450611b53565b8051601c1115611abf576040518060400160405280600681526020016566366365353160d01b81525095506040518060400160405280600681526020016538353636313760d01b8152509450611b53565b805160201115611b10576040518060400160405280600681526020016537653133303560d01b8152509550604051806040016040528060068152602001651930981a181960d11b8152509450611b53565b6040518060400160405280600681526020016533373132303560d01b81525095506040518060400160405280600681526020016530373033303160d01b81525094505b60006040518060a0016040528060678152602001615d096067913990506000604051806060016040528060348152602001615ee160349139905060006040518060a00160405280606b8152602001615e76606b913990506000604051806080016040528060528152602001615daf60529139905060006040518060600160405280603f8152602001615d70603f913990506000604051806060016040528060308152602001615f516030913990506000604051806060016040528060358152602001615e0160359139905060006040518060600160405280603c8152602001615f15603c9139905080828284604051602001611c529493929190612c10565b6040516020818303038152906040529e508e818383604051602001611c7a9493929190612d20565b6040516020818303038152906040529e508e8e8e604051602001611ca0939291906130f8565b6040516020818303038152906040529e508860400151600003611d25576040518060400160405280600681526020016503235323332360d41b8152509b506040518060400160405280600681526020016534373235323560d01b8152509a506040518060400160405280600681526020016533323135313560d01b8152509950611df0565b8860400151600103611d9957604051806040016040528060068152602001651c191ab319b360d11b8152509b506040518060400160405280600681526020016506e6468c664760d31b8152509a506040518060400160405280600681526020016535383339316360d01b8152509950611df0565b6040805180820182526006808252650c990cd94c9960d21b602080840191909152835180850185528281526534393333316560d01b908201528351808501909452908352650666a646c62760d31b908301529c509a505b8e8c8c8c604051602001611e0794939291906131a8565b6040516020818303038152906040529e508e87604051602001611e2b929190613347565b6040516020818303038152906040529e50600489602001511015611fe5578e8587604051602001611e5e939291906134a1565b6040516020818303038152906040529e50600289602001511015611ea3578e604051602001611e8d919061363a565b6040516020818303038152906040529e50611ec6565b8e604051602001611eb491906136db565b6040516020818303038152906040529e505b8e84604051602001611ed9929190613742565b6040516020818303038152906040529e50600289602001511015611f1e578e604051602001611f089190613849565b6040516020818303038152906040529e50611f41565b8e604051602001611f2f91906138a4565b6040516020818303038152906040529e505b8e604051602001611f5291906138e5565b6040516020818303038152906040529e50600289602001511015611f97578e604051602001611f819190613998565b6040516020818303038152906040529e50611fba565b8e604051602001611fa891906139ec565b6040516020818303038152906040529e505b8e8384604051602001611fcf93929190613a22565b6040516020818303038152906040529e50612118565b60068960200151101561200b578e85878686604051602001611fcf959493929190613b4f565b600889602001511015612031578e85878686604051602001611fcf959493929190613f76565b600a89602001511015612057578e85878686604051602001611fcf959493929190614267565b600b8960200151101561207b578e858485604051602001611fcf94939291906145ea565b600d896020015110156120c7578e85878860405160200161209f9493929190614b26565b6040516020818303038152906040529e508e848585604051602001611fcf9493929190614d41565b8e8587886040516020016120de94939291906150e0565b6040516020818303038152906040529e508e8485856040516020016121069493929190615309565b6040516020818303038152906040529e505b8e87888a8b6040516020016121319594939291906156b8565b6040516020818303038152906040529e508e8888898b60405160200161215b959493929190615810565b6040516020818303038152906040529e508e8889896040516020016121839493929190615973565b6040516020818303038152906040529e508e87898a866040516020016121ad959493929190615a60565b6040516020818303038152906040529e508860200151600a036121f1578e6040516020016121db9190615bea565b6040516020818303038152906040529e50612214565b8e6040516020016122029190615c1f565b6040516020818303038152906040529e505b5050505050505050505050505050919050565b6060815160000361224657505060408051602081019091526000815290565b6000604051806060016040528060408152602001615e36604091399050600060038451600261227591906128fd565b61227f9190615c6e565b61228a906004615c82565b67ffffffffffffffff8111156122a2576122a261274a565b6040519080825280601f01601f1916602001820160405280156122cc576020820181803683370190505b509050600182016020820185865187015b80821015612338576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506122dd565b505060038651066001811461235457600281146123675761236f565b603d6001830353603d600283035361236f565b603d60018303535b509195945050505050565b61239e60405180606001604052806000815260200160008152602001600081525090565b60006023836040516020016123c091815261623160f01b602082015260220190565b6040516020818303038152906040528051906020012060001c6123e39190615c99565b90506000600f8460405160200161240791815261673160f01b602082015260220190565b6040516020818303038152906040528051906020012060001c61242a9190615c99565b9050600060038560405160200161245091815263626b673160e01b602082015260240190565b6040516020818303038152906040528051906020012060001c6124739190615c99565b604080516060810182529485526020850193909352918301919091525092915050565b6060816000036124bd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124e757806124d181615cad565b91506124e09050600a83615c6e565b91506124c1565b60008167ffffffffffffffff8111156125025761250261274a565b6040519080825280601f01601f19166020018201604052801561252c576020820181803683370190505b509050815b85156125b957612542600182615cc6565b90506000612551600a88615c6e565b61255c90600a615c82565b6125669088615cc6565b612571906030615cd9565b905060008160f81b90508084848151811061258e5761258e615cf2565b60200101906001600160f81b031916908160001a9053506125b0600a89615c6e565b97505050612531565b50949350505050565b6001600160e01b0319811681146108a257600080fd5b6000602082840312156125ea57600080fd5b8135610cd8816125c2565b60005b838110156126105781810151838201526020016125f8565b50506000910152565b600081518084526126318160208601602086016125f5565b601f01601f19169290920160200192915050565b602081526000610cd86020830184612619565b60006020828403121561266a57600080fd5b5035919050565b80356001600160a01b038116811461268857600080fd5b919050565b600080604083850312156126a057600080fd5b6126a983612671565b946020939093013593505050565b6000806000606084860312156126cc57600080fd5b6126d584612671565b92506126e360208501612671565b9150604084013590509250925092565b60006020828403121561270557600080fd5b610cd882612671565b6000806040838503121561272157600080fd5b61272a83612671565b91506020830135801515811461273f57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561277657600080fd5b61277f85612671565b935061278d60208601612671565b925060408501359150606085013567ffffffffffffffff808211156127b157600080fd5b818701915087601f8301126127c557600080fd5b8135818111156127d7576127d761274a565b604051601f8201601f19908116603f011681019083821181831017156127ff576127ff61274a565b816040528281528a602084870101111561281857600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b634e487b7160e01b600052602160045260246000fd5b602081016002831061287457634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561288d57600080fd5b61289683612671565b91506128a460208401612671565b90509250929050565b600181811c908216806128c157607f821691505b6020821081036128e157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104cf576104cf6128e7565b6020808252600790820152664d61782065786360c81b604082015260600190565b600081516129438185602086016125f5565b9290920192915050565b6000835161295f8184602088016125f5565b80830190507f5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b81526618985cd94d8d0b60ca1b602082015283516129aa8160278401602088016125f5565b61227d60f01b60279290910191820152602901949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516129fd81601d8501602087016125f5565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a3d90830184612619565b9695505050505050565b600060208284031215612a5957600080fd5b8151610cd8816125c2565b7f7b226e616d65223a202243727970746f50696e74732023000000000000000000815260008651612a9c816017850160208b016125f5565b6201016960ed1b6017918401918201528651612abf81601a840160208b016125f5565b7f222c20226465736372697074696f6e223a202231303025206f6e2d636861696e601a92909101918201527f2053564720626565722e222c202261747472696275746573223a5b0000000000603a8201527f7b2274726169745f74797065223a202242656572222c202276616c7565223a206055820152601160f91b60758201528551612b53816076840160208a016125f5565b612c03612bf5612bef612bc6612bb7612bb1612b7d6076888a010162089f4b60ea1b815260030190565b7f7b2274726169745f74797065223a2022476c617373222c202276616c7565223a815261101160f11b602082015260220190565b8b612931565b62089f4b60ea1b815260030190565b7f7b2274726169745f74797065223a2022507562222c202276616c7565223a2022815260200190565b87612931565b61227d60f01b815260020190565b9998505050505050505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222069643d2267222077696474683d223531322220686569676860208201527f743d22353132223e3c7374796c653e406b65796672616d657320672d752d666760408201526474737b302560d81b606082015260008551612ca2816065850160208a016125f5565b61293b60f01b6065918401918201528551612cc4816067840160208a016125f5565b663236252c37302560c81b606792909101918201528451612cec81606e8401602089016125f5565b642e3135293b60d81b606e92909101918201528351612d128160738401602088016125f5565b016073019695505050505050565b60008551612d32818460208a016125f5565b6235302560e81b9083019081528551612d52816003840160208a016125f5565b632e31293b60e01b600392909101918201528451612d778160078401602089016125f5565b61746f60f01b600792909101918201528351612d9a8160098401602088016125f5565b7f293b7d7d406b65796672616d6573206232747b30257b7472616e73666f726d3a600992909101918201527f7472616e736c617465283235322e3470782c3335302e377078297d3630257b7460298201527f72616e73666f726d3a7472616e736c617465283235322e3170782c3333352e3560498201527f7078297d746f7b7472616e73666f726d3a7472616e736c617465283234302e3960698201527f70782c3137362e367078297d7d406b65796672616d6573206232637b30252c3660898201527f30252c746f7b6f7061636974793a307d3930257b6f7061636974793a317d7d4060a98201527f6b65796672616d6573206231747b30257b7472616e73666f726d3a7472616e7360c98201527f6c6174652832353670782c3335302e377078297d3430252c746f7b7472616e7360e98201527f666f726d3a7472616e736c617465283236352e3470782c3138307078297d7d406101098201527f6b65796672616d6573206231637b30252c3430252c746f7b6f7061636974793a6101298201527f307d3330257b6f7061636974793a317d7d406b65796672616d6573206233747b6101498201527f30257b7472616e73666f726d3a7472616e736c617465283235372e3570782c336101698201527f32362e397078297d3238257b7472616e73666f726d3a7472616e736c617465286101898201527f3235322e3370782c3332382e317078297d3638252c746f7b7472616e73666f726101a98201527f6d3a7472616e736c617465283234392e3270782c3137342e317078297d7d406b6101c98201527f65796672616d6573206233637b30252c3238252c3638252c746f7b6f706163696101e98201527f74793a307d3538257b6f7061636974793a317d7d3c2f7374796c653e3c6465666102098201527f733e3c6c696e6561724772616469656e742069643d226766222078313d222e356102298201527f222078323d222e35222079313d2230222079323d223122206772616469656e746102498201527f556e6974733d226f626a656374426f756e64696e67426f7822207370726561646102698201527f4d6574686f643d22706164223e3c73746f702069643d2267662d3022206f6666610289820152757365743d223025222073746f702d636f6c6f723d222360501b6102a98201526102bf019695505050505050565b6000845161310a8184602089016125f5565b84519083019061311e8183602089016125f5565b8082019150507f222f3e3c73746f702069643d2267312d3122206f66667365743d22313030252281526d2073746f702d636f6c6f723d222360901b6020820152835161317181602e8401602088016125f5565b7f222f3e3c2f6c696e6561724772616469656e743e3c2f646566733e0000000000602e929091019182015260490195945050505050565b600085516131ba818460208a016125f5565b80830190507f3c672069643d22672d752d6267223e3c726563742069643d227231302220776981527f6474683d2235313222206865696768743d22353132222066696c6c3d222300006020820152855161321b81603e840160208a016125f5565b7f222f3e3c726563742069643d22723131222077696474683d2235313222206865603e929091019182015273696768743d223231332e37222066696c6c3d222360601b605e82015284516132768160728401602089016125f5565b7f22207472616e73666f726d3d227472616e736c6174652830203239382e332922607292909101918201527f2f3e3c726563742069643d22723132222077696474683d2235313222206865696092820152726768743d223231332e37222066696c6c3d222360681b60b282015283516132f68160c58401602088016125f5565b61333b60c5828401017f22207472616e73666f726d3d226d6174726978283120302030202e3136312030815269101a1b9b971b1491179f60b11b6020820152602a0190565b98975050505050505050565b600083516133598184602088016125f5565b80830190507f3c2f673e3c656c6c697073652069643d22672d752d7377222066696c6c3d222381527f303530353035222066696c6c2d6f7061636974793d222e31222072783d22373360208201527f2e32222072793d2232322e3822207472616e73666f726d3d226d61747269782860408201527f312e313534202e3231202d2e32343420312e333420323138203335302e37292260608201527f2f3e3c67207374796c653d22616e696d6174696f6e3a672d752d6667747300006080820152835161342c81609e8401602088016125f5565b7f726f74617465282d2e32203534373038202d36303138312e3429223e3c672069609e92909101918201527f643d22672d752d666722207472616e73666f726d3d227472616e736c6174652860be8201526f16991a98171b101699189c971a14911f60811b60de82015260ee01949350505050565b600084516134b38184602089016125f5565b6f0f1c185d1a081a590f489a8b5c1a5b9d60821b90830190815284516134e08160108401602089016125f5565b7f31382e372037312e34203132322e372e382d312e352d32322e33632e362d3137601092909101918201527f2e372d3132302e332d31362e352d3132302e3520307631332e386c2d2e37203760308201527f2e375a22207472616e73666f726d3d226d617472697828312030203020312e3560508201527f3132203137322e332036372e3829222f3e3c2f673e3c2f673e3c672069643d2260708201527f672d752d6d7022207472616e73666f726d3d227472616e736c6174652831373260908201527f2e342031303029223e3c706174682069643d22672d752d6f670000000000000060b082015283516135dc8160c98401602088016125f5565b7f352220643d224d33342e38203236372e314332392e35203230322e382032332e60c992909101918201527f33203133352032322e3520313237632d2e332d332e352d00000000000000000060e98201526101000195945050505050565b6000825161364c8184602087016125f5565b7f392d31342e352d31302d32362e372d2e372d31312e3320362e342d32332e38209201918252507f352e392d32372e356c312d3330203132302e352e327633302e3463302032203760208201527f2e362031352e3620362e352032392e312d312e322031352e352d31312033312e60408201526a322d31312e332033332e3760a81b6060820152606b01919050565b600082516136ed8184602087016125f5565b7f332e362d35302e352d342e312d35342e326c312d3330203132302e352e3276339201918252507f302e34633020322d342e362036302e332d342e382036322e38000000000000006020820152603901919050565b600083516137548184602088016125f5565b80830190507f6c2d392e36203133302e34632e372031302e382d32302e322031382e322d343381527f2e392031382e342d31342e342d2e342d34392d362d34362e382d31372e39222060208201527f7472616e73666f726d3d227472616e736c617465282e3229222f3e3c7061746860408201527f2069643d22672d752d6967222066696c6c3d2275726c2823676629222073747260608201526806f6b653d22233030360bc1b608082015283516138138160898401602088016125f5565b7f352220643d226d32382e362037342e32203130322e382e3500000000000000006089929091019182015260a101949350505050565b6000825161385b8184602087016125f5565b7f632d2e3220312e3620362031332e3520352032352e372d312e322031332e312d920191825250701c971a90191b171c169c971b901998171960791b6020820152603101919050565b600082516138b68184602087016125f5565b7f613439303120343930312030203020302d342e37203536000000000000000000920191825250601701919050565b600082516138f78184602087016125f5565b7f6c2d342037322e372d332e382034342e37632d2e3920382d31312e352031322e9201918252507f382d31392e332031322e382d392e3920312e372d333120312d34322e352d2e3460208201527f2d362d2e342d31332e342d372d31342e312d31342e342d342e352d35302e322d60408201527f382e382d38362d31312e322d3131342e322d2e352d352e382d000000000000006060820152607901919050565b600082516139aa8184602087016125f5565b7f392d31392e362d392e362d33322e322d2e372d31322e3820362e342d32342e3392019182525069101b171a16991a971a2d60b11b6020820152602a01919050565b600082516139fe8184602087016125f5565b71199719169a9b171a96999719169a9b971b2d60711b920191825250601201919050565b60008451613a348184602089016125f5565b80830190507f22207472616e73666f726d3d227472616e736c6174652830202d2e3329222f3e81526f3c656c6c697073652069643d226b653160801b60208201528451613a888160308401602089016125f5565b7f34222072793d2232322e3322207472616e73666f726d3d226d6174726978282e6030929091019182018190527f363533202d2e3036202e32313420322e3331362034372e32203139312e312922605083015271179f1e32b63634b839b29034b21e9135b29960711b60708301528451613b098160828501602089016125f5565b60829201918201527f393632202d2e3033202e303135202e34392033332e342039382e3129222f3e3c60a28201526217b39f60e91b60c282015260c50195945050505050565b60008651613b61818460208b016125f5565b6c03c706174682069643d226a2d7609c1b9083019081528651613b8b81600d840160208b016125f5565b7f3230382e39203133332e32632d312e332d32302039342e352d31392039342e37600d92909101918201527f2d312e336c2d312e31203233613339392e32203339392e322030203020312d39602d8201527f332e322e376c2d2e342d32322e345a22207472616e73666f726d3d226d617472604d8201527f697828312030203020312e30312030202d312e3429222f3e3c2f673e3c2f673e606d8201527f3c672069643d22672d752d7022207472616e73666f726d3d226d617472697828608d8201527f312e30303420302030202e393937202d31202e3729223e3c706174682069643d60ad82015267113396ba96b7b39960c11b60cd82015261333b613f16613f10613e29613e23613ca160d587018c612931565b7f352220643d226d3231322e34203133302038382e322d2e3263312031392e362d81527f31322e33203132322e352d32312e34203230352e382d342e342031352d322e3260208201527f2033322e3220362e352033312e386c2d342e382d352e3563362e392d2e33203160408201527f362e3420342e372032302e3520382e372d32342e332031302e352d363920313160608201527f2e362d39322d2e3920312e372d332e322031302d372e352032302e352d384c3260808201527f32342033363763372e392d322031322e332d31372e3120382d33312e322d392e60a08201527f362d39352e392d32322d3139352e342d31392e372d3230352e375a222074726160c08201527f6e73666f726d3d226d617472697828312e3036362030203020312e303338202d60e08201527f3137202d392e3429222f3e3c706174682069643d22672d752d6967222066696c6101008201527f6c3d2275726c282367662922207374726f6b653d2223303030000000000000006101208201526101390190565b89612931565b7f342220643d224d3232312e35203136372e336333322e3320312e372035382e3881527f20312036362e322d2e3720382e3120332e342d372e322038392e332d3135203160208201527f36382e332d392e3320342e382d32372e3720352e392d33362e342d2e324c323160408201527f392e3720313831632d2e342d362e382e322d31342e3720312e382d31332e375a60608201527f22207472616e73666f726d3d226d617472697828312030203020312e3035322060808201527f2e33202d32302e3829222f3e3c656c6c697073652069643d226b65330000000060a082015260bc0190565b86612931565b7f34222072793d2232322e3322207472616e73666f726d3d226d6174726978282e81527f373133202d2e303636202e33303520332e323937203233362e33203234312e326020820152671491179f1e17b39f60c11b604082015260480190565b60008651613f88818460208b016125f5565b6c0f1c185d1a081a590f489a8b5b609a1b9083019081528651613fb281600d840160208b016125f5565b7f3230382e39203133332e32632d312e332d32302039342e352d31392039342e37600d92909101918201527f2d312e336c2d312e31203233613339392e32203339392e322030203020312d39602d8201527f332e322e376c2d2e342d32322e345a22207472616e73666f726d3d226d617472604d8201527f6978282e38312030203020312e3338372034372e37202d34362e3729222f3e3c606d8201527f2f673e3c2f673e3c672069643d22672d752d6c223e3c706174682069643d2267608d820152650b5d4b5bd9cd60d21b60ad82015285516140978160b3840160208a016125f5565b612c0361420c612bef61416161415b60b3868801017f342220643d224d3231352e36203337332e326331392e322031302e342035382081527f31302e332037372e3820312e34762d35312e316c2e332d3139372e38632d323160208201527f20322e392d35392e3720342d37382030763234372e355a222f3e3c706174682060408201527f69643d22672d752d6967222066696c6c3d2275726c282367662922207374726f60608201526a6b653d222330343033303360a81b6080820152608b0190565b8a612931565b7f342220643d224d3232322e332031373163313620322e3620343920322e34203681527f362e3320306c2d312e38203138332e34632d31312e3820372e382d34312e322060208201527f31312e322d36342e362030563137315a22207472616e73666f726d3d226d617460408201527f726978283120302030202e3939392030202e3329222f3e3c656c6c69707365206060820152660d2c87a44d6ca760cb1b608082015260870190565b7f322e33222072793d2235322e3222207472616e73666f726d3d226d617472697881527f282e3933372030203020312e343834203233302e34203236342e3129222f3e3c60208201526217b39f60e91b604082015260430190565b60008651614279818460208b016125f5565b6c3c706174682069643d226a2d7760981b90830190815286516142a381600d840160208b016125f5565b7f3230372031333063352e312d392e382039352d392e362039372e372e33613537600d92909101918201527f2e342035372e3420302030203120362e332033342e38632d32332e3720332e32602d8201527f2d383820332e352d313131202e342e322d392e3820332d32372e3420372d3335604d8201527f2e355a22207472616e73666f726d3d226d6174726978282e3831203020302031606d8201527f2e3338372034372e37202d34362e3729222f3e3c2f673e3c2f673e3c67206964608d8201527f3d22672d752d77223e3c706174682069643d22672d752d6f673500000000000060ad820152855161439f8160c7840160208a016125f5565b612c0361459b612bef6144c161415b60c7868801017f342220643d224d3231352e36203337332e326331352e38203720353820362e3681527f2037372e3320302d2e352d33362e372d362e342d39342e3820302d3134312e3760208201527f20362d34332e382031322e382d36322e3720312e372d3130332e322d3231203260408201527f2e392d36312e3220342d37392e3520302d372e362034302e352d372036312e3160608201527f2d312e36203130332e3220362e342034392e3520312e36203130362e3920322e60808201527f31203134312e375a222f3e3c706174682069643d22672d752d6967222066696c60a08201527f6c3d2275726c282367662922207374726f6b653d22233034303330330000000060c082015260dc0190565b7f342220643d224d3231392e37203138352e326331352e3920322e36203533203381527f2037302e332e362d332e362032312d382036322e322d382e362038322e34763960208201527f312e34632d31352e3920362d34312e3120342d35342e3420306c2d2e332d393160408201527f2e34632e322d32302e392d332e342d36322e342d372d38335a22207472616e7360608201527f666f726d3d226d6174726978283120302030202e3939392030202e3829222f3e60808201526f3c656c6c697073652069643d226b653960801b60a082015260b00190565b7f322e33222072793d2235322e3222207472616e73666f726d3d227472616e736c81527f617465283233352e34203330302e3129222f3e3c2f673e000000000000000000602082015260370190565b600085516145fc818460208a016125f5565b6c1e3830ba341034b21e913516b160991b908301908152855161462681600d840160208a016125f5565b7f3230372031333063352e312d392e382039352d392e362039372e372e33613537600d92909101918201527f2e342035372e3420302030203120362e332033342e38632d32332e3720332e32602d8201527f2d383820332e352d313131202e342e322d392e3820332d32372e3420372d3335604d8201527f2e355a22207472616e73666f726d3d226d6174726978282e393420302030202e606d8201527f39312031352e332032352e3429222f3e3c2f673e3c2f673e3c672069643d2267608d8201527f2d752d62223e3c706174682069643d22672d752d6f6736222066696c6c3d222360ad8201527f666666222066696c6c2d6f7061636974793d222e3522207374726f6b653d222360cd8201527f30303022207374726f6b652d77696474683d22352220643d224d3230372e332060ed8201527f3134322e356332342e3820332e3920373320342e352039362e3520302035203261010d8201527f312e3820342036372e322d2e362039342e352d342e312031382e372d31302e3561012d8201527f2039302e3220312e35203131392e3520332e322031322e382d322e342033302e61014d8201527f322d31332e342032372e37682d32392e38632d362e322d31302d32392d2e372d61016d8201527f34362e362d2e376c2d35332e322e33632d32302e362d312e352d32312e382d3361018d8201527f322e3120362e382d33382e372033332d382e392035382e322d32332e382034346101ad8201527f2d38322e322d382d33352d31332d39352e372d352e322d3132302e345a2220746101cd8201527f72616e73666f726d3d227472616e736c617465282e33202e3329222f3e3c70616101ed8201527f74682069643d22672d752d6967222066696c6c3d2275726c282367662922207361020d8201527f74726f6b653d222330303022207374726f6b652d77696474683d22342220643d61022d8201527f226d3231372e32203137362e342038302e352e3463342e3320312e3220332e3461024d8201527f2031392e3320312033372e346c2d362e332033352e38632d382032392e372d3761026d8201527f2037382e34203020393020352e3820313320362e352033312d31322e3120333061028d8201527f2e352d31322d312e382d33342e362d312e342d34352e3320312e352d323320336102ad8201527f2e332d35382e3720342e322d373020312e362d31312d332e312d31312e322d316102cd8201527f362e3420302d31392e3961323035203230352030203020312032382e342d372e6102ed8201527f336332382e372d352e352033372e372d34342e352033312e332d37382e346c2d61030d8201527f31312e332d35312e34632d322d31352e352d332d33382e3720332e382d34302e61032d8201527f325a22207472616e73666f726d3d227472616e736c6174652830202e3429222f61034d8201527103e3c656c6c697073652069643d226b6531360741b61036d820152614b1b614acc613f10614a7361037f850189612931565b7f33222072793d22342e3122207472616e73666f726d3d227472616e736c61746581527f283136352e32203336342e3129222f3e3c656c6c697073652069643d226b65316020820152603160f81b604082015260410190565b7f332e36222072793d2231382e3522207472616e73666f726d3d227472616e736c81527f617465283232312e35203230342e3329222f3e3c2f673e000000000000000000602082015260370190565b979650505050505050565b60008551614b38818460208a016125f5565b6c0f1c185d1a081a590f489a8b5d609a1b9083019081528551614b6281600d840160208a016125f5565b7f3230342e36203132382e3663352e312d392e372039392e312d392e3420313031600d92909101918201527f2e382e3520312e3520392e3720332032382e3420352e352033352e392d32332e602d8201527f382e352d38392e322e322d3131342e322e356131393020313930203020302030604d8201527f20362e392d33362e395a22207472616e73666f726d3d226d6174726978282e38606d8201527f3120302030202e3837362034372e372036352e3529222f3e3c2f673e3c2f673e608d8201527f3c672069643d22672d752d74223e3c706174682069643d226b7034000000000060ad8201528451614c5e8160c88401602089016125f5565b7f352220643d224d3231322e36203137392e3463323020352e3520363220352e3260c892909101918201527f2038342e322e392d2e352033302e3420372034302e362031322e372035352e3760e88201527f2031382e392035302e362d31332e332038342e312d35342e322038342e312d346101088201527f372e3220302d37332e372d33362e342d35362e352d38332e3920372e332d31396101288201527f2e392031362d33342e372031332e382d35362e385a222f3e3c70617468206964610148820152643d226b703560d81b610168820152614b1b61016d820185612931565b60008551614d53818460208a016125f5565b80830190507f352220643d224d323735203336342e38632d382d372e372d31322e342d32362e81527f352d372e312d34342e374832343263392e312032302d382e332034362e372d3560208201527f2e392034342e372d31332e3920302d33312e3720322e382d33322e3320372e3360408201527f2d2e322039203130312e3520382e35203130312e35203020302d332e332d313960608201527f2e342d382e322d33302e332d372e335a22207472616e73666f726d3d2274726160808201527f6e736c617465282d3129222f3e3c706174682069643d226b7036222066696c6c60a08201527303d226e6f6e6522207374726f6b653d22233030360641b60c08201528551614e698160d4840160208a016125f5565b7f332220643d224d3237362e37203336392e3463322e3820332e362031302e362060d492909101918201527f372031362e3220352e3922207472616e73666f726d3d227472616e736c61746560f48201527f282d322e36202d332e3929222f3e3c706174682069643d226b7037222066696c6101148201527406c3d226e6f6e6522207374726f6b653d222330303605c1b610134820152614b1b615099613f10614f17610149850189612931565b7f332220643d224d3233362e3120333636632d2e3920332e342d382e3820352e3681527f2d313620342e3922207472616e73666f726d3d227472616e736c61746528302060208201527f2d2e3229222f3e3c706174682069643d226b7038222066696c6c3d2275726c2860408201527f2367662922207374726f6b653d222330303022207374726f6b652d776964746860608201527f3d22342220643d224d3231352e34203231372e336837362e3463342e3920392e60808201527f372031322032362e392031332e3520333520372033332e362d32302035372e3660a08201527f2d34382e352035382e382d3237202e352d35382e382d31392e372d35332e372d60c08201527f35382e3720312e392d382e3720382d32362e322031322e332d33352e315a222060e08201527f7472616e73666f726d3d226d6174726978282e39383620302030202e393820336101008201527f2e3720352e3129222f3e3c656c6c697073652069643d226b653132000000000061012082015261013b0190565b7f342e34222072793d2231352e3222207472616e73666f726d3d227472616e736c81527430ba329419189910191b1a971a1491179f1e17b39f60591b602082015260350190565b600085516150f2818460208a016125f5565b6c3c706174682069643d226a2d6760981b908301908152855161511c81600d840160208a016125f5565b7f3230332e35203132352e386331332e312d31312e312039322d372e3620313030600d92909101918201527f2e362d2e33203820362e3620382e392033312e3420392033392e362d3234202e602d8201527f352d3131372e342e372d3131372e342e37732d2e372d33332e3320372e382d34604d8201527f305a22207472616e73666f726d3d226d617472697828312e3038352030203020606d8201527f2e353432202d32332031323029222f3e3c2f673e3c2f673e3c672069643d2267608d820152722d752d67223e3c706174682069643d226b703960681b60ad820152845161520e8160c08401602089016125f5565b7f352220643d224d3139312e31203139372e3463323020352e34203130302e352060c092909101918201527f352e33203132322e37203120372e382032342e3220392034372e39203920363660e08201527f2e3520302033312d32342035362d36372e352035352e322d34372e3220302d366101008201527f382e372d33302d36392e332d35362d2e342d32302e3720322e312d34372e33206101208201527f352e312d36362e375a22207472616e73666f726d3d227472616e736c617465286101408201527f2d31202e3529222f3e3c706174682069643d226b703130000000000000000000610160820152614b1b610177820185612931565b6000855161531b818460208a016125f5565b80830190507f352220643d224d3237352e31203336352e37632d31302e342d372e362d31322e81527f382d32352e352d31302e342d34342e386c2d32322e392e3263362e312031392e60208201527f322d372e322034362e352d342e372034342e362d31342e312d312e332d33332e60408201527f3620322e332d33332e3420362d2e322038203130312e362039203130312e362e60608201527f3420302d332e332d31392e332d372e352d33302e322d362e345a22207472616e60808201527f73666f726d3d227472616e736c617465282d322e32202d2e3229222f3e3c706160a08201527f74682069643d226b703131222066696c6c3d226e6f6e6522207374726f6b653d60c082015264022233030360dc1b60e082015285516154488160e5840160208a016125f5565b61333b615673612bef6154f161415b60e5868801017f332220643d224d3237362e37203336392e3463312e3820332e342031302e362081527f372031362e3220352e3922207472616e73666f726d3d227472616e736c61746560208201527f282d352e31202d342e3229222f3e3c706174682069643d226b7031322220666960408201527506c6c3d226e6f6e6522207374726f6b653d22233030360541b606082015260760190565b7f332220643d224d3233362e3120333636632d312e3720332e372d382e3220352e81527f382d313620342e3922207472616e73666f726d3d227472616e736c617465282d60208201527f31202d2e3829222f3e3c706174682069643d226b703133222066696c6c3d227560408201527f726c282367662922207374726f6b653d222330303022207374726f6b652d776960608201527f6474683d22342220643d224d3230302e35203231382e324833303763342e352060808201527f392e34203720333320362e352034332e3820302033312e372d32312e3720353060a08201527f2e332d35392e352035302e332d33352e3620302d35392e332d32312e362d353860c08201527f2e382d3535202e322d31302e3520312e312d32392e3320352e332d33392e315a60e08201527f22207472616e73666f726d3d226d6174726978282e39383620302030202e39386101008201527f20322e3720332e3129222f3e3c656c6c697073652069643d226b65313300000061012082015261013d0190565b7f34222072793d2232322e3522207472616e73666f726d3d227472616e736c6174815272329419181c171c90191a989491179f1e17b39f60691b602082015260330190565b600086516156ca818460208b016125f5565b7f3c67207374796c653d22616e696d6174696f6e3a6232740000000000000000009083019081528651615704816017840160208b016125f5565b7f7472616e736c617465283235322e35203335302e3729223e3c67206f70616369601792909101918201527f74793d223022207374796c653d22616e696d6174696f6e3a623263000000000060378201528551615768816052840160208a016125f5565b7f6d617472697828322e3033362030203020322e31202d3139392e33202d353137605292909101918201527314911f1e31b4b931b6329034b21e9135b2989a9160611b607282015284516157c38160868401602089016125f5565b7f3130302e36203235302e3229222f3e3c636972636c652069643d226b653136226086929091019182015283516158018160a68401602088016125f5565b0160a601979650505050505050565b60008651615822818460208b016125f5565b7f3934203234342e3929222f3e3c636972636c652069643d226b65313722000000908301908152865161585c81601d840160208b016125f5565b7f3130312e38203234322e3229222f3e3c2f673e3c2f673e3c67207374796c653d601d92909101918201526d08985b9a5b585d1a5bdb8e988c5d60921b603d82015285516158b181604b840160208a016125f5565b7f7472616e736c61746528323536203335302e3729223e3c67206f706163697479604b92909101918201527f3d223022207374796c653d22616e696d6174696f6e3a62316300000000000000606b82015284516159158160848401602089016125f5565b7f6d617472697828312e3635312030203020312e353838202d3136312e36202d33608492909101918201527f39302e3929223e3c636972636c652069643d226b65313822000000000000000060a482015261333b60bc820185612931565b6000855160206159868285838b016125f5565b7f3130302e36203235302e3229222f3e3c636972636c652069643d226b6531392291840191825286516159be81838501848b016125f5565b7f3934203234342e3929222f3e3c636972636c652069643d226b6532302200000092018181019290925285516159fa81603d85018985016125f5565b7f3130312e38203234322e3229222f3e3c2f673e3c2f673e3c67207374796c653d603d93909101928301526d08985b9a5b585d1a5bdb8e988cdd60921b605d8301528451615a4e81606b85018489016125f5565b91909101606b01979650505050505050565b60008651615a72818460208b016125f5565b80830190507f7472616e736c617465283235372e36203332362e3929223e3c67206f7061636981527f74793d223022207374796c653d22616e696d6174696f6e3a623363000000000060208201528651615ad381603b840160208b016125f5565b7f6d617472697828322e3033362030203020322e31202d3139392e33202d353137603b92909101918201527314911f1e31b4b931b6329034b21e9135b299189160611b605b8201528551615b2e81606f840160208a016125f5565b7f39352e372032353529222f3e3c636972636c652069643d226b65323222000000606f92909101918201528451615b6c81608c8401602089016125f5565b7f3934203234342e3929222f3e3c2f673e3c2f673e3c656c6c697073652069643d608c929091019182015265113396ba96b960d11b60ac82015261333b615bb660b2830186612931565b7f3135222072793d22322e3622207472616e73666f726d3d227472616e736c61748152610ca560f31b602082015260220190565b60008251615bfc8184602087016125f5565b70191c1910199b9b9491179f1e17b9bb339f60791b920191825250601101919050565b60008251615c318184602087016125f5565b74191a99971b90199b98971a1491179f1e17b9bb339f60591b920191825250601501919050565b634e487b7160e01b600052601260045260246000fd5b600082615c7d57615c7d615c58565b500490565b80820281158282048414176104cf576104cf6128e7565b600082615ca857615ca8615c58565b500690565b600060018201615cbf57615cbf6128e7565b5060010190565b818103818111156104cf576104cf6128e7565b60ff81811683821601908111156104cf576104cf6128e7565b634e487b7160e01b600052603260045260246000fdfe20723d22332e34222066696c6c3d226e6f6e6522207374726f6b653d2272676261283235352c3235352c3235352c302e352922207374726f6b652d77696474683d22312e3522207472616e73666f726d3d226d6174726978282e35363820302030202e3536332022207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6422207374726f6b652d77696474683d22222066696c6c3d222366666622207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6422207374726f6b652d77696474683d22312220643d226d3b616e696d6174696f6e2d74696d696e672d66756e6374696f6e3a63756269632d62657a696572282e34322c302c2e35382c31297d4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3522207374726f6b653d222330303022207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6422207374726f6b652d77696474683d2220353030306d73206c696e65617220696e66696e697465206e6f726d616c20666f72776172647322207472616e73666f726d3d227b7472616e73666f726d3a7472616e736c617465283235302e3070782c3232362e3370782920726f74617465283064656729207363616c6528312c31222066696c6c3d222366666622207374726f6b652d77696474683d223022206f7061636974793d222e35222072783d22a2646970667358221220547a3fa8e8c84c72f65e9133fbd7ebcbe546a9ae267c90ab94daa20ce66326ba64736f6c63430008130033
Deployed Bytecode
0x6080604052600436106101665760003560e01c806370a08231116100d1578063b88d4fde1161008a578063cbccefb211610064578063cbccefb2146103fc578063e985e9c514610423578063f2fde38b14610443578063f8dcbddb1461046357600080fd5b8063b88d4fde1461039c578063c87b56dd146103af578063cad45358146103cf57600080fd5b806370a08231146102f4578063715018a6146103145780638da5cb5b1461032957806395d89b4114610347578063a0712d681461035c578063a22cb4651461037c57600080fd5b806323b872dd1161012357806323b872dd1461025057806332cb6b0c1461026357806342842e0e14610279578063632e1dfe1461028c5780636352211e146102b457806363bc312a146102d457600080fd5b806301ffc9a71461016b57806306fdde03146101a0578063081812fc146101c2578063095ea7b3146101fa5780630bc7a2de1461020f57806318160ddd14610233575b600080fd5b34801561017757600080fd5b5061018b6101863660046125d8565b610483565b60405190151581526020015b60405180910390f35b3480156101ac57600080fd5b506101b56104d5565b6040516101979190612645565b3480156101ce57600080fd5b506101e26101dd366004612658565b610567565b6040516001600160a01b039091168152602001610197565b61020d61020836600461268d565b6105ab565b005b34801561021b57600080fd5b5061022560095481565b604051908152602001610197565b34801561023f57600080fd5b506001546000540360001901610225565b61020d61025e3660046126b7565b61064b565b34801561026f57600080fd5b50610225600a5481565b61020d6102873660046126b7565b6107e3565b34801561029857600080fd5b506101e273cade4b581e3ab2be3f74422ae0954013e9bff47881565b3480156102c057600080fd5b506101e26102cf366004612658565b610803565b3480156102e057600080fd5b5061020d6102ef366004612658565b61080e565b34801561030057600080fd5b5061022561030f3660046126f3565b6108a5565b34801561032057600080fd5b5061020d6108f4565b34801561033557600080fd5b506008546001600160a01b03166101e2565b34801561035357600080fd5b506101b5610908565b34801561036857600080fd5b5061020d610377366004612658565b610917565b34801561038857600080fd5b5061020d61039736600461270e565b610a42565b61020d6103aa366004612760565b610aae565b3480156103bb57600080fd5b506101b56103ca366004612658565b610af8565b3480156103db57600080fd5b506102256103ea3660046126f3565b600b6020526000908152604090205481565b34801561040857600080fd5b50600c546104169060ff1681565b6040516101979190612852565b34801561042f57600080fd5b5061018b61043e36600461287a565b610b6e565b34801561044f57600080fd5b5061020d61045e3660046126f3565b610b9c565b34801561046f57600080fd5b5061020d61047e366004612658565b610c12565b60006301ffc9a760e01b6001600160e01b0319831614806104b457506380ac58cd60e01b6001600160e01b03198316145b806104cf5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546104e4906128ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610510906128ad565b801561055d5780601f106105325761010080835404028352916020019161055d565b820191906000526020600020905b81548152906001019060200180831161054057829003601f168201915b5050505050905090565b600061057282610c4f565b61058f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006105b682610803565b9050336001600160a01b038216146105ef576105d28133610b6e565b6105ef576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061065682610c84565b9050836001600160a01b0316816001600160a01b0316146106895760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176106d6576106b98633610b6e565b6106d657604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166106fd57604051633a954ecd60e21b815260040160405180910390fd5b801561070857600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b8416900361079a576001840160008181526004602052604081205490036107985760005481146107985760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6107fe83838360405180602001604052806000815250610aae565b505050565b60006104cf82610c84565b600a54600154600054839190036000190161082991906128fd565b11156108505760405162461bcd60e51b815260040161084790612910565b60405180910390fd5b3373cade4b581e3ab2be3f74422ae0954013e9bff478146108985760405162461bcd60e51b81526020600482015260026024820152614e6f60f01b6044820152606401610847565b6108a23382610cfa565b50565b60006001600160a01b0382166108ce576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6108fc610df8565b6109066000610e52565b565b6060600380546104e4906128ad565b6001600c5460ff1660018111156109305761093061283c565b146109685760405162461bcd60e51b81526020600482015260086024820152674e6f74204c69766560c01b6044820152606401610847565b600954336000908152600b60205260409020546109869083906128fd565b11156109a45760405162461bcd60e51b815260040161084790612910565b600a5460015460005483919003600019016109bf91906128fd565b11156109dd5760405162461bcd60e51b815260040161084790612910565b323314610a115760405162461bcd60e51b81526020600482015260026024820152614e6f60f01b6044820152606401610847565b610a1b3382610cfa565b336000908152600b602052604081208054839290610a3a9084906128fd565b909155505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ab984848461064b565b6001600160a01b0383163b15610af257610ad584848484610ea4565b610af2576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606000610b0583610f8f565b9050606081610b1b610b1686611911565b612227565b604051602001610b2c92919061294d565b6040516020818303038152906040529050610b4681612227565b604051602001610b5691906129c5565b60405160208183030381529060405292505050919050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b610ba4610df8565b6001600160a01b038116610c095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610847565b6108a281610e52565b610c1a610df8565b806001811115610c2c57610c2c61283c565b600c805460ff191660018381811115610c4757610c4761283c565b021790555050565b600081600111158015610c63575060005482105b80156104cf575050600090815260046020526040902054600160e01b161590565b60008180600111610ce157600054811015610ce15760008181526004602052604081205490600160e01b82169003610cdf575b80600003610cd8575060001901600081815260046020526040902054610cb7565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b6000805490829003610d1f5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114610dce57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101610d96565b5081600003610def57604051622e076360e81b815260040160405180910390fd5b60005550505050565b6008546001600160a01b031633146109065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610847565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290610ed9903390899088908890600401612a0a565b6020604051808303816000875af1925050508015610f14575060408051601f3d908101601f19168201909252610f1191810190612a47565b60015b610f72573d808015610f42576040519150601f19603f3d011682016040523d82523d6000602084013e610f47565b606091505b508051600003610f6a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60606000610f9c8361237a565b905060608060608360000151600003610fd8576040518060400160405280600981526020016842726f776e20416c6560b81b81525092506116c1565b835160010361100c576040518060400160405280600b81526020016a4261726c65792057696e6560a81b81525092506116c1565b835160020361104657604051806040016040528060118152602001704f786964697a656420486f6d656272657760781b81525092506116c1565b835160030361107557604051806040016040528060068152602001652837b93a32b960d11b81525092506116c1565b83516004036110ae576040518060400160405280601081526020016f223cb2b21023b932b2b7102630b3b2b960811b81525092506116c1565b83516005036110e5576040518060400160405280600e81526020016d23b2b936b0b7102834b639b732b960911b81525092506116c1565b835160060361111f576040518060400160405280601181526020017056616e696c6c6120437265616d20416c6560781b81525092506116c1565b8351600703611156576040518060400160405280600e81526020016d20b6b2b934b1b0b7102630b3b2b960911b81525092506116c1565b8351600803611186576040518060400160405280600781526020016643657276657a6160c81b81525092506116c1565b83516009036111b7576040518060400160405280600881526020016748617a792049504160c01b81525092506116c1565b8351600a036111e8576040518060400160405280600881526020016750616c6520416c6560c01b81525092506116c1565b8351600b0361121e576040518060400160405280600d81526020016c4d756e6963682048656c6c657360981b81525092506116c1565b8351600c0361124d5760405180604001604052806006815260200165096ded8e6c6d60d31b81525092506116c1565b8351600d03611281576040518060400160405280600b81526020016a21bd32b1b4102630b3b2b960a91b81525092506116c1565b8351600e036112b5576040518060400160405280600b81526020016a13d8dd1bd8995c99995cdd60aa1b81525092506116c1565b8351600f036112e9576040518060400160405280600b81526020016a20b6b132b9102630b3b2b960a91b81525092506116c1565b835160100361131c576040518060400160405280600a815260200169446f70706c65626f636b60b01b81525092506116c1565b8351601103611353576040518060400160405280600e81526020016d22b733b634b9b4102134ba3a32b960911b81525092506116c1565b8351601203611386576040518060400160405280600a8152602001695374726f6e6720416c6560b01b81525092506116c1565b83516013036113b5576040518060400160405280600681526020016526b0b93d32b760d11b81525092506116c1565b83516014036113e1576040518060400160405280600381526020016249504160e81b81525092506116c1565b8351601503611414576040518060400160405280600a815260200169446f75626c652049504160b01b81525092506116c1565b835160160361144b576040518060400160405280600e81526020016d10995b19da585b88151c9a5c195b60921b81525092506116c1565b83516017036114795760405180604001604052806005815260200164109b1bdb9960da1b81525092506116c1565b83516018036114a8576040518060400160405280600681526020016529b0b4b9b7b760d11b81525092506116c1565b83516019036114d55760405180604001604052806004815260200163476f736560e01b81525092506116c1565b8351601a0361150a576040518060400160405280600c81526020016b2b34b2b73730902630b3b2b960a11b81525092506116c1565b8351601b0361153d576040518060400160405280600a815260200169547269706c652049504160b01b81525092506116c1565b8351601c0361156a576040518060400160405280600481526020016329b7bab960e11b81525092506116c1565b8351601d0361159a576040518060400160405280600781526020016652656420416c6560c81b81525092506116c1565b8351601e036115c957604051806040016040528060068152602001654c616d62696360d01b81525092506116c1565b8351601f036115fa576040518060400160405280600881526020016757696c6420416c6560c01b81525092506116c1565b8351602003611632576040518060400160405280600f81526020016e111c9e48125c9a5cda0814dd1bdd5d608a1b81525092506116c1565b8351602103611669576040518060400160405280600e81526020016d125b5c195c9a585b0814dd1bdd5d60921b81525092506116c1565b835160220361169f576040518060400160405280600d81526020016c13d85d1b59585b0814dd1bdd5d609a1b81525092506116c1565b604051806040016040528060068152602001652837b93a32b960d11b81525092505b6002846020015110156116fb576040518060400160405280600d81526020016c125b5c195c9a585b08141a5b9d609a1b8152509150611858565b600484602001511015611735576040518060400160405280600d81526020016c105b595c9a58d85b88141a5b9d609a1b8152509150611858565b60068460200151101561176957604051806040016040528060078152602001662834b639b732b960c91b8152509150611858565b60088460200151101561179c57604051806040016040528060068152602001655374616e676560d01b8152509150611858565b600a846020015110156117cf57604051806040016040528060068152602001652bb2b4bd32b760d11b8152509150611858565b600b84602001511015611804576040518060400160405280600881526020016711185cc8109bdbdd60c21b8152509150611858565b600d846020015110156118365760405180604001604052806005815260200164054756c69760dc1b8152509150611858565b6040518060400160405280600681526020016511dbd89b195d60d21b81525091505b83604001516000036118885750604080518082019091526007815266084e4d2e8d2e6d60cb1b60208201526118d3565b83604001516001036118b557506040805180820190915260048152634469766560e01b60208201526118d3565b50604080518082019091526005815264092e4d2e6d60db1b60208201525b60006118de87612496565b848585856040516020016118f6959493929190612a64565b60408051601f19818403018152919052979650505050505050565b60608060608060608060006119258861237a565b905060048160000151101561197b576040518060400160405280600681526020016536613266316160d01b81525095506040518060400160405280600681526020016519319899181b60d11b8152509450611b53565b8051600511156119cc5760405180604001604052806006815260200165313332b3183360d11b81525095506040518060400160405280600681526020016503437353931360d41b8152509450611b53565b8051600e1115611a1d576040518060400160405280600681526020016566666635616560d01b81525095506040518060400160405280600681526020016565316165323960d01b8152509450611b53565b805160141115611a6e576040518060400160405280600681526020016532b33098183360d11b81525095506040518060400160405280600681526020016503539333631360d41b8152509450611b53565b8051601c1115611abf576040518060400160405280600681526020016566366365353160d01b81525095506040518060400160405280600681526020016538353636313760d01b8152509450611b53565b805160201115611b10576040518060400160405280600681526020016537653133303560d01b8152509550604051806040016040528060068152602001651930981a181960d11b8152509450611b53565b6040518060400160405280600681526020016533373132303560d01b81525095506040518060400160405280600681526020016530373033303160d01b81525094505b60006040518060a0016040528060678152602001615d096067913990506000604051806060016040528060348152602001615ee160349139905060006040518060a00160405280606b8152602001615e76606b913990506000604051806080016040528060528152602001615daf60529139905060006040518060600160405280603f8152602001615d70603f913990506000604051806060016040528060308152602001615f516030913990506000604051806060016040528060358152602001615e0160359139905060006040518060600160405280603c8152602001615f15603c9139905080828284604051602001611c529493929190612c10565b6040516020818303038152906040529e508e818383604051602001611c7a9493929190612d20565b6040516020818303038152906040529e508e8e8e604051602001611ca0939291906130f8565b6040516020818303038152906040529e508860400151600003611d25576040518060400160405280600681526020016503235323332360d41b8152509b506040518060400160405280600681526020016534373235323560d01b8152509a506040518060400160405280600681526020016533323135313560d01b8152509950611df0565b8860400151600103611d9957604051806040016040528060068152602001651c191ab319b360d11b8152509b506040518060400160405280600681526020016506e6468c664760d31b8152509a506040518060400160405280600681526020016535383339316360d01b8152509950611df0565b6040805180820182526006808252650c990cd94c9960d21b602080840191909152835180850185528281526534393333316560d01b908201528351808501909452908352650666a646c62760d31b908301529c509a505b8e8c8c8c604051602001611e0794939291906131a8565b6040516020818303038152906040529e508e87604051602001611e2b929190613347565b6040516020818303038152906040529e50600489602001511015611fe5578e8587604051602001611e5e939291906134a1565b6040516020818303038152906040529e50600289602001511015611ea3578e604051602001611e8d919061363a565b6040516020818303038152906040529e50611ec6565b8e604051602001611eb491906136db565b6040516020818303038152906040529e505b8e84604051602001611ed9929190613742565b6040516020818303038152906040529e50600289602001511015611f1e578e604051602001611f089190613849565b6040516020818303038152906040529e50611f41565b8e604051602001611f2f91906138a4565b6040516020818303038152906040529e505b8e604051602001611f5291906138e5565b6040516020818303038152906040529e50600289602001511015611f97578e604051602001611f819190613998565b6040516020818303038152906040529e50611fba565b8e604051602001611fa891906139ec565b6040516020818303038152906040529e505b8e8384604051602001611fcf93929190613a22565b6040516020818303038152906040529e50612118565b60068960200151101561200b578e85878686604051602001611fcf959493929190613b4f565b600889602001511015612031578e85878686604051602001611fcf959493929190613f76565b600a89602001511015612057578e85878686604051602001611fcf959493929190614267565b600b8960200151101561207b578e858485604051602001611fcf94939291906145ea565b600d896020015110156120c7578e85878860405160200161209f9493929190614b26565b6040516020818303038152906040529e508e848585604051602001611fcf9493929190614d41565b8e8587886040516020016120de94939291906150e0565b6040516020818303038152906040529e508e8485856040516020016121069493929190615309565b6040516020818303038152906040529e505b8e87888a8b6040516020016121319594939291906156b8565b6040516020818303038152906040529e508e8888898b60405160200161215b959493929190615810565b6040516020818303038152906040529e508e8889896040516020016121839493929190615973565b6040516020818303038152906040529e508e87898a866040516020016121ad959493929190615a60565b6040516020818303038152906040529e508860200151600a036121f1578e6040516020016121db9190615bea565b6040516020818303038152906040529e50612214565b8e6040516020016122029190615c1f565b6040516020818303038152906040529e505b5050505050505050505050505050919050565b6060815160000361224657505060408051602081019091526000815290565b6000604051806060016040528060408152602001615e36604091399050600060038451600261227591906128fd565b61227f9190615c6e565b61228a906004615c82565b67ffffffffffffffff8111156122a2576122a261274a565b6040519080825280601f01601f1916602001820160405280156122cc576020820181803683370190505b509050600182016020820185865187015b80821015612338576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506122dd565b505060038651066001811461235457600281146123675761236f565b603d6001830353603d600283035361236f565b603d60018303535b509195945050505050565b61239e60405180606001604052806000815260200160008152602001600081525090565b60006023836040516020016123c091815261623160f01b602082015260220190565b6040516020818303038152906040528051906020012060001c6123e39190615c99565b90506000600f8460405160200161240791815261673160f01b602082015260220190565b6040516020818303038152906040528051906020012060001c61242a9190615c99565b9050600060038560405160200161245091815263626b673160e01b602082015260240190565b6040516020818303038152906040528051906020012060001c6124739190615c99565b604080516060810182529485526020850193909352918301919091525092915050565b6060816000036124bd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124e757806124d181615cad565b91506124e09050600a83615c6e565b91506124c1565b60008167ffffffffffffffff8111156125025761250261274a565b6040519080825280601f01601f19166020018201604052801561252c576020820181803683370190505b509050815b85156125b957612542600182615cc6565b90506000612551600a88615c6e565b61255c90600a615c82565b6125669088615cc6565b612571906030615cd9565b905060008160f81b90508084848151811061258e5761258e615cf2565b60200101906001600160f81b031916908160001a9053506125b0600a89615c6e565b97505050612531565b50949350505050565b6001600160e01b0319811681146108a257600080fd5b6000602082840312156125ea57600080fd5b8135610cd8816125c2565b60005b838110156126105781810151838201526020016125f8565b50506000910152565b600081518084526126318160208601602086016125f5565b601f01601f19169290920160200192915050565b602081526000610cd86020830184612619565b60006020828403121561266a57600080fd5b5035919050565b80356001600160a01b038116811461268857600080fd5b919050565b600080604083850312156126a057600080fd5b6126a983612671565b946020939093013593505050565b6000806000606084860312156126cc57600080fd5b6126d584612671565b92506126e360208501612671565b9150604084013590509250925092565b60006020828403121561270557600080fd5b610cd882612671565b6000806040838503121561272157600080fd5b61272a83612671565b91506020830135801515811461273f57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561277657600080fd5b61277f85612671565b935061278d60208601612671565b925060408501359150606085013567ffffffffffffffff808211156127b157600080fd5b818701915087601f8301126127c557600080fd5b8135818111156127d7576127d761274a565b604051601f8201601f19908116603f011681019083821181831017156127ff576127ff61274a565b816040528281528a602084870101111561281857600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b634e487b7160e01b600052602160045260246000fd5b602081016002831061287457634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561288d57600080fd5b61289683612671565b91506128a460208401612671565b90509250929050565b600181811c908216806128c157607f821691505b6020821081036128e157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104cf576104cf6128e7565b6020808252600790820152664d61782065786360c81b604082015260600190565b600081516129438185602086016125f5565b9290920192915050565b6000835161295f8184602088016125f5565b80830190507f5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b81526618985cd94d8d0b60ca1b602082015283516129aa8160278401602088016125f5565b61227d60f01b60279290910191820152602901949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516129fd81601d8501602087016125f5565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a3d90830184612619565b9695505050505050565b600060208284031215612a5957600080fd5b8151610cd8816125c2565b7f7b226e616d65223a202243727970746f50696e74732023000000000000000000815260008651612a9c816017850160208b016125f5565b6201016960ed1b6017918401918201528651612abf81601a840160208b016125f5565b7f222c20226465736372697074696f6e223a202231303025206f6e2d636861696e601a92909101918201527f2053564720626565722e222c202261747472696275746573223a5b0000000000603a8201527f7b2274726169745f74797065223a202242656572222c202276616c7565223a206055820152601160f91b60758201528551612b53816076840160208a016125f5565b612c03612bf5612bef612bc6612bb7612bb1612b7d6076888a010162089f4b60ea1b815260030190565b7f7b2274726169745f74797065223a2022476c617373222c202276616c7565223a815261101160f11b602082015260220190565b8b612931565b62089f4b60ea1b815260030190565b7f7b2274726169745f74797065223a2022507562222c202276616c7565223a2022815260200190565b87612931565b61227d60f01b815260020190565b9998505050505050505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222069643d2267222077696474683d223531322220686569676860208201527f743d22353132223e3c7374796c653e406b65796672616d657320672d752d666760408201526474737b302560d81b606082015260008551612ca2816065850160208a016125f5565b61293b60f01b6065918401918201528551612cc4816067840160208a016125f5565b663236252c37302560c81b606792909101918201528451612cec81606e8401602089016125f5565b642e3135293b60d81b606e92909101918201528351612d128160738401602088016125f5565b016073019695505050505050565b60008551612d32818460208a016125f5565b6235302560e81b9083019081528551612d52816003840160208a016125f5565b632e31293b60e01b600392909101918201528451612d778160078401602089016125f5565b61746f60f01b600792909101918201528351612d9a8160098401602088016125f5565b7f293b7d7d406b65796672616d6573206232747b30257b7472616e73666f726d3a600992909101918201527f7472616e736c617465283235322e3470782c3335302e377078297d3630257b7460298201527f72616e73666f726d3a7472616e736c617465283235322e3170782c3333352e3560498201527f7078297d746f7b7472616e73666f726d3a7472616e736c617465283234302e3960698201527f70782c3137362e367078297d7d406b65796672616d6573206232637b30252c3660898201527f30252c746f7b6f7061636974793a307d3930257b6f7061636974793a317d7d4060a98201527f6b65796672616d6573206231747b30257b7472616e73666f726d3a7472616e7360c98201527f6c6174652832353670782c3335302e377078297d3430252c746f7b7472616e7360e98201527f666f726d3a7472616e736c617465283236352e3470782c3138307078297d7d406101098201527f6b65796672616d6573206231637b30252c3430252c746f7b6f7061636974793a6101298201527f307d3330257b6f7061636974793a317d7d406b65796672616d6573206233747b6101498201527f30257b7472616e73666f726d3a7472616e736c617465283235372e3570782c336101698201527f32362e397078297d3238257b7472616e73666f726d3a7472616e736c617465286101898201527f3235322e3370782c3332382e317078297d3638252c746f7b7472616e73666f726101a98201527f6d3a7472616e736c617465283234392e3270782c3137342e317078297d7d406b6101c98201527f65796672616d6573206233637b30252c3238252c3638252c746f7b6f706163696101e98201527f74793a307d3538257b6f7061636974793a317d7d3c2f7374796c653e3c6465666102098201527f733e3c6c696e6561724772616469656e742069643d226766222078313d222e356102298201527f222078323d222e35222079313d2230222079323d223122206772616469656e746102498201527f556e6974733d226f626a656374426f756e64696e67426f7822207370726561646102698201527f4d6574686f643d22706164223e3c73746f702069643d2267662d3022206f6666610289820152757365743d223025222073746f702d636f6c6f723d222360501b6102a98201526102bf019695505050505050565b6000845161310a8184602089016125f5565b84519083019061311e8183602089016125f5565b8082019150507f222f3e3c73746f702069643d2267312d3122206f66667365743d22313030252281526d2073746f702d636f6c6f723d222360901b6020820152835161317181602e8401602088016125f5565b7f222f3e3c2f6c696e6561724772616469656e743e3c2f646566733e0000000000602e929091019182015260490195945050505050565b600085516131ba818460208a016125f5565b80830190507f3c672069643d22672d752d6267223e3c726563742069643d227231302220776981527f6474683d2235313222206865696768743d22353132222066696c6c3d222300006020820152855161321b81603e840160208a016125f5565b7f222f3e3c726563742069643d22723131222077696474683d2235313222206865603e929091019182015273696768743d223231332e37222066696c6c3d222360601b605e82015284516132768160728401602089016125f5565b7f22207472616e73666f726d3d227472616e736c6174652830203239382e332922607292909101918201527f2f3e3c726563742069643d22723132222077696474683d2235313222206865696092820152726768743d223231332e37222066696c6c3d222360681b60b282015283516132f68160c58401602088016125f5565b61333b60c5828401017f22207472616e73666f726d3d226d6174726978283120302030202e3136312030815269101a1b9b971b1491179f60b11b6020820152602a0190565b98975050505050505050565b600083516133598184602088016125f5565b80830190507f3c2f673e3c656c6c697073652069643d22672d752d7377222066696c6c3d222381527f303530353035222066696c6c2d6f7061636974793d222e31222072783d22373360208201527f2e32222072793d2232322e3822207472616e73666f726d3d226d61747269782860408201527f312e313534202e3231202d2e32343420312e333420323138203335302e37292260608201527f2f3e3c67207374796c653d22616e696d6174696f6e3a672d752d6667747300006080820152835161342c81609e8401602088016125f5565b7f726f74617465282d2e32203534373038202d36303138312e3429223e3c672069609e92909101918201527f643d22672d752d666722207472616e73666f726d3d227472616e736c6174652860be8201526f16991a98171b101699189c971a14911f60811b60de82015260ee01949350505050565b600084516134b38184602089016125f5565b6f0f1c185d1a081a590f489a8b5c1a5b9d60821b90830190815284516134e08160108401602089016125f5565b7f31382e372037312e34203132322e372e382d312e352d32322e33632e362d3137601092909101918201527f2e372d3132302e332d31362e352d3132302e3520307631332e386c2d2e37203760308201527f2e375a22207472616e73666f726d3d226d617472697828312030203020312e3560508201527f3132203137322e332036372e3829222f3e3c2f673e3c2f673e3c672069643d2260708201527f672d752d6d7022207472616e73666f726d3d227472616e736c6174652831373260908201527f2e342031303029223e3c706174682069643d22672d752d6f670000000000000060b082015283516135dc8160c98401602088016125f5565b7f352220643d224d33342e38203236372e314332392e35203230322e382032332e60c992909101918201527f33203133352032322e3520313237632d2e332d332e352d00000000000000000060e98201526101000195945050505050565b6000825161364c8184602087016125f5565b7f392d31342e352d31302d32362e372d2e372d31312e3320362e342d32332e38209201918252507f352e392d32372e356c312d3330203132302e352e327633302e3463302032203760208201527f2e362031352e3620362e352032392e312d312e322031352e352d31312033312e60408201526a322d31312e332033332e3760a81b6060820152606b01919050565b600082516136ed8184602087016125f5565b7f332e362d35302e352d342e312d35342e326c312d3330203132302e352e3276339201918252507f302e34633020322d342e362036302e332d342e382036322e38000000000000006020820152603901919050565b600083516137548184602088016125f5565b80830190507f6c2d392e36203133302e34632e372031302e382d32302e322031382e322d343381527f2e392031382e342d31342e342d2e342d34392d362d34362e382d31372e39222060208201527f7472616e73666f726d3d227472616e736c617465282e3229222f3e3c7061746860408201527f2069643d22672d752d6967222066696c6c3d2275726c2823676629222073747260608201526806f6b653d22233030360bc1b608082015283516138138160898401602088016125f5565b7f352220643d226d32382e362037342e32203130322e382e3500000000000000006089929091019182015260a101949350505050565b6000825161385b8184602087016125f5565b7f632d2e3220312e3620362031332e3520352032352e372d312e322031332e312d920191825250701c971a90191b171c169c971b901998171960791b6020820152603101919050565b600082516138b68184602087016125f5565b7f613439303120343930312030203020302d342e37203536000000000000000000920191825250601701919050565b600082516138f78184602087016125f5565b7f6c2d342037322e372d332e382034342e37632d2e3920382d31312e352031322e9201918252507f382d31392e332031322e382d392e3920312e372d333120312d34322e352d2e3460208201527f2d362d2e342d31332e342d372d31342e312d31342e342d342e352d35302e322d60408201527f382e382d38362d31312e322d3131342e322d2e352d352e382d000000000000006060820152607901919050565b600082516139aa8184602087016125f5565b7f392d31392e362d392e362d33322e322d2e372d31322e3820362e342d32342e3392019182525069101b171a16991a971a2d60b11b6020820152602a01919050565b600082516139fe8184602087016125f5565b71199719169a9b171a96999719169a9b971b2d60711b920191825250601201919050565b60008451613a348184602089016125f5565b80830190507f22207472616e73666f726d3d227472616e736c6174652830202d2e3329222f3e81526f3c656c6c697073652069643d226b653160801b60208201528451613a888160308401602089016125f5565b7f34222072793d2232322e3322207472616e73666f726d3d226d6174726978282e6030929091019182018190527f363533202d2e3036202e32313420322e3331362034372e32203139312e312922605083015271179f1e32b63634b839b29034b21e9135b29960711b60708301528451613b098160828501602089016125f5565b60829201918201527f393632202d2e3033202e303135202e34392033332e342039382e3129222f3e3c60a28201526217b39f60e91b60c282015260c50195945050505050565b60008651613b61818460208b016125f5565b6c03c706174682069643d226a2d7609c1b9083019081528651613b8b81600d840160208b016125f5565b7f3230382e39203133332e32632d312e332d32302039342e352d31392039342e37600d92909101918201527f2d312e336c2d312e31203233613339392e32203339392e322030203020312d39602d8201527f332e322e376c2d2e342d32322e345a22207472616e73666f726d3d226d617472604d8201527f697828312030203020312e30312030202d312e3429222f3e3c2f673e3c2f673e606d8201527f3c672069643d22672d752d7022207472616e73666f726d3d226d617472697828608d8201527f312e30303420302030202e393937202d31202e3729223e3c706174682069643d60ad82015267113396ba96b7b39960c11b60cd82015261333b613f16613f10613e29613e23613ca160d587018c612931565b7f352220643d226d3231322e34203133302038382e322d2e3263312031392e362d81527f31322e33203132322e352d32312e34203230352e382d342e342031352d322e3260208201527f2033322e3220362e352033312e386c2d342e382d352e3563362e392d2e33203160408201527f362e3420342e372032302e3520382e372d32342e332031302e352d363920313160608201527f2e362d39322d2e3920312e372d332e322031302d372e352032302e352d384c3260808201527f32342033363763372e392d322031322e332d31372e3120382d33312e322d392e60a08201527f362d39352e392d32322d3139352e342d31392e372d3230352e375a222074726160c08201527f6e73666f726d3d226d617472697828312e3036362030203020312e303338202d60e08201527f3137202d392e3429222f3e3c706174682069643d22672d752d6967222066696c6101008201527f6c3d2275726c282367662922207374726f6b653d2223303030000000000000006101208201526101390190565b89612931565b7f342220643d224d3232312e35203136372e336333322e3320312e372035382e3881527f20312036362e322d2e3720382e3120332e342d372e322038392e332d3135203160208201527f36382e332d392e3320342e382d32372e3720352e392d33362e342d2e324c323160408201527f392e3720313831632d2e342d362e382e322d31342e3720312e382d31332e375a60608201527f22207472616e73666f726d3d226d617472697828312030203020312e3035322060808201527f2e33202d32302e3829222f3e3c656c6c697073652069643d226b65330000000060a082015260bc0190565b86612931565b7f34222072793d2232322e3322207472616e73666f726d3d226d6174726978282e81527f373133202d2e303636202e33303520332e323937203233362e33203234312e326020820152671491179f1e17b39f60c11b604082015260480190565b60008651613f88818460208b016125f5565b6c0f1c185d1a081a590f489a8b5b609a1b9083019081528651613fb281600d840160208b016125f5565b7f3230382e39203133332e32632d312e332d32302039342e352d31392039342e37600d92909101918201527f2d312e336c2d312e31203233613339392e32203339392e322030203020312d39602d8201527f332e322e376c2d2e342d32322e345a22207472616e73666f726d3d226d617472604d8201527f6978282e38312030203020312e3338372034372e37202d34362e3729222f3e3c606d8201527f2f673e3c2f673e3c672069643d22672d752d6c223e3c706174682069643d2267608d820152650b5d4b5bd9cd60d21b60ad82015285516140978160b3840160208a016125f5565b612c0361420c612bef61416161415b60b3868801017f342220643d224d3231352e36203337332e326331392e322031302e342035382081527f31302e332037372e3820312e34762d35312e316c2e332d3139372e38632d323160208201527f20322e392d35392e3720342d37382030763234372e355a222f3e3c706174682060408201527f69643d22672d752d6967222066696c6c3d2275726c282367662922207374726f60608201526a6b653d222330343033303360a81b6080820152608b0190565b8a612931565b7f342220643d224d3232322e332031373163313620322e3620343920322e34203681527f362e3320306c2d312e38203138332e34632d31312e3820372e382d34312e322060208201527f31312e322d36342e362030563137315a22207472616e73666f726d3d226d617460408201527f726978283120302030202e3939392030202e3329222f3e3c656c6c69707365206060820152660d2c87a44d6ca760cb1b608082015260870190565b7f322e33222072793d2235322e3222207472616e73666f726d3d226d617472697881527f282e3933372030203020312e343834203233302e34203236342e3129222f3e3c60208201526217b39f60e91b604082015260430190565b60008651614279818460208b016125f5565b6c3c706174682069643d226a2d7760981b90830190815286516142a381600d840160208b016125f5565b7f3230372031333063352e312d392e382039352d392e362039372e372e33613537600d92909101918201527f2e342035372e3420302030203120362e332033342e38632d32332e3720332e32602d8201527f2d383820332e352d313131202e342e322d392e3820332d32372e3420372d3335604d8201527f2e355a22207472616e73666f726d3d226d6174726978282e3831203020302031606d8201527f2e3338372034372e37202d34362e3729222f3e3c2f673e3c2f673e3c67206964608d8201527f3d22672d752d77223e3c706174682069643d22672d752d6f673500000000000060ad820152855161439f8160c7840160208a016125f5565b612c0361459b612bef6144c161415b60c7868801017f342220643d224d3231352e36203337332e326331352e38203720353820362e3681527f2037372e3320302d2e352d33362e372d362e342d39342e3820302d3134312e3760208201527f20362d34332e382031322e382d36322e3720312e372d3130332e322d3231203260408201527f2e392d36312e3220342d37392e3520302d372e362034302e352d372036312e3160608201527f2d312e36203130332e3220362e342034392e3520312e36203130362e3920322e60808201527f31203134312e375a222f3e3c706174682069643d22672d752d6967222066696c60a08201527f6c3d2275726c282367662922207374726f6b653d22233034303330330000000060c082015260dc0190565b7f342220643d224d3231392e37203138352e326331352e3920322e36203533203381527f2037302e332e362d332e362032312d382036322e322d382e362038322e34763960208201527f312e34632d31352e3920362d34312e3120342d35342e3420306c2d2e332d393160408201527f2e34632e322d32302e392d332e342d36322e342d372d38335a22207472616e7360608201527f666f726d3d226d6174726978283120302030202e3939392030202e3829222f3e60808201526f3c656c6c697073652069643d226b653960801b60a082015260b00190565b7f322e33222072793d2235322e3222207472616e73666f726d3d227472616e736c81527f617465283233352e34203330302e3129222f3e3c2f673e000000000000000000602082015260370190565b600085516145fc818460208a016125f5565b6c1e3830ba341034b21e913516b160991b908301908152855161462681600d840160208a016125f5565b7f3230372031333063352e312d392e382039352d392e362039372e372e33613537600d92909101918201527f2e342035372e3420302030203120362e332033342e38632d32332e3720332e32602d8201527f2d383820332e352d313131202e342e322d392e3820332d32372e3420372d3335604d8201527f2e355a22207472616e73666f726d3d226d6174726978282e393420302030202e606d8201527f39312031352e332032352e3429222f3e3c2f673e3c2f673e3c672069643d2267608d8201527f2d752d62223e3c706174682069643d22672d752d6f6736222066696c6c3d222360ad8201527f666666222066696c6c2d6f7061636974793d222e3522207374726f6b653d222360cd8201527f30303022207374726f6b652d77696474683d22352220643d224d3230372e332060ed8201527f3134322e356332342e3820332e3920373320342e352039362e3520302035203261010d8201527f312e3820342036372e322d2e362039342e352d342e312031382e372d31302e3561012d8201527f2039302e3220312e35203131392e3520332e322031322e382d322e342033302e61014d8201527f322d31332e342032372e37682d32392e38632d362e322d31302d32392d2e372d61016d8201527f34362e362d2e376c2d35332e322e33632d32302e362d312e352d32312e382d3361018d8201527f322e3120362e382d33382e372033332d382e392035382e322d32332e382034346101ad8201527f2d38322e322d382d33352d31332d39352e372d352e322d3132302e345a2220746101cd8201527f72616e73666f726d3d227472616e736c617465282e33202e3329222f3e3c70616101ed8201527f74682069643d22672d752d6967222066696c6c3d2275726c282367662922207361020d8201527f74726f6b653d222330303022207374726f6b652d77696474683d22342220643d61022d8201527f226d3231372e32203137362e342038302e352e3463342e3320312e3220332e3461024d8201527f2031392e3320312033372e346c2d362e332033352e38632d382032392e372d3761026d8201527f2037382e34203020393020352e3820313320362e352033312d31322e3120333061028d8201527f2e352d31322d312e382d33342e362d312e342d34352e3320312e352d323320336102ad8201527f2e332d35382e3720342e322d373020312e362d31312d332e312d31312e322d316102cd8201527f362e3420302d31392e3961323035203230352030203020312032382e342d372e6102ed8201527f336332382e372d352e352033372e372d34342e352033312e332d37382e346c2d61030d8201527f31312e332d35312e34632d322d31352e352d332d33382e3720332e382d34302e61032d8201527f325a22207472616e73666f726d3d227472616e736c6174652830202e3429222f61034d8201527103e3c656c6c697073652069643d226b6531360741b61036d820152614b1b614acc613f10614a7361037f850189612931565b7f33222072793d22342e3122207472616e73666f726d3d227472616e736c61746581527f283136352e32203336342e3129222f3e3c656c6c697073652069643d226b65316020820152603160f81b604082015260410190565b7f332e36222072793d2231382e3522207472616e73666f726d3d227472616e736c81527f617465283232312e35203230342e3329222f3e3c2f673e000000000000000000602082015260370190565b979650505050505050565b60008551614b38818460208a016125f5565b6c0f1c185d1a081a590f489a8b5d609a1b9083019081528551614b6281600d840160208a016125f5565b7f3230342e36203132382e3663352e312d392e372039392e312d392e3420313031600d92909101918201527f2e382e3520312e3520392e3720332032382e3420352e352033352e392d32332e602d8201527f382e352d38392e322e322d3131342e322e356131393020313930203020302030604d8201527f20362e392d33362e395a22207472616e73666f726d3d226d6174726978282e38606d8201527f3120302030202e3837362034372e372036352e3529222f3e3c2f673e3c2f673e608d8201527f3c672069643d22672d752d74223e3c706174682069643d226b7034000000000060ad8201528451614c5e8160c88401602089016125f5565b7f352220643d224d3231322e36203137392e3463323020352e3520363220352e3260c892909101918201527f2038342e322e392d2e352033302e3420372034302e362031322e372035352e3760e88201527f2031382e392035302e362d31332e332038342e312d35342e322038342e312d346101088201527f372e3220302d37332e372d33362e342d35362e352d38332e3920372e332d31396101288201527f2e392031362d33342e372031332e382d35362e385a222f3e3c70617468206964610148820152643d226b703560d81b610168820152614b1b61016d820185612931565b60008551614d53818460208a016125f5565b80830190507f352220643d224d323735203336342e38632d382d372e372d31322e342d32362e81527f352d372e312d34342e374832343263392e312032302d382e332034362e372d3560208201527f2e392034342e372d31332e3920302d33312e3720322e382d33322e3320372e3360408201527f2d2e322039203130312e3520382e35203130312e35203020302d332e332d313960608201527f2e342d382e322d33302e332d372e335a22207472616e73666f726d3d2274726160808201527f6e736c617465282d3129222f3e3c706174682069643d226b7036222066696c6c60a08201527303d226e6f6e6522207374726f6b653d22233030360641b60c08201528551614e698160d4840160208a016125f5565b7f332220643d224d3237362e37203336392e3463322e3820332e362031302e362060d492909101918201527f372031362e3220352e3922207472616e73666f726d3d227472616e736c61746560f48201527f282d322e36202d332e3929222f3e3c706174682069643d226b7037222066696c6101148201527406c3d226e6f6e6522207374726f6b653d222330303605c1b610134820152614b1b615099613f10614f17610149850189612931565b7f332220643d224d3233362e3120333636632d2e3920332e342d382e3820352e3681527f2d313620342e3922207472616e73666f726d3d227472616e736c61746528302060208201527f2d2e3229222f3e3c706174682069643d226b7038222066696c6c3d2275726c2860408201527f2367662922207374726f6b653d222330303022207374726f6b652d776964746860608201527f3d22342220643d224d3231352e34203231372e336837362e3463342e3920392e60808201527f372031322032362e392031332e3520333520372033332e362d32302035372e3660a08201527f2d34382e352035382e382d3237202e352d35382e382d31392e372d35332e372d60c08201527f35382e3720312e392d382e3720382d32362e322031322e332d33352e315a222060e08201527f7472616e73666f726d3d226d6174726978282e39383620302030202e393820336101008201527f2e3720352e3129222f3e3c656c6c697073652069643d226b653132000000000061012082015261013b0190565b7f342e34222072793d2231352e3222207472616e73666f726d3d227472616e736c81527430ba329419189910191b1a971a1491179f1e17b39f60591b602082015260350190565b600085516150f2818460208a016125f5565b6c3c706174682069643d226a2d6760981b908301908152855161511c81600d840160208a016125f5565b7f3230332e35203132352e386331332e312d31312e312039322d372e3620313030600d92909101918201527f2e362d2e33203820362e3620382e392033312e3420392033392e362d3234202e602d8201527f352d3131372e342e372d3131372e342e37732d2e372d33332e3320372e382d34604d8201527f305a22207472616e73666f726d3d226d617472697828312e3038352030203020606d8201527f2e353432202d32332031323029222f3e3c2f673e3c2f673e3c672069643d2267608d820152722d752d67223e3c706174682069643d226b703960681b60ad820152845161520e8160c08401602089016125f5565b7f352220643d224d3139312e31203139372e3463323020352e34203130302e352060c092909101918201527f352e33203132322e37203120372e382032342e3220392034372e39203920363660e08201527f2e3520302033312d32342035362d36372e352035352e322d34372e3220302d366101008201527f382e372d33302d36392e332d35362d2e342d32302e3720322e312d34372e33206101208201527f352e312d36362e375a22207472616e73666f726d3d227472616e736c617465286101408201527f2d31202e3529222f3e3c706174682069643d226b703130000000000000000000610160820152614b1b610177820185612931565b6000855161531b818460208a016125f5565b80830190507f352220643d224d3237352e31203336352e37632d31302e342d372e362d31322e81527f382d32352e352d31302e342d34342e386c2d32322e392e3263362e312031392e60208201527f322d372e322034362e352d342e372034342e362d31342e312d312e332d33332e60408201527f3620322e332d33332e3420362d2e322038203130312e362039203130312e362e60608201527f3420302d332e332d31392e332d372e352d33302e322d362e345a22207472616e60808201527f73666f726d3d227472616e736c617465282d322e32202d2e3229222f3e3c706160a08201527f74682069643d226b703131222066696c6c3d226e6f6e6522207374726f6b653d60c082015264022233030360dc1b60e082015285516154488160e5840160208a016125f5565b61333b615673612bef6154f161415b60e5868801017f332220643d224d3237362e37203336392e3463312e3820332e342031302e362081527f372031362e3220352e3922207472616e73666f726d3d227472616e736c61746560208201527f282d352e31202d342e3229222f3e3c706174682069643d226b7031322220666960408201527506c6c3d226e6f6e6522207374726f6b653d22233030360541b606082015260760190565b7f332220643d224d3233362e3120333636632d312e3720332e372d382e3220352e81527f382d313620342e3922207472616e73666f726d3d227472616e736c617465282d60208201527f31202d2e3829222f3e3c706174682069643d226b703133222066696c6c3d227560408201527f726c282367662922207374726f6b653d222330303022207374726f6b652d776960608201527f6474683d22342220643d224d3230302e35203231382e324833303763342e352060808201527f392e34203720333320362e352034332e3820302033312e372d32312e3720353060a08201527f2e332d35392e352035302e332d33352e3620302d35392e332d32312e362d353860c08201527f2e382d3535202e322d31302e3520312e312d32392e3320352e332d33392e315a60e08201527f22207472616e73666f726d3d226d6174726978282e39383620302030202e39386101008201527f20322e3720332e3129222f3e3c656c6c697073652069643d226b65313300000061012082015261013d0190565b7f34222072793d2232322e3522207472616e73666f726d3d227472616e736c6174815272329419181c171c90191a989491179f1e17b39f60691b602082015260330190565b600086516156ca818460208b016125f5565b7f3c67207374796c653d22616e696d6174696f6e3a6232740000000000000000009083019081528651615704816017840160208b016125f5565b7f7472616e736c617465283235322e35203335302e3729223e3c67206f70616369601792909101918201527f74793d223022207374796c653d22616e696d6174696f6e3a623263000000000060378201528551615768816052840160208a016125f5565b7f6d617472697828322e3033362030203020322e31202d3139392e33202d353137605292909101918201527314911f1e31b4b931b6329034b21e9135b2989a9160611b607282015284516157c38160868401602089016125f5565b7f3130302e36203235302e3229222f3e3c636972636c652069643d226b653136226086929091019182015283516158018160a68401602088016125f5565b0160a601979650505050505050565b60008651615822818460208b016125f5565b7f3934203234342e3929222f3e3c636972636c652069643d226b65313722000000908301908152865161585c81601d840160208b016125f5565b7f3130312e38203234322e3229222f3e3c2f673e3c2f673e3c67207374796c653d601d92909101918201526d08985b9a5b585d1a5bdb8e988c5d60921b603d82015285516158b181604b840160208a016125f5565b7f7472616e736c61746528323536203335302e3729223e3c67206f706163697479604b92909101918201527f3d223022207374796c653d22616e696d6174696f6e3a62316300000000000000606b82015284516159158160848401602089016125f5565b7f6d617472697828312e3635312030203020312e353838202d3136312e36202d33608492909101918201527f39302e3929223e3c636972636c652069643d226b65313822000000000000000060a482015261333b60bc820185612931565b6000855160206159868285838b016125f5565b7f3130302e36203235302e3229222f3e3c636972636c652069643d226b6531392291840191825286516159be81838501848b016125f5565b7f3934203234342e3929222f3e3c636972636c652069643d226b6532302200000092018181019290925285516159fa81603d85018985016125f5565b7f3130312e38203234322e3229222f3e3c2f673e3c2f673e3c67207374796c653d603d93909101928301526d08985b9a5b585d1a5bdb8e988cdd60921b605d8301528451615a4e81606b85018489016125f5565b91909101606b01979650505050505050565b60008651615a72818460208b016125f5565b80830190507f7472616e736c617465283235372e36203332362e3929223e3c67206f7061636981527f74793d223022207374796c653d22616e696d6174696f6e3a623363000000000060208201528651615ad381603b840160208b016125f5565b7f6d617472697828322e3033362030203020322e31202d3139392e33202d353137603b92909101918201527314911f1e31b4b931b6329034b21e9135b299189160611b605b8201528551615b2e81606f840160208a016125f5565b7f39352e372032353529222f3e3c636972636c652069643d226b65323222000000606f92909101918201528451615b6c81608c8401602089016125f5565b7f3934203234342e3929222f3e3c2f673e3c2f673e3c656c6c697073652069643d608c929091019182015265113396ba96b960d11b60ac82015261333b615bb660b2830186612931565b7f3135222072793d22322e3622207472616e73666f726d3d227472616e736c61748152610ca560f31b602082015260220190565b60008251615bfc8184602087016125f5565b70191c1910199b9b9491179f1e17b9bb339f60791b920191825250601101919050565b60008251615c318184602087016125f5565b74191a99971b90199b98971a1491179f1e17b9bb339f60591b920191825250601501919050565b634e487b7160e01b600052601260045260246000fd5b600082615c7d57615c7d615c58565b500490565b80820281158282048414176104cf576104cf6128e7565b600082615ca857615ca8615c58565b500690565b600060018201615cbf57615cbf6128e7565b5060010190565b818103818111156104cf576104cf6128e7565b60ff81811683821601908111156104cf576104cf6128e7565b634e487b7160e01b600052603260045260246000fdfe20723d22332e34222066696c6c3d226e6f6e6522207374726f6b653d2272676261283235352c3235352c3235352c302e352922207374726f6b652d77696474683d22312e3522207472616e73666f726d3d226d6174726978282e35363820302030202e3536332022207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6422207374726f6b652d77696474683d22222066696c6c3d222366666622207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6422207374726f6b652d77696474683d22312220643d226d3b616e696d6174696f6e2d74696d696e672d66756e6374696f6e3a63756269632d62657a696572282e34322c302c2e35382c31297d4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3522207374726f6b653d222330303022207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6422207374726f6b652d77696474683d2220353030306d73206c696e65617220696e66696e697465206e6f726d616c20666f72776172647322207472616e73666f726d3d227b7472616e73666f726d3a7472616e736c617465283235302e3070782c3232362e3370782920726f74617465283064656729207363616c6528312c31222066696c6c3d222366666622207374726f6b652d77696474683d223022206f7061636974793d222e35222072783d22a2646970667358221220547a3fa8e8c84c72f65e9133fbd7ebcbe546a9ae267c90ab94daa20ce66326ba64736f6c63430008130033
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.