ERC-721
Overview
Max Total Supply
4,292 FART
Holders
1,570
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 FARTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Fart
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-04 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * 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(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary 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 auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: elftown.sol pragma solidity >=0.8.9 <0.9.0; contract Fart is Ownable, ERC721A { uint256 public immutable maxPerAddressDuringMint; uint256 public immutable collectionSize; uint256 public immutable freeMintSize; uint256 public immutable amountForDevs; uint32 public publicSaleStartTime; uint64 public publicPriceWei; string private _baseTokenURI; constructor( uint256 maxBatchSize_, uint256 collectionSize_, uint256 amountForDevs_, uint256 freeMintSize_ ) ERC721A("Fart", "FART") { require( maxBatchSize_ < collectionSize_, "MaxBarchSize should be smaller than collectionSize" ); maxPerAddressDuringMint = maxBatchSize_; collectionSize = collectionSize_; freeMintSize = freeMintSize_; amountForDevs = amountForDevs_; } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function devMint(uint256 quantity) external onlyOwner { require( quantity <= amountForDevs, "Too many already minted before dev mint" ); require( totalSupply() + quantity <= collectionSize, "Reached max supply" ); _safeMint(msg.sender, quantity); } function mint(uint256 quantity) external payable callerIsUser { require(isPublicSaleOn(), "Public sale has not begun yet"); require( totalSupply() + quantity <= collectionSize, "Reached max supply" ); require( numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "Reached max quantity that one wallet can mint" ); uint256 priceWei = 0; if ((totalSupply() + quantity > freeMintSize)){ if(totalSupply() + quantity - freeMintSize > quantity){ priceWei = quantity * publicPriceWei; } else{ priceWei = (totalSupply() + quantity - freeMintSize) * publicPriceWei; } } _safeMint(msg.sender, quantity); refundIfOver(priceWei); } function isPublicSaleOn() public view returns (bool) { require( publicSaleStartTime != 0, "Public Sale Not Start" ); return block.timestamp >= publicSaleStartTime; } function numberMinted(address minter) public view returns (uint256) { return _numberMinted(minter); } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function withdrawMoney() external onlyOwner { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function setupPublicPriceWei( uint64 publicPriceWei_ ) public onlyOwner { publicPriceWei = publicPriceWei_; } function setupPublicSaleStartTime( uint32 publicSaleStartTime_ ) public onlyOwner { publicSaleStartTime = publicSaleStartTime_; } function refundIfOver(uint256 price) internal { require(msg.value >= price, "Need to send more ETH."); if (msg.value > price) { payable(msg.sender).transfer(msg.value - price); } } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"amountForDevs_","type":"uint256"},{"internalType":"uint256","name":"freeMintSize_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"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":"amountForDevs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintSize","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":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPriceWei","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStartTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"publicPriceWei_","type":"uint64"}],"name":"setupPublicPriceWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"publicSaleStartTime_","type":"uint32"}],"name":"setupPublicSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b5060405162003a9138038062003a9183398181016040528101906200003891906200033e565b6040518060400160405280600481526020017f46617274000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4641525400000000000000000000000000000000000000000000000000000000815250620000c4620000b86200017d60201b60201c565b6200018560201b60201c565b8160039080519060200190620000dc9291906200024e565b508060049080519060200190620000f59291906200024e565b50620001066200024960201b60201c565b600181905550505082841062000153576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014a9062000437565b60405180910390fd5b83608081815250508260a081815250508060c081815250508160e0818152505050505050620004bd565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b8280546200025c9062000488565b90600052602060002090601f016020900481019282620002805760008555620002cc565b82601f106200029b57805160ff1916838001178555620002cc565b82800160010185558215620002cc579182015b82811115620002cb578251825591602001919060010190620002ae565b5b509050620002db9190620002df565b5090565b5b80821115620002fa576000816000905550600101620002e0565b5090565b600080fd5b6000819050919050565b620003188162000303565b81146200032457600080fd5b50565b60008151905062000338816200030d565b92915050565b600080600080608085870312156200035b576200035a620002fe565b5b60006200036b8782880162000327565b94505060206200037e8782880162000327565b9350506040620003918782880162000327565b9250506060620003a48782880162000327565b91505092959194509250565b600082825260208201905092915050565b7f4d6178426172636853697a652073686f756c6420626520736d616c6c6572207460008201527f68616e20636f6c6c656374696f6e53697a650000000000000000000000000000602082015250565b60006200041f603283620003b0565b91506200042c82620003c1565b604082019050919050565b60006020820190508181036000830152620004528162000410565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004a157607f821691505b602082108103620004b757620004b662000459565b5b50919050565b60805160a05160c05160e0516135696200052860003960008181610b30015261195d015260008181610fd70152818161122f0152818161126a0152611302015260008181610b9301528181610cb20152611142015260008181610eea01526111b701526135696000f3fe6080604052600436106101d85760003560e01c8063715018a611610102578063ac44600211610095578063dc33e68111610064578063dc33e68114610677578063e985e9c5146106b4578063f2fde38b146106f1578063fbe1aa511461071a576101d8565b8063ac446002146105d1578063b88d4fde146105e8578063c87b56dd14610611578063d084ce771461064e576101d8565b8063943578af116100d1578063943578af1461053657806395d89b4114610561578063a0712d681461058c578063a22cb465146105a8576101d8565b8063715018a6146104a05780638bc35c2f146104b75780638da5cb5b146104e257806392e891a01461050d576101d8565b80633f5e47411161017a5780635d463810116101495780635d463810146103d05780636352211e146103fb5780636bb7b1d91461043857806370a0823114610463576101d8565b80633f5e47411461032857806342842e0e1461035357806345c0f5331461037c57806355f804b3146103a7576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d6578063375a069a146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff919061265f565b610745565b60405161021191906126a7565b60405180910390f35b34801561022657600080fd5b5061022f6107d7565b60405161023c919061275b565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906127b3565b610869565b6040516102799190612821565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612868565b6108e5565b005b3480156102b757600080fd5b506102c0610a8b565b6040516102cd91906128b7565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f891906128d2565b610aa2565b005b34801561030b57600080fd5b50610326600480360381019061032191906127b3565b610ab2565b005b34801561033457600080fd5b5061033d610c13565b60405161034a91906126a7565b60405180910390f35b34801561035f57600080fd5b5061037a600480360381019061037591906128d2565b610c90565b005b34801561038857600080fd5b50610391610cb0565b60405161039e91906128b7565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c9919061298a565b610cd4565b005b3480156103dc57600080fd5b506103e5610d66565b6040516103f291906129fa565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d91906127b3565b610d80565b60405161042f9190612821565b60405180910390f35b34801561044457600080fd5b5061044d610d92565b60405161045a9190612a34565b60405180910390f35b34801561046f57600080fd5b5061048a60048036038101906104859190612a4f565b610da8565b60405161049791906128b7565b60405180910390f35b3480156104ac57600080fd5b506104b5610e60565b005b3480156104c357600080fd5b506104cc610ee8565b6040516104d991906128b7565b60405180910390f35b3480156104ee57600080fd5b506104f7610f0c565b6040516105049190612821565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f9190612aa8565b610f35565b005b34801561054257600080fd5b5061054b610fd5565b60405161055891906128b7565b60405180910390f35b34801561056d57600080fd5b50610576610ff9565b604051610583919061275b565b60405180910390f35b6105a660048036038101906105a191906127b3565b61108b565b005b3480156105b457600080fd5b506105cf60048036038101906105ca9190612b01565b611363565b005b3480156105dd57600080fd5b506105e66114da565b005b3480156105f457600080fd5b5061060f600480360381019061060a9190612c71565b611605565b005b34801561061d57600080fd5b50610638600480360381019061063391906127b3565b611678565b604051610645919061275b565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190612d20565b611716565b005b34801561068357600080fd5b5061069e60048036038101906106999190612a4f565b6117be565b6040516106ab91906128b7565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d69190612d4d565b6117d0565b6040516106e891906126a7565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190612a4f565b611864565b005b34801561072657600080fd5b5061072f61195b565b60405161073c91906128b7565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546107e690612dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461081290612dbc565b801561085f5780601f106108345761010080835404028352916020019161085f565b820191906000526020600020905b81548152906001019060200180831161084257829003601f168201915b5050505050905090565b60006108748261197f565b6108aa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f0826119de565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610957576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610976611aaa565b73ffffffffffffffffffffffffffffffffffffffff16146109d9576109a28161099d611aaa565b6117d0565b6109d8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a95611ab2565b6002546001540303905090565b610aad838383611ab7565b505050565b610aba611e5e565b73ffffffffffffffffffffffffffffffffffffffff16610ad8610f0c565b73ffffffffffffffffffffffffffffffffffffffff1614610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590612e39565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8890612ecb565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081610bbb610a8b565b610bc59190612f1a565b1115610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd90612fbc565b60405180910390fd5b610c103382611e66565b50565b600080600960009054906101000a900463ffffffff1663ffffffff1603610c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6690613028565b60405180910390fd5b600960009054906101000a900463ffffffff1663ffffffff16421015905090565b610cab83838360405180602001604052806000815250611605565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610cdc611e5e565b73ffffffffffffffffffffffffffffffffffffffff16610cfa610f0c565b73ffffffffffffffffffffffffffffffffffffffff1614610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4790612e39565b60405180910390fd5b8181600a9190610d61929190612550565b505050565b600960049054906101000a900467ffffffffffffffff1681565b6000610d8b826119de565b9050919050565b600960009054906101000a900463ffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e0f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e68611e5e565b73ffffffffffffffffffffffffffffffffffffffff16610e86610f0c565b73ffffffffffffffffffffffffffffffffffffffff1614610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed390612e39565b60405180910390fd5b610ee66000611e84565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f3d611e5e565b73ffffffffffffffffffffffffffffffffffffffff16610f5b610f0c565b73ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa890612e39565b60405180910390fd5b80600960006101000a81548163ffffffff021916908363ffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606004805461100890612dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461103490612dbc565b80156110815780601f1061105657610100808354040283529160200191611081565b820191906000526020600020905b81548152906001019060200180831161106457829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090613094565b60405180910390fd5b611101610c13565b611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790613100565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008161116a610a8b565b6111749190612f1a565b11156111b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac90612fbc565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816111e0336117be565b6111ea9190612f1a565b111561122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122290613192565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000082611257610a8b565b6112619190612f1a565b111561134c57817f000000000000000000000000000000000000000000000000000000000000000083611292610a8b565b61129c9190612f1a565b6112a691906131b2565b11156112df57600960049054906101000a900467ffffffffffffffff1667ffffffffffffffff16826112d891906131e6565b905061134b565b600960049054906101000a900467ffffffffffffffff1667ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000008361132a610a8b565b6113349190612f1a565b61133e91906131b2565b61134891906131e6565b90505b5b6113563383611e66565b61135f81611f48565b5050565b61136b611aaa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113cf576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006113dc611aaa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611489611aaa565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114ce91906126a7565b60405180910390a35050565b6114e2611e5e565b73ffffffffffffffffffffffffffffffffffffffff16611500610f0c565b73ffffffffffffffffffffffffffffffffffffffff1614611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90612e39565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161157c90613271565b60006040518083038185875af1925050503d80600081146115b9576040519150601f19603f3d011682016040523d82523d6000602084013e6115be565b606091505b5050905080611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f9906132d2565b60405180910390fd5b50565b611610848484611ab7565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116725761163b84848484611fe9565b611671576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606116838261197f565b6116b9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116c3612139565b905060008151036116e3576040518060200160405280600081525061170e565b806116ed846121cb565b6040516020016116fe92919061332e565b6040516020818303038152906040525b915050919050565b61171e611e5e565b73ffffffffffffffffffffffffffffffffffffffff1661173c610f0c565b73ffffffffffffffffffffffffffffffffffffffff1614611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990612e39565b60405180910390fd5b80600960046101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60006117c982612225565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61186c611e5e565b73ffffffffffffffffffffffffffffffffffffffff1661188a610f0c565b73ffffffffffffffffffffffffffffffffffffffff16146118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790612e39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361194f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611946906133c4565b60405180910390fd5b61195881611e84565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008161198a611ab2565b11158015611999575060015482105b80156119d7575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600080829050806119ed611ab2565b11611a7357600154811015611a725760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611a70575b60008103611a66576005600083600190039350838152602001908152602001600020549050611a3c565b8092505050611aa5565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611ac2826119de565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b29576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611b4a611aaa565b73ffffffffffffffffffffffffffffffffffffffff161480611b795750611b7885611b73611aaa565b6117d0565b5b80611bbe5750611b87611aaa565b73ffffffffffffffffffffffffffffffffffffffff16611ba684610869565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611bf7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c5d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c6a858585600161227c565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611d6786612282565b1717600560008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611def5760006001840190506000600560008381526020019081526020016000205403611ded576001548114611dec578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e57858585600161228c565b5050505050565b600033905090565b611e80828260405180602001604052806000815250612292565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80341015611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290613430565b60405180910390fd5b80341115611fe6573373ffffffffffffffffffffffffffffffffffffffff166108fc8234611fb991906131b2565b9081150290604051600060405180830381858888f19350505050158015611fe4573d6000803e3d6000fd5b505b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261200f611aaa565b8786866040518563ffffffff1660e01b815260040161203194939291906134a5565b6020604051808303816000875af192505050801561206d57506040513d601f19601f8201168201806040525081019061206a9190613506565b60015b6120e6573d806000811461209d576040519150601f19603f3d011682016040523d82523d6000602084013e6120a2565b606091505b5060008151036120de576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461214890612dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461217490612dbc565b80156121c15780601f10612196576101008083540402835291602001916121c1565b820191906000526020600020905b8154815290600101906020018083116121a457829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561221157600183039250600a81066030018353600a810490506121f1565b508181036020830392508083525050919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036122ff576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612339576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612346600085838661227c565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16123ab60018514612546565b901b60a042901b6123bb86612282565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146124bf575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461246f6000878480600101955087611fe9565b6124a5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106124005782600154146124ba57600080fd5b61252a565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106124c0575b816001819055505050612540600085838661228c565b50505050565b6000819050919050565b82805461255c90612dbc565b90600052602060002090601f01602090048101928261257e57600085556125c5565b82601f1061259757803560ff19168380011785556125c5565b828001600101855582156125c5579182015b828111156125c45782358255916020019190600101906125a9565b5b5090506125d291906125d6565b5090565b5b808211156125ef5760008160009055506001016125d7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61263c81612607565b811461264757600080fd5b50565b60008135905061265981612633565b92915050565b600060208284031215612675576126746125fd565b5b60006126838482850161264a565b91505092915050565b60008115159050919050565b6126a18161268c565b82525050565b60006020820190506126bc6000830184612698565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126fc5780820151818401526020810190506126e1565b8381111561270b576000848401525b50505050565b6000601f19601f8301169050919050565b600061272d826126c2565b61273781856126cd565b93506127478185602086016126de565b61275081612711565b840191505092915050565b600060208201905081810360008301526127758184612722565b905092915050565b6000819050919050565b6127908161277d565b811461279b57600080fd5b50565b6000813590506127ad81612787565b92915050565b6000602082840312156127c9576127c86125fd565b5b60006127d78482850161279e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061280b826127e0565b9050919050565b61281b81612800565b82525050565b60006020820190506128366000830184612812565b92915050565b61284581612800565b811461285057600080fd5b50565b6000813590506128628161283c565b92915050565b6000806040838503121561287f5761287e6125fd565b5b600061288d85828601612853565b925050602061289e8582860161279e565b9150509250929050565b6128b18161277d565b82525050565b60006020820190506128cc60008301846128a8565b92915050565b6000806000606084860312156128eb576128ea6125fd565b5b60006128f986828701612853565b935050602061290a86828701612853565b925050604061291b8682870161279e565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261294a57612949612925565b5b8235905067ffffffffffffffff8111156129675761296661292a565b5b6020830191508360018202830111156129835761298261292f565b5b9250929050565b600080602083850312156129a1576129a06125fd565b5b600083013567ffffffffffffffff8111156129bf576129be612602565b5b6129cb85828601612934565b92509250509250929050565b600067ffffffffffffffff82169050919050565b6129f4816129d7565b82525050565b6000602082019050612a0f60008301846129eb565b92915050565b600063ffffffff82169050919050565b612a2e81612a15565b82525050565b6000602082019050612a496000830184612a25565b92915050565b600060208284031215612a6557612a646125fd565b5b6000612a7384828501612853565b91505092915050565b612a8581612a15565b8114612a9057600080fd5b50565b600081359050612aa281612a7c565b92915050565b600060208284031215612abe57612abd6125fd565b5b6000612acc84828501612a93565b91505092915050565b612ade8161268c565b8114612ae957600080fd5b50565b600081359050612afb81612ad5565b92915050565b60008060408385031215612b1857612b176125fd565b5b6000612b2685828601612853565b9250506020612b3785828601612aec565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b7e82612711565b810181811067ffffffffffffffff82111715612b9d57612b9c612b46565b5b80604052505050565b6000612bb06125f3565b9050612bbc8282612b75565b919050565b600067ffffffffffffffff821115612bdc57612bdb612b46565b5b612be582612711565b9050602081019050919050565b82818337600083830152505050565b6000612c14612c0f84612bc1565b612ba6565b905082815260208101848484011115612c3057612c2f612b41565b5b612c3b848285612bf2565b509392505050565b600082601f830112612c5857612c57612925565b5b8135612c68848260208601612c01565b91505092915050565b60008060008060808587031215612c8b57612c8a6125fd565b5b6000612c9987828801612853565b9450506020612caa87828801612853565b9350506040612cbb8782880161279e565b925050606085013567ffffffffffffffff811115612cdc57612cdb612602565b5b612ce887828801612c43565b91505092959194509250565b612cfd816129d7565b8114612d0857600080fd5b50565b600081359050612d1a81612cf4565b92915050565b600060208284031215612d3657612d356125fd565b5b6000612d4484828501612d0b565b91505092915050565b60008060408385031215612d6457612d636125fd565b5b6000612d7285828601612853565b9250506020612d8385828601612853565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dd457607f821691505b602082108103612de757612de6612d8d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612e236020836126cd565b9150612e2e82612ded565b602082019050919050565b60006020820190508181036000830152612e5281612e16565b9050919050565b7f546f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e7400000000000000000000000000000000000000000000000000602082015250565b6000612eb56027836126cd565b9150612ec082612e59565b604082019050919050565b60006020820190508181036000830152612ee481612ea8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f258261277d565b9150612f308361277d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f6557612f64612eeb565b5b828201905092915050565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000612fa66012836126cd565b9150612fb182612f70565b602082019050919050565b60006020820190508181036000830152612fd581612f99565b9050919050565b7f5075626c69632053616c65204e6f742053746172740000000000000000000000600082015250565b60006130126015836126cd565b915061301d82612fdc565b602082019050919050565b6000602082019050818103600083015261304181613005565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b600061307e601e836126cd565b915061308982613048565b602082019050919050565b600060208201905081810360008301526130ad81613071565b9050919050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b60006130ea601d836126cd565b91506130f5826130b4565b602082019050919050565b60006020820190508181036000830152613119816130dd565b9050919050565b7f52656163686564206d6178207175616e746974792074686174206f6e6520776160008201527f6c6c65742063616e206d696e7400000000000000000000000000000000000000602082015250565b600061317c602d836126cd565b915061318782613120565b604082019050919050565b600060208201905081810360008301526131ab8161316f565b9050919050565b60006131bd8261277d565b91506131c88361277d565b9250828210156131db576131da612eeb565b5b828203905092915050565b60006131f18261277d565b91506131fc8361277d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561323557613234612eeb565b5b828202905092915050565b600081905092915050565b50565b600061325b600083613240565b91506132668261324b565b600082019050919050565b600061327c8261324e565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006132bc6010836126cd565b91506132c782613286565b602082019050919050565b600060208201905081810360008301526132eb816132af565b9050919050565b600081905092915050565b6000613308826126c2565b61331281856132f2565b93506133228185602086016126de565b80840191505092915050565b600061333a82856132fd565b915061334682846132fd565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006133ae6026836126cd565b91506133b982613352565b604082019050919050565b600060208201905081810360008301526133dd816133a1565b9050919050565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b600061341a6016836126cd565b9150613425826133e4565b602082019050919050565b600060208201905081810360008301526134498161340d565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061347782613450565b613481818561345b565b93506134918185602086016126de565b61349a81612711565b840191505092915050565b60006080820190506134ba6000830187612812565b6134c76020830186612812565b6134d460408301856128a8565b81810360608301526134e6818461346c565b905095945050505050565b60008151905061350081612633565b92915050565b60006020828403121561351c5761351b6125fd565b5b600061352a848285016134f1565b9150509291505056fea26469706673582212206fae656c6218e8d5c3918c7499974a52e07bd7410ea563f2b7d670336e25d24d64736f6c634300080e003300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000001a0a00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000fa0
Deployed Bytecode
0x6080604052600436106101d85760003560e01c8063715018a611610102578063ac44600211610095578063dc33e68111610064578063dc33e68114610677578063e985e9c5146106b4578063f2fde38b146106f1578063fbe1aa511461071a576101d8565b8063ac446002146105d1578063b88d4fde146105e8578063c87b56dd14610611578063d084ce771461064e576101d8565b8063943578af116100d1578063943578af1461053657806395d89b4114610561578063a0712d681461058c578063a22cb465146105a8576101d8565b8063715018a6146104a05780638bc35c2f146104b75780638da5cb5b146104e257806392e891a01461050d576101d8565b80633f5e47411161017a5780635d463810116101495780635d463810146103d05780636352211e146103fb5780636bb7b1d91461043857806370a0823114610463576101d8565b80633f5e47411461032857806342842e0e1461035357806345c0f5331461037c57806355f804b3146103a7576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d6578063375a069a146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff919061265f565b610745565b60405161021191906126a7565b60405180910390f35b34801561022657600080fd5b5061022f6107d7565b60405161023c919061275b565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906127b3565b610869565b6040516102799190612821565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612868565b6108e5565b005b3480156102b757600080fd5b506102c0610a8b565b6040516102cd91906128b7565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f891906128d2565b610aa2565b005b34801561030b57600080fd5b50610326600480360381019061032191906127b3565b610ab2565b005b34801561033457600080fd5b5061033d610c13565b60405161034a91906126a7565b60405180910390f35b34801561035f57600080fd5b5061037a600480360381019061037591906128d2565b610c90565b005b34801561038857600080fd5b50610391610cb0565b60405161039e91906128b7565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c9919061298a565b610cd4565b005b3480156103dc57600080fd5b506103e5610d66565b6040516103f291906129fa565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d91906127b3565b610d80565b60405161042f9190612821565b60405180910390f35b34801561044457600080fd5b5061044d610d92565b60405161045a9190612a34565b60405180910390f35b34801561046f57600080fd5b5061048a60048036038101906104859190612a4f565b610da8565b60405161049791906128b7565b60405180910390f35b3480156104ac57600080fd5b506104b5610e60565b005b3480156104c357600080fd5b506104cc610ee8565b6040516104d991906128b7565b60405180910390f35b3480156104ee57600080fd5b506104f7610f0c565b6040516105049190612821565b60405180910390f35b34801561051957600080fd5b50610534600480360381019061052f9190612aa8565b610f35565b005b34801561054257600080fd5b5061054b610fd5565b60405161055891906128b7565b60405180910390f35b34801561056d57600080fd5b50610576610ff9565b604051610583919061275b565b60405180910390f35b6105a660048036038101906105a191906127b3565b61108b565b005b3480156105b457600080fd5b506105cf60048036038101906105ca9190612b01565b611363565b005b3480156105dd57600080fd5b506105e66114da565b005b3480156105f457600080fd5b5061060f600480360381019061060a9190612c71565b611605565b005b34801561061d57600080fd5b50610638600480360381019061063391906127b3565b611678565b604051610645919061275b565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190612d20565b611716565b005b34801561068357600080fd5b5061069e60048036038101906106999190612a4f565b6117be565b6040516106ab91906128b7565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d69190612d4d565b6117d0565b6040516106e891906126a7565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190612a4f565b611864565b005b34801561072657600080fd5b5061072f61195b565b60405161073c91906128b7565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546107e690612dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461081290612dbc565b801561085f5780601f106108345761010080835404028352916020019161085f565b820191906000526020600020905b81548152906001019060200180831161084257829003601f168201915b5050505050905090565b60006108748261197f565b6108aa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108f0826119de565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610957576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610976611aaa565b73ffffffffffffffffffffffffffffffffffffffff16146109d9576109a28161099d611aaa565b6117d0565b6109d8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a95611ab2565b6002546001540303905090565b610aad838383611ab7565b505050565b610aba611e5e565b73ffffffffffffffffffffffffffffffffffffffff16610ad8610f0c565b73ffffffffffffffffffffffffffffffffffffffff1614610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590612e39565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000063811115610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8890612ecb565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000001a0a81610bbb610a8b565b610bc59190612f1a565b1115610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd90612fbc565b60405180910390fd5b610c103382611e66565b50565b600080600960009054906101000a900463ffffffff1663ffffffff1603610c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6690613028565b60405180910390fd5b600960009054906101000a900463ffffffff1663ffffffff16421015905090565b610cab83838360405180602001604052806000815250611605565b505050565b7f0000000000000000000000000000000000000000000000000000000000001a0a81565b610cdc611e5e565b73ffffffffffffffffffffffffffffffffffffffff16610cfa610f0c565b73ffffffffffffffffffffffffffffffffffffffff1614610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4790612e39565b60405180910390fd5b8181600a9190610d61929190612550565b505050565b600960049054906101000a900467ffffffffffffffff1681565b6000610d8b826119de565b9050919050565b600960009054906101000a900463ffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e0f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e68611e5e565b73ffffffffffffffffffffffffffffffffffffffff16610e86610f0c565b73ffffffffffffffffffffffffffffffffffffffff1614610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed390612e39565b60405180910390fd5b610ee66000611e84565b565b7f000000000000000000000000000000000000000000000000000000000000000381565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f3d611e5e565b73ffffffffffffffffffffffffffffffffffffffff16610f5b610f0c565b73ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa890612e39565b60405180910390fd5b80600960006101000a81548163ffffffff021916908363ffffffff16021790555050565b7f0000000000000000000000000000000000000000000000000000000000000fa081565b60606004805461100890612dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461103490612dbc565b80156110815780601f1061105657610100808354040283529160200191611081565b820191906000526020600020905b81548152906001019060200180831161106457829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090613094565b60405180910390fd5b611101610c13565b611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790613100565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000001a0a8161116a610a8b565b6111749190612f1a565b11156111b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac90612fbc565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000003816111e0336117be565b6111ea9190612f1a565b111561122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122290613192565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000fa082611257610a8b565b6112619190612f1a565b111561134c57817f0000000000000000000000000000000000000000000000000000000000000fa083611292610a8b565b61129c9190612f1a565b6112a691906131b2565b11156112df57600960049054906101000a900467ffffffffffffffff1667ffffffffffffffff16826112d891906131e6565b905061134b565b600960049054906101000a900467ffffffffffffffff1667ffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000fa08361132a610a8b565b6113349190612f1a565b61133e91906131b2565b61134891906131e6565b90505b5b6113563383611e66565b61135f81611f48565b5050565b61136b611aaa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113cf576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006113dc611aaa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611489611aaa565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114ce91906126a7565b60405180910390a35050565b6114e2611e5e565b73ffffffffffffffffffffffffffffffffffffffff16611500610f0c565b73ffffffffffffffffffffffffffffffffffffffff1614611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154d90612e39565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161157c90613271565b60006040518083038185875af1925050503d80600081146115b9576040519150601f19603f3d011682016040523d82523d6000602084013e6115be565b606091505b5050905080611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f9906132d2565b60405180910390fd5b50565b611610848484611ab7565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116725761163b84848484611fe9565b611671576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606116838261197f565b6116b9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116c3612139565b905060008151036116e3576040518060200160405280600081525061170e565b806116ed846121cb565b6040516020016116fe92919061332e565b6040516020818303038152906040525b915050919050565b61171e611e5e565b73ffffffffffffffffffffffffffffffffffffffff1661173c610f0c565b73ffffffffffffffffffffffffffffffffffffffff1614611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990612e39565b60405180910390fd5b80600960046101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60006117c982612225565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61186c611e5e565b73ffffffffffffffffffffffffffffffffffffffff1661188a610f0c565b73ffffffffffffffffffffffffffffffffffffffff16146118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790612e39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361194f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611946906133c4565b60405180910390fd5b61195881611e84565b50565b7f000000000000000000000000000000000000000000000000000000000000006381565b60008161198a611ab2565b11158015611999575060015482105b80156119d7575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600080829050806119ed611ab2565b11611a7357600154811015611a725760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611a70575b60008103611a66576005600083600190039350838152602001908152602001600020549050611a3c565b8092505050611aa5565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611ac2826119de565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b29576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611b4a611aaa565b73ffffffffffffffffffffffffffffffffffffffff161480611b795750611b7885611b73611aaa565b6117d0565b5b80611bbe5750611b87611aaa565b73ffffffffffffffffffffffffffffffffffffffff16611ba684610869565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611bf7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c5d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c6a858585600161227c565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611d6786612282565b1717600560008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611def5760006001840190506000600560008381526020019081526020016000205403611ded576001548114611dec578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e57858585600161228c565b5050505050565b600033905090565b611e80828260405180602001604052806000815250612292565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80341015611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290613430565b60405180910390fd5b80341115611fe6573373ffffffffffffffffffffffffffffffffffffffff166108fc8234611fb991906131b2565b9081150290604051600060405180830381858888f19350505050158015611fe4573d6000803e3d6000fd5b505b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261200f611aaa565b8786866040518563ffffffff1660e01b815260040161203194939291906134a5565b6020604051808303816000875af192505050801561206d57506040513d601f19601f8201168201806040525081019061206a9190613506565b60015b6120e6573d806000811461209d576040519150601f19603f3d011682016040523d82523d6000602084013e6120a2565b606091505b5060008151036120de576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461214890612dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461217490612dbc565b80156121c15780601f10612196576101008083540402835291602001916121c1565b820191906000526020600020905b8154815290600101906020018083116121a457829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561221157600183039250600a81066030018353600a810490506121f1565b508181036020830392508083525050919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036122ff576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612339576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612346600085838661227c565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16123ab60018514612546565b901b60a042901b6123bb86612282565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146124bf575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461246f6000878480600101955087611fe9565b6124a5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106124005782600154146124ba57600080fd5b61252a565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106124c0575b816001819055505050612540600085838661228c565b50505050565b6000819050919050565b82805461255c90612dbc565b90600052602060002090601f01602090048101928261257e57600085556125c5565b82601f1061259757803560ff19168380011785556125c5565b828001600101855582156125c5579182015b828111156125c45782358255916020019190600101906125a9565b5b5090506125d291906125d6565b5090565b5b808211156125ef5760008160009055506001016125d7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61263c81612607565b811461264757600080fd5b50565b60008135905061265981612633565b92915050565b600060208284031215612675576126746125fd565b5b60006126838482850161264a565b91505092915050565b60008115159050919050565b6126a18161268c565b82525050565b60006020820190506126bc6000830184612698565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126fc5780820151818401526020810190506126e1565b8381111561270b576000848401525b50505050565b6000601f19601f8301169050919050565b600061272d826126c2565b61273781856126cd565b93506127478185602086016126de565b61275081612711565b840191505092915050565b600060208201905081810360008301526127758184612722565b905092915050565b6000819050919050565b6127908161277d565b811461279b57600080fd5b50565b6000813590506127ad81612787565b92915050565b6000602082840312156127c9576127c86125fd565b5b60006127d78482850161279e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061280b826127e0565b9050919050565b61281b81612800565b82525050565b60006020820190506128366000830184612812565b92915050565b61284581612800565b811461285057600080fd5b50565b6000813590506128628161283c565b92915050565b6000806040838503121561287f5761287e6125fd565b5b600061288d85828601612853565b925050602061289e8582860161279e565b9150509250929050565b6128b18161277d565b82525050565b60006020820190506128cc60008301846128a8565b92915050565b6000806000606084860312156128eb576128ea6125fd565b5b60006128f986828701612853565b935050602061290a86828701612853565b925050604061291b8682870161279e565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261294a57612949612925565b5b8235905067ffffffffffffffff8111156129675761296661292a565b5b6020830191508360018202830111156129835761298261292f565b5b9250929050565b600080602083850312156129a1576129a06125fd565b5b600083013567ffffffffffffffff8111156129bf576129be612602565b5b6129cb85828601612934565b92509250509250929050565b600067ffffffffffffffff82169050919050565b6129f4816129d7565b82525050565b6000602082019050612a0f60008301846129eb565b92915050565b600063ffffffff82169050919050565b612a2e81612a15565b82525050565b6000602082019050612a496000830184612a25565b92915050565b600060208284031215612a6557612a646125fd565b5b6000612a7384828501612853565b91505092915050565b612a8581612a15565b8114612a9057600080fd5b50565b600081359050612aa281612a7c565b92915050565b600060208284031215612abe57612abd6125fd565b5b6000612acc84828501612a93565b91505092915050565b612ade8161268c565b8114612ae957600080fd5b50565b600081359050612afb81612ad5565b92915050565b60008060408385031215612b1857612b176125fd565b5b6000612b2685828601612853565b9250506020612b3785828601612aec565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b7e82612711565b810181811067ffffffffffffffff82111715612b9d57612b9c612b46565b5b80604052505050565b6000612bb06125f3565b9050612bbc8282612b75565b919050565b600067ffffffffffffffff821115612bdc57612bdb612b46565b5b612be582612711565b9050602081019050919050565b82818337600083830152505050565b6000612c14612c0f84612bc1565b612ba6565b905082815260208101848484011115612c3057612c2f612b41565b5b612c3b848285612bf2565b509392505050565b600082601f830112612c5857612c57612925565b5b8135612c68848260208601612c01565b91505092915050565b60008060008060808587031215612c8b57612c8a6125fd565b5b6000612c9987828801612853565b9450506020612caa87828801612853565b9350506040612cbb8782880161279e565b925050606085013567ffffffffffffffff811115612cdc57612cdb612602565b5b612ce887828801612c43565b91505092959194509250565b612cfd816129d7565b8114612d0857600080fd5b50565b600081359050612d1a81612cf4565b92915050565b600060208284031215612d3657612d356125fd565b5b6000612d4484828501612d0b565b91505092915050565b60008060408385031215612d6457612d636125fd565b5b6000612d7285828601612853565b9250506020612d8385828601612853565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dd457607f821691505b602082108103612de757612de6612d8d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612e236020836126cd565b9150612e2e82612ded565b602082019050919050565b60006020820190508181036000830152612e5281612e16565b9050919050565b7f546f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e7400000000000000000000000000000000000000000000000000602082015250565b6000612eb56027836126cd565b9150612ec082612e59565b604082019050919050565b60006020820190508181036000830152612ee481612ea8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f258261277d565b9150612f308361277d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f6557612f64612eeb565b5b828201905092915050565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000612fa66012836126cd565b9150612fb182612f70565b602082019050919050565b60006020820190508181036000830152612fd581612f99565b9050919050565b7f5075626c69632053616c65204e6f742053746172740000000000000000000000600082015250565b60006130126015836126cd565b915061301d82612fdc565b602082019050919050565b6000602082019050818103600083015261304181613005565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b600061307e601e836126cd565b915061308982613048565b602082019050919050565b600060208201905081810360008301526130ad81613071565b9050919050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b60006130ea601d836126cd565b91506130f5826130b4565b602082019050919050565b60006020820190508181036000830152613119816130dd565b9050919050565b7f52656163686564206d6178207175616e746974792074686174206f6e6520776160008201527f6c6c65742063616e206d696e7400000000000000000000000000000000000000602082015250565b600061317c602d836126cd565b915061318782613120565b604082019050919050565b600060208201905081810360008301526131ab8161316f565b9050919050565b60006131bd8261277d565b91506131c88361277d565b9250828210156131db576131da612eeb565b5b828203905092915050565b60006131f18261277d565b91506131fc8361277d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561323557613234612eeb565b5b828202905092915050565b600081905092915050565b50565b600061325b600083613240565b91506132668261324b565b600082019050919050565b600061327c8261324e565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006132bc6010836126cd565b91506132c782613286565b602082019050919050565b600060208201905081810360008301526132eb816132af565b9050919050565b600081905092915050565b6000613308826126c2565b61331281856132f2565b93506133228185602086016126de565b80840191505092915050565b600061333a82856132fd565b915061334682846132fd565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006133ae6026836126cd565b91506133b982613352565b604082019050919050565b600060208201905081810360008301526133dd816133a1565b9050919050565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b600061341a6016836126cd565b9150613425826133e4565b602082019050919050565b600060208201905081810360008301526134498161340d565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061347782613450565b613481818561345b565b93506134918185602086016126de565b61349a81612711565b840191505092915050565b60006080820190506134ba6000830187612812565b6134c76020830186612812565b6134d460408301856128a8565b81810360608301526134e6818461346c565b905095945050505050565b60008151905061350081612633565b92915050565b60006020828403121561351c5761351b6125fd565b5b600061352a848285016134f1565b9150509291505056fea26469706673582212206fae656c6218e8d5c3918c7499974a52e07bd7410ea563f2b7d670336e25d24d64736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000001a0a00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000fa0
-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 3
Arg [1] : collectionSize_ (uint256): 6666
Arg [2] : amountForDevs_ (uint256): 99
Arg [3] : freeMintSize_ (uint256): 4000
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [1] : 0000000000000000000000000000000000000000000000000000000000001a0a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000063
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000fa0
Deployed Bytecode Sourcemap
43963:3559:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15197:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20210:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22278:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21738:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14251:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23164:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44944:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46205:225;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23405:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44059:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46561:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44236:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19999:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44196:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15876:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43077:103;;;;;;;;;;;;;:::i;:::-;;44004:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42426:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47006:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44105:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20379:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45300:897;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22554:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46675:178;;;;;;;;;;;;;:::i;:::-;;23661:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20554:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46861:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46438:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22933:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43335:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44149:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15197:615;15282:4;15597:10;15582:25;;:11;:25;;;;:102;;;;15674:10;15659:25;;:11;:25;;;;15582:102;:179;;;;15751:10;15736:25;;:11;:25;;;;15582:179;15562:199;;15197:615;;;:::o;20210:100::-;20264:13;20297:5;20290:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20210:100;:::o;22278:204::-;22346:7;22371:16;22379:7;22371;:16::i;:::-;22366:64;;22396:34;;;;;;;;;;;;;;22366:64;22450:15;:24;22466:7;22450:24;;;;;;;;;;;;;;;;;;;;;22443:31;;22278:204;;;:::o;21738:474::-;21811:13;21843:27;21862:7;21843:18;:27::i;:::-;21811:61;;21893:5;21887:11;;:2;:11;;;21883:48;;21907:24;;;;;;;;;;;;;;21883:48;21971:5;21948:28;;:19;:17;:19::i;:::-;:28;;;21944:175;;21996:44;22013:5;22020:19;:17;:19::i;:::-;21996:16;:44::i;:::-;21991:128;;22068:35;;;;;;;;;;;;;;21991:128;21944:175;22158:2;22131:15;:24;22147:7;22131:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22196:7;22192:2;22176:28;;22185:5;22176:28;;;;;;;;;;;;21800:412;21738:474;;:::o;14251:315::-;14304:7;14532:15;:13;:15::i;:::-;14517:12;;14501:13;;:28;:46;14494:53;;14251:315;:::o;23164:170::-;23298:28;23308:4;23314:2;23318:7;23298:9;:28::i;:::-;23164:170;;;:::o;44944:350::-;42657:12;:10;:12::i;:::-;42646:23;;:7;:5;:7::i;:::-;:23;;;42638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45043:13:::1;45031:8;:25;;45009:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;45184:14;45172:8;45156:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;45134:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45255:31;45265:10;45277:8;45255:9;:31::i;:::-;44944:350:::0;:::o;46205:225::-;46252:4;46314:1;46291:19;;;;;;;;;;;:24;;;46269:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;46403:19;;;;;;;;;;;46384:38;;:15;:38;;46377:45;;46205:225;:::o;23405:185::-;23543:39;23560:4;23566:2;23570:7;23543:39;;;;;;;;;;;;:16;:39::i;:::-;23405:185;;;:::o;44059:39::-;;;:::o;46561:106::-;42657:12;:10;:12::i;:::-;42646:23;;:7;:5;:7::i;:::-;:23;;;42638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46652:7:::1;;46636:13;:23;;;;;;;:::i;:::-;;46561:106:::0;;:::o;44236:28::-;;;;;;;;;;;;;:::o;19999:144::-;20063:7;20106:27;20125:7;20106:18;:27::i;:::-;20083:52;;19999:144;;;:::o;44196:33::-;;;;;;;;;;;;;:::o;15876:224::-;15940:7;15981:1;15964:19;;:5;:19;;;15960:60;;15992:28;;;;;;;;;;;;;;15960:60;11215:13;16038:18;:25;16057:5;16038:25;;;;;;;;;;;;;;;;:54;16031:61;;15876:224;;;:::o;43077:103::-;42657:12;:10;:12::i;:::-;42646:23;;:7;:5;:7::i;:::-;:23;;;42638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43142:30:::1;43169:1;43142:18;:30::i;:::-;43077:103::o:0;44004:48::-;;;:::o;42426:87::-;42472:7;42499:6;;;;;;;;;;;42492:13;;42426:87;:::o;47006:157::-;42657:12;:10;:12::i;:::-;42646:23;;:7;:5;:7::i;:::-;:23;;;42638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47135:20:::1;47113:19;;:42;;;;;;;;;;;;;;;;;;47006:157:::0;:::o;44105:37::-;;;:::o;20379:104::-;20435:13;20468:7;20461:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20379:104;:::o;45300:897::-;44871:10;44858:23;;:9;:23;;;44850:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45413:16:::1;:14;:16::i;:::-;45405:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45524:14;45512:8;45496:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;45474:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;45656:23;45644:8;45617:24;45630:10;45617:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;45595:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;45763:16;45826:12;45815:8;45799:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:39;45794:319;;;45900:8;45885:12;45874:8;45858:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:39;;;;:::i;:::-;:50;45855:247;;;45950:14;;;;;;;;;;;45939:25;;:8;:25;;;;:::i;:::-;45928:36;;45855:247;;;46072:14;;;;;;;;;;;46028:58;;46056:12;46045:8;46029:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:39;;;;:::i;:::-;46028:58;;;;:::i;:::-;46017:69;;45855:247;45794:319;46125:31;46135:10;46147:8;46125:9;:31::i;:::-;46167:22;46180:8;46167:12;:22::i;:::-;45394:803;45300:897:::0;:::o;22554:308::-;22665:19;:17;:19::i;:::-;22653:31;;:8;:31;;;22649:61;;22693:17;;;;;;;;;;;;;;22649:61;22775:8;22723:18;:39;22742:19;:17;:19::i;:::-;22723:39;;;;;;;;;;;;;;;:49;22763:8;22723:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;22835:8;22799:55;;22814:19;:17;:19::i;:::-;22799:55;;;22845:8;22799:55;;;;;;:::i;:::-;;;;;;;;22554:308;;:::o;46675:178::-;42657:12;:10;:12::i;:::-;42646:23;;:7;:5;:7::i;:::-;:23;;;42638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46731:12:::1;46749:10;:15;;46772:21;46749:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46730:68;;;46817:7;46809:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;46719:134;46675:178::o:0;23661:396::-;23828:28;23838:4;23844:2;23848:7;23828:9;:28::i;:::-;23889:1;23871:2;:14;;;:19;23867:183;;23910:56;23941:4;23947:2;23951:7;23960:5;23910:30;:56::i;:::-;23905:145;;23994:40;;;;;;;;;;;;;;23905:145;23867:183;23661:396;;;;:::o;20554:318::-;20627:13;20658:16;20666:7;20658;:16::i;:::-;20653:59;;20683:29;;;;;;;;;;;;;;20653:59;20725:21;20749:10;:8;:10::i;:::-;20725:34;;20802:1;20783:7;20777:21;:26;:87;;;;;;;;;;;;;;;;;20830:7;20839:18;20849:7;20839:9;:18::i;:::-;20813:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20777:87;20770:94;;;20554:318;;;:::o;46861:137::-;42657:12;:10;:12::i;:::-;42646:23;;:7;:5;:7::i;:::-;:23;;;42638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46975:15:::1;46958:14;;:32;;;;;;;;;;;;;;;;;;46861:137:::0;:::o;46438:115::-;46497:7;46524:21;46538:6;46524:13;:21::i;:::-;46517:28;;46438:115;;;:::o;22933:164::-;23030:4;23054:18;:25;23073:5;23054:25;;;;;;;;;;;;;;;:35;23080:8;23054:35;;;;;;;;;;;;;;;;;;;;;;;;;23047:42;;22933:164;;;;:::o;43335:201::-;42657:12;:10;:12::i;:::-;42646:23;;:7;:5;:7::i;:::-;:23;;;42638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43444:1:::1;43424:22;;:8;:22;;::::0;43416:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;43500:28;43519:8;43500:18;:28::i;:::-;43335:201:::0;:::o;44149:38::-;;;:::o;24312:273::-;24369:4;24425:7;24406:15;:13;:15::i;:::-;:26;;:66;;;;;24459:13;;24449:7;:23;24406:66;:152;;;;;24557:1;11985:8;24510:17;:26;24528:7;24510:26;;;;;;;;;;;;:43;:48;24406:152;24386:172;;24312:273;;;:::o;17514:1129::-;17581:7;17601:12;17616:7;17601:22;;17684:4;17665:15;:13;:15::i;:::-;:23;17661:915;;17718:13;;17711:4;:20;17707:869;;;17756:14;17773:17;:23;17791:4;17773:23;;;;;;;;;;;;17756:40;;17889:1;11985:8;17862:6;:23;:28;17858:699;;18381:113;18398:1;18388:6;:11;18381:113;;18441:17;:25;18459:6;;;;;;;18441:25;;;;;;;;;;;;18432:34;;18381:113;;;18527:6;18520:13;;;;;;17858:699;17733:843;17707:869;17661:915;18604:31;;;;;;;;;;;;;;17514:1129;;;;:::o;38294:105::-;38354:7;38381:10;38374:17;;38294:105;:::o;13774:92::-;13830:7;13774:92;:::o;29551:2515::-;29666:27;29696;29715:7;29696:18;:27::i;:::-;29666:57;;29781:4;29740:45;;29756:19;29740:45;;;29736:86;;29794:28;;;;;;;;;;;;;;29736:86;29835:22;29884:4;29861:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;29905:43;29922:4;29928:19;:17;:19::i;:::-;29905:16;:43::i;:::-;29861:87;:147;;;;29989:19;:17;:19::i;:::-;29965:43;;:20;29977:7;29965:11;:20::i;:::-;:43;;;29861:147;29835:174;;30027:17;30022:66;;30053:35;;;;;;;;;;;;;;30022:66;30117:1;30103:16;;:2;:16;;;30099:52;;30128:23;;;;;;;;;;;;;;30099:52;30164:43;30186:4;30192:2;30196:7;30205:1;30164:21;:43::i;:::-;30280:15;:24;30296:7;30280:24;;;;;;;;;;;;30273:31;;;;;;;;;;;30672:18;:24;30691:4;30672:24;;;;;;;;;;;;;;;;30670:26;;;;;;;;;;;;30741:18;:22;30760:2;30741:22;;;;;;;;;;;;;;;;30739:24;;;;;;;;;;;12267:8;11869:3;31122:15;:41;;31080:21;31098:2;31080:17;:21::i;:::-;:84;:128;31034:17;:26;31052:7;31034:26;;;;;;;;;;;:174;;;;31378:1;12267:8;31328:19;:46;:51;31324:626;;31400:19;31432:1;31422:7;:11;31400:33;;31589:1;31555:17;:30;31573:11;31555:30;;;;;;;;;;;;:35;31551:384;;31693:13;;31678:11;:28;31674:242;;31873:19;31840:17;:30;31858:11;31840:30;;;;;;;;;;;:52;;;;31674:242;31551:384;31381:569;31324:626;31997:7;31993:2;31978:27;;31987:4;31978:27;;;;;;;;;;;;32016:42;32037:4;32043:2;32047:7;32056:1;32016:20;:42::i;:::-;29655:2411;;29551:2515;;;:::o;41150:98::-;41203:7;41230:10;41223:17;;41150:98;:::o;24669:104::-;24738:27;24748:2;24752:8;24738:27;;;;;;;;;;;;:9;:27::i;:::-;24669:104;;:::o;43696:191::-;43770:16;43789:6;;;;;;;;;;;43770:25;;43815:8;43806:6;;:17;;;;;;;;;;;;;;;;;;43870:8;43839:40;;43860:8;43839:40;;;;;;;;;;;;43759:128;43696:191;:::o;47172:225::-;47250:5;47237:9;:18;;47229:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;47309:5;47297:9;:17;47293:97;;;47339:10;47331:28;;:47;47372:5;47360:9;:17;;;;:::i;:::-;47331:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47293:97;47172:225;:::o;35763:716::-;35926:4;35972:2;35947:45;;;35993:19;:17;:19::i;:::-;36014:4;36020:7;36029:5;35947:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35943:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36247:1;36230:6;:13;:18;36226:235;;36276:40;;;;;;;;;;;;;;36226:235;36419:6;36413:13;36404:6;36400:2;36396:15;36389:38;35943:529;36116:54;;;36106:64;;;:6;:64;;;;36099:71;;;35763:716;;;;;;:::o;47405:114::-;47465:13;47498;47491:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47405:114;:::o;38505:1959::-;38562:17;38983:3;38976:4;38970:11;38966:21;38959:28;;39074:3;39068:4;39061:17;39180:3;39637:5;39767:1;39762:3;39758:11;39751:18;;39904:2;39898:4;39894:13;39890:2;39886:22;39881:3;39873:36;39945:2;39939:4;39935:13;39927:21;;39528:682;39964:4;39528:682;;;40139:1;40134:3;40130:11;40123:18;;40190:2;40184:4;40180:13;40176:2;40172:22;40167:3;40159:36;40060:2;40054:4;40050:13;40042:21;;39528:682;;;39532:431;40261:3;40256;40252:13;40376:2;40371:3;40367:12;40360:19;;40439:6;40434:3;40427:19;38601:1856;;38505:1959;;;:::o;16182:176::-;16243:7;11215:13;11352:2;16271:18;:25;16290:5;16271:25;;;;;;;;;;;;;;;;:49;;16270:80;16263:87;;16182:176;;;:::o;37127:159::-;;;;;:::o;21299:148::-;21363:14;21424:5;21414:15;;21299:148;;;:::o;37945:158::-;;;;;:::o;25146:2236::-;25269:20;25292:13;;25269:36;;25334:1;25320:16;;:2;:16;;;25316:48;;25345:19;;;;;;;;;;;;;;25316:48;25391:1;25379:8;:13;25375:44;;25401:18;;;;;;;;;;;;;;25375:44;25432:61;25462:1;25466:2;25470:12;25484:8;25432:21;:61::i;:::-;26036:1;11352:2;26007:1;:25;;26006:31;25994:8;:44;25968:18;:22;25987:2;25968:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;12132:3;26437:29;26464:1;26452:8;:13;26437:14;:29::i;:::-;:56;;11869:3;26374:15;:41;;26332:21;26350:2;26332:17;:21::i;:::-;:84;:162;26281:17;:31;26299:12;26281:31;;;;;;;;;;;:213;;;;26511:20;26534:12;26511:35;;26561:11;26590:8;26575:12;:23;26561:37;;26637:1;26619:2;:14;;;:19;26615:635;;26659:313;26715:12;26711:2;26690:38;;26707:1;26690:38;;;;;;;;;;;;26756:69;26795:1;26799:2;26803:14;;;;;;26819:5;26756:30;:69::i;:::-;26751:174;;26861:40;;;;;;;;;;;;;;26751:174;26967:3;26952:12;:18;26659:313;;27053:12;27036:13;;:29;27032:43;;27067:8;;;27032:43;26615:635;;;27116:119;27172:14;;;;;;27168:2;27147:40;;27164:1;27147:40;;;;;;;;;;;;27230:3;27215:12;:18;27116:119;;26615:635;27280:12;27264:13;:28;;;;25745:1559;;27314:60;27343:1;27347:2;27351:12;27365:8;27314:20;:60::i;:::-;25258:2124;25146:2236;;;:::o;21534:142::-;21592:14;21653:5;21643:15;;21534:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:117;6270:1;6267;6260:12;6298:553;6356:8;6366:6;6416:3;6409:4;6401:6;6397:17;6393:27;6383:122;;6424:79;;:::i;:::-;6383:122;6537:6;6524:20;6514:30;;6567:18;6559:6;6556:30;6553:117;;;6589:79;;:::i;:::-;6553:117;6703:4;6695:6;6691:17;6679:29;;6757:3;6749:4;6741:6;6737:17;6727:8;6723:32;6720:41;6717:128;;;6764:79;;:::i;:::-;6717:128;6298:553;;;;;:::o;6857:529::-;6928:6;6936;6985:2;6973:9;6964:7;6960:23;6956:32;6953:119;;;6991:79;;:::i;:::-;6953:119;7139:1;7128:9;7124:17;7111:31;7169:18;7161:6;7158:30;7155:117;;;7191:79;;:::i;:::-;7155:117;7304:65;7361:7;7352:6;7341:9;7337:22;7304:65;:::i;:::-;7286:83;;;;7082:297;6857:529;;;;;:::o;7392:101::-;7428:7;7468:18;7461:5;7457:30;7446:41;;7392:101;;;:::o;7499:115::-;7584:23;7601:5;7584:23;:::i;:::-;7579:3;7572:36;7499:115;;:::o;7620:218::-;7711:4;7749:2;7738:9;7734:18;7726:26;;7762:69;7828:1;7817:9;7813:17;7804:6;7762:69;:::i;:::-;7620:218;;;;:::o;7844:93::-;7880:7;7920:10;7913:5;7909:22;7898:33;;7844:93;;;:::o;7943:115::-;8028:23;8045:5;8028:23;:::i;:::-;8023:3;8016:36;7943:115;;:::o;8064:218::-;8155:4;8193:2;8182:9;8178:18;8170:26;;8206:69;8272:1;8261:9;8257:17;8248:6;8206:69;:::i;:::-;8064:218;;;;:::o;8288:329::-;8347:6;8396:2;8384:9;8375:7;8371:23;8367:32;8364:119;;;8402:79;;:::i;:::-;8364:119;8522:1;8547:53;8592:7;8583:6;8572:9;8568:22;8547:53;:::i;:::-;8537:63;;8493:117;8288:329;;;;:::o;8623:120::-;8695:23;8712:5;8695:23;:::i;:::-;8688:5;8685:34;8675:62;;8733:1;8730;8723:12;8675:62;8623:120;:::o;8749:137::-;8794:5;8832:6;8819:20;8810:29;;8848:32;8874:5;8848:32;:::i;:::-;8749:137;;;;:::o;8892:327::-;8950:6;8999:2;8987:9;8978:7;8974:23;8970:32;8967:119;;;9005:79;;:::i;:::-;8967:119;9125:1;9150:52;9194:7;9185:6;9174:9;9170:22;9150:52;:::i;:::-;9140:62;;9096:116;8892:327;;;;:::o;9225:116::-;9295:21;9310:5;9295:21;:::i;:::-;9288:5;9285:32;9275:60;;9331:1;9328;9321:12;9275:60;9225:116;:::o;9347:133::-;9390:5;9428:6;9415:20;9406:29;;9444:30;9468:5;9444:30;:::i;:::-;9347:133;;;;:::o;9486:468::-;9551:6;9559;9608:2;9596:9;9587:7;9583:23;9579:32;9576:119;;;9614:79;;:::i;:::-;9576:119;9734:1;9759:53;9804:7;9795:6;9784:9;9780:22;9759:53;:::i;:::-;9749:63;;9705:117;9861:2;9887:50;9929:7;9920:6;9909:9;9905:22;9887:50;:::i;:::-;9877:60;;9832:115;9486:468;;;;;:::o;9960:117::-;10069:1;10066;10059:12;10083:180;10131:77;10128:1;10121:88;10228:4;10225:1;10218:15;10252:4;10249:1;10242:15;10269:281;10352:27;10374:4;10352:27;:::i;:::-;10344:6;10340:40;10482:6;10470:10;10467:22;10446:18;10434:10;10431:34;10428:62;10425:88;;;10493:18;;:::i;:::-;10425:88;10533:10;10529:2;10522:22;10312:238;10269:281;;:::o;10556:129::-;10590:6;10617:20;;:::i;:::-;10607:30;;10646:33;10674:4;10666:6;10646:33;:::i;:::-;10556:129;;;:::o;10691:307::-;10752:4;10842:18;10834:6;10831:30;10828:56;;;10864:18;;:::i;:::-;10828:56;10902:29;10924:6;10902:29;:::i;:::-;10894:37;;10986:4;10980;10976:15;10968:23;;10691:307;;;:::o;11004:154::-;11088:6;11083:3;11078;11065:30;11150:1;11141:6;11136:3;11132:16;11125:27;11004:154;;;:::o;11164:410::-;11241:5;11266:65;11282:48;11323:6;11282:48;:::i;:::-;11266:65;:::i;:::-;11257:74;;11354:6;11347:5;11340:21;11392:4;11385:5;11381:16;11430:3;11421:6;11416:3;11412:16;11409:25;11406:112;;;11437:79;;:::i;:::-;11406:112;11527:41;11561:6;11556:3;11551;11527:41;:::i;:::-;11247:327;11164:410;;;;;:::o;11593:338::-;11648:5;11697:3;11690:4;11682:6;11678:17;11674:27;11664:122;;11705:79;;:::i;:::-;11664:122;11822:6;11809:20;11847:78;11921:3;11913:6;11906:4;11898:6;11894:17;11847:78;:::i;:::-;11838:87;;11654:277;11593:338;;;;:::o;11937:943::-;12032:6;12040;12048;12056;12105:3;12093:9;12084:7;12080:23;12076:33;12073:120;;;12112:79;;:::i;:::-;12073:120;12232:1;12257:53;12302:7;12293:6;12282:9;12278:22;12257:53;:::i;:::-;12247:63;;12203:117;12359:2;12385:53;12430:7;12421:6;12410:9;12406:22;12385:53;:::i;:::-;12375:63;;12330:118;12487:2;12513:53;12558:7;12549:6;12538:9;12534:22;12513:53;:::i;:::-;12503:63;;12458:118;12643:2;12632:9;12628:18;12615:32;12674:18;12666:6;12663:30;12660:117;;;12696:79;;:::i;:::-;12660:117;12801:62;12855:7;12846:6;12835:9;12831:22;12801:62;:::i;:::-;12791:72;;12586:287;11937:943;;;;;;;:::o;12886:120::-;12958:23;12975:5;12958:23;:::i;:::-;12951:5;12948:34;12938:62;;12996:1;12993;12986:12;12938:62;12886:120;:::o;13012:137::-;13057:5;13095:6;13082:20;13073:29;;13111:32;13137:5;13111:32;:::i;:::-;13012:137;;;;:::o;13155:327::-;13213:6;13262:2;13250:9;13241:7;13237:23;13233:32;13230:119;;;13268:79;;:::i;:::-;13230:119;13388:1;13413:52;13457:7;13448:6;13437:9;13433:22;13413:52;:::i;:::-;13403:62;;13359:116;13155:327;;;;:::o;13488:474::-;13556:6;13564;13613:2;13601:9;13592:7;13588:23;13584:32;13581:119;;;13619:79;;:::i;:::-;13581:119;13739:1;13764:53;13809:7;13800:6;13789:9;13785:22;13764:53;:::i;:::-;13754:63;;13710:117;13866:2;13892:53;13937:7;13928:6;13917:9;13913:22;13892:53;:::i;:::-;13882:63;;13837:118;13488:474;;;;;:::o;13968:180::-;14016:77;14013:1;14006:88;14113:4;14110:1;14103:15;14137:4;14134:1;14127:15;14154:320;14198:6;14235:1;14229:4;14225:12;14215:22;;14282:1;14276:4;14272:12;14303:18;14293:81;;14359:4;14351:6;14347:17;14337:27;;14293:81;14421:2;14413:6;14410:14;14390:18;14387:38;14384:84;;14440:18;;:::i;:::-;14384:84;14205:269;14154:320;;;:::o;14480:182::-;14620:34;14616:1;14608:6;14604:14;14597:58;14480:182;:::o;14668:366::-;14810:3;14831:67;14895:2;14890:3;14831:67;:::i;:::-;14824:74;;14907:93;14996:3;14907:93;:::i;:::-;15025:2;15020:3;15016:12;15009:19;;14668:366;;;:::o;15040:419::-;15206:4;15244:2;15233:9;15229:18;15221:26;;15293:9;15287:4;15283:20;15279:1;15268:9;15264:17;15257:47;15321:131;15447:4;15321:131;:::i;:::-;15313:139;;15040:419;;;:::o;15465:226::-;15605:34;15601:1;15593:6;15589:14;15582:58;15674:9;15669:2;15661:6;15657:15;15650:34;15465:226;:::o;15697:366::-;15839:3;15860:67;15924:2;15919:3;15860:67;:::i;:::-;15853:74;;15936:93;16025:3;15936:93;:::i;:::-;16054:2;16049:3;16045:12;16038:19;;15697:366;;;:::o;16069:419::-;16235:4;16273:2;16262:9;16258:18;16250:26;;16322:9;16316:4;16312:20;16308:1;16297:9;16293:17;16286:47;16350:131;16476:4;16350:131;:::i;:::-;16342:139;;16069:419;;;:::o;16494:180::-;16542:77;16539:1;16532:88;16639:4;16636:1;16629:15;16663:4;16660:1;16653:15;16680:305;16720:3;16739:20;16757:1;16739:20;:::i;:::-;16734:25;;16773:20;16791:1;16773:20;:::i;:::-;16768:25;;16927:1;16859:66;16855:74;16852:1;16849:81;16846:107;;;16933:18;;:::i;:::-;16846:107;16977:1;16974;16970:9;16963:16;;16680:305;;;;:::o;16991:168::-;17131:20;17127:1;17119:6;17115:14;17108:44;16991:168;:::o;17165:366::-;17307:3;17328:67;17392:2;17387:3;17328:67;:::i;:::-;17321:74;;17404:93;17493:3;17404:93;:::i;:::-;17522:2;17517:3;17513:12;17506:19;;17165:366;;;:::o;17537:419::-;17703:4;17741:2;17730:9;17726:18;17718:26;;17790:9;17784:4;17780:20;17776:1;17765:9;17761:17;17754:47;17818:131;17944:4;17818:131;:::i;:::-;17810:139;;17537:419;;;:::o;17962:171::-;18102:23;18098:1;18090:6;18086:14;18079:47;17962:171;:::o;18139:366::-;18281:3;18302:67;18366:2;18361:3;18302:67;:::i;:::-;18295:74;;18378:93;18467:3;18378:93;:::i;:::-;18496:2;18491:3;18487:12;18480:19;;18139:366;;;:::o;18511:419::-;18677:4;18715:2;18704:9;18700:18;18692:26;;18764:9;18758:4;18754:20;18750:1;18739:9;18735:17;18728:47;18792:131;18918:4;18792:131;:::i;:::-;18784:139;;18511:419;;;:::o;18936:180::-;19076:32;19072:1;19064:6;19060:14;19053:56;18936:180;:::o;19122:366::-;19264:3;19285:67;19349:2;19344:3;19285:67;:::i;:::-;19278:74;;19361:93;19450:3;19361:93;:::i;:::-;19479:2;19474:3;19470:12;19463:19;;19122:366;;;:::o;19494:419::-;19660:4;19698:2;19687:9;19683:18;19675:26;;19747:9;19741:4;19737:20;19733:1;19722:9;19718:17;19711:47;19775:131;19901:4;19775:131;:::i;:::-;19767:139;;19494:419;;;:::o;19919:179::-;20059:31;20055:1;20047:6;20043:14;20036:55;19919:179;:::o;20104:366::-;20246:3;20267:67;20331:2;20326:3;20267:67;:::i;:::-;20260:74;;20343:93;20432:3;20343:93;:::i;:::-;20461:2;20456:3;20452:12;20445:19;;20104:366;;;:::o;20476:419::-;20642:4;20680:2;20669:9;20665:18;20657:26;;20729:9;20723:4;20719:20;20715:1;20704:9;20700:17;20693:47;20757:131;20883:4;20757:131;:::i;:::-;20749:139;;20476:419;;;:::o;20901:232::-;21041:34;21037:1;21029:6;21025:14;21018:58;21110:15;21105:2;21097:6;21093:15;21086:40;20901:232;:::o;21139:366::-;21281:3;21302:67;21366:2;21361:3;21302:67;:::i;:::-;21295:74;;21378:93;21467:3;21378:93;:::i;:::-;21496:2;21491:3;21487:12;21480:19;;21139:366;;;:::o;21511:419::-;21677:4;21715:2;21704:9;21700:18;21692:26;;21764:9;21758:4;21754:20;21750:1;21739:9;21735:17;21728:47;21792:131;21918:4;21792:131;:::i;:::-;21784:139;;21511:419;;;:::o;21936:191::-;21976:4;21996:20;22014:1;21996:20;:::i;:::-;21991:25;;22030:20;22048:1;22030:20;:::i;:::-;22025:25;;22069:1;22066;22063:8;22060:34;;;22074:18;;:::i;:::-;22060:34;22119:1;22116;22112:9;22104:17;;21936:191;;;;:::o;22133:348::-;22173:7;22196:20;22214:1;22196:20;:::i;:::-;22191:25;;22230:20;22248:1;22230:20;:::i;:::-;22225:25;;22418:1;22350:66;22346:74;22343:1;22340:81;22335:1;22328:9;22321:17;22317:105;22314:131;;;22425:18;;:::i;:::-;22314:131;22473:1;22470;22466:9;22455:20;;22133:348;;;;:::o;22487:147::-;22588:11;22625:3;22610:18;;22487:147;;;;:::o;22640:114::-;;:::o;22760:398::-;22919:3;22940:83;23021:1;23016:3;22940:83;:::i;:::-;22933:90;;23032:93;23121:3;23032:93;:::i;:::-;23150:1;23145:3;23141:11;23134:18;;22760:398;;;:::o;23164:379::-;23348:3;23370:147;23513:3;23370:147;:::i;:::-;23363:154;;23534:3;23527:10;;23164:379;;;:::o;23549:166::-;23689:18;23685:1;23677:6;23673:14;23666:42;23549:166;:::o;23721:366::-;23863:3;23884:67;23948:2;23943:3;23884:67;:::i;:::-;23877:74;;23960:93;24049:3;23960:93;:::i;:::-;24078:2;24073:3;24069:12;24062:19;;23721:366;;;:::o;24093:419::-;24259:4;24297:2;24286:9;24282:18;24274:26;;24346:9;24340:4;24336:20;24332:1;24321:9;24317:17;24310:47;24374:131;24500:4;24374:131;:::i;:::-;24366:139;;24093:419;;;:::o;24518:148::-;24620:11;24657:3;24642:18;;24518:148;;;;:::o;24672:377::-;24778:3;24806:39;24839:5;24806:39;:::i;:::-;24861:89;24943:6;24938:3;24861:89;:::i;:::-;24854:96;;24959:52;25004:6;24999:3;24992:4;24985:5;24981:16;24959:52;:::i;:::-;25036:6;25031:3;25027:16;25020:23;;24782:267;24672:377;;;;:::o;25055:435::-;25235:3;25257:95;25348:3;25339:6;25257:95;:::i;:::-;25250:102;;25369:95;25460:3;25451:6;25369:95;:::i;:::-;25362:102;;25481:3;25474:10;;25055:435;;;;;:::o;25496:225::-;25636:34;25632:1;25624:6;25620:14;25613:58;25705:8;25700:2;25692:6;25688:15;25681:33;25496:225;:::o;25727:366::-;25869:3;25890:67;25954:2;25949:3;25890:67;:::i;:::-;25883:74;;25966:93;26055:3;25966:93;:::i;:::-;26084:2;26079:3;26075:12;26068:19;;25727:366;;;:::o;26099:419::-;26265:4;26303:2;26292:9;26288:18;26280:26;;26352:9;26346:4;26342:20;26338:1;26327:9;26323:17;26316:47;26380:131;26506:4;26380:131;:::i;:::-;26372:139;;26099:419;;;:::o;26524:172::-;26664:24;26660:1;26652:6;26648:14;26641:48;26524:172;:::o;26702:366::-;26844:3;26865:67;26929:2;26924:3;26865:67;:::i;:::-;26858:74;;26941:93;27030:3;26941:93;:::i;:::-;27059:2;27054:3;27050:12;27043:19;;26702:366;;;:::o;27074:419::-;27240:4;27278:2;27267:9;27263:18;27255:26;;27327:9;27321:4;27317:20;27313:1;27302:9;27298:17;27291:47;27355:131;27481:4;27355:131;:::i;:::-;27347:139;;27074:419;;;:::o;27499:98::-;27550:6;27584:5;27578:12;27568:22;;27499:98;;;:::o;27603:168::-;27686:11;27720:6;27715:3;27708:19;27760:4;27755:3;27751:14;27736:29;;27603:168;;;;:::o;27777:360::-;27863:3;27891:38;27923:5;27891:38;:::i;:::-;27945:70;28008:6;28003:3;27945:70;:::i;:::-;27938:77;;28024:52;28069:6;28064:3;28057:4;28050:5;28046:16;28024:52;:::i;:::-;28101:29;28123:6;28101:29;:::i;:::-;28096:3;28092:39;28085:46;;27867:270;27777:360;;;;:::o;28143:640::-;28338:4;28376:3;28365:9;28361:19;28353:27;;28390:71;28458:1;28447:9;28443:17;28434:6;28390:71;:::i;:::-;28471:72;28539:2;28528:9;28524:18;28515:6;28471:72;:::i;:::-;28553;28621:2;28610:9;28606:18;28597:6;28553:72;:::i;:::-;28672:9;28666:4;28662:20;28657:2;28646:9;28642:18;28635:48;28700:76;28771:4;28762:6;28700:76;:::i;:::-;28692:84;;28143:640;;;;;;;:::o;28789:141::-;28845:5;28876:6;28870:13;28861:22;;28892:32;28918:5;28892:32;:::i;:::-;28789:141;;;;:::o;28936:349::-;29005:6;29054:2;29042:9;29033:7;29029:23;29025:32;29022:119;;;29060:79;;:::i;:::-;29022:119;29180:1;29205:63;29260:7;29251:6;29240:9;29236:22;29205:63;:::i;:::-;29195:73;;29151:127;28936:349;;;;:::o
Swarm Source
ipfs://6fae656c6218e8d5c3918c7499974a52e07bd7410ea563f2b7d670336e25d24d
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.