ERC-721
Overview
Max Total Supply
52 VAMPIRE
Holders
28
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 VAMPIRELoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
VampirestownNFT
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-04 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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: ss.sol // SPDX-License-Identifier: MIT pragma solidity 0.8.14; contract VampirestownNFT is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; uint256 price; uint256 _maxSupply; uint256 maxMintAmountPerTx; uint256 maxMintAmountPerWallet; uint256 currentSupply; string baseURL; // string ExtensionURL = ".json"; uint256 mintDate; bool paused = false; constructor(uint256 __maxSupply, string memory _initBaseURI, uint256 _maxMintAmountPerTx, uint256 _maxMintAmountPerWallet) ERC721A("vampirestownwtf", "VAMPIRE") { baseURL = _initBaseURI; price = 0.005 ether; _maxSupply = __maxSupply; maxMintAmountPerTx = _maxMintAmountPerTx; maxMintAmountPerWallet = _maxMintAmountPerWallet; mintDate = 1654360201; // https://www.unixtimestamp.com } function checkCost(uint256 _supply) internal pure returns (uint256 _price){ return _supply < 3000 ? 0 ether : 0.005 ether; } function checkMintAmount(uint256 _supply) internal pure returns (uint256 _price){ return _supply < 3000 ? 2 : 10; } // ================== Mint Function ======================= function mint(uint256 _mintAmount) public payable{ require(block.timestamp >= mintDate, "Not yet available"); require(!paused, "The contract is paused!"); require(totalSupply() <= _maxSupply, "All tokens have been minted!"); require(_mintAmount > 0 && _mintAmount <= checkMintAmount(currentSupply), "Invalid mint amount!"); require(currentSupply + _mintAmount <= _maxSupply, "You want to suck too much blood. Max supply exceeded!"); require(msg.value >= checkCost(currentSupply) * _mintAmount, "Are your fangs too short, or you dont have enough funds?"); require(balanceOf(msg.sender) + _mintAmount <= checkMintAmount(currentSupply), "Dont be greedy! Max mint per wallet exceeded!"); _safeMint(msg.sender, _mintAmount); currentSupply = totalSupply(); } // ================== Orange Functions (Owner Only) =============== function pause(bool state) public onlyOwner { paused = state; } function safeMint(address to, uint256 quantity) public onlyOwner { _safeMint(to, quantity); } function setbaseURL(string memory uri) public onlyOwner{ baseURL = uri; } function setExtensionURL(string memory uri) public onlyOwner{ ExtensionURL = uri; } function setCostPrice(uint256 _cost) public onlyOwner{ price = _cost; } function setSupply(uint256 supply) public onlyOwner{ _maxSupply = supply; } function setMintDate(uint _date) public onlyOwner{ mintDate = _date; } function setMaxMintAmountPerTx(uint _maxMintAmountPerTx) public onlyOwner{ maxMintAmountPerTx = _maxMintAmountPerTx; } function setMaxMintAmountPerWallet(uint _maxMintAmountPerWallet) public onlyOwner{ maxMintAmountPerWallet = _maxMintAmountPerWallet; } // ================================ Withdraw Function ==================== function withdraw() public onlyOwner nonReentrant{ uint256 CurrentContractBalance = address(this).balance; (bool os, ) = payable(owner()).call{value: CurrentContractBalance}(""); require(os); } // =================== Blue Functions (View Only) ==================== function tokenURI(uint256 tokenId) public view override(ERC721A) returns (string memory){ require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI ,(tokenId + 1).toString(), ExtensionURL)) : ''; } function getCost() public view returns (uint256){ return checkCost(currentSupply); } function _baseURI() internal view virtual override returns (string memory) { return baseURL; } function getMaxSupply() public view returns (uint256){ return _maxSupply; } function getCurrentSupply() public view returns (uint256){ return currentSupply; } function getCurrentURI() public view returns (string memory) { return baseURL; } function getCurrentMaxMintAmountPerTx() public view returns (uint256){ return maxMintAmountPerTx; } function getCurrentMaxMintAmountPerWallet() public view returns (uint256){ return maxMintAmountPerWallet; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"__maxSupply","type":"uint256"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerWallet","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":[{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentMaxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentMaxMintAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"safeMint","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":"uint256","name":"_cost","type":"uint256"}],"name":"setCostPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setExtensionURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerWallet","type":"uint256"}],"name":"setMaxMintAmountPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_date","type":"uint256"}],"name":"setMintDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setbaseURL","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506010908051906020019062000051929190620002a2565b506000601260006101000a81548160ff0219169083151502179055503480156200007a57600080fd5b5060405162003f1338038062003f138339818101604052810190620000a091906200052a565b6040518060400160405280600f81526020017f76616d7069726573746f776e77746600000000000000000000000000000000008152506040518060400160405280600781526020017f56414d5049524500000000000000000000000000000000000000000000000000815250816002908051906020019062000124929190620002a2565b5080600390805190602001906200013d929190620002a2565b506200014e620001cf60201b60201c565b6000819055505050620001766200016a620001d460201b60201c565b620001dc60201b60201c565b600160098190555082600f908051906020019062000196929190620002a2565b506611c37937e08000600a8190555083600b8190555081600c8190555080600d8190555063629b8889601181905550505050506200061f565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002b090620005ea565b90600052602060002090601f016020900481019282620002d4576000855562000320565b82601f10620002ef57805160ff191683800117855562000320565b8280016001018555821562000320579182015b828111156200031f57825182559160200191906001019062000302565b5b5090506200032f919062000333565b5090565b5b808211156200034e57600081600090555060010162000334565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6200037b8162000366565b81146200038757600080fd5b50565b6000815190506200039b8162000370565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003f682620003ab565b810181811067ffffffffffffffff82111715620004185762000417620003bc565b5b80604052505050565b60006200042d62000352565b90506200043b8282620003eb565b919050565b600067ffffffffffffffff8211156200045e576200045d620003bc565b5b6200046982620003ab565b9050602081019050919050565b60005b838110156200049657808201518184015260208101905062000479565b83811115620004a6576000848401525b50505050565b6000620004c3620004bd8462000440565b62000421565b905082815260208101848484011115620004e257620004e1620003a6565b5b620004ef84828562000476565b509392505050565b600082601f8301126200050f576200050e620003a1565b5b815162000521848260208601620004ac565b91505092915050565b600080600080608085870312156200054757620005466200035c565b5b600062000557878288016200038a565b945050602085015167ffffffffffffffff8111156200057b576200057a62000361565b5b6200058987828801620004f7565b93505060406200059c878288016200038a565b9250506060620005af878288016200038a565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200060357607f821691505b602082108103620006195762000618620005bb565b5b50919050565b6138e4806200062f6000396000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd146106d2578063ddd699a11461070f578063e985e9c51461073a578063f2fde38b14610777578063f807b687146107a0576101f9565b8063a22cb4651461062c578063b071401b14610655578063b88d4fde1461067e578063bd3e19d4146106a7576101f9565b806395d89b41116100dc57806395d89b41146105935780639951b132146105be578063a0712d68146105e7578063a144819414610603576101f9565b806370a08231146104eb578063715018a614610528578063766b7d091461053f5780638da5cb5b14610568576101f9565b80633ccfd60b116101905780634f3e1efc1161015f5780634f3e1efc146104065780634f4ee6b814610431578063626ab3b81461045c5780636352211e14610485578063676f2602146104c2576101f9565b80633ccfd60b1461037257806342842e0e146103895780634c0f38c2146103b25780634d534a7d146103dd576101f9565b8063095ea7b3116101cc578063095ea7b3146102cc57806318160ddd146102f557806323b872dd146103205780633b4c4b2514610349576101f9565b806301ffc9a7146101fe57806302329a291461023b57806306fdde0314610264578063081812fc1461028f575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612839565b6107cb565b6040516102329190612881565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d91906128c8565b61085d565b005b34801561027057600080fd5b506102796108f6565b604051610286919061298e565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b191906129e6565b610988565b6040516102c39190612a54565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee9190612a9b565b610a04565b005b34801561030157600080fd5b5061030a610baa565b6040516103179190612aea565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190612b05565b610bc1565b005b34801561035557600080fd5b50610370600480360381019061036b91906129e6565b610bd1565b005b34801561037e57600080fd5b50610387610c57565b005b34801561039557600080fd5b506103b060048036038101906103ab9190612b05565b610dae565b005b3480156103be57600080fd5b506103c7610dce565b6040516103d49190612aea565b60405180910390f35b3480156103e957600080fd5b5061040460048036038101906103ff9190612c8d565b610dd8565b005b34801561041257600080fd5b5061041b610e6e565b6040516104289190612aea565b60405180910390f35b34801561043d57600080fd5b50610446610e78565b6040516104539190612aea565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190612c8d565b610e82565b005b34801561049157600080fd5b506104ac60048036038101906104a791906129e6565b610f18565b6040516104b99190612a54565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e491906129e6565b610f2a565b005b3480156104f757600080fd5b50610512600480360381019061050d9190612cd6565b610fb0565b60405161051f9190612aea565b60405180910390f35b34801561053457600080fd5b5061053d611068565b005b34801561054b57600080fd5b50610566600480360381019061056191906129e6565b6110f0565b005b34801561057457600080fd5b5061057d611176565b60405161058a9190612a54565b60405180910390f35b34801561059f57600080fd5b506105a86111a0565b6040516105b5919061298e565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e091906129e6565b611232565b005b61060160048036038101906105fc91906129e6565b6112b8565b005b34801561060f57600080fd5b5061062a60048036038101906106259190612a9b565b611517565b005b34801561063857600080fd5b50610653600480360381019061064e9190612d03565b6115a1565b005b34801561066157600080fd5b5061067c600480360381019061067791906129e6565b611718565b005b34801561068a57600080fd5b506106a560048036038101906106a09190612de4565b61179e565b005b3480156106b357600080fd5b506106bc611811565b6040516106c99190612aea565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f491906129e6565b611823565b604051610706919061298e565b60405180910390f35b34801561071b57600080fd5b506107246118d9565b604051610731919061298e565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190612e67565b61196b565b60405161076e9190612881565b60405180910390f35b34801561078357600080fd5b5061079e60048036038101906107999190612cd6565b6119ff565b005b3480156107ac57600080fd5b506107b5611af6565b6040516107c29190612aea565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108565750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610865611b00565b73ffffffffffffffffffffffffffffffffffffffff16610883611176565b73ffffffffffffffffffffffffffffffffffffffff16146108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612ef3565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b60606002805461090590612f42565b80601f016020809104026020016040519081016040528092919081815260200182805461093190612f42565b801561097e5780601f106109535761010080835404028352916020019161097e565b820191906000526020600020905b81548152906001019060200180831161096157829003601f168201915b5050505050905090565b600061099382611b08565b6109c9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a0f82611b67565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a76576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a95611c33565b73ffffffffffffffffffffffffffffffffffffffff1614610af857610ac181610abc611c33565b61196b565b610af7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bb4611c3b565b6001546000540303905090565b610bcc838383611c40565b505050565b610bd9611b00565b73ffffffffffffffffffffffffffffffffffffffff16610bf7611176565b73ffffffffffffffffffffffffffffffffffffffff1614610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4490612ef3565b60405180910390fd5b80600b8190555050565b610c5f611b00565b73ffffffffffffffffffffffffffffffffffffffff16610c7d611176565b73ffffffffffffffffffffffffffffffffffffffff1614610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90612ef3565b60405180910390fd5b600260095403610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f90612fbf565b60405180910390fd5b600260098190555060004790506000610d2f611176565b73ffffffffffffffffffffffffffffffffffffffff1682604051610d5290613010565b60006040518083038185875af1925050503d8060008114610d8f576040519150601f19603f3d011682016040523d82523d6000602084013e610d94565b606091505b5050905080610da257600080fd5b50506001600981905550565b610dc98383836040518060200160405280600081525061179e565b505050565b6000600b54905090565b610de0611b00565b73ffffffffffffffffffffffffffffffffffffffff16610dfe611176565b73ffffffffffffffffffffffffffffffffffffffff1614610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4b90612ef3565b60405180910390fd5b8060109080519060200190610e6a92919061272a565b5050565b6000600e54905090565b6000600d54905090565b610e8a611b00565b73ffffffffffffffffffffffffffffffffffffffff16610ea8611176565b73ffffffffffffffffffffffffffffffffffffffff1614610efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef590612ef3565b60405180910390fd5b80600f9080519060200190610f1492919061272a565b5050565b6000610f2382611b67565b9050919050565b610f32611b00565b73ffffffffffffffffffffffffffffffffffffffff16610f50611176565b73ffffffffffffffffffffffffffffffffffffffff1614610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612ef3565b60405180910390fd5b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611017576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611070611b00565b73ffffffffffffffffffffffffffffffffffffffff1661108e611176565b73ffffffffffffffffffffffffffffffffffffffff16146110e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110db90612ef3565b60405180910390fd5b6110ee6000611fe7565b565b6110f8611b00565b73ffffffffffffffffffffffffffffffffffffffff16611116611176565b73ffffffffffffffffffffffffffffffffffffffff161461116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390612ef3565b60405180910390fd5b80600d8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111af90612f42565b80601f01602080910402602001604051908101604052809291908181526020018280546111db90612f42565b80156112285780601f106111fd57610100808354040283529160200191611228565b820191906000526020600020905b81548152906001019060200180831161120b57829003601f168201915b5050505050905090565b61123a611b00565b73ffffffffffffffffffffffffffffffffffffffff16611258611176565b73ffffffffffffffffffffffffffffffffffffffff16146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590612ef3565b60405180910390fd5b8060118190555050565b6011544210156112fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f490613071565b60405180910390fd5b601260009054906101000a900460ff161561134d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611344906130dd565b60405180910390fd5b600b54611358610baa565b1115611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090613149565b60405180910390fd5b6000811180156113b357506113af600e546120ad565b8111155b6113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e9906131b5565b60405180910390fd5b600b5481600e546114039190613204565b1115611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b906132cc565b60405180910390fd5b80611450600e546120cc565b61145a91906132ec565b34101561149c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611493906133b8565b60405180910390fd5b6114a7600e546120ad565b816114b133610fb0565b6114bb9190613204565b11156114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f39061344a565b60405180910390fd5b61150633826120f7565b61150e610baa565b600e8190555050565b61151f611b00565b73ffffffffffffffffffffffffffffffffffffffff1661153d611176565b73ffffffffffffffffffffffffffffffffffffffff1614611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90612ef3565b60405180910390fd5b61159d82826120f7565b5050565b6115a9611c33565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361160d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061161a611c33565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116c7611c33565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161170c9190612881565b60405180910390a35050565b611720611b00565b73ffffffffffffffffffffffffffffffffffffffff1661173e611176565b73ffffffffffffffffffffffffffffffffffffffff1614611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90612ef3565b60405180910390fd5b80600c8190555050565b6117a9848484611c40565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461180b576117d484848484612115565b61180a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600061181e600e546120cc565b905090565b606061182e82611b08565b61186d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611864906134dc565b60405180910390fd5b6000611877612265565b9050600081511161189757604051806020016040528060008152506118d1565b806118ad6001856118a89190613204565b6122f7565b60106040516020016118c1939291906135cc565b6040516020818303038152906040525b915050919050565b6060600f80546118e890612f42565b80601f016020809104026020016040519081016040528092919081815260200182805461191490612f42565b80156119615780601f1061193657610100808354040283529160200191611961565b820191906000526020600020905b81548152906001019060200180831161194457829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a07611b00565b73ffffffffffffffffffffffffffffffffffffffff16611a25611176565b73ffffffffffffffffffffffffffffffffffffffff1614611a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7290612ef3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae19061366f565b60405180910390fd5b611af381611fe7565b50565b6000600c54905090565b600033905090565b600081611b13611c3b565b11158015611b22575060005482105b8015611b60575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611b76611c3b565b11611bfc57600054811015611bfb5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611bf9575b60008103611bef576004600083600190039350838152602001908152602001600020549050611bc5565b8092505050611c2e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611c4b82611b67565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611cb2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611cd3611c33565b73ffffffffffffffffffffffffffffffffffffffff161480611d025750611d0185611cfc611c33565b61196b565b5b80611d475750611d10611c33565b73ffffffffffffffffffffffffffffffffffffffff16611d2f84610988565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d80576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611de6576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611df38585856001612457565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611ef08661245d565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611f785760006001840190506000600460008381526020019081526020016000205403611f76576000548114611f75578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fe08585856001612467565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000610bb882106120bf57600a6120c2565b60025b60ff169050919050565b6000610bb882106120e4576611c37937e080006120e7565b60005b66ffffffffffffff169050919050565b61211182826040518060200160405280600081525061246d565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261213b611c33565b8786866040518563ffffffff1660e01b815260040161215d94939291906136e4565b6020604051808303816000875af192505050801561219957506040513d601f19601f820116820180604052508101906121969190613745565b60015b612212573d80600081146121c9576040519150601f19603f3d011682016040523d82523d6000602084013e6121ce565b606091505b50600081510361220a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f805461227490612f42565b80601f01602080910402602001604051908101604052809291908181526020018280546122a090612f42565b80156122ed5780601f106122c2576101008083540402835291602001916122ed565b820191906000526020600020905b8154815290600101906020018083116122d057829003601f168201915b5050505050905090565b60606000820361233e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612452565b600082905060005b6000821461237057808061235990613772565b915050600a8261236991906137e9565b9150612346565b60008167ffffffffffffffff81111561238c5761238b612b62565b5b6040519080825280601f01601f1916602001820160405280156123be5781602001600182028036833780820191505090505b5090505b6000851461244b576001826123d7919061381a565b9150600a856123e6919061384e565b60306123f29190613204565b60f81b8183815181106124085761240761387f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561244491906137e9565b94506123c2565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036124d9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612513576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125206000858386612457565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161258560018514612720565b901b60a042901b6125958661245d565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612699575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126496000878480600101955087612115565b61267f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106125da57826000541461269457600080fd5b612704565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061269a575b81600081905550505061271a6000858386612467565b50505050565b6000819050919050565b82805461273690612f42565b90600052602060002090601f016020900481019282612758576000855561279f565b82601f1061277157805160ff191683800117855561279f565b8280016001018555821561279f579182015b8281111561279e578251825591602001919060010190612783565b5b5090506127ac91906127b0565b5090565b5b808211156127c95760008160009055506001016127b1565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612816816127e1565b811461282157600080fd5b50565b6000813590506128338161280d565b92915050565b60006020828403121561284f5761284e6127d7565b5b600061285d84828501612824565b91505092915050565b60008115159050919050565b61287b81612866565b82525050565b60006020820190506128966000830184612872565b92915050565b6128a581612866565b81146128b057600080fd5b50565b6000813590506128c28161289c565b92915050565b6000602082840312156128de576128dd6127d7565b5b60006128ec848285016128b3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561292f578082015181840152602081019050612914565b8381111561293e576000848401525b50505050565b6000601f19601f8301169050919050565b6000612960826128f5565b61296a8185612900565b935061297a818560208601612911565b61298381612944565b840191505092915050565b600060208201905081810360008301526129a88184612955565b905092915050565b6000819050919050565b6129c3816129b0565b81146129ce57600080fd5b50565b6000813590506129e0816129ba565b92915050565b6000602082840312156129fc576129fb6127d7565b5b6000612a0a848285016129d1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a3e82612a13565b9050919050565b612a4e81612a33565b82525050565b6000602082019050612a696000830184612a45565b92915050565b612a7881612a33565b8114612a8357600080fd5b50565b600081359050612a9581612a6f565b92915050565b60008060408385031215612ab257612ab16127d7565b5b6000612ac085828601612a86565b9250506020612ad1858286016129d1565b9150509250929050565b612ae4816129b0565b82525050565b6000602082019050612aff6000830184612adb565b92915050565b600080600060608486031215612b1e57612b1d6127d7565b5b6000612b2c86828701612a86565b9350506020612b3d86828701612a86565b9250506040612b4e868287016129d1565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b9a82612944565b810181811067ffffffffffffffff82111715612bb957612bb8612b62565b5b80604052505050565b6000612bcc6127cd565b9050612bd88282612b91565b919050565b600067ffffffffffffffff821115612bf857612bf7612b62565b5b612c0182612944565b9050602081019050919050565b82818337600083830152505050565b6000612c30612c2b84612bdd565b612bc2565b905082815260208101848484011115612c4c57612c4b612b5d565b5b612c57848285612c0e565b509392505050565b600082601f830112612c7457612c73612b58565b5b8135612c84848260208601612c1d565b91505092915050565b600060208284031215612ca357612ca26127d7565b5b600082013567ffffffffffffffff811115612cc157612cc06127dc565b5b612ccd84828501612c5f565b91505092915050565b600060208284031215612cec57612ceb6127d7565b5b6000612cfa84828501612a86565b91505092915050565b60008060408385031215612d1a57612d196127d7565b5b6000612d2885828601612a86565b9250506020612d39858286016128b3565b9150509250929050565b600067ffffffffffffffff821115612d5e57612d5d612b62565b5b612d6782612944565b9050602081019050919050565b6000612d87612d8284612d43565b612bc2565b905082815260208101848484011115612da357612da2612b5d565b5b612dae848285612c0e565b509392505050565b600082601f830112612dcb57612dca612b58565b5b8135612ddb848260208601612d74565b91505092915050565b60008060008060808587031215612dfe57612dfd6127d7565b5b6000612e0c87828801612a86565b9450506020612e1d87828801612a86565b9350506040612e2e878288016129d1565b925050606085013567ffffffffffffffff811115612e4f57612e4e6127dc565b5b612e5b87828801612db6565b91505092959194509250565b60008060408385031215612e7e57612e7d6127d7565b5b6000612e8c85828601612a86565b9250506020612e9d85828601612a86565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612edd602083612900565b9150612ee882612ea7565b602082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f5a57607f821691505b602082108103612f6d57612f6c612f13565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612fa9601f83612900565b9150612fb482612f73565b602082019050919050565b60006020820190508181036000830152612fd881612f9c565b9050919050565b600081905092915050565b50565b6000612ffa600083612fdf565b915061300582612fea565b600082019050919050565b600061301b82612fed565b9150819050919050565b7f4e6f742079657420617661696c61626c65000000000000000000000000000000600082015250565b600061305b601183612900565b915061306682613025565b602082019050919050565b6000602082019050818103600083015261308a8161304e565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006130c7601783612900565b91506130d282613091565b602082019050919050565b600060208201905081810360008301526130f6816130ba565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465642100000000600082015250565b6000613133601c83612900565b915061313e826130fd565b602082019050919050565b6000602082019050818103600083015261316281613126565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061319f601483612900565b91506131aa82613169565b602082019050919050565b600060208201905081810360008301526131ce81613192565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061320f826129b0565b915061321a836129b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561324f5761324e6131d5565b5b828201905092915050565b7f596f752077616e7420746f207375636b20746f6f206d75636820626c6f6f642e60008201527f204d617820737570706c79206578636565646564210000000000000000000000602082015250565b60006132b6603583612900565b91506132c18261325a565b604082019050919050565b600060208201905081810360008301526132e5816132a9565b9050919050565b60006132f7826129b0565b9150613302836129b0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561333b5761333a6131d5565b5b828202905092915050565b7f41726520796f75722066616e677320746f6f2073686f72742c206f7220796f7560008201527f20646f6e74206861766520656e6f7567682066756e64733f0000000000000000602082015250565b60006133a2603883612900565b91506133ad82613346565b604082019050919050565b600060208201905081810360008301526133d181613395565b9050919050565b7f446f6e742062652067726565647921204d6178206d696e74207065722077616c60008201527f6c65742065786365656465642100000000000000000000000000000000000000602082015250565b6000613434602d83612900565b915061343f826133d8565b604082019050919050565b6000602082019050818103600083015261346381613427565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006134c6602f83612900565b91506134d18261346a565b604082019050919050565b600060208201905081810360008301526134f5816134b9565b9050919050565b600081905092915050565b6000613512826128f5565b61351c81856134fc565b935061352c818560208601612911565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461355a81612f42565b61356481866134fc565b9450600182166000811461357f5760018114613590576135c3565b60ff198316865281860193506135c3565b61359985613538565b60005b838110156135bb5781548189015260018201915060208101905061359c565b838801955050505b50505092915050565b60006135d88286613507565b91506135e48285613507565b91506135f0828461354d565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613659602683612900565b9150613664826135fd565b604082019050919050565b600060208201905081810360008301526136888161364c565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006136b68261368f565b6136c0818561369a565b93506136d0818560208601612911565b6136d981612944565b840191505092915050565b60006080820190506136f96000830187612a45565b6137066020830186612a45565b6137136040830185612adb565b818103606083015261372581846136ab565b905095945050505050565b60008151905061373f8161280d565b92915050565b60006020828403121561375b5761375a6127d7565b5b600061376984828501613730565b91505092915050565b600061377d826129b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137af576137ae6131d5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006137f4826129b0565b91506137ff836129b0565b92508261380f5761380e6137ba565b5b828204905092915050565b6000613825826129b0565b9150613830836129b0565b925082821015613843576138426131d5565b5b828203905092915050565b6000613859826129b0565b9150613864836129b0565b925082613874576138736137ba565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122090c521055a3206a6bb546dc47d12d5fd030d60f55cfd24c202f8440f27f3d05c64736f6c634300080e00330000000000000000000000000000000000000000000000000000000000001a0a0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5075416b4b364e33554437567459373267334e5478596b7239624a63635957376274505443476239655778632f00000000000000000000
Deployed Bytecode
0x6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd146106d2578063ddd699a11461070f578063e985e9c51461073a578063f2fde38b14610777578063f807b687146107a0576101f9565b8063a22cb4651461062c578063b071401b14610655578063b88d4fde1461067e578063bd3e19d4146106a7576101f9565b806395d89b41116100dc57806395d89b41146105935780639951b132146105be578063a0712d68146105e7578063a144819414610603576101f9565b806370a08231146104eb578063715018a614610528578063766b7d091461053f5780638da5cb5b14610568576101f9565b80633ccfd60b116101905780634f3e1efc1161015f5780634f3e1efc146104065780634f4ee6b814610431578063626ab3b81461045c5780636352211e14610485578063676f2602146104c2576101f9565b80633ccfd60b1461037257806342842e0e146103895780634c0f38c2146103b25780634d534a7d146103dd576101f9565b8063095ea7b3116101cc578063095ea7b3146102cc57806318160ddd146102f557806323b872dd146103205780633b4c4b2514610349576101f9565b806301ffc9a7146101fe57806302329a291461023b57806306fdde0314610264578063081812fc1461028f575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612839565b6107cb565b6040516102329190612881565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d91906128c8565b61085d565b005b34801561027057600080fd5b506102796108f6565b604051610286919061298e565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b191906129e6565b610988565b6040516102c39190612a54565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee9190612a9b565b610a04565b005b34801561030157600080fd5b5061030a610baa565b6040516103179190612aea565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190612b05565b610bc1565b005b34801561035557600080fd5b50610370600480360381019061036b91906129e6565b610bd1565b005b34801561037e57600080fd5b50610387610c57565b005b34801561039557600080fd5b506103b060048036038101906103ab9190612b05565b610dae565b005b3480156103be57600080fd5b506103c7610dce565b6040516103d49190612aea565b60405180910390f35b3480156103e957600080fd5b5061040460048036038101906103ff9190612c8d565b610dd8565b005b34801561041257600080fd5b5061041b610e6e565b6040516104289190612aea565b60405180910390f35b34801561043d57600080fd5b50610446610e78565b6040516104539190612aea565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e9190612c8d565b610e82565b005b34801561049157600080fd5b506104ac60048036038101906104a791906129e6565b610f18565b6040516104b99190612a54565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e491906129e6565b610f2a565b005b3480156104f757600080fd5b50610512600480360381019061050d9190612cd6565b610fb0565b60405161051f9190612aea565b60405180910390f35b34801561053457600080fd5b5061053d611068565b005b34801561054b57600080fd5b50610566600480360381019061056191906129e6565b6110f0565b005b34801561057457600080fd5b5061057d611176565b60405161058a9190612a54565b60405180910390f35b34801561059f57600080fd5b506105a86111a0565b6040516105b5919061298e565b60405180910390f35b3480156105ca57600080fd5b506105e560048036038101906105e091906129e6565b611232565b005b61060160048036038101906105fc91906129e6565b6112b8565b005b34801561060f57600080fd5b5061062a60048036038101906106259190612a9b565b611517565b005b34801561063857600080fd5b50610653600480360381019061064e9190612d03565b6115a1565b005b34801561066157600080fd5b5061067c600480360381019061067791906129e6565b611718565b005b34801561068a57600080fd5b506106a560048036038101906106a09190612de4565b61179e565b005b3480156106b357600080fd5b506106bc611811565b6040516106c99190612aea565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f491906129e6565b611823565b604051610706919061298e565b60405180910390f35b34801561071b57600080fd5b506107246118d9565b604051610731919061298e565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190612e67565b61196b565b60405161076e9190612881565b60405180910390f35b34801561078357600080fd5b5061079e60048036038101906107999190612cd6565b6119ff565b005b3480156107ac57600080fd5b506107b5611af6565b6040516107c29190612aea565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108565750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610865611b00565b73ffffffffffffffffffffffffffffffffffffffff16610883611176565b73ffffffffffffffffffffffffffffffffffffffff16146108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090612ef3565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b60606002805461090590612f42565b80601f016020809104026020016040519081016040528092919081815260200182805461093190612f42565b801561097e5780601f106109535761010080835404028352916020019161097e565b820191906000526020600020905b81548152906001019060200180831161096157829003601f168201915b5050505050905090565b600061099382611b08565b6109c9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a0f82611b67565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a76576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a95611c33565b73ffffffffffffffffffffffffffffffffffffffff1614610af857610ac181610abc611c33565b61196b565b610af7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bb4611c3b565b6001546000540303905090565b610bcc838383611c40565b505050565b610bd9611b00565b73ffffffffffffffffffffffffffffffffffffffff16610bf7611176565b73ffffffffffffffffffffffffffffffffffffffff1614610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4490612ef3565b60405180910390fd5b80600b8190555050565b610c5f611b00565b73ffffffffffffffffffffffffffffffffffffffff16610c7d611176565b73ffffffffffffffffffffffffffffffffffffffff1614610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90612ef3565b60405180910390fd5b600260095403610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f90612fbf565b60405180910390fd5b600260098190555060004790506000610d2f611176565b73ffffffffffffffffffffffffffffffffffffffff1682604051610d5290613010565b60006040518083038185875af1925050503d8060008114610d8f576040519150601f19603f3d011682016040523d82523d6000602084013e610d94565b606091505b5050905080610da257600080fd5b50506001600981905550565b610dc98383836040518060200160405280600081525061179e565b505050565b6000600b54905090565b610de0611b00565b73ffffffffffffffffffffffffffffffffffffffff16610dfe611176565b73ffffffffffffffffffffffffffffffffffffffff1614610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4b90612ef3565b60405180910390fd5b8060109080519060200190610e6a92919061272a565b5050565b6000600e54905090565b6000600d54905090565b610e8a611b00565b73ffffffffffffffffffffffffffffffffffffffff16610ea8611176565b73ffffffffffffffffffffffffffffffffffffffff1614610efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef590612ef3565b60405180910390fd5b80600f9080519060200190610f1492919061272a565b5050565b6000610f2382611b67565b9050919050565b610f32611b00565b73ffffffffffffffffffffffffffffffffffffffff16610f50611176565b73ffffffffffffffffffffffffffffffffffffffff1614610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612ef3565b60405180910390fd5b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611017576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611070611b00565b73ffffffffffffffffffffffffffffffffffffffff1661108e611176565b73ffffffffffffffffffffffffffffffffffffffff16146110e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110db90612ef3565b60405180910390fd5b6110ee6000611fe7565b565b6110f8611b00565b73ffffffffffffffffffffffffffffffffffffffff16611116611176565b73ffffffffffffffffffffffffffffffffffffffff161461116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390612ef3565b60405180910390fd5b80600d8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111af90612f42565b80601f01602080910402602001604051908101604052809291908181526020018280546111db90612f42565b80156112285780601f106111fd57610100808354040283529160200191611228565b820191906000526020600020905b81548152906001019060200180831161120b57829003601f168201915b5050505050905090565b61123a611b00565b73ffffffffffffffffffffffffffffffffffffffff16611258611176565b73ffffffffffffffffffffffffffffffffffffffff16146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590612ef3565b60405180910390fd5b8060118190555050565b6011544210156112fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f490613071565b60405180910390fd5b601260009054906101000a900460ff161561134d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611344906130dd565b60405180910390fd5b600b54611358610baa565b1115611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090613149565b60405180910390fd5b6000811180156113b357506113af600e546120ad565b8111155b6113f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e9906131b5565b60405180910390fd5b600b5481600e546114039190613204565b1115611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b906132cc565b60405180910390fd5b80611450600e546120cc565b61145a91906132ec565b34101561149c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611493906133b8565b60405180910390fd5b6114a7600e546120ad565b816114b133610fb0565b6114bb9190613204565b11156114fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f39061344a565b60405180910390fd5b61150633826120f7565b61150e610baa565b600e8190555050565b61151f611b00565b73ffffffffffffffffffffffffffffffffffffffff1661153d611176565b73ffffffffffffffffffffffffffffffffffffffff1614611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90612ef3565b60405180910390fd5b61159d82826120f7565b5050565b6115a9611c33565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361160d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061161a611c33565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116c7611c33565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161170c9190612881565b60405180910390a35050565b611720611b00565b73ffffffffffffffffffffffffffffffffffffffff1661173e611176565b73ffffffffffffffffffffffffffffffffffffffff1614611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90612ef3565b60405180910390fd5b80600c8190555050565b6117a9848484611c40565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461180b576117d484848484612115565b61180a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600061181e600e546120cc565b905090565b606061182e82611b08565b61186d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611864906134dc565b60405180910390fd5b6000611877612265565b9050600081511161189757604051806020016040528060008152506118d1565b806118ad6001856118a89190613204565b6122f7565b60106040516020016118c1939291906135cc565b6040516020818303038152906040525b915050919050565b6060600f80546118e890612f42565b80601f016020809104026020016040519081016040528092919081815260200182805461191490612f42565b80156119615780601f1061193657610100808354040283529160200191611961565b820191906000526020600020905b81548152906001019060200180831161194457829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a07611b00565b73ffffffffffffffffffffffffffffffffffffffff16611a25611176565b73ffffffffffffffffffffffffffffffffffffffff1614611a7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7290612ef3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae19061366f565b60405180910390fd5b611af381611fe7565b50565b6000600c54905090565b600033905090565b600081611b13611c3b565b11158015611b22575060005482105b8015611b60575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611b76611c3b565b11611bfc57600054811015611bfb5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611bf9575b60008103611bef576004600083600190039350838152602001908152602001600020549050611bc5565b8092505050611c2e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611c4b82611b67565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611cb2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611cd3611c33565b73ffffffffffffffffffffffffffffffffffffffff161480611d025750611d0185611cfc611c33565b61196b565b5b80611d475750611d10611c33565b73ffffffffffffffffffffffffffffffffffffffff16611d2f84610988565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d80576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611de6576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611df38585856001612457565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611ef08661245d565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611f785760006001840190506000600460008381526020019081526020016000205403611f76576000548114611f75578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fe08585856001612467565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000610bb882106120bf57600a6120c2565b60025b60ff169050919050565b6000610bb882106120e4576611c37937e080006120e7565b60005b66ffffffffffffff169050919050565b61211182826040518060200160405280600081525061246d565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261213b611c33565b8786866040518563ffffffff1660e01b815260040161215d94939291906136e4565b6020604051808303816000875af192505050801561219957506040513d601f19601f820116820180604052508101906121969190613745565b60015b612212573d80600081146121c9576040519150601f19603f3d011682016040523d82523d6000602084013e6121ce565b606091505b50600081510361220a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f805461227490612f42565b80601f01602080910402602001604051908101604052809291908181526020018280546122a090612f42565b80156122ed5780601f106122c2576101008083540402835291602001916122ed565b820191906000526020600020905b8154815290600101906020018083116122d057829003601f168201915b5050505050905090565b60606000820361233e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612452565b600082905060005b6000821461237057808061235990613772565b915050600a8261236991906137e9565b9150612346565b60008167ffffffffffffffff81111561238c5761238b612b62565b5b6040519080825280601f01601f1916602001820160405280156123be5781602001600182028036833780820191505090505b5090505b6000851461244b576001826123d7919061381a565b9150600a856123e6919061384e565b60306123f29190613204565b60f81b8183815181106124085761240761387f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561244491906137e9565b94506123c2565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036124d9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612513576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125206000858386612457565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161258560018514612720565b901b60a042901b6125958661245d565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612699575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126496000878480600101955087612115565b61267f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106125da57826000541461269457600080fd5b612704565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061269a575b81600081905550505061271a6000858386612467565b50505050565b6000819050919050565b82805461273690612f42565b90600052602060002090601f016020900481019282612758576000855561279f565b82601f1061277157805160ff191683800117855561279f565b8280016001018555821561279f579182015b8281111561279e578251825591602001919060010190612783565b5b5090506127ac91906127b0565b5090565b5b808211156127c95760008160009055506001016127b1565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612816816127e1565b811461282157600080fd5b50565b6000813590506128338161280d565b92915050565b60006020828403121561284f5761284e6127d7565b5b600061285d84828501612824565b91505092915050565b60008115159050919050565b61287b81612866565b82525050565b60006020820190506128966000830184612872565b92915050565b6128a581612866565b81146128b057600080fd5b50565b6000813590506128c28161289c565b92915050565b6000602082840312156128de576128dd6127d7565b5b60006128ec848285016128b3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561292f578082015181840152602081019050612914565b8381111561293e576000848401525b50505050565b6000601f19601f8301169050919050565b6000612960826128f5565b61296a8185612900565b935061297a818560208601612911565b61298381612944565b840191505092915050565b600060208201905081810360008301526129a88184612955565b905092915050565b6000819050919050565b6129c3816129b0565b81146129ce57600080fd5b50565b6000813590506129e0816129ba565b92915050565b6000602082840312156129fc576129fb6127d7565b5b6000612a0a848285016129d1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a3e82612a13565b9050919050565b612a4e81612a33565b82525050565b6000602082019050612a696000830184612a45565b92915050565b612a7881612a33565b8114612a8357600080fd5b50565b600081359050612a9581612a6f565b92915050565b60008060408385031215612ab257612ab16127d7565b5b6000612ac085828601612a86565b9250506020612ad1858286016129d1565b9150509250929050565b612ae4816129b0565b82525050565b6000602082019050612aff6000830184612adb565b92915050565b600080600060608486031215612b1e57612b1d6127d7565b5b6000612b2c86828701612a86565b9350506020612b3d86828701612a86565b9250506040612b4e868287016129d1565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612b9a82612944565b810181811067ffffffffffffffff82111715612bb957612bb8612b62565b5b80604052505050565b6000612bcc6127cd565b9050612bd88282612b91565b919050565b600067ffffffffffffffff821115612bf857612bf7612b62565b5b612c0182612944565b9050602081019050919050565b82818337600083830152505050565b6000612c30612c2b84612bdd565b612bc2565b905082815260208101848484011115612c4c57612c4b612b5d565b5b612c57848285612c0e565b509392505050565b600082601f830112612c7457612c73612b58565b5b8135612c84848260208601612c1d565b91505092915050565b600060208284031215612ca357612ca26127d7565b5b600082013567ffffffffffffffff811115612cc157612cc06127dc565b5b612ccd84828501612c5f565b91505092915050565b600060208284031215612cec57612ceb6127d7565b5b6000612cfa84828501612a86565b91505092915050565b60008060408385031215612d1a57612d196127d7565b5b6000612d2885828601612a86565b9250506020612d39858286016128b3565b9150509250929050565b600067ffffffffffffffff821115612d5e57612d5d612b62565b5b612d6782612944565b9050602081019050919050565b6000612d87612d8284612d43565b612bc2565b905082815260208101848484011115612da357612da2612b5d565b5b612dae848285612c0e565b509392505050565b600082601f830112612dcb57612dca612b58565b5b8135612ddb848260208601612d74565b91505092915050565b60008060008060808587031215612dfe57612dfd6127d7565b5b6000612e0c87828801612a86565b9450506020612e1d87828801612a86565b9350506040612e2e878288016129d1565b925050606085013567ffffffffffffffff811115612e4f57612e4e6127dc565b5b612e5b87828801612db6565b91505092959194509250565b60008060408385031215612e7e57612e7d6127d7565b5b6000612e8c85828601612a86565b9250506020612e9d85828601612a86565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612edd602083612900565b9150612ee882612ea7565b602082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f5a57607f821691505b602082108103612f6d57612f6c612f13565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612fa9601f83612900565b9150612fb482612f73565b602082019050919050565b60006020820190508181036000830152612fd881612f9c565b9050919050565b600081905092915050565b50565b6000612ffa600083612fdf565b915061300582612fea565b600082019050919050565b600061301b82612fed565b9150819050919050565b7f4e6f742079657420617661696c61626c65000000000000000000000000000000600082015250565b600061305b601183612900565b915061306682613025565b602082019050919050565b6000602082019050818103600083015261308a8161304e565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006130c7601783612900565b91506130d282613091565b602082019050919050565b600060208201905081810360008301526130f6816130ba565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465642100000000600082015250565b6000613133601c83612900565b915061313e826130fd565b602082019050919050565b6000602082019050818103600083015261316281613126565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061319f601483612900565b91506131aa82613169565b602082019050919050565b600060208201905081810360008301526131ce81613192565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061320f826129b0565b915061321a836129b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561324f5761324e6131d5565b5b828201905092915050565b7f596f752077616e7420746f207375636b20746f6f206d75636820626c6f6f642e60008201527f204d617820737570706c79206578636565646564210000000000000000000000602082015250565b60006132b6603583612900565b91506132c18261325a565b604082019050919050565b600060208201905081810360008301526132e5816132a9565b9050919050565b60006132f7826129b0565b9150613302836129b0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561333b5761333a6131d5565b5b828202905092915050565b7f41726520796f75722066616e677320746f6f2073686f72742c206f7220796f7560008201527f20646f6e74206861766520656e6f7567682066756e64733f0000000000000000602082015250565b60006133a2603883612900565b91506133ad82613346565b604082019050919050565b600060208201905081810360008301526133d181613395565b9050919050565b7f446f6e742062652067726565647921204d6178206d696e74207065722077616c60008201527f6c65742065786365656465642100000000000000000000000000000000000000602082015250565b6000613434602d83612900565b915061343f826133d8565b604082019050919050565b6000602082019050818103600083015261346381613427565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006134c6602f83612900565b91506134d18261346a565b604082019050919050565b600060208201905081810360008301526134f5816134b9565b9050919050565b600081905092915050565b6000613512826128f5565b61351c81856134fc565b935061352c818560208601612911565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461355a81612f42565b61356481866134fc565b9450600182166000811461357f5760018114613590576135c3565b60ff198316865281860193506135c3565b61359985613538565b60005b838110156135bb5781548189015260018201915060208101905061359c565b838801955050505b50505092915050565b60006135d88286613507565b91506135e48285613507565b91506135f0828461354d565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613659602683612900565b9150613664826135fd565b604082019050919050565b600060208201905081810360008301526136888161364c565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006136b68261368f565b6136c0818561369a565b93506136d0818560208601612911565b6136d981612944565b840191505092915050565b60006080820190506136f96000830187612a45565b6137066020830186612a45565b6137136040830185612adb565b818103606083015261372581846136ab565b905095945050505050565b60008151905061373f8161280d565b92915050565b60006020828403121561375b5761375a6127d7565b5b600061376984828501613730565b91505092915050565b600061377d826129b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137af576137ae6131d5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006137f4826129b0565b91506137ff836129b0565b92508261380f5761380e6137ba565b5b828204905092915050565b6000613825826129b0565b9150613830836129b0565b925082821015613843576138426131d5565b5b828203905092915050565b6000613859826129b0565b9150613864836129b0565b925082613874576138736137ba565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea264697066735822122090c521055a3206a6bb546dc47d12d5fd030d60f55cfd24c202f8440f27f3d05c64736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000001a0a0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5075416b4b364e33554437567459373267334e5478596b7239624a63635957376274505443476239655778632f00000000000000000000
-----Decoded View---------------
Arg [0] : __maxSupply (uint256): 6666
Arg [1] : _initBaseURI (string): ipfs://QmPuAkK6N3UD7VtY72g3NTxYkr9bJccYW7btPTCGb9eWxc/
Arg [2] : _maxMintAmountPerTx (uint256): 2
Arg [3] : _maxMintAmountPerWallet (uint256): 2
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000001a0a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [5] : 697066733a2f2f516d5075416b4b364e33554437567459373267334e5478596b
Arg [6] : 7239624a63635957376274505443476239655778632f00000000000000000000
Deployed Bytecode Sourcemap
46744:4716:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17956:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48878:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22969:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25037:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24497:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17010:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25923:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49376:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49947:229;;;;;;;;;;;;;:::i;:::-;;26164:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50904:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49177:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51003:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51334:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49082:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22758:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49282:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18635:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45836:103;;;;;;;;;;;;;:::i;:::-;;49705:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45185:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23138:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49473:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47927:870;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48963:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25313:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49565:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26420:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50682:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50262:412;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51109:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25692:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46094:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51211:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17956:615;18041:4;18356:10;18341:25;;:11;:25;;;;:102;;;;18433:10;18418:25;;:11;:25;;;;18341:102;:179;;;;18510:10;18495:25;;:11;:25;;;;18341:179;18321:199;;17956:615;;;:::o;48878:77::-;45416:12;:10;:12::i;:::-;45405:23;;:7;:5;:7::i;:::-;:23;;;45397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48942:5:::1;48933:6;;:14;;;;;;;;;;;;;;;;;;48878:77:::0;:::o;22969:100::-;23023:13;23056:5;23049:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22969:100;:::o;25037:204::-;25105:7;25130:16;25138:7;25130;:16::i;:::-;25125:64;;25155:34;;;;;;;;;;;;;;25125:64;25209:15;:24;25225:7;25209:24;;;;;;;;;;;;;;;;;;;;;25202:31;;25037:204;;;:::o;24497:474::-;24570:13;24602:27;24621:7;24602:18;:27::i;:::-;24570:61;;24652:5;24646:11;;:2;:11;;;24642:48;;24666:24;;;;;;;;;;;;;;24642:48;24730:5;24707:28;;:19;:17;:19::i;:::-;:28;;;24703:175;;24755:44;24772:5;24779:19;:17;:19::i;:::-;24755:16;:44::i;:::-;24750:128;;24827:35;;;;;;;;;;;;;;24750:128;24703:175;24917:2;24890:15;:24;24906:7;24890:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24955:7;24951:2;24935:28;;24944:5;24935:28;;;;;;;;;;;;24559:412;24497:474;;:::o;17010:315::-;17063:7;17291:15;:13;:15::i;:::-;17276:12;;17260:13;;:28;:46;17253:53;;17010:315;:::o;25923:170::-;26057:28;26067:4;26073:2;26077:7;26057:9;:28::i;:::-;25923:170;;;:::o;49376:89::-;45416:12;:10;:12::i;:::-;45405:23;;:7;:5;:7::i;:::-;:23;;;45397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49451:6:::1;49438:10;:19;;;;49376:89:::0;:::o;49947:229::-;45416:12;:10;:12::i;:::-;45405:23;;:7;:5;:7::i;:::-;:23;;;45397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19:::0;2402:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;50009:30:::2;50042:21;50009:54;;50075:7;50096;:5;:7::i;:::-;50088:21;;50117:22;50088:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50074:70;;;50163:2;50155:11;;;::::0;::::2;;49996:180;;1768:1:::1;2722:7;:22;;;;49947:229::o:0;26164:185::-;26302:39;26319:4;26325:2;26329:7;26302:39;;;;;;;;;;;;:16;:39::i;:::-;26164:185;;;:::o;50904:89::-;50949:7;50975:10;;50968:17;;50904:89;:::o;49177:97::-;45416:12;:10;:12::i;:::-;45405:23;;:7;:5;:7::i;:::-;:23;;;45397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49263:3:::1;49248:12;:18;;;;;;;;;;;;:::i;:::-;;49177:97:::0;:::o;51003:96::-;51052:7;51078:13;;51071:20;;51003:96;:::o;51334:121::-;51399:7;51425:22;;51418:29;;51334:121;:::o;49082:87::-;45416:12;:10;:12::i;:::-;45405:23;;:7;:5;:7::i;:::-;:23;;;45397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49158:3:::1;49148:7;:13;;;;;;;;;;;;:::i;:::-;;49082:87:::0;:::o;22758:144::-;22822:7;22865:27;22884:7;22865:18;:27::i;:::-;22842:52;;22758:144;;;:::o;49282:85::-;45416:12;:10;:12::i;:::-;45405:23;;:7;:5;:7::i;:::-;:23;;;45397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49354:5:::1;49346;:13;;;;49282:85:::0;:::o;18635:224::-;18699:7;18740:1;18723:19;;:5;:19;;;18719:60;;18751:28;;;;;;;;;;;;;;18719:60;13974:13;18797:18;:25;18816:5;18797:25;;;;;;;;;;;;;;;;:54;18790:61;;18635:224;;;:::o;45836:103::-;45416:12;:10;:12::i;:::-;45405:23;;:7;:5;:7::i;:::-;:23;;;45397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45901:30:::1;45928:1;45901:18;:30::i;:::-;45836:103::o:0;49705:148::-;45416:12;:10;:12::i;:::-;45405:23;;:7;:5;:7::i;:::-;:23;;;45397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49822:23:::1;49797:22;:48;;;;49705:148:::0;:::o;45185:87::-;45231:7;45258:6;;;;;;;;;;;45251:13;;45185:87;:::o;23138:104::-;23194:13;23227:7;23220:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23138:104;:::o;49473:84::-;45416:12;:10;:12::i;:::-;45405:23;;:7;:5;:7::i;:::-;:23;;;45397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49544:5:::1;49533:8;:16;;;;49473:84:::0;:::o;47927:870::-;48018:8;;47999:15;:27;;47991:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;48071:6;;;;;;;;;;;48070:7;48062:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;48143:10;;48126:13;:11;:13::i;:::-;:27;;48118:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48221:1;48207:11;:15;:64;;;;;48241:30;48257:13;;48241:15;:30::i;:::-;48226:11;:45;;48207:64;48199:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;48351:10;;48336:11;48320:13;;:27;;;;:::i;:::-;:41;;48312:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;48480:11;48453:24;48463:13;;48453:9;:24::i;:::-;:38;;;;:::i;:::-;48440:9;:51;;48432:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;48613:30;48629:13;;48613:15;:30::i;:::-;48598:11;48574:21;48584:10;48574:9;:21::i;:::-;:35;;;;:::i;:::-;:69;;48566:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;48709:34;48719:10;48731:11;48709:9;:34::i;:::-;48772:13;:11;:13::i;:::-;48756;:29;;;;47927:870;:::o;48963:107::-;45416:12;:10;:12::i;:::-;45405:23;;:7;:5;:7::i;:::-;:23;;;45397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49039:23:::1;49049:2;49053:8;49039:9;:23::i;:::-;48963:107:::0;;:::o;25313:308::-;25424:19;:17;:19::i;:::-;25412:31;;:8;:31;;;25408:61;;25452:17;;;;;;;;;;;;;;25408:61;25534:8;25482:18;:39;25501:19;:17;:19::i;:::-;25482:39;;;;;;;;;;;;;;;:49;25522:8;25482:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25594:8;25558:55;;25573:19;:17;:19::i;:::-;25558:55;;;25604:8;25558:55;;;;;;:::i;:::-;;;;;;;;25313:308;;:::o;49565:132::-;45416:12;:10;:12::i;:::-;45405:23;;:7;:5;:7::i;:::-;:23;;;45397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49670:19:::1;49649:18;:40;;;;49565:132:::0;:::o;26420:396::-;26587:28;26597:4;26603:2;26607:7;26587:9;:28::i;:::-;26648:1;26630:2;:14;;;:19;26626:183;;26669:56;26700:4;26706:2;26710:7;26719:5;26669:30;:56::i;:::-;26664:145;;26753:40;;;;;;;;;;;;;;26664:145;26626:183;26420:396;;;;:::o;50682:98::-;50722:7;50748:24;50758:13;;50748:9;:24::i;:::-;50741:31;;50682:98;:::o;50262:412::-;50336:13;50371:16;50379:7;50371;:16::i;:::-;50363:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50459:28;50490:10;:8;:10::i;:::-;50459:41;;50549:1;50524:14;50518:28;:32;:146;;;;;;;;;;;;;;;;;50590:14;50606:24;50617:1;50607:7;:11;;;;:::i;:::-;50606:22;:24::i;:::-;50632:12;50573:72;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50518:146;50511:153;;;50262:412;;;:::o;51109:94::-;51155:13;51188:7;51181:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51109:94;:::o;25692:164::-;25789:4;25813:18;:25;25832:5;25813:25;;;;;;;;;;;;;;;:35;25839:8;25813:35;;;;;;;;;;;;;;;;;;;;;;;;;25806:42;;25692:164;;;;:::o;46094:201::-;45416:12;:10;:12::i;:::-;45405:23;;:7;:5;:7::i;:::-;:23;;;45397:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46203:1:::1;46183:22;;:8;:22;;::::0;46175:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46259:28;46278:8;46259:18;:28::i;:::-;46094:201:::0;:::o;51211:113::-;51272:7;51298:18;;51291:25;;51211:113;:::o;43909:98::-;43962:7;43989:10;43982:17;;43909:98;:::o;27071:273::-;27128:4;27184:7;27165:15;:13;:15::i;:::-;:26;;:66;;;;;27218:13;;27208:7;:23;27165:66;:152;;;;;27316:1;14744:8;27269:17;:26;27287:7;27269:26;;;;;;;;;;;;:43;:48;27165:152;27145:172;;27071:273;;;:::o;20273:1129::-;20340:7;20360:12;20375:7;20360:22;;20443:4;20424:15;:13;:15::i;:::-;:23;20420:915;;20477:13;;20470:4;:20;20466:869;;;20515:14;20532:17;:23;20550:4;20532:23;;;;;;;;;;;;20515:40;;20648:1;14744:8;20621:6;:23;:28;20617:699;;21140:113;21157:1;21147:6;:11;21140:113;;21200:17;:25;21218:6;;;;;;;21200:25;;;;;;;;;;;;21191:34;;21140:113;;;21286:6;21279:13;;;;;;20617:699;20492:843;20466:869;20420:915;21363:31;;;;;;;;;;;;;;20273:1129;;;;:::o;41053:105::-;41113:7;41140:10;41133:17;;41053:105;:::o;16533:92::-;16589:7;16533:92;:::o;32310:2515::-;32425:27;32455;32474:7;32455:18;:27::i;:::-;32425:57;;32540:4;32499:45;;32515:19;32499:45;;;32495:86;;32553:28;;;;;;;;;;;;;;32495:86;32594:22;32643:4;32620:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;32664:43;32681:4;32687:19;:17;:19::i;:::-;32664:16;:43::i;:::-;32620:87;:147;;;;32748:19;:17;:19::i;:::-;32724:43;;:20;32736:7;32724:11;:20::i;:::-;:43;;;32620:147;32594:174;;32786:17;32781:66;;32812:35;;;;;;;;;;;;;;32781:66;32876:1;32862:16;;:2;:16;;;32858:52;;32887:23;;;;;;;;;;;;;;32858:52;32923:43;32945:4;32951:2;32955:7;32964:1;32923:21;:43::i;:::-;33039:15;:24;33055:7;33039:24;;;;;;;;;;;;33032:31;;;;;;;;;;;33431:18;:24;33450:4;33431:24;;;;;;;;;;;;;;;;33429:26;;;;;;;;;;;;33500:18;:22;33519:2;33500:22;;;;;;;;;;;;;;;;33498:24;;;;;;;;;;;15026:8;14628:3;33881:15;:41;;33839:21;33857:2;33839:17;:21::i;:::-;:84;:128;33793:17;:26;33811:7;33793:26;;;;;;;;;;;:174;;;;34137:1;15026:8;34087:19;:46;:51;34083:626;;34159:19;34191:1;34181:7;:11;34159:33;;34348:1;34314:17;:30;34332:11;34314:30;;;;;;;;;;;;:35;34310:384;;34452:13;;34437:11;:28;34433:242;;34632:19;34599:17;:30;34617:11;34599:30;;;;;;;;;;;:52;;;;34433:242;34310:384;34140:569;34083:626;34756:7;34752:2;34737:27;;34746:4;34737:27;;;;;;;;;;;;34775:42;34796:4;34802:2;34806:7;34815:1;34775:20;:42::i;:::-;32414:2411;;32310:2515;;;:::o;46455:191::-;46529:16;46548:6;;;;;;;;;;;46529:25;;46574:8;46565:6;;:17;;;;;;;;;;;;;;;;;;46629:8;46598:40;;46619:8;46598:40;;;;;;;;;;;;46518:128;46455:191;:::o;47721:129::-;47786:14;47829:4;47819:7;:14;:23;;47840:2;47819:23;;;47836:1;47819:23;47812:30;;;;47721:129;;;:::o;47577:138::-;47636:14;47679:4;47669:7;:14;:38;;47696:11;47669:38;;;47686:7;47669:38;47662:45;;;;47577:138;;;:::o;27428:104::-;27497:27;27507:2;27511:8;27497:27;;;;;;;;;;;;:9;:27::i;:::-;27428:104;;:::o;38522:716::-;38685:4;38731:2;38706:45;;;38752:19;:17;:19::i;:::-;38773:4;38779:7;38788:5;38706:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38702:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39006:1;38989:6;:13;:18;38985:235;;39035:40;;;;;;;;;;;;;;38985:235;39178:6;39172:13;39163:6;39159:2;39155:15;39148:38;38702:529;38875:54;;;38865:64;;;:6;:64;;;;38858:71;;;38522:716;;;;;;:::o;50788:108::-;50848:13;50881:7;50874:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50788:108;:::o;3124:723::-;3180:13;3410:1;3401:5;:10;3397:53;;3428:10;;;;;;;;;;;;;;;;;;;;;3397:53;3460:12;3475:5;3460:20;;3491:14;3516:78;3531:1;3523:4;:9;3516:78;;3549:8;;;;;:::i;:::-;;;;3580:2;3572:10;;;;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:39;;3654:154;3670:1;3661:5;:10;3654:154;;3698:1;3688:11;;;;;:::i;:::-;;;3765:2;3757:5;:10;;;;:::i;:::-;3744:2;:24;;;;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3794:2;3785:11;;;;;:::i;:::-;;;3654:154;;;3832:6;3818:21;;;;;3124:723;;;;:::o;39886:159::-;;;;;:::o;24058:148::-;24122:14;24183:5;24173:15;;24058:148;;;:::o;40704:158::-;;;;;:::o;27905:2236::-;28028:20;28051:13;;28028:36;;28093:1;28079:16;;:2;:16;;;28075:48;;28104:19;;;;;;;;;;;;;;28075:48;28150:1;28138:8;:13;28134:44;;28160:18;;;;;;;;;;;;;;28134:44;28191:61;28221:1;28225:2;28229:12;28243:8;28191:21;:61::i;:::-;28795:1;14111:2;28766:1;:25;;28765:31;28753:8;:44;28727:18;:22;28746:2;28727:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;14891:3;29196:29;29223:1;29211:8;:13;29196:14;:29::i;:::-;:56;;14628:3;29133:15;:41;;29091:21;29109:2;29091:17;:21::i;:::-;:84;:162;29040:17;:31;29058:12;29040:31;;;;;;;;;;;:213;;;;29270:20;29293:12;29270:35;;29320:11;29349:8;29334:12;:23;29320:37;;29396:1;29378:2;:14;;;:19;29374:635;;29418:313;29474:12;29470:2;29449:38;;29466:1;29449:38;;;;;;;;;;;;29515:69;29554:1;29558:2;29562:14;;;;;;29578:5;29515:30;:69::i;:::-;29510:174;;29620:40;;;;;;;;;;;;;;29510:174;29726:3;29711:12;:18;29418:313;;29812:12;29795:13;;:29;29791:43;;29826:8;;;29791:43;29374:635;;;29875:119;29931:14;;;;;;29927:2;29906:40;;29923:1;29906:40;;;;;;;;;;;;29989:3;29974:12;:18;29875:119;;29374:635;30039:12;30023:13;:28;;;;28504:1559;;30073:60;30102:1;30106:2;30110:12;30124:8;30073:20;:60::i;:::-;28017:2124;27905:2236;;;:::o;24293:142::-;24351:14;24412:5;24402:15;;24293: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:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:307::-;2456:1;2466:113;2480:6;2477:1;2474:13;2466:113;;;2565:1;2560:3;2556:11;2550:18;2546:1;2541:3;2537:11;2530:39;2502:2;2499:1;2495:10;2490:15;;2466:113;;;2597:6;2594:1;2591:13;2588:101;;;2677:1;2668:6;2663:3;2659:16;2652:27;2588:101;2437:258;2388:307;;;:::o;2701:102::-;2742:6;2793:2;2789:7;2784:2;2777:5;2773:14;2769:28;2759:38;;2701:102;;;:::o;2809:364::-;2897:3;2925:39;2958:5;2925:39;:::i;:::-;2980:71;3044:6;3039:3;2980:71;:::i;:::-;2973:78;;3060:52;3105:6;3100:3;3093:4;3086:5;3082:16;3060:52;:::i;:::-;3137:29;3159:6;3137:29;:::i;:::-;3132:3;3128:39;3121:46;;2901:272;2809:364;;;;:::o;3179:313::-;3292:4;3330:2;3319:9;3315:18;3307:26;;3379:9;3373:4;3369:20;3365:1;3354:9;3350:17;3343:47;3407:78;3480:4;3471:6;3407:78;:::i;:::-;3399:86;;3179:313;;;;:::o;3498:77::-;3535:7;3564:5;3553:16;;3498:77;;;:::o;3581:122::-;3654:24;3672:5;3654:24;:::i;:::-;3647:5;3644:35;3634:63;;3693:1;3690;3683:12;3634:63;3581:122;:::o;3709:139::-;3755:5;3793:6;3780:20;3771:29;;3809:33;3836:5;3809:33;:::i;:::-;3709:139;;;;:::o;3854:329::-;3913:6;3962:2;3950:9;3941:7;3937:23;3933:32;3930:119;;;3968:79;;:::i;:::-;3930:119;4088:1;4113:53;4158:7;4149:6;4138:9;4134:22;4113:53;:::i;:::-;4103:63;;4059:117;3854:329;;;;:::o;4189:126::-;4226:7;4266:42;4259:5;4255:54;4244:65;;4189:126;;;:::o;4321:96::-;4358:7;4387:24;4405:5;4387:24;:::i;:::-;4376:35;;4321:96;;;:::o;4423:118::-;4510:24;4528:5;4510:24;:::i;:::-;4505:3;4498:37;4423:118;;:::o;4547:222::-;4640:4;4678:2;4667:9;4663:18;4655:26;;4691:71;4759:1;4748:9;4744:17;4735:6;4691:71;:::i;:::-;4547:222;;;;:::o;4775:122::-;4848:24;4866:5;4848:24;:::i;:::-;4841:5;4838:35;4828:63;;4887:1;4884;4877:12;4828:63;4775:122;:::o;4903:139::-;4949:5;4987:6;4974:20;4965:29;;5003:33;5030:5;5003:33;:::i;:::-;4903:139;;;;:::o;5048:474::-;5116:6;5124;5173:2;5161:9;5152:7;5148:23;5144:32;5141:119;;;5179:79;;:::i;:::-;5141:119;5299:1;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5270:117;5426:2;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5397:118;5048:474;;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:117::-;6614:1;6611;6604:12;6628:117;6737:1;6734;6727:12;6751:180;6799:77;6796:1;6789:88;6896:4;6893:1;6886:15;6920:4;6917:1;6910:15;6937:281;7020:27;7042:4;7020:27;:::i;:::-;7012:6;7008:40;7150:6;7138:10;7135:22;7114:18;7102:10;7099:34;7096:62;7093:88;;;7161:18;;:::i;:::-;7093:88;7201:10;7197:2;7190:22;6980:238;6937:281;;:::o;7224:129::-;7258:6;7285:20;;:::i;:::-;7275:30;;7314:33;7342:4;7334:6;7314:33;:::i;:::-;7224:129;;;:::o;7359:308::-;7421:4;7511:18;7503:6;7500:30;7497:56;;;7533:18;;:::i;:::-;7497:56;7571:29;7593:6;7571:29;:::i;:::-;7563:37;;7655:4;7649;7645:15;7637:23;;7359:308;;;:::o;7673:154::-;7757:6;7752:3;7747;7734:30;7819:1;7810:6;7805:3;7801:16;7794:27;7673:154;;;:::o;7833:412::-;7911:5;7936:66;7952:49;7994:6;7952:49;:::i;:::-;7936:66;:::i;:::-;7927:75;;8025:6;8018:5;8011:21;8063:4;8056:5;8052:16;8101:3;8092:6;8087:3;8083:16;8080:25;8077:112;;;8108:79;;:::i;:::-;8077:112;8198:41;8232:6;8227:3;8222;8198:41;:::i;:::-;7917:328;7833:412;;;;;:::o;8265:340::-;8321:5;8370:3;8363:4;8355:6;8351:17;8347:27;8337:122;;8378:79;;:::i;:::-;8337:122;8495:6;8482:20;8520:79;8595:3;8587:6;8580:4;8572:6;8568:17;8520:79;:::i;:::-;8511:88;;8327:278;8265:340;;;;:::o;8611:509::-;8680:6;8729:2;8717:9;8708:7;8704:23;8700:32;8697:119;;;8735:79;;:::i;:::-;8697:119;8883:1;8872:9;8868:17;8855:31;8913:18;8905:6;8902:30;8899:117;;;8935:79;;:::i;:::-;8899:117;9040:63;9095:7;9086:6;9075:9;9071:22;9040:63;:::i;:::-;9030:73;;8826:287;8611:509;;;;:::o;9126:329::-;9185:6;9234:2;9222:9;9213:7;9209:23;9205:32;9202:119;;;9240:79;;:::i;:::-;9202:119;9360:1;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9331:117;9126:329;;;;:::o;9461:468::-;9526:6;9534;9583:2;9571:9;9562:7;9558:23;9554:32;9551:119;;;9589:79;;:::i;:::-;9551:119;9709:1;9734:53;9779:7;9770:6;9759:9;9755:22;9734:53;:::i;:::-;9724:63;;9680:117;9836:2;9862:50;9904:7;9895:6;9884:9;9880:22;9862:50;:::i;:::-;9852:60;;9807:115;9461:468;;;;;:::o;9935:307::-;9996:4;10086:18;10078:6;10075:30;10072:56;;;10108:18;;:::i;:::-;10072:56;10146:29;10168:6;10146:29;:::i;:::-;10138:37;;10230:4;10224;10220:15;10212:23;;9935:307;;;:::o;10248:410::-;10325:5;10350:65;10366:48;10407:6;10366:48;:::i;:::-;10350:65;:::i;:::-;10341:74;;10438:6;10431:5;10424:21;10476:4;10469:5;10465:16;10514:3;10505:6;10500:3;10496:16;10493:25;10490:112;;;10521:79;;:::i;:::-;10490:112;10611:41;10645:6;10640:3;10635;10611:41;:::i;:::-;10331:327;10248:410;;;;;:::o;10677:338::-;10732:5;10781:3;10774:4;10766:6;10762:17;10758:27;10748:122;;10789:79;;:::i;:::-;10748:122;10906:6;10893:20;10931:78;11005:3;10997:6;10990:4;10982:6;10978:17;10931:78;:::i;:::-;10922:87;;10738:277;10677:338;;;;:::o;11021:943::-;11116:6;11124;11132;11140;11189:3;11177:9;11168:7;11164:23;11160:33;11157:120;;;11196:79;;:::i;:::-;11157:120;11316:1;11341:53;11386:7;11377:6;11366:9;11362:22;11341:53;:::i;:::-;11331:63;;11287:117;11443:2;11469:53;11514:7;11505:6;11494:9;11490:22;11469:53;:::i;:::-;11459:63;;11414:118;11571:2;11597:53;11642:7;11633:6;11622:9;11618:22;11597:53;:::i;:::-;11587:63;;11542:118;11727:2;11716:9;11712:18;11699:32;11758:18;11750:6;11747:30;11744:117;;;11780:79;;:::i;:::-;11744:117;11885:62;11939:7;11930:6;11919:9;11915:22;11885:62;:::i;:::-;11875:72;;11670:287;11021:943;;;;;;;:::o;11970:474::-;12038:6;12046;12095:2;12083:9;12074:7;12070:23;12066:32;12063:119;;;12101:79;;:::i;:::-;12063:119;12221:1;12246:53;12291:7;12282:6;12271:9;12267:22;12246:53;:::i;:::-;12236:63;;12192:117;12348:2;12374:53;12419:7;12410:6;12399:9;12395:22;12374:53;:::i;:::-;12364:63;;12319:118;11970:474;;;;;:::o;12450:182::-;12590:34;12586:1;12578:6;12574:14;12567:58;12450:182;:::o;12638:366::-;12780:3;12801:67;12865:2;12860:3;12801:67;:::i;:::-;12794:74;;12877:93;12966:3;12877:93;:::i;:::-;12995:2;12990:3;12986:12;12979:19;;12638:366;;;:::o;13010:419::-;13176:4;13214:2;13203:9;13199:18;13191:26;;13263:9;13257:4;13253:20;13249:1;13238:9;13234:17;13227:47;13291:131;13417:4;13291:131;:::i;:::-;13283:139;;13010:419;;;:::o;13435:180::-;13483:77;13480:1;13473:88;13580:4;13577:1;13570:15;13604:4;13601:1;13594:15;13621:320;13665:6;13702:1;13696:4;13692:12;13682:22;;13749:1;13743:4;13739:12;13770:18;13760:81;;13826:4;13818:6;13814:17;13804:27;;13760:81;13888:2;13880:6;13877:14;13857:18;13854:38;13851:84;;13907:18;;:::i;:::-;13851:84;13672:269;13621:320;;;:::o;13947:181::-;14087:33;14083:1;14075:6;14071:14;14064:57;13947:181;:::o;14134:366::-;14276:3;14297:67;14361:2;14356:3;14297:67;:::i;:::-;14290:74;;14373:93;14462:3;14373:93;:::i;:::-;14491:2;14486:3;14482:12;14475:19;;14134:366;;;:::o;14506:419::-;14672:4;14710:2;14699:9;14695:18;14687:26;;14759:9;14753:4;14749:20;14745:1;14734:9;14730:17;14723:47;14787:131;14913:4;14787:131;:::i;:::-;14779:139;;14506:419;;;:::o;14931:147::-;15032:11;15069:3;15054:18;;14931:147;;;;:::o;15084:114::-;;:::o;15204:398::-;15363:3;15384:83;15465:1;15460:3;15384:83;:::i;:::-;15377:90;;15476:93;15565:3;15476:93;:::i;:::-;15594:1;15589:3;15585:11;15578:18;;15204:398;;;:::o;15608:379::-;15792:3;15814:147;15957:3;15814:147;:::i;:::-;15807:154;;15978:3;15971:10;;15608:379;;;:::o;15993:167::-;16133:19;16129:1;16121:6;16117:14;16110:43;15993:167;:::o;16166:366::-;16308:3;16329:67;16393:2;16388:3;16329:67;:::i;:::-;16322:74;;16405:93;16494:3;16405:93;:::i;:::-;16523:2;16518:3;16514:12;16507:19;;16166:366;;;:::o;16538:419::-;16704:4;16742:2;16731:9;16727:18;16719:26;;16791:9;16785:4;16781:20;16777:1;16766:9;16762:17;16755:47;16819:131;16945:4;16819:131;:::i;:::-;16811:139;;16538:419;;;:::o;16963:173::-;17103:25;17099:1;17091:6;17087:14;17080:49;16963:173;:::o;17142:366::-;17284:3;17305:67;17369:2;17364:3;17305:67;:::i;:::-;17298:74;;17381:93;17470:3;17381:93;:::i;:::-;17499:2;17494:3;17490:12;17483:19;;17142:366;;;:::o;17514:419::-;17680:4;17718:2;17707:9;17703:18;17695:26;;17767:9;17761:4;17757:20;17753:1;17742:9;17738:17;17731:47;17795:131;17921:4;17795:131;:::i;:::-;17787:139;;17514:419;;;:::o;17939:178::-;18079:30;18075:1;18067:6;18063:14;18056:54;17939:178;:::o;18123:366::-;18265:3;18286:67;18350:2;18345:3;18286:67;:::i;:::-;18279:74;;18362:93;18451:3;18362:93;:::i;:::-;18480:2;18475:3;18471:12;18464:19;;18123:366;;;:::o;18495:419::-;18661:4;18699:2;18688:9;18684:18;18676:26;;18748:9;18742:4;18738:20;18734:1;18723:9;18719:17;18712:47;18776:131;18902:4;18776:131;:::i;:::-;18768:139;;18495:419;;;:::o;18920:170::-;19060:22;19056:1;19048:6;19044:14;19037:46;18920:170;:::o;19096:366::-;19238:3;19259:67;19323:2;19318:3;19259:67;:::i;:::-;19252:74;;19335:93;19424:3;19335:93;:::i;:::-;19453:2;19448:3;19444:12;19437:19;;19096:366;;;:::o;19468:419::-;19634:4;19672:2;19661:9;19657:18;19649:26;;19721:9;19715:4;19711:20;19707:1;19696:9;19692:17;19685:47;19749:131;19875:4;19749:131;:::i;:::-;19741:139;;19468:419;;;:::o;19893:180::-;19941:77;19938:1;19931:88;20038:4;20035:1;20028:15;20062:4;20059:1;20052:15;20079:305;20119:3;20138:20;20156:1;20138:20;:::i;:::-;20133:25;;20172:20;20190:1;20172:20;:::i;:::-;20167:25;;20326:1;20258:66;20254:74;20251:1;20248:81;20245:107;;;20332:18;;:::i;:::-;20245:107;20376:1;20373;20369:9;20362:16;;20079:305;;;;:::o;20390:240::-;20530:34;20526:1;20518:6;20514:14;20507:58;20599:23;20594:2;20586:6;20582:15;20575:48;20390:240;:::o;20636:366::-;20778:3;20799:67;20863:2;20858:3;20799:67;:::i;:::-;20792:74;;20875:93;20964:3;20875:93;:::i;:::-;20993:2;20988:3;20984:12;20977:19;;20636:366;;;:::o;21008:419::-;21174:4;21212:2;21201:9;21197:18;21189:26;;21261:9;21255:4;21251:20;21247:1;21236:9;21232:17;21225:47;21289:131;21415:4;21289:131;:::i;:::-;21281:139;;21008:419;;;:::o;21433:348::-;21473:7;21496:20;21514:1;21496:20;:::i;:::-;21491:25;;21530:20;21548:1;21530:20;:::i;:::-;21525:25;;21718:1;21650:66;21646:74;21643:1;21640:81;21635:1;21628:9;21621:17;21617:105;21614:131;;;21725:18;;:::i;:::-;21614:131;21773:1;21770;21766:9;21755:20;;21433:348;;;;:::o;21787:243::-;21927:34;21923:1;21915:6;21911:14;21904:58;21996:26;21991:2;21983:6;21979:15;21972:51;21787:243;:::o;22036:366::-;22178:3;22199:67;22263:2;22258:3;22199:67;:::i;:::-;22192:74;;22275:93;22364:3;22275:93;:::i;:::-;22393:2;22388:3;22384:12;22377:19;;22036:366;;;:::o;22408:419::-;22574:4;22612:2;22601:9;22597:18;22589:26;;22661:9;22655:4;22651:20;22647:1;22636:9;22632:17;22625:47;22689:131;22815:4;22689:131;:::i;:::-;22681:139;;22408:419;;;:::o;22833:232::-;22973:34;22969:1;22961:6;22957:14;22950:58;23042:15;23037:2;23029:6;23025:15;23018:40;22833:232;:::o;23071:366::-;23213:3;23234:67;23298:2;23293:3;23234:67;:::i;:::-;23227:74;;23310:93;23399:3;23310:93;:::i;:::-;23428:2;23423:3;23419:12;23412:19;;23071:366;;;:::o;23443:419::-;23609:4;23647:2;23636:9;23632:18;23624:26;;23696:9;23690:4;23686:20;23682:1;23671:9;23667:17;23660:47;23724:131;23850:4;23724:131;:::i;:::-;23716:139;;23443:419;;;:::o;23868:234::-;24008:34;24004:1;23996:6;23992:14;23985:58;24077:17;24072:2;24064:6;24060:15;24053:42;23868:234;:::o;24108:366::-;24250:3;24271:67;24335:2;24330:3;24271:67;:::i;:::-;24264:74;;24347:93;24436:3;24347:93;:::i;:::-;24465:2;24460:3;24456:12;24449:19;;24108:366;;;:::o;24480:419::-;24646:4;24684:2;24673:9;24669:18;24661:26;;24733:9;24727:4;24723:20;24719:1;24708:9;24704:17;24697:47;24761:131;24887:4;24761:131;:::i;:::-;24753:139;;24480:419;;;:::o;24905:148::-;25007:11;25044:3;25029:18;;24905:148;;;;:::o;25059:377::-;25165:3;25193:39;25226:5;25193:39;:::i;:::-;25248:89;25330:6;25325:3;25248:89;:::i;:::-;25241:96;;25346:52;25391:6;25386:3;25379:4;25372:5;25368:16;25346:52;:::i;:::-;25423:6;25418:3;25414:16;25407:23;;25169:267;25059:377;;;;:::o;25442:141::-;25491:4;25514:3;25506:11;;25537:3;25534:1;25527:14;25571:4;25568:1;25558:18;25550:26;;25442:141;;;:::o;25613:845::-;25716:3;25753:5;25747:12;25782:36;25808:9;25782:36;:::i;:::-;25834:89;25916:6;25911:3;25834:89;:::i;:::-;25827:96;;25954:1;25943:9;25939:17;25970:1;25965:137;;;;26116:1;26111:341;;;;25932:520;;25965:137;26049:4;26045:9;26034;26030:25;26025:3;26018:38;26085:6;26080:3;26076:16;26069:23;;25965:137;;26111:341;26178:38;26210:5;26178:38;:::i;:::-;26238:1;26252:154;26266:6;26263:1;26260:13;26252:154;;;26340:7;26334:14;26330:1;26325:3;26321:11;26314:35;26390:1;26381:7;26377:15;26366:26;;26288:4;26285:1;26281:12;26276:17;;26252:154;;;26435:6;26430:3;26426:16;26419:23;;26118:334;;25932:520;;25720:738;;25613:845;;;;:::o;26464:589::-;26689:3;26711:95;26802:3;26793:6;26711:95;:::i;:::-;26704:102;;26823:95;26914:3;26905:6;26823:95;:::i;:::-;26816:102;;26935:92;27023:3;27014:6;26935:92;:::i;:::-;26928:99;;27044:3;27037:10;;26464:589;;;;;;:::o;27059:225::-;27199:34;27195:1;27187:6;27183:14;27176:58;27268:8;27263:2;27255:6;27251:15;27244:33;27059:225;:::o;27290:366::-;27432:3;27453:67;27517:2;27512:3;27453:67;:::i;:::-;27446:74;;27529:93;27618:3;27529:93;:::i;:::-;27647:2;27642:3;27638:12;27631:19;;27290:366;;;:::o;27662:419::-;27828:4;27866:2;27855:9;27851:18;27843:26;;27915:9;27909:4;27905:20;27901:1;27890:9;27886:17;27879:47;27943:131;28069:4;27943:131;:::i;:::-;27935:139;;27662:419;;;:::o;28087:98::-;28138:6;28172:5;28166:12;28156:22;;28087:98;;;:::o;28191:168::-;28274:11;28308:6;28303:3;28296:19;28348:4;28343:3;28339:14;28324:29;;28191:168;;;;:::o;28365:360::-;28451:3;28479:38;28511:5;28479:38;:::i;:::-;28533:70;28596:6;28591:3;28533:70;:::i;:::-;28526:77;;28612:52;28657:6;28652:3;28645:4;28638:5;28634:16;28612:52;:::i;:::-;28689:29;28711:6;28689:29;:::i;:::-;28684:3;28680:39;28673:46;;28455:270;28365:360;;;;:::o;28731:640::-;28926:4;28964:3;28953:9;28949:19;28941:27;;28978:71;29046:1;29035:9;29031:17;29022:6;28978:71;:::i;:::-;29059:72;29127:2;29116:9;29112:18;29103:6;29059:72;:::i;:::-;29141;29209:2;29198:9;29194:18;29185:6;29141:72;:::i;:::-;29260:9;29254:4;29250:20;29245:2;29234:9;29230:18;29223:48;29288:76;29359:4;29350:6;29288:76;:::i;:::-;29280:84;;28731:640;;;;;;;:::o;29377:141::-;29433:5;29464:6;29458:13;29449:22;;29480:32;29506:5;29480:32;:::i;:::-;29377:141;;;;:::o;29524:349::-;29593:6;29642:2;29630:9;29621:7;29617:23;29613:32;29610:119;;;29648:79;;:::i;:::-;29610:119;29768:1;29793:63;29848:7;29839:6;29828:9;29824:22;29793:63;:::i;:::-;29783:73;;29739:127;29524:349;;;;:::o;29879:233::-;29918:3;29941:24;29959:5;29941:24;:::i;:::-;29932:33;;29987:66;29980:5;29977:77;29974:103;;30057:18;;:::i;:::-;29974:103;30104:1;30097:5;30093:13;30086:20;;29879:233;;;:::o;30118:180::-;30166:77;30163:1;30156:88;30263:4;30260:1;30253:15;30287:4;30284:1;30277:15;30304:185;30344:1;30361:20;30379:1;30361:20;:::i;:::-;30356:25;;30395:20;30413:1;30395:20;:::i;:::-;30390:25;;30434:1;30424:35;;30439:18;;:::i;:::-;30424:35;30481:1;30478;30474:9;30469:14;;30304:185;;;;:::o;30495:191::-;30535:4;30555:20;30573:1;30555:20;:::i;:::-;30550:25;;30589:20;30607:1;30589:20;:::i;:::-;30584:25;;30628:1;30625;30622:8;30619:34;;;30633:18;;:::i;:::-;30619:34;30678:1;30675;30671:9;30663:17;;30495:191;;;;:::o;30692:176::-;30724:1;30741:20;30759:1;30741:20;:::i;:::-;30736:25;;30775:20;30793:1;30775:20;:::i;:::-;30770:25;;30814:1;30804:35;;30819:18;;:::i;:::-;30804:35;30860:1;30857;30853:9;30848:14;;30692:176;;;;:::o;30874:180::-;30922:77;30919:1;30912:88;31019:4;31016:1;31009:15;31043:4;31040:1;31033:15
Swarm Source
ipfs://90c521055a3206a6bb546dc47d12d5fd030d60f55cfd24c202f8440f27f3d05c
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.