ERC-721
NFT
Overview
Max Total Supply
999 POG
Holders
45
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PriveSociete
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-31 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.10; /** * @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); } /** * @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) } } } /** * @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; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface 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); } /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } /// @dev This is a contract used to add ERC2981 support to ERC721A abstract contract ERC2981 is IERC2981 { uint256 public constant MULTIPLIER = 10000; uint256 public value; error RoyaltyValueOutOfRange(); /// @dev Sets token royalties /// @param _value percentage (using 2 decimals - 10000 = 100, 0 = 0) function _setTokenRoyalty(uint256 _value) internal { if (_value > MULTIPLIER) revert RoyaltyValueOutOfRange(); value = _value; } } contract PriveSociete is ERC721A, Ownable, ERC2981 { enum MintStatus { NOT_WHITELISTED, WHITELISTED, MINTED } uint256 private constant MAX_SUPPLY = 999; uint256 private constant INITIAL_SUPPLY = 587; uint256 private constant ROYALTY = 500; uint256 public constant MINT_START_TIME = 1661954400; uint256 public constant MINT_CLOSE_TIME = 1662559200; string public baseURI; bool public isRevealed; mapping(address => MintStatus) public userMints; event Whitelisted(address[] _userList); event Blacklisted(address _user); event PermanentURI(string _value, uint256 indexed _id); error ExceedsMaxSupply(); error NotWhitelisted(); error AlreadyMinted(); error CannotBeBlacklisted(); error CannotBeWhitelisted(); error AlreadyRevealed(); error MintNotStarted(); error MintEnded(); error MintInProgress(); constructor(string memory _initBaseURI) ERC721A("Prive OG", "POG") { baseURI = _initBaseURI; value = ROYALTY; isRevealed = false; _safeMint(msg.sender, INITIAL_SUPPLY); } function setRevealed() external onlyOwner { isRevealed = true; } function setBaseURI(string memory _newBaseURI) external onlyOwner { if(isRevealed) revert AlreadyRevealed(); baseURI = _newBaseURI; } function _baseURI() internal view override returns (string memory) { return baseURI; } function tokenURI(uint256 tokenId) public view override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI_ = _baseURI(); return bytes(baseURI_).length != 0 ? string(abi.encodePacked(baseURI_, _toString(tokenId), ".json")) : ""; } function _startTokenId() internal pure override returns (uint256) { return 1; } /// @inheritdoc IERC2981 function royaltyInfo(uint256 , uint256 _value) external view override returns (address receiver, uint256 royaltyAmount) { return (owner(), (_value * value) / MULTIPLIER); } function setTokenRoyalty(uint256 _value) external onlyOwner { _setTokenRoyalty(_value); } function whitelist(address[] calldata _users) external onlyOwner { for (uint256 index = 0; index < _users.length; index++) { if (userMints[_users[index]] == MintStatus.MINTED) revert CannotBeWhitelisted(); userMints[_users[index]] = MintStatus.WHITELISTED; } emit Whitelisted(_users); } function blacklist(address[] calldata _users) external onlyOwner { for (uint256 index = 0; index < _users.length; index++) { if ( userMints[_users[index]] == MintStatus.NOT_WHITELISTED || userMints[_users[index]] == MintStatus.MINTED ) revert CannotBeBlacklisted(); userMints[_users[index]] = MintStatus.NOT_WHITELISTED; emit Blacklisted(_users[index]); } } function mint() external { _checkAndMint(msg.sender); } function mintTo(address to_) external { _checkAndMint(to_); } function _checkAndMint(address to_) private { if(block.timestamp < MINT_START_TIME) revert MintNotStarted(); if(block.timestamp > MINT_CLOSE_TIME) revert MintEnded(); if (userMints[to_] == MintStatus.NOT_WHITELISTED) revert NotWhitelisted(); if (userMints[to_] == MintStatus.MINTED) revert AlreadyMinted(); userMints[to_] = MintStatus.MINTED; _safeMint(to_, 1); if (totalSupply() > MAX_SUPPLY) revert ExceedsMaxSupply(); } function mintRemaining() external onlyOwner { if(block.timestamp < MINT_CLOSE_TIME) revert MintInProgress(); _safeMint(msg.sender, MAX_SUPPLY - totalSupply()); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721A) 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. interfaceId == type(IERC2981).interfaceId; // ERC165 interface ID for ERC2981 } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyMinted","type":"error"},{"inputs":[],"name":"AlreadyRevealed","type":"error"},{"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":"CannotBeBlacklisted","type":"error"},{"inputs":[],"name":"CannotBeWhitelisted","type":"error"},{"inputs":[],"name":"ExceedsMaxSupply","type":"error"},{"inputs":[],"name":"MintEnded","type":"error"},{"inputs":[],"name":"MintInProgress","type":"error"},{"inputs":[],"name":"MintNotStarted","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NotWhitelisted","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"RoyaltyValueOutOfRange","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":false,"internalType":"address","name":"_user","type":"address"}],"name":"Blacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"PermanentURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"_userList","type":"address[]"}],"name":"Whitelisted","type":"event"},{"inputs":[],"name":"MINT_CLOSE_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintRemaining","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setTokenRoyalty","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":[{"internalType":"address","name":"","type":"address"}],"name":"userMints","outputs":[{"internalType":"enum PriveSociete.MintStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"value","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003e1938038062003e1983398181016040528101906200003791906200091e565b6040518060400160405280600881526020017f5072697665204f470000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f504f4700000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000bb929190620006d1565b508060039080519060200190620000d4929190620006d1565b50620000e56200016560201b60201c565b60008190555050506200010d620001016200016e60201b60201c565b6200017660201b60201c565b80600a908051906020019062000125929190620006d1565b506101f46009819055506000600b60006101000a81548160ff0219169083151502179055506200015e3361024b6200023c60201b60201c565b5062000b74565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200025e8282604051806020016040528060008152506200026260201b60201c565b5050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620002d0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156200030c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200032160008583866200054760201b60201c565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16200038e600185146200054d60201b60201c565b901b60a042901b620003a6866200055760201b60201c565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14620004b7575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200046360008784806001019550876200056160201b60201c565b6200049a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210620003ec578260005414620004b157600080fd5b62000523565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210620004b8575b816000819055505050620005416000858386620006c360201b60201c565b50505050565b50505050565b6000819050919050565b6000819050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200058f620006c960201b60201c565b8786866040518563ffffffff1660e01b8152600401620005b3949392919062000a2c565b6020604051808303816000875af1925050508015620005f257506040513d601f19601f82011682018060405250810190620005ef919062000add565b60015b62000670573d806000811462000625576040519150601f19603f3d011682016040523d82523d6000602084013e6200062a565b606091505b5060008151141562000668576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b600033905090565b828054620006df9062000b3e565b90600052602060002090601f0160209004810192826200070357600085556200074f565b82601f106200071e57805160ff19168380011785556200074f565b828001600101855582156200074f579182015b828111156200074e57825182559160200191906001019062000731565b5b5090506200075e919062000762565b5090565b5b808211156200077d57600081600090555060010162000763565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620007ea826200079f565b810181811067ffffffffffffffff821117156200080c576200080b620007b0565b5b80604052505050565b60006200082162000781565b90506200082f8282620007df565b919050565b600067ffffffffffffffff821115620008525762000851620007b0565b5b6200085d826200079f565b9050602081019050919050565b60005b838110156200088a5780820151818401526020810190506200086d565b838111156200089a576000848401525b50505050565b6000620008b7620008b18462000834565b62000815565b905082815260208101848484011115620008d657620008d56200079a565b5b620008e38482856200086a565b509392505050565b600082601f83011262000903576200090262000795565b5b815162000915848260208601620008a0565b91505092915050565b6000602082840312156200093757620009366200078b565b5b600082015167ffffffffffffffff81111562000958576200095762000790565b5b6200096684828501620008eb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200099c826200096f565b9050919050565b620009ae816200098f565b82525050565b6000819050919050565b620009c981620009b4565b82525050565b600081519050919050565b600082825260208201905092915050565b6000620009f882620009cf565b62000a048185620009da565b935062000a168185602086016200086a565b62000a21816200079f565b840191505092915050565b600060808201905062000a436000830187620009a3565b62000a526020830186620009a3565b62000a616040830185620009be565b818103606083015262000a758184620009eb565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000ab78162000a80565b811462000ac357600080fd5b50565b60008151905062000ad78162000aac565b92915050565b60006020828403121562000af65762000af56200078b565b5b600062000b068482850162000ac6565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b5757607f821691505b6020821081141562000b6e5762000b6d62000b0f565b5b50919050565b6132958062000b846000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a57806395d89b41116100ad578063c87b56dd1161007c578063c87b56dd14610541578063dd27c16114610571578063df2823311461058d578063e985e9c5146105bd578063f2fde38b146105ed576101fb565b806395d89b41146104cf578063a22cb465146104ed578063b88d4fde14610509578063bd8aa78014610525576101fb565b8063755edd17116100e9578063755edd171461046d57806376185f39146104895780637e2ade0c146104935780638da5cb5b146104b1576101fb565b80636352211e146103e55780636c0360eb1461041557806370a0823114610433578063715018a614610463576101fb565b80631d7baede116101925780633fa4f245116101615780633fa4f2451461037157806342842e0e1461038f57806354214f69146103ab57806355f804b3146103c9576101fb565b80631d7baede146102fc57806323b872dd1461031a5780632a55205a146103365780633bd6496814610367576101fb565b8063081812fc116101ce578063081812fc14610288578063095ea7b3146102b85780631249c58b146102d457806318160ddd146102de576101fb565b806301ffc9a714610200578063041f173f14610230578063059f8b161461024c57806306fdde031461026a575b600080fd5b61021a60048036038101906102159190612501565b610609565b6040516102279190612549565b60405180910390f35b61024a600480360381019061024591906125c9565b610703565b005b610254610991565b604051610261919061262f565b60405180910390f35b610272610997565b60405161027f91906126e3565b60405180910390f35b6102a2600480360381019061029d9190612731565b610a29565b6040516102af919061279f565b60405180910390f35b6102d260048036038101906102cd91906127e6565b610aa5565b005b6102dc610c4c565b005b6102e6610c57565b6040516102f3919061262f565b60405180910390f35b610304610c6e565b604051610311919061262f565b60405180910390f35b610334600480360381019061032f9190612826565b610c76565b005b610350600480360381019061034b9190612879565b610c86565b60405161035e9291906128b9565b60405180910390f35b61036f610cb7565b005b610379610cdc565b604051610386919061262f565b60405180910390f35b6103a960048036038101906103a49190612826565b610ce2565b005b6103b3610d02565b6040516103c09190612549565b60405180910390f35b6103e360048036038101906103de9190612a12565b610d15565b005b6103ff60048036038101906103fa9190612731565b610d7e565b60405161040c919061279f565b60405180910390f35b61041d610d90565b60405161042a91906126e3565b60405180910390f35b61044d60048036038101906104489190612a5b565b610e1e565b60405161045a919061262f565b60405180910390f35b61046b610ed7565b005b61048760048036038101906104829190612a5b565b610eeb565b005b610491610ef7565b005b61049b610f5d565b6040516104a8919061262f565b60405180910390f35b6104b9610f65565b6040516104c6919061279f565b60405180910390f35b6104d7610f8f565b6040516104e491906126e3565b60405180910390f35b61050760048036038101906105029190612ab4565b611021565b005b610523600480360381019061051e9190612b95565b611199565b005b61053f600480360381019061053a91906125c9565b61120c565b005b61055b60048036038101906105569190612731565b6113d3565b60405161056891906126e3565b60405180910390f35b61058b60048036038101906105869190612731565b611472565b005b6105a760048036038101906105a29190612a5b565b611486565b6040516105b49190612c8f565b60405180910390f35b6105d760048036038101906105d29190612caa565b6114a6565b6040516105e49190612549565b60405180910390f35b61060760048036038101906106029190612a5b565b61153a565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106945750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106fc57507f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b61070b6115be565b60005b8282905081101561098c576000600281111561072d5761072c612c18565b5b600c600085858581811061074457610743612cea565b5b90506020020160208101906107599190612a5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660028111156107b3576107b2612c18565b5b148061085557506002808111156107cd576107cc612c18565b5b600c60008585858181106107e4576107e3612cea565b5b90506020020160208101906107f99190612a5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600281111561085357610852612c18565b5b145b1561088c576040517f52552b5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600c60008585858181106108a5576108a4612cea565b5b90506020020160208101906108ba9190612a5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600281111561091657610915612c18565b5b02179055507fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b85583838381811061094f5761094e612cea565b5b90506020020160208101906109649190612a5b565b604051610971919061279f565b60405180910390a1808061098490612d48565b91505061070e565b505050565b61271081565b6060600280546109a690612dc0565b80601f01602080910402602001604051908101604052809291908181526020018280546109d290612dc0565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b5050505050905090565b6000610a348261163c565b610a6a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab08261169b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b18576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b37611769565b73ffffffffffffffffffffffffffffffffffffffff1614610b9a57610b6381610b5e611769565b6114a6565b610b99576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610c5533611771565b565b6000610c616119fb565b6001546000540303905090565b636318a3e081565b610c81838383611a04565b505050565b600080610c91610f65565b61271060095485610ca29190612df2565b610cac9190612e7b565b915091509250929050565b610cbf6115be565b6001600b60006101000a81548160ff021916908315150217905550565b60095481565b610cfd83838360405180602001604052806000815250611199565b505050565b600b60009054906101000a900460ff1681565b610d1d6115be565b600b60009054906101000a900460ff1615610d64576040517fa89ac15100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a9080519060200190610d7a9291906123f2565b5050565b6000610d898261169b565b9050919050565b600a8054610d9d90612dc0565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc990612dc0565b8015610e165780601f10610deb57610100808354040283529160200191610e16565b820191906000526020600020905b815481529060010190602001808311610df957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e86576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610edf6115be565b610ee96000611dae565b565b610ef481611771565b50565b610eff6115be565b636318a3e0421015610f3d576040517f7acf846d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f5b33610f49610c57565b6103e7610f569190612eac565b611e74565b565b63630f696081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f9e90612dc0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fca90612dc0565b80156110175780601f10610fec57610100808354040283529160200191611017565b820191906000526020600020905b815481529060010190602001808311610ffa57829003601f168201915b5050505050905090565b611029611769565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561108e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061109b611769565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611148611769565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161118d9190612549565b60405180910390a35050565b6111a4848484611a04565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611206576111cf84848484611e92565b611205576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6112146115be565b60005b828290508110156113955760028081111561123557611234612c18565b5b600c600085858581811061124c5761124b612cea565b5b90506020020160208101906112619190612a5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660028111156112bb576112ba612c18565b5b14156112f3576040517ffc4db35000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600c600085858581811061130c5761130b612cea565b5b90506020020160208101906113219190612a5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600281111561137d5761137c612c18565b5b0217905550808061138d90612d48565b915050611217565b507fc1c703b4c00725dc366c1a5d49f08a7661064e6112e10c497e7bd82db87f232582826040516113c7929190612fa3565b60405180910390a15050565b60606113de8261163c565b611414576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061141e611fe3565b905060008151141561143f576040518060200160405280600081525061146a565b8061144984612075565b60405160200161145a92919061304f565b6040516020818303038152906040525b915050919050565b61147a6115be565b611483816120cf565b50565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115426115be565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a9906130f0565b60405180910390fd5b6115bb81611dae565b50565b6115c6612115565b73ffffffffffffffffffffffffffffffffffffffff166115e4610f65565b73ffffffffffffffffffffffffffffffffffffffff161461163a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116319061315c565b60405180910390fd5b565b6000816116476119fb565b11158015611656575060005482105b8015611694575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806116aa6119fb565b11611732576000548110156117315760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561172f575b60008114156117255760046000836001900393508381526020019081526020016000205490506116fa565b8092505050611764565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b63630f69604210156117af576040517f06290e4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b636318a3e04211156117ed576040517f49084b9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600281111561180157611800612c18565b5b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660028111156118605761185f612c18565b5b1415611898576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002808111156118ab576118aa612c18565b5b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600281111561190a57611909612c18565b5b1415611942576040517fddefae2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360028111156119a5576119a4612c18565b5b02179055506119b5816001611e74565b6103e76119c0610c57565b11156119f8576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006001905090565b6000611a0f8261169b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a76576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a97611769565b73ffffffffffffffffffffffffffffffffffffffff161480611ac65750611ac585611ac0611769565b6114a6565b5b80611b0b5750611ad4611769565b73ffffffffffffffffffffffffffffffffffffffff16611af384610a29565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b44576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611bab576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb8858585600161211d565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611cb586612123565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611d3f576000600184019050600060046000838152602001908152602001600020541415611d3d576000548114611d3c578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611da7858585600161212d565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e8e828260405180602001604052806000815250612133565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eb8611769565b8786866040518563ffffffff1660e01b8152600401611eda94939291906131d1565b6020604051808303816000875af1925050508015611f1657506040513d601f19601f82011682018060405250810190611f139190613232565b60015b611f90573d8060008114611f46576040519150601f19603f3d011682016040523d82523d6000602084013e611f4b565b606091505b50600081511415611f88576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611ff290612dc0565b80601f016020809104026020016040519081016040528092919081815260200182805461201e90612dc0565b801561206b5780601f106120405761010080835404028352916020019161206b565b820191906000526020600020905b81548152906001019060200180831161204e57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156120bb57600183039250600a81066030018353600a8104905061209b565b508181036020830392508083525050919050565b61271081111561210b576040517f0a4c5cc800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060098190555050565b600033905090565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121a0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156121db576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121e8600085838661211d565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161224d600185146123e8565b901b60a042901b61225d86612123565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612361575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123116000878480600101955087611e92565b612347576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106122a257826000541461235c57600080fd5b6123cc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612362575b8160008190555050506123e2600085838661212d565b50505050565b6000819050919050565b8280546123fe90612dc0565b90600052602060002090601f0160209004810192826124205760008555612467565b82601f1061243957805160ff1916838001178555612467565b82800160010185558215612467579182015b8281111561246657825182559160200191906001019061244b565b5b5090506124749190612478565b5090565b5b80821115612491576000816000905550600101612479565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124de816124a9565b81146124e957600080fd5b50565b6000813590506124fb816124d5565b92915050565b6000602082840312156125175761251661249f565b5b6000612525848285016124ec565b91505092915050565b60008115159050919050565b6125438161252e565b82525050565b600060208201905061255e600083018461253a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261258957612588612564565b5b8235905067ffffffffffffffff8111156125a6576125a5612569565b5b6020830191508360208202830111156125c2576125c161256e565b5b9250929050565b600080602083850312156125e0576125df61249f565b5b600083013567ffffffffffffffff8111156125fe576125fd6124a4565b5b61260a85828601612573565b92509250509250929050565b6000819050919050565b61262981612616565b82525050565b60006020820190506126446000830184612620565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612684578082015181840152602081019050612669565b83811115612693576000848401525b50505050565b6000601f19601f8301169050919050565b60006126b58261264a565b6126bf8185612655565b93506126cf818560208601612666565b6126d881612699565b840191505092915050565b600060208201905081810360008301526126fd81846126aa565b905092915050565b61270e81612616565b811461271957600080fd5b50565b60008135905061272b81612705565b92915050565b6000602082840312156127475761274661249f565b5b60006127558482850161271c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127898261275e565b9050919050565b6127998161277e565b82525050565b60006020820190506127b46000830184612790565b92915050565b6127c38161277e565b81146127ce57600080fd5b50565b6000813590506127e0816127ba565b92915050565b600080604083850312156127fd576127fc61249f565b5b600061280b858286016127d1565b925050602061281c8582860161271c565b9150509250929050565b60008060006060848603121561283f5761283e61249f565b5b600061284d868287016127d1565b935050602061285e868287016127d1565b925050604061286f8682870161271c565b9150509250925092565b600080604083850312156128905761288f61249f565b5b600061289e8582860161271c565b92505060206128af8582860161271c565b9150509250929050565b60006040820190506128ce6000830185612790565b6128db6020830184612620565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61291f82612699565b810181811067ffffffffffffffff8211171561293e5761293d6128e7565b5b80604052505050565b6000612951612495565b905061295d8282612916565b919050565b600067ffffffffffffffff82111561297d5761297c6128e7565b5b61298682612699565b9050602081019050919050565b82818337600083830152505050565b60006129b56129b084612962565b612947565b9050828152602081018484840111156129d1576129d06128e2565b5b6129dc848285612993565b509392505050565b600082601f8301126129f9576129f8612564565b5b8135612a098482602086016129a2565b91505092915050565b600060208284031215612a2857612a2761249f565b5b600082013567ffffffffffffffff811115612a4657612a456124a4565b5b612a52848285016129e4565b91505092915050565b600060208284031215612a7157612a7061249f565b5b6000612a7f848285016127d1565b91505092915050565b612a918161252e565b8114612a9c57600080fd5b50565b600081359050612aae81612a88565b92915050565b60008060408385031215612acb57612aca61249f565b5b6000612ad9858286016127d1565b9250506020612aea85828601612a9f565b9150509250929050565b600067ffffffffffffffff821115612b0f57612b0e6128e7565b5b612b1882612699565b9050602081019050919050565b6000612b38612b3384612af4565b612947565b905082815260208101848484011115612b5457612b536128e2565b5b612b5f848285612993565b509392505050565b600082601f830112612b7c57612b7b612564565b5b8135612b8c848260208601612b25565b91505092915050565b60008060008060808587031215612baf57612bae61249f565b5b6000612bbd878288016127d1565b9450506020612bce878288016127d1565b9350506040612bdf8782880161271c565b925050606085013567ffffffffffffffff811115612c0057612bff6124a4565b5b612c0c87828801612b67565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110612c5857612c57612c18565b5b50565b6000819050612c6982612c47565b919050565b6000612c7982612c5b565b9050919050565b612c8981612c6e565b82525050565b6000602082019050612ca46000830184612c80565b92915050565b60008060408385031215612cc157612cc061249f565b5b6000612ccf858286016127d1565b9250506020612ce0858286016127d1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d5382612616565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612d8657612d85612d19565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dd857607f821691505b60208210811415612dec57612deb612d91565b5b50919050565b6000612dfd82612616565b9150612e0883612616565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e4157612e40612d19565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e8682612616565b9150612e9183612616565b925082612ea157612ea0612e4c565b5b828204905092915050565b6000612eb782612616565b9150612ec283612616565b925082821015612ed557612ed4612d19565b5b828203905092915050565b600082825260208201905092915050565b6000819050919050565b612f048161277e565b82525050565b6000612f168383612efb565b60208301905092915050565b6000612f3160208401846127d1565b905092915050565b6000602082019050919050565b6000612f528385612ee0565b9350612f5d82612ef1565b8060005b85811015612f9657612f738284612f22565b612f7d8882612f0a565b9750612f8883612f39565b925050600181019050612f61565b5085925050509392505050565b60006020820190508181036000830152612fbe818486612f46565b90509392505050565b600081905092915050565b6000612fdd8261264a565b612fe78185612fc7565b9350612ff7818560208601612666565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613039600583612fc7565b915061304482613003565b600582019050919050565b600061305b8285612fd2565b91506130678284612fd2565b91506130728261302c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006130da602683612655565b91506130e58261307e565b604082019050919050565b60006020820190508181036000830152613109816130cd565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613146602083612655565b915061315182613110565b602082019050919050565b6000602082019050818103600083015261317581613139565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006131a38261317c565b6131ad8185613187565b93506131bd818560208601612666565b6131c681612699565b840191505092915050565b60006080820190506131e66000830187612790565b6131f36020830186612790565b6132006040830185612620565b81810360608301526132128184613198565b905095945050505050565b60008151905061322c816124d5565b92915050565b6000602082840312156132485761324761249f565b5b60006132568482850161321d565b9150509291505056fea264697066735822122052c5b0a6090e2e3527f9ea02637e3f6bd4fa6a5ee8fb93216edaeed6d1a113fa64736f6c634300080a003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5666617134555845664243734d4743647534724552664b62674c684a43335346576d344347767137327137692f00000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a57806395d89b41116100ad578063c87b56dd1161007c578063c87b56dd14610541578063dd27c16114610571578063df2823311461058d578063e985e9c5146105bd578063f2fde38b146105ed576101fb565b806395d89b41146104cf578063a22cb465146104ed578063b88d4fde14610509578063bd8aa78014610525576101fb565b8063755edd17116100e9578063755edd171461046d57806376185f39146104895780637e2ade0c146104935780638da5cb5b146104b1576101fb565b80636352211e146103e55780636c0360eb1461041557806370a0823114610433578063715018a614610463576101fb565b80631d7baede116101925780633fa4f245116101615780633fa4f2451461037157806342842e0e1461038f57806354214f69146103ab57806355f804b3146103c9576101fb565b80631d7baede146102fc57806323b872dd1461031a5780632a55205a146103365780633bd6496814610367576101fb565b8063081812fc116101ce578063081812fc14610288578063095ea7b3146102b85780631249c58b146102d457806318160ddd146102de576101fb565b806301ffc9a714610200578063041f173f14610230578063059f8b161461024c57806306fdde031461026a575b600080fd5b61021a60048036038101906102159190612501565b610609565b6040516102279190612549565b60405180910390f35b61024a600480360381019061024591906125c9565b610703565b005b610254610991565b604051610261919061262f565b60405180910390f35b610272610997565b60405161027f91906126e3565b60405180910390f35b6102a2600480360381019061029d9190612731565b610a29565b6040516102af919061279f565b60405180910390f35b6102d260048036038101906102cd91906127e6565b610aa5565b005b6102dc610c4c565b005b6102e6610c57565b6040516102f3919061262f565b60405180910390f35b610304610c6e565b604051610311919061262f565b60405180910390f35b610334600480360381019061032f9190612826565b610c76565b005b610350600480360381019061034b9190612879565b610c86565b60405161035e9291906128b9565b60405180910390f35b61036f610cb7565b005b610379610cdc565b604051610386919061262f565b60405180910390f35b6103a960048036038101906103a49190612826565b610ce2565b005b6103b3610d02565b6040516103c09190612549565b60405180910390f35b6103e360048036038101906103de9190612a12565b610d15565b005b6103ff60048036038101906103fa9190612731565b610d7e565b60405161040c919061279f565b60405180910390f35b61041d610d90565b60405161042a91906126e3565b60405180910390f35b61044d60048036038101906104489190612a5b565b610e1e565b60405161045a919061262f565b60405180910390f35b61046b610ed7565b005b61048760048036038101906104829190612a5b565b610eeb565b005b610491610ef7565b005b61049b610f5d565b6040516104a8919061262f565b60405180910390f35b6104b9610f65565b6040516104c6919061279f565b60405180910390f35b6104d7610f8f565b6040516104e491906126e3565b60405180910390f35b61050760048036038101906105029190612ab4565b611021565b005b610523600480360381019061051e9190612b95565b611199565b005b61053f600480360381019061053a91906125c9565b61120c565b005b61055b60048036038101906105569190612731565b6113d3565b60405161056891906126e3565b60405180910390f35b61058b60048036038101906105869190612731565b611472565b005b6105a760048036038101906105a29190612a5b565b611486565b6040516105b49190612c8f565b60405180910390f35b6105d760048036038101906105d29190612caa565b6114a6565b6040516105e49190612549565b60405180910390f35b61060760048036038101906106029190612a5b565b61153a565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106945750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106fc57507f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b61070b6115be565b60005b8282905081101561098c576000600281111561072d5761072c612c18565b5b600c600085858581811061074457610743612cea565b5b90506020020160208101906107599190612a5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660028111156107b3576107b2612c18565b5b148061085557506002808111156107cd576107cc612c18565b5b600c60008585858181106107e4576107e3612cea565b5b90506020020160208101906107f99190612a5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600281111561085357610852612c18565b5b145b1561088c576040517f52552b5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600c60008585858181106108a5576108a4612cea565b5b90506020020160208101906108ba9190612a5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600281111561091657610915612c18565b5b02179055507fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b85583838381811061094f5761094e612cea565b5b90506020020160208101906109649190612a5b565b604051610971919061279f565b60405180910390a1808061098490612d48565b91505061070e565b505050565b61271081565b6060600280546109a690612dc0565b80601f01602080910402602001604051908101604052809291908181526020018280546109d290612dc0565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b5050505050905090565b6000610a348261163c565b610a6a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab08261169b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b18576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b37611769565b73ffffffffffffffffffffffffffffffffffffffff1614610b9a57610b6381610b5e611769565b6114a6565b610b99576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610c5533611771565b565b6000610c616119fb565b6001546000540303905090565b636318a3e081565b610c81838383611a04565b505050565b600080610c91610f65565b61271060095485610ca29190612df2565b610cac9190612e7b565b915091509250929050565b610cbf6115be565b6001600b60006101000a81548160ff021916908315150217905550565b60095481565b610cfd83838360405180602001604052806000815250611199565b505050565b600b60009054906101000a900460ff1681565b610d1d6115be565b600b60009054906101000a900460ff1615610d64576040517fa89ac15100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a9080519060200190610d7a9291906123f2565b5050565b6000610d898261169b565b9050919050565b600a8054610d9d90612dc0565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc990612dc0565b8015610e165780601f10610deb57610100808354040283529160200191610e16565b820191906000526020600020905b815481529060010190602001808311610df957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e86576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610edf6115be565b610ee96000611dae565b565b610ef481611771565b50565b610eff6115be565b636318a3e0421015610f3d576040517f7acf846d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f5b33610f49610c57565b6103e7610f569190612eac565b611e74565b565b63630f696081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f9e90612dc0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fca90612dc0565b80156110175780601f10610fec57610100808354040283529160200191611017565b820191906000526020600020905b815481529060010190602001808311610ffa57829003601f168201915b5050505050905090565b611029611769565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561108e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061109b611769565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611148611769565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161118d9190612549565b60405180910390a35050565b6111a4848484611a04565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611206576111cf84848484611e92565b611205576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6112146115be565b60005b828290508110156113955760028081111561123557611234612c18565b5b600c600085858581811061124c5761124b612cea565b5b90506020020160208101906112619190612a5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660028111156112bb576112ba612c18565b5b14156112f3576040517ffc4db35000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600c600085858581811061130c5761130b612cea565b5b90506020020160208101906113219190612a5b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600281111561137d5761137c612c18565b5b0217905550808061138d90612d48565b915050611217565b507fc1c703b4c00725dc366c1a5d49f08a7661064e6112e10c497e7bd82db87f232582826040516113c7929190612fa3565b60405180910390a15050565b60606113de8261163c565b611414576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061141e611fe3565b905060008151141561143f576040518060200160405280600081525061146a565b8061144984612075565b60405160200161145a92919061304f565b6040516020818303038152906040525b915050919050565b61147a6115be565b611483816120cf565b50565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115426115be565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a9906130f0565b60405180910390fd5b6115bb81611dae565b50565b6115c6612115565b73ffffffffffffffffffffffffffffffffffffffff166115e4610f65565b73ffffffffffffffffffffffffffffffffffffffff161461163a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116319061315c565b60405180910390fd5b565b6000816116476119fb565b11158015611656575060005482105b8015611694575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806116aa6119fb565b11611732576000548110156117315760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561172f575b60008114156117255760046000836001900393508381526020019081526020016000205490506116fa565b8092505050611764565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b63630f69604210156117af576040517f06290e4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b636318a3e04211156117ed576040517f49084b9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600281111561180157611800612c18565b5b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660028111156118605761185f612c18565b5b1415611898576040517f584a793800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002808111156118ab576118aa612c18565b5b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600281111561190a57611909612c18565b5b1415611942576040517fddefae2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360028111156119a5576119a4612c18565b5b02179055506119b5816001611e74565b6103e76119c0610c57565b11156119f8576040517fc30436e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006001905090565b6000611a0f8261169b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a76576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a97611769565b73ffffffffffffffffffffffffffffffffffffffff161480611ac65750611ac585611ac0611769565b6114a6565b5b80611b0b5750611ad4611769565b73ffffffffffffffffffffffffffffffffffffffff16611af384610a29565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b44576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611bab576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb8858585600161211d565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611cb586612123565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611d3f576000600184019050600060046000838152602001908152602001600020541415611d3d576000548114611d3c578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611da7858585600161212d565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e8e828260405180602001604052806000815250612133565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eb8611769565b8786866040518563ffffffff1660e01b8152600401611eda94939291906131d1565b6020604051808303816000875af1925050508015611f1657506040513d601f19601f82011682018060405250810190611f139190613232565b60015b611f90573d8060008114611f46576040519150601f19603f3d011682016040523d82523d6000602084013e611f4b565b606091505b50600081511415611f88576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611ff290612dc0565b80601f016020809104026020016040519081016040528092919081815260200182805461201e90612dc0565b801561206b5780601f106120405761010080835404028352916020019161206b565b820191906000526020600020905b81548152906001019060200180831161204e57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156120bb57600183039250600a81066030018353600a8104905061209b565b508181036020830392508083525050919050565b61271081111561210b576040517f0a4c5cc800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060098190555050565b600033905090565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121a0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156121db576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121e8600085838661211d565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161224d600185146123e8565b901b60a042901b61225d86612123565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612361575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123116000878480600101955087611e92565b612347576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106122a257826000541461235c57600080fd5b6123cc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612362575b8160008190555050506123e2600085838661212d565b50505050565b6000819050919050565b8280546123fe90612dc0565b90600052602060002090601f0160209004810192826124205760008555612467565b82601f1061243957805160ff1916838001178555612467565b82800160010185558215612467579182015b8281111561246657825182559160200191906001019061244b565b5b5090506124749190612478565b5090565b5b80821115612491576000816000905550600101612479565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124de816124a9565b81146124e957600080fd5b50565b6000813590506124fb816124d5565b92915050565b6000602082840312156125175761251661249f565b5b6000612525848285016124ec565b91505092915050565b60008115159050919050565b6125438161252e565b82525050565b600060208201905061255e600083018461253a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261258957612588612564565b5b8235905067ffffffffffffffff8111156125a6576125a5612569565b5b6020830191508360208202830111156125c2576125c161256e565b5b9250929050565b600080602083850312156125e0576125df61249f565b5b600083013567ffffffffffffffff8111156125fe576125fd6124a4565b5b61260a85828601612573565b92509250509250929050565b6000819050919050565b61262981612616565b82525050565b60006020820190506126446000830184612620565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612684578082015181840152602081019050612669565b83811115612693576000848401525b50505050565b6000601f19601f8301169050919050565b60006126b58261264a565b6126bf8185612655565b93506126cf818560208601612666565b6126d881612699565b840191505092915050565b600060208201905081810360008301526126fd81846126aa565b905092915050565b61270e81612616565b811461271957600080fd5b50565b60008135905061272b81612705565b92915050565b6000602082840312156127475761274661249f565b5b60006127558482850161271c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127898261275e565b9050919050565b6127998161277e565b82525050565b60006020820190506127b46000830184612790565b92915050565b6127c38161277e565b81146127ce57600080fd5b50565b6000813590506127e0816127ba565b92915050565b600080604083850312156127fd576127fc61249f565b5b600061280b858286016127d1565b925050602061281c8582860161271c565b9150509250929050565b60008060006060848603121561283f5761283e61249f565b5b600061284d868287016127d1565b935050602061285e868287016127d1565b925050604061286f8682870161271c565b9150509250925092565b600080604083850312156128905761288f61249f565b5b600061289e8582860161271c565b92505060206128af8582860161271c565b9150509250929050565b60006040820190506128ce6000830185612790565b6128db6020830184612620565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61291f82612699565b810181811067ffffffffffffffff8211171561293e5761293d6128e7565b5b80604052505050565b6000612951612495565b905061295d8282612916565b919050565b600067ffffffffffffffff82111561297d5761297c6128e7565b5b61298682612699565b9050602081019050919050565b82818337600083830152505050565b60006129b56129b084612962565b612947565b9050828152602081018484840111156129d1576129d06128e2565b5b6129dc848285612993565b509392505050565b600082601f8301126129f9576129f8612564565b5b8135612a098482602086016129a2565b91505092915050565b600060208284031215612a2857612a2761249f565b5b600082013567ffffffffffffffff811115612a4657612a456124a4565b5b612a52848285016129e4565b91505092915050565b600060208284031215612a7157612a7061249f565b5b6000612a7f848285016127d1565b91505092915050565b612a918161252e565b8114612a9c57600080fd5b50565b600081359050612aae81612a88565b92915050565b60008060408385031215612acb57612aca61249f565b5b6000612ad9858286016127d1565b9250506020612aea85828601612a9f565b9150509250929050565b600067ffffffffffffffff821115612b0f57612b0e6128e7565b5b612b1882612699565b9050602081019050919050565b6000612b38612b3384612af4565b612947565b905082815260208101848484011115612b5457612b536128e2565b5b612b5f848285612993565b509392505050565b600082601f830112612b7c57612b7b612564565b5b8135612b8c848260208601612b25565b91505092915050565b60008060008060808587031215612baf57612bae61249f565b5b6000612bbd878288016127d1565b9450506020612bce878288016127d1565b9350506040612bdf8782880161271c565b925050606085013567ffffffffffffffff811115612c0057612bff6124a4565b5b612c0c87828801612b67565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110612c5857612c57612c18565b5b50565b6000819050612c6982612c47565b919050565b6000612c7982612c5b565b9050919050565b612c8981612c6e565b82525050565b6000602082019050612ca46000830184612c80565b92915050565b60008060408385031215612cc157612cc061249f565b5b6000612ccf858286016127d1565b9250506020612ce0858286016127d1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612d5382612616565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612d8657612d85612d19565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dd857607f821691505b60208210811415612dec57612deb612d91565b5b50919050565b6000612dfd82612616565b9150612e0883612616565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e4157612e40612d19565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e8682612616565b9150612e9183612616565b925082612ea157612ea0612e4c565b5b828204905092915050565b6000612eb782612616565b9150612ec283612616565b925082821015612ed557612ed4612d19565b5b828203905092915050565b600082825260208201905092915050565b6000819050919050565b612f048161277e565b82525050565b6000612f168383612efb565b60208301905092915050565b6000612f3160208401846127d1565b905092915050565b6000602082019050919050565b6000612f528385612ee0565b9350612f5d82612ef1565b8060005b85811015612f9657612f738284612f22565b612f7d8882612f0a565b9750612f8883612f39565b925050600181019050612f61565b5085925050509392505050565b60006020820190508181036000830152612fbe818486612f46565b90509392505050565b600081905092915050565b6000612fdd8261264a565b612fe78185612fc7565b9350612ff7818560208601612666565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613039600583612fc7565b915061304482613003565b600582019050919050565b600061305b8285612fd2565b91506130678284612fd2565b91506130728261302c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006130da602683612655565b91506130e58261307e565b604082019050919050565b60006020820190508181036000830152613109816130cd565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613146602083612655565b915061315182613110565b602082019050919050565b6000602082019050818103600083015261317581613139565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006131a38261317c565b6131ad8185613187565b93506131bd818560208601612666565b6131c681612699565b840191505092915050565b60006080820190506131e66000830187612790565b6131f36020830186612790565b6132006040830185612620565b81810360608301526132128184613198565b905095945050505050565b60008151905061322c816124d5565b92915050565b6000602082840312156132485761324761249f565b5b60006132568482850161321d565b9150509291505056fea264697066735822122052c5b0a6090e2e3527f9ea02637e3f6bd4fa6a5ee8fb93216edaeed6d1a113fa64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5666617134555845664243734d4743647534724552664b62674c684a43335346576d344347767137327137692f00000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmVfaq4UXEfBCsMGCdu4rERfKbgLhJC3SFWm4CGvq72q7i/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d5666617134555845664243734d4743647534724552664b
Arg [3] : 62674c684a43335346576d344347767137327137692f00000000000000000000
Deployed Bytecode Sourcemap
43437:4990:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47648:776;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46235:470;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43051:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17893:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19961:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19421:474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46713:69;;;:::i;:::-;;11934:315;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43795:52;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20847:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45518:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;44611:78;;;:::i;:::-;;43100:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21088:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43884:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44697:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17682:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43856:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13559:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40637:103;;;:::i;:::-;;46790:75;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47392:184;;;:::i;:::-;;43736:52;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39989:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18062:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20237:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21344:396;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45864:363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44969:410;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45753:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43913:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20616:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40895:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47648:776;47796:4;48116:10;48101:25;;:11;:25;;;;:102;;;;48193:10;48178:25;;:11;:25;;;;48101:102;:179;;;;48270:10;48255:25;;:11;:25;;;;48101:179;:280;;;;48355:26;48340:41;;;:11;:41;;;;48101:280;48081:300;;47648:776;;;:::o;46235:470::-;39875:13;:11;:13::i;:::-;46316::::1;46311:387;46343:6;;:13;;46335:5;:21;46311:387;;;46432:26;46404:54;;;;;;;;:::i;:::-;;:9;:24;46414:6;;46421:5;46414:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;46404:24;;;;;;;;;;;;;;;;;;;;;;;;;:54;;;;;;;;:::i;:::-;;;:120;;;;46507:17;46479:45:::0;::::1;;;;;;;:::i;:::-;;:9;:24;46489:6;;46496:5;46489:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;46479:24;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;;;;:::i;:::-;;;46404:120;46382:186;;;46547:21;;;;;;;;;;;;;;46382:186;46612:26;46585:9;:24;46595:6;;46602:5;46595:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;46585:24;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;46660:26;46672:6;;46679:5;46672:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;46660:26;;;;;;:::i;:::-;;;;;;;;46358:7;;;;;:::i;:::-;;;;46311:387;;;;46235:470:::0;;:::o;43051:42::-;43088:5;43051:42;:::o;17893:100::-;17947:13;17980:5;17973:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17893:100;:::o;19961:204::-;20029:7;20054:16;20062:7;20054;:16::i;:::-;20049:64;;20079:34;;;;;;;;;;;;;;20049:64;20133:15;:24;20149:7;20133:24;;;;;;;;;;;;;;;;;;;;;20126:31;;19961:204;;;:::o;19421:474::-;19494:13;19526:27;19545:7;19526:18;:27::i;:::-;19494:61;;19576:5;19570:11;;:2;:11;;;19566:48;;;19590:24;;;;;;;;;;;;;;19566:48;19654:5;19631:28;;:19;:17;:19::i;:::-;:28;;;19627:175;;19679:44;19696:5;19703:19;:17;:19::i;:::-;19679:16;:44::i;:::-;19674:128;;19751:35;;;;;;;;;;;;;;19674:128;19627:175;19841:2;19814:15;:24;19830:7;19814:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19879:7;19875:2;19859:28;;19868:5;19859:28;;;;;;;;;;;;19483:412;19421:474;;:::o;46713:69::-;46749:25;46763:10;46749:13;:25::i;:::-;46713:69::o;11934:315::-;11987:7;12215:15;:13;:15::i;:::-;12200:12;;12184:13;;:28;:46;12177:53;;11934:315;:::o;43795:52::-;43837:10;43795:52;:::o;20847:170::-;20981:28;20991:4;20997:2;21001:7;20981:9;:28::i;:::-;20847:170;;;:::o;45518:227::-;45633:16;45651:21;45698:7;:5;:7::i;:::-;43088:5;45717;;45708:6;:14;;;;:::i;:::-;45707:29;;;;:::i;:::-;45690:47;;;;45518:227;;;;;:::o;44611:78::-;39875:13;:11;:13::i;:::-;44677:4:::1;44664:10;;:17;;;;;;;;;;;;;;;;;;44611:78::o:0;43100:20::-;;;;:::o;21088:185::-;21226:39;21243:4;21249:2;21253:7;21226:39;;;;;;;;;;;;:16;:39::i;:::-;21088:185;;;:::o;43884:22::-;;;;;;;;;;;;;:::o;44697:156::-;39875:13;:11;:13::i;:::-;44777:10:::1;;;;;;;;;;;44774:39;;;44796:17;;;;;;;;;;;;;;44774:39;44834:11;44824:7;:21;;;;;;;;;;;;:::i;:::-;;44697:156:::0;:::o;17682:144::-;17746:7;17789:27;17808:7;17789:18;:27::i;:::-;17766:52;;17682:144;;;:::o;43856:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13559:224::-;13623:7;13664:1;13647:19;;:5;:19;;;13643:60;;;13675:28;;;;;;;;;;;;;;13643:60;8898:13;13721:18;:25;13740:5;13721:25;;;;;;;;;;;;;;;;:54;13714:61;;13559:224;;;:::o;40637:103::-;39875:13;:11;:13::i;:::-;40702:30:::1;40729:1;40702:18;:30::i;:::-;40637:103::o:0;46790:75::-;46839:18;46853:3;46839:13;:18::i;:::-;46790:75;:::o;47392:184::-;39875:13;:11;:13::i;:::-;43837:10:::1;47450:15;:33;47447:61;;;47492:16;;;;;;;;;;;;;;47447:61;47519:49;47529:10;47554:13;:11;:13::i;:::-;43629:3;47541:26;;;;:::i;:::-;47519:9;:49::i;:::-;47392:184::o:0;43736:52::-;43778:10;43736:52;:::o;39989:87::-;40035:7;40062:6;;;;;;;;;;;40055:13;;39989:87;:::o;18062:104::-;18118:13;18151:7;18144:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18062:104;:::o;20237:308::-;20348:19;:17;:19::i;:::-;20336:31;;:8;:31;;;20332:61;;;20376:17;;;;;;;;;;;;;;20332:61;20458:8;20406:18;:39;20425:19;:17;:19::i;:::-;20406:39;;;;;;;;;;;;;;;:49;20446:8;20406:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20518:8;20482:55;;20497:19;:17;:19::i;:::-;20482:55;;;20528:8;20482:55;;;;;;:::i;:::-;;;;;;;;20237:308;;:::o;21344:396::-;21511:28;21521:4;21527:2;21531:7;21511:9;:28::i;:::-;21572:1;21554:2;:14;;;:19;21550:183;;21593:56;21624:4;21630:2;21634:7;21643:5;21593:30;:56::i;:::-;21588:145;;21677:40;;;;;;;;;;;;;;21588:145;21550:183;21344:396;;;;:::o;45864:363::-;39875:13;:11;:13::i;:::-;45945::::1;45940:243;45972:6;;:13;;45964:5;:21;45940:243;;;46043:17;46015:45:::0;::::1;;;;;;;:::i;:::-;;:9;:24;46025:6;;46032:5;46025:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;46015:24;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;;;;:::i;:::-;;;46011:96;;;46086:21;;;;;;;;;;;;;;46011:96;46149:22;46122:9;:24;46132:6;;46139:5;46132:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;46122:24;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;45987:7;;;;;:::i;:::-;;;;45940:243;;;;46200:19;46212:6;;46200:19;;;;;;;:::i;:::-;;;;;;;;45864:363:::0;;:::o;44969:410::-;45070:13;45106:16;45114:7;45106;:16::i;:::-;45101:59;;45131:29;;;;;;;;;;;;;;45101:59;45173:22;45198:10;:8;:10::i;:::-;45173:35;;45265:1;45245:8;45239:22;:27;;:132;;;;;;;;;;;;;;;;;45310:8;45320:18;45330:7;45320:9;:18::i;:::-;45293:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45239:132;45219:152;;;44969:410;;;:::o;45753:103::-;39875:13;:11;:13::i;:::-;45824:24:::1;45841:6;45824:16;:24::i;:::-;45753:103:::0;:::o;43913:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;20616:164::-;20713:4;20737:18;:25;20756:5;20737:25;;;;;;;;;;;;;;;:35;20763:8;20737:35;;;;;;;;;;;;;;;;;;;;;;;;;20730:42;;20616:164;;;;:::o;40895:201::-;39875:13;:11;:13::i;:::-;41004:1:::1;40984:22;;:8;:22;;;;40976:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41060:28;41079:8;41060:18;:28::i;:::-;40895:201:::0;:::o;40154:132::-;40229:12;:10;:12::i;:::-;40218:23;;:7;:5;:7::i;:::-;:23;;;40210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40154:132::o;21995:273::-;22052:4;22108:7;22089:15;:13;:15::i;:::-;:26;;:66;;;;;22142:13;;22132:7;:23;22089:66;:152;;;;;22240:1;9668:8;22193:17;:26;22211:7;22193:26;;;;;;;;;;;;:43;:48;22089:152;22069:172;;21995:273;;;:::o;15197:1129::-;15264:7;15284:12;15299:7;15284:22;;15367:4;15348:15;:13;:15::i;:::-;:23;15344:915;;15401:13;;15394:4;:20;15390:869;;;15439:14;15456:17;:23;15474:4;15456:23;;;;;;;;;;;;15439:40;;15572:1;9668:8;15545:6;:23;:28;15541:699;;;16064:113;16081:1;16071:6;:11;16064:113;;;16124:17;:25;16142:6;;;;;;;16124:25;;;;;;;;;;;;16115:34;;16064:113;;;16210:6;16203:13;;;;;;15541:699;15416:843;15390:869;15344:915;16287:31;;;;;;;;;;;;;;15197:1129;;;;:::o;35977:105::-;36037:7;36064:10;36057:17;;35977:105;:::o;46873:511::-;43778:10;46931:15;:33;46928:61;;;46973:16;;;;;;;;;;;;;;46928:61;43837:10;47003:15;:33;47000:56;;;47045:11;;;;;;;;;;;;;;47000:56;47091:26;47073:44;;;;;;;;:::i;:::-;;:9;:14;47083:3;47073:14;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;;;;;:::i;:::-;;;47069:86;;;47139:16;;;;;;;;;;;;;;47069:86;47190:17;47172:35;;;;;;;;:::i;:::-;;:9;:14;47182:3;47172:14;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;;;;;;:::i;:::-;;;47168:63;;;47216:15;;;;;;;;;;;;;;47168:63;47261:17;47244:9;:14;47254:3;47244:14;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;47289:17;47299:3;47304:1;47289:9;:17::i;:::-;43629:3;47323:13;:11;:13::i;:::-;:26;47319:57;;;47358:18;;;;;;;;;;;;;;47319:57;46873:511;:::o;45387:93::-;45444:7;45471:1;45464:8;;45387:93;:::o;27234:2515::-;27349:27;27379;27398:7;27379:18;:27::i;:::-;27349:57;;27464:4;27423:45;;27439:19;27423:45;;;27419:86;;27477:28;;;;;;;;;;;;;;27419:86;27518:22;27567:4;27544:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;27588:43;27605:4;27611:19;:17;:19::i;:::-;27588:16;:43::i;:::-;27544:87;:147;;;;27672:19;:17;:19::i;:::-;27648:43;;:20;27660:7;27648:11;:20::i;:::-;:43;;;27544:147;27518:174;;27710:17;27705:66;;27736:35;;;;;;;;;;;;;;27705:66;27800:1;27786:16;;:2;:16;;;27782:52;;;27811:23;;;;;;;;;;;;;;27782:52;27847:43;27869:4;27875:2;27879:7;27888:1;27847:21;:43::i;:::-;27963:15;:24;27979:7;27963:24;;;;;;;;;;;;27956:31;;;;;;;;;;;28355:18;:24;28374:4;28355:24;;;;;;;;;;;;;;;;28353:26;;;;;;;;;;;;28424:18;:22;28443:2;28424:22;;;;;;;;;;;;;;;;28422:24;;;;;;;;;;;9950:8;9552:3;28805:15;:41;;28763:21;28781:2;28763:17;:21::i;:::-;:84;:128;28717:17;:26;28735:7;28717:26;;;;;;;;;;;:174;;;;29061:1;9950:8;29011:19;:46;:51;29007:626;;;29083:19;29115:1;29105:7;:11;29083:33;;29272:1;29238:17;:30;29256:11;29238:30;;;;;;;;;;;;:35;29234:384;;;29376:13;;29361:11;:28;29357:242;;29556:19;29523:17;:30;29541:11;29523:30;;;;;;;;;;;:52;;;;29357:242;29234:384;29064:569;29007:626;29680:7;29676:2;29661:27;;29670:4;29661:27;;;;;;;;;;;;29699:42;29720:4;29726:2;29730:7;29739:1;29699:20;:42::i;:::-;27338:2411;;27234:2515;;;:::o;41256:191::-;41330:16;41349:6;;;;;;;;;;;41330:25;;41375:8;41366:6;;:17;;;;;;;;;;;;;;;;;;41430:8;41399:40;;41420:8;41399:40;;;;;;;;;;;;41319:128;41256:191;:::o;22352:104::-;22421:27;22431:2;22435:8;22421:27;;;;;;;;;;;;:9;:27::i;:::-;22352:104;;:::o;33446:716::-;33609:4;33655:2;33630:45;;;33676:19;:17;:19::i;:::-;33697:4;33703:7;33712:5;33630:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33626:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33930:1;33913:6;:13;:18;33909:235;;;33959:40;;;;;;;;;;;;;;33909:235;34102:6;34096:13;34087:6;34083:2;34079:15;34072:38;33626:529;33799:54;;;33789:64;;;:6;:64;;;;33782:71;;;33446:716;;;;;;:::o;44861:100::-;44913:13;44946:7;44939:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44861:100;:::o;36188:1959::-;36245:17;36666:3;36659:4;36653:11;36649:21;36642:28;;36757:3;36751:4;36744:17;36863:3;37320:5;37450:1;37445:3;37441:11;37434:18;;37587:2;37581:4;37577:13;37573:2;37569:22;37564:3;37556:36;37628:2;37622:4;37618:13;37610:21;;37211:682;37647:4;37211:682;;;37822:1;37817:3;37813:11;37806:18;;37873:2;37867:4;37863:13;37859:2;37855:22;37850:3;37842:36;37743:2;37737:4;37733:13;37725:21;;37211:682;;;37215:431;37944:3;37939;37935:13;38059:2;38054:3;38050:12;38043:19;;38122:6;38117:3;38110:19;36284:1856;;36188:1959;;;:::o;43277:151::-;43088:5;43343:6;:19;43339:56;;;43371:24;;;;;;;;;;;;;;43339:56;43414:6;43406:5;:14;;;;43277:151;:::o;38696:98::-;38749:7;38776:10;38769:17;;38696:98;:::o;34810:159::-;;;;;:::o;18982:148::-;19046:14;19107:5;19097:15;;18982:148;;;:::o;35628:158::-;;;;;:::o;22829:2236::-;22952:20;22975:13;;22952:36;;23017:1;23003:16;;:2;:16;;;22999:48;;;23028:19;;;;;;;;;;;;;;22999:48;23074:1;23062:8;:13;23058:44;;;23084:18;;;;;;;;;;;;;;23058:44;23115:61;23145:1;23149:2;23153:12;23167:8;23115:21;:61::i;:::-;23719:1;9035:2;23690:1;:25;;23689:31;23677:8;:44;23651:18;:22;23670:2;23651:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;9815:3;24120:29;24147:1;24135:8;:13;24120:14;:29::i;:::-;:56;;9552:3;24057:15;:41;;24015:21;24033:2;24015:17;:21::i;:::-;:84;:162;23964:17;:31;23982:12;23964:31;;;;;;;;;;;:213;;;;24194:20;24217:12;24194:35;;24244:11;24273:8;24258:12;:23;24244:37;;24320:1;24302:2;:14;;;:19;24298:635;;24342:313;24398:12;24394:2;24373:38;;24390:1;24373:38;;;;;;;;;;;;24439:69;24478:1;24482:2;24486:14;;;;;;24502:5;24439:30;:69::i;:::-;24434:174;;24544:40;;;;;;;;;;;;;;24434:174;24650:3;24635:12;:18;24342:313;;24736:12;24719:13;;:29;24715:43;;24750:8;;;24715:43;24298:635;;;24799:119;24855:14;;;;;;24851:2;24830:40;;24847:1;24830:40;;;;;;;;;;;;24913:3;24898:12;:18;24799:119;;24298:635;24963:12;24947:13;:28;;;;23428:1559;;24997:60;25026:1;25030:2;25034:12;25048:8;24997:20;:60::i;:::-;22941:2124;22829:2236;;;:::o;19217:142::-;19275:14;19336:5;19326:15;;19217: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:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:117;1873:1;1870;1863:12;1904:568;1977:8;1987:6;2037:3;2030:4;2022:6;2018:17;2014:27;2004:122;;2045:79;;:::i;:::-;2004:122;2158:6;2145:20;2135:30;;2188:18;2180:6;2177:30;2174:117;;;2210:79;;:::i;:::-;2174:117;2324:4;2316:6;2312:17;2300:29;;2378:3;2370:4;2362:6;2358:17;2348:8;2344:32;2341:41;2338:128;;;2385:79;;:::i;:::-;2338:128;1904:568;;;;;:::o;2478:559::-;2564:6;2572;2621:2;2609:9;2600:7;2596:23;2592:32;2589:119;;;2627:79;;:::i;:::-;2589:119;2775:1;2764:9;2760:17;2747:31;2805:18;2797:6;2794:30;2791:117;;;2827:79;;:::i;:::-;2791:117;2940:80;3012:7;3003:6;2992:9;2988:22;2940:80;:::i;:::-;2922:98;;;;2718:312;2478:559;;;;;:::o;3043:77::-;3080:7;3109:5;3098:16;;3043:77;;;:::o;3126:118::-;3213:24;3231:5;3213:24;:::i;:::-;3208:3;3201:37;3126:118;;:::o;3250:222::-;3343:4;3381:2;3370:9;3366:18;3358:26;;3394:71;3462:1;3451:9;3447:17;3438:6;3394:71;:::i;:::-;3250:222;;;;:::o;3478:99::-;3530:6;3564:5;3558:12;3548:22;;3478:99;;;:::o;3583:169::-;3667:11;3701:6;3696:3;3689:19;3741:4;3736:3;3732:14;3717:29;;3583:169;;;;:::o;3758:307::-;3826:1;3836:113;3850:6;3847:1;3844:13;3836:113;;;3935:1;3930:3;3926:11;3920:18;3916:1;3911:3;3907:11;3900:39;3872:2;3869:1;3865:10;3860:15;;3836:113;;;3967:6;3964:1;3961:13;3958:101;;;4047:1;4038:6;4033:3;4029:16;4022:27;3958:101;3807:258;3758:307;;;:::o;4071:102::-;4112:6;4163:2;4159:7;4154:2;4147:5;4143:14;4139:28;4129:38;;4071:102;;;:::o;4179:364::-;4267:3;4295:39;4328:5;4295:39;:::i;:::-;4350:71;4414:6;4409:3;4350:71;:::i;:::-;4343:78;;4430:52;4475:6;4470:3;4463:4;4456:5;4452:16;4430:52;:::i;:::-;4507:29;4529:6;4507:29;:::i;:::-;4502:3;4498:39;4491:46;;4271:272;4179:364;;;;:::o;4549:313::-;4662:4;4700:2;4689:9;4685:18;4677:26;;4749:9;4743:4;4739:20;4735:1;4724:9;4720:17;4713:47;4777:78;4850:4;4841:6;4777:78;:::i;:::-;4769:86;;4549:313;;;;:::o;4868:122::-;4941:24;4959:5;4941:24;:::i;:::-;4934:5;4931:35;4921:63;;4980:1;4977;4970:12;4921:63;4868:122;:::o;4996:139::-;5042:5;5080:6;5067:20;5058:29;;5096:33;5123:5;5096:33;:::i;:::-;4996:139;;;;:::o;5141:329::-;5200:6;5249:2;5237:9;5228:7;5224:23;5220:32;5217:119;;;5255:79;;:::i;:::-;5217:119;5375:1;5400:53;5445:7;5436:6;5425:9;5421:22;5400:53;:::i;:::-;5390:63;;5346:117;5141:329;;;;:::o;5476:126::-;5513:7;5553:42;5546:5;5542:54;5531:65;;5476:126;;;:::o;5608:96::-;5645:7;5674:24;5692:5;5674:24;:::i;:::-;5663:35;;5608:96;;;:::o;5710:118::-;5797:24;5815:5;5797:24;:::i;:::-;5792:3;5785:37;5710:118;;:::o;5834:222::-;5927:4;5965:2;5954:9;5950:18;5942:26;;5978:71;6046:1;6035:9;6031:17;6022:6;5978:71;:::i;:::-;5834:222;;;;:::o;6062:122::-;6135:24;6153:5;6135:24;:::i;:::-;6128:5;6125:35;6115:63;;6174:1;6171;6164:12;6115:63;6062:122;:::o;6190:139::-;6236:5;6274:6;6261:20;6252:29;;6290:33;6317:5;6290:33;:::i;:::-;6190:139;;;;:::o;6335:474::-;6403:6;6411;6460:2;6448:9;6439:7;6435:23;6431:32;6428:119;;;6466:79;;:::i;:::-;6428:119;6586:1;6611:53;6656:7;6647:6;6636:9;6632:22;6611:53;:::i;:::-;6601:63;;6557:117;6713:2;6739:53;6784:7;6775:6;6764:9;6760:22;6739:53;:::i;:::-;6729:63;;6684:118;6335:474;;;;;:::o;6815:619::-;6892:6;6900;6908;6957:2;6945:9;6936:7;6932:23;6928:32;6925:119;;;6963:79;;:::i;:::-;6925:119;7083:1;7108:53;7153:7;7144:6;7133:9;7129:22;7108:53;:::i;:::-;7098:63;;7054:117;7210:2;7236:53;7281:7;7272:6;7261:9;7257:22;7236:53;:::i;:::-;7226:63;;7181:118;7338:2;7364:53;7409:7;7400:6;7389:9;7385:22;7364:53;:::i;:::-;7354:63;;7309:118;6815:619;;;;;:::o;7440:474::-;7508:6;7516;7565:2;7553:9;7544:7;7540:23;7536:32;7533:119;;;7571:79;;:::i;:::-;7533:119;7691:1;7716:53;7761:7;7752:6;7741:9;7737:22;7716:53;:::i;:::-;7706:63;;7662:117;7818:2;7844:53;7889:7;7880:6;7869:9;7865:22;7844:53;:::i;:::-;7834:63;;7789:118;7440:474;;;;;:::o;7920:332::-;8041:4;8079:2;8068:9;8064:18;8056:26;;8092:71;8160:1;8149:9;8145:17;8136:6;8092:71;:::i;:::-;8173:72;8241:2;8230:9;8226:18;8217:6;8173:72;:::i;:::-;7920:332;;;;;:::o;8258:117::-;8367:1;8364;8357:12;8381:180;8429:77;8426:1;8419:88;8526:4;8523:1;8516:15;8550:4;8547:1;8540:15;8567:281;8650:27;8672:4;8650:27;:::i;:::-;8642:6;8638:40;8780:6;8768:10;8765:22;8744:18;8732:10;8729:34;8726:62;8723:88;;;8791:18;;:::i;:::-;8723:88;8831:10;8827:2;8820:22;8610:238;8567:281;;:::o;8854:129::-;8888:6;8915:20;;:::i;:::-;8905:30;;8944:33;8972:4;8964:6;8944:33;:::i;:::-;8854:129;;;:::o;8989:308::-;9051:4;9141:18;9133:6;9130:30;9127:56;;;9163:18;;:::i;:::-;9127:56;9201:29;9223:6;9201:29;:::i;:::-;9193:37;;9285:4;9279;9275:15;9267:23;;8989:308;;;:::o;9303:154::-;9387:6;9382:3;9377;9364:30;9449:1;9440:6;9435:3;9431:16;9424:27;9303:154;;;:::o;9463:412::-;9541:5;9566:66;9582:49;9624:6;9582:49;:::i;:::-;9566:66;:::i;:::-;9557:75;;9655:6;9648:5;9641:21;9693:4;9686:5;9682:16;9731:3;9722:6;9717:3;9713:16;9710:25;9707:112;;;9738:79;;:::i;:::-;9707:112;9828:41;9862:6;9857:3;9852;9828:41;:::i;:::-;9547:328;9463:412;;;;;:::o;9895:340::-;9951:5;10000:3;9993:4;9985:6;9981:17;9977:27;9967:122;;10008:79;;:::i;:::-;9967:122;10125:6;10112:20;10150:79;10225:3;10217:6;10210:4;10202:6;10198:17;10150:79;:::i;:::-;10141:88;;9957:278;9895:340;;;;:::o;10241:509::-;10310:6;10359:2;10347:9;10338:7;10334:23;10330:32;10327:119;;;10365:79;;:::i;:::-;10327:119;10513:1;10502:9;10498:17;10485:31;10543:18;10535:6;10532:30;10529:117;;;10565:79;;:::i;:::-;10529:117;10670:63;10725:7;10716:6;10705:9;10701:22;10670:63;:::i;:::-;10660:73;;10456:287;10241:509;;;;:::o;10756:329::-;10815:6;10864:2;10852:9;10843:7;10839:23;10835:32;10832:119;;;10870:79;;:::i;:::-;10832:119;10990:1;11015:53;11060:7;11051:6;11040:9;11036:22;11015:53;:::i;:::-;11005:63;;10961:117;10756:329;;;;:::o;11091:116::-;11161:21;11176:5;11161:21;:::i;:::-;11154:5;11151:32;11141:60;;11197:1;11194;11187:12;11141:60;11091:116;:::o;11213:133::-;11256:5;11294:6;11281:20;11272:29;;11310:30;11334:5;11310:30;:::i;:::-;11213:133;;;;:::o;11352:468::-;11417:6;11425;11474:2;11462:9;11453:7;11449:23;11445:32;11442:119;;;11480:79;;:::i;:::-;11442:119;11600:1;11625:53;11670:7;11661:6;11650:9;11646:22;11625:53;:::i;:::-;11615:63;;11571:117;11727:2;11753:50;11795:7;11786:6;11775:9;11771:22;11753:50;:::i;:::-;11743:60;;11698:115;11352:468;;;;;:::o;11826:307::-;11887:4;11977:18;11969:6;11966:30;11963:56;;;11999:18;;:::i;:::-;11963:56;12037:29;12059:6;12037:29;:::i;:::-;12029:37;;12121:4;12115;12111:15;12103:23;;11826:307;;;:::o;12139:410::-;12216:5;12241:65;12257:48;12298:6;12257:48;:::i;:::-;12241:65;:::i;:::-;12232:74;;12329:6;12322:5;12315:21;12367:4;12360:5;12356:16;12405:3;12396:6;12391:3;12387:16;12384:25;12381:112;;;12412:79;;:::i;:::-;12381:112;12502:41;12536:6;12531:3;12526;12502:41;:::i;:::-;12222:327;12139:410;;;;;:::o;12568:338::-;12623:5;12672:3;12665:4;12657:6;12653:17;12649:27;12639:122;;12680:79;;:::i;:::-;12639:122;12797:6;12784:20;12822:78;12896:3;12888:6;12881:4;12873:6;12869:17;12822:78;:::i;:::-;12813:87;;12629:277;12568:338;;;;:::o;12912:943::-;13007:6;13015;13023;13031;13080:3;13068:9;13059:7;13055:23;13051:33;13048:120;;;13087:79;;:::i;:::-;13048:120;13207:1;13232:53;13277:7;13268:6;13257:9;13253:22;13232:53;:::i;:::-;13222:63;;13178:117;13334:2;13360:53;13405:7;13396:6;13385:9;13381:22;13360:53;:::i;:::-;13350:63;;13305:118;13462:2;13488:53;13533:7;13524:6;13513:9;13509:22;13488:53;:::i;:::-;13478:63;;13433:118;13618:2;13607:9;13603:18;13590:32;13649:18;13641:6;13638:30;13635:117;;;13671:79;;:::i;:::-;13635:117;13776:62;13830:7;13821:6;13810:9;13806:22;13776:62;:::i;:::-;13766:72;;13561:287;12912:943;;;;;;;:::o;13861:180::-;13909:77;13906:1;13899:88;14006:4;14003:1;13996:15;14030:4;14027:1;14020:15;14047:120;14135:1;14128:5;14125:12;14115:46;;14141:18;;:::i;:::-;14115:46;14047:120;:::o;14173:141::-;14225:7;14254:5;14243:16;;14260:48;14302:5;14260:48;:::i;:::-;14173:141;;;:::o;14320:::-;14383:9;14416:39;14449:5;14416:39;:::i;:::-;14403:52;;14320:141;;;:::o;14467:157::-;14567:50;14611:5;14567:50;:::i;:::-;14562:3;14555:63;14467:157;;:::o;14630:248::-;14736:4;14774:2;14763:9;14759:18;14751:26;;14787:84;14868:1;14857:9;14853:17;14844:6;14787:84;:::i;:::-;14630:248;;;;:::o;14884:474::-;14952:6;14960;15009:2;14997:9;14988:7;14984:23;14980:32;14977:119;;;15015:79;;:::i;:::-;14977:119;15135:1;15160:53;15205:7;15196:6;15185:9;15181:22;15160:53;:::i;:::-;15150:63;;15106:117;15262:2;15288:53;15333:7;15324:6;15313:9;15309:22;15288:53;:::i;:::-;15278:63;;15233:118;14884:474;;;;;:::o;15364:180::-;15412:77;15409:1;15402:88;15509:4;15506:1;15499:15;15533:4;15530:1;15523:15;15550:180;15598:77;15595:1;15588:88;15695:4;15692:1;15685:15;15719:4;15716:1;15709:15;15736:233;15775:3;15798:24;15816:5;15798:24;:::i;:::-;15789:33;;15844:66;15837:5;15834:77;15831:103;;;15914:18;;:::i;:::-;15831:103;15961:1;15954:5;15950:13;15943:20;;15736:233;;;:::o;15975:180::-;16023:77;16020:1;16013:88;16120:4;16117:1;16110:15;16144:4;16141:1;16134:15;16161:320;16205:6;16242:1;16236:4;16232:12;16222:22;;16289:1;16283:4;16279:12;16310:18;16300:81;;16366:4;16358:6;16354:17;16344:27;;16300:81;16428:2;16420:6;16417:14;16397:18;16394:38;16391:84;;;16447:18;;:::i;:::-;16391:84;16212:269;16161:320;;;:::o;16487:348::-;16527:7;16550:20;16568:1;16550:20;:::i;:::-;16545:25;;16584:20;16602:1;16584:20;:::i;:::-;16579:25;;16772:1;16704:66;16700:74;16697:1;16694:81;16689:1;16682:9;16675:17;16671:105;16668:131;;;16779:18;;:::i;:::-;16668:131;16827:1;16824;16820:9;16809:20;;16487:348;;;;:::o;16841:180::-;16889:77;16886:1;16879:88;16986:4;16983:1;16976:15;17010:4;17007:1;17000:15;17027:185;17067:1;17084:20;17102:1;17084:20;:::i;:::-;17079:25;;17118:20;17136:1;17118:20;:::i;:::-;17113:25;;17157:1;17147:35;;17162:18;;:::i;:::-;17147:35;17204:1;17201;17197:9;17192:14;;17027:185;;;;:::o;17218:191::-;17258:4;17278:20;17296:1;17278:20;:::i;:::-;17273:25;;17312:20;17330:1;17312:20;:::i;:::-;17307:25;;17351:1;17348;17345:8;17342:34;;;17356:18;;:::i;:::-;17342:34;17401:1;17398;17394:9;17386:17;;17218:191;;;;:::o;17415:184::-;17514:11;17548:6;17543:3;17536:19;17588:4;17583:3;17579:14;17564:29;;17415:184;;;;:::o;17605:102::-;17674:4;17697:3;17689:11;;17605:102;;;:::o;17713:108::-;17790:24;17808:5;17790:24;:::i;:::-;17785:3;17778:37;17713:108;;:::o;17827:179::-;17896:10;17917:46;17959:3;17951:6;17917:46;:::i;:::-;17995:4;17990:3;17986:14;17972:28;;17827:179;;;;:::o;18012:122::-;18064:5;18089:39;18124:2;18119:3;18115:12;18110:3;18089:39;:::i;:::-;18080:48;;18012:122;;;;:::o;18140:115::-;18212:4;18244;18239:3;18235:14;18227:22;;18140:115;;;:::o;18291:699::-;18420:3;18443:86;18522:6;18517:3;18443:86;:::i;:::-;18436:93;;18553:58;18605:5;18553:58;:::i;:::-;18634:7;18665:1;18650:315;18675:6;18672:1;18669:13;18650:315;;;18745:42;18780:6;18771:7;18745:42;:::i;:::-;18807:63;18866:3;18851:13;18807:63;:::i;:::-;18800:70;;18893:62;18948:6;18893:62;:::i;:::-;18883:72;;18710:255;18697:1;18694;18690:9;18685:14;;18650:315;;;18654:14;18981:3;18974:10;;18425:565;;18291:699;;;;;:::o;18996:393::-;19149:4;19187:2;19176:9;19172:18;19164:26;;19236:9;19230:4;19226:20;19222:1;19211:9;19207:17;19200:47;19264:118;19377:4;19368:6;19360;19264:118;:::i;:::-;19256:126;;18996:393;;;;;:::o;19395:148::-;19497:11;19534:3;19519:18;;19395:148;;;;:::o;19549:377::-;19655:3;19683:39;19716:5;19683:39;:::i;:::-;19738:89;19820:6;19815:3;19738:89;:::i;:::-;19731:96;;19836:52;19881:6;19876:3;19869:4;19862:5;19858:16;19836:52;:::i;:::-;19913:6;19908:3;19904:16;19897:23;;19659:267;19549:377;;;;:::o;19932:155::-;20072:7;20068:1;20060:6;20056:14;20049:31;19932:155;:::o;20093:400::-;20253:3;20274:84;20356:1;20351:3;20274:84;:::i;:::-;20267:91;;20367:93;20456:3;20367:93;:::i;:::-;20485:1;20480:3;20476:11;20469:18;;20093:400;;;:::o;20499:701::-;20780:3;20802:95;20893:3;20884:6;20802:95;:::i;:::-;20795:102;;20914:95;21005:3;20996:6;20914:95;:::i;:::-;20907:102;;21026:148;21170:3;21026:148;:::i;:::-;21019:155;;21191:3;21184:10;;20499:701;;;;;:::o;21206:225::-;21346:34;21342:1;21334:6;21330:14;21323:58;21415:8;21410:2;21402:6;21398:15;21391:33;21206:225;:::o;21437:366::-;21579:3;21600:67;21664:2;21659:3;21600:67;:::i;:::-;21593:74;;21676:93;21765:3;21676:93;:::i;:::-;21794:2;21789:3;21785:12;21778:19;;21437:366;;;:::o;21809:419::-;21975:4;22013:2;22002:9;21998:18;21990:26;;22062:9;22056:4;22052:20;22048:1;22037:9;22033:17;22026:47;22090:131;22216:4;22090:131;:::i;:::-;22082:139;;21809:419;;;:::o;22234:182::-;22374:34;22370:1;22362:6;22358:14;22351:58;22234:182;:::o;22422:366::-;22564:3;22585:67;22649:2;22644:3;22585:67;:::i;:::-;22578:74;;22661:93;22750:3;22661:93;:::i;:::-;22779:2;22774:3;22770:12;22763:19;;22422:366;;;:::o;22794:419::-;22960:4;22998:2;22987:9;22983:18;22975:26;;23047:9;23041:4;23037:20;23033:1;23022:9;23018:17;23011:47;23075:131;23201:4;23075:131;:::i;:::-;23067:139;;22794:419;;;:::o;23219:98::-;23270:6;23304:5;23298:12;23288:22;;23219:98;;;:::o;23323:168::-;23406:11;23440:6;23435:3;23428:19;23480:4;23475:3;23471:14;23456:29;;23323:168;;;;:::o;23497:360::-;23583:3;23611:38;23643:5;23611:38;:::i;:::-;23665:70;23728:6;23723:3;23665:70;:::i;:::-;23658:77;;23744:52;23789:6;23784:3;23777:4;23770:5;23766:16;23744:52;:::i;:::-;23821:29;23843:6;23821:29;:::i;:::-;23816:3;23812:39;23805:46;;23587:270;23497:360;;;;:::o;23863:640::-;24058:4;24096:3;24085:9;24081:19;24073:27;;24110:71;24178:1;24167:9;24163:17;24154:6;24110:71;:::i;:::-;24191:72;24259:2;24248:9;24244:18;24235:6;24191:72;:::i;:::-;24273;24341:2;24330:9;24326:18;24317:6;24273:72;:::i;:::-;24392:9;24386:4;24382:20;24377:2;24366:9;24362:18;24355:48;24420:76;24491:4;24482:6;24420:76;:::i;:::-;24412:84;;23863:640;;;;;;;:::o;24509:141::-;24565:5;24596:6;24590:13;24581:22;;24612:32;24638:5;24612:32;:::i;:::-;24509:141;;;;:::o;24656:349::-;24725:6;24774:2;24762:9;24753:7;24749:23;24745:32;24742:119;;;24780:79;;:::i;:::-;24742:119;24900:1;24925:63;24980:7;24971:6;24960:9;24956:22;24925:63;:::i;:::-;24915:73;;24871:127;24656:349;;;;:::o
Swarm Source
ipfs://52c5b0a6090e2e3527f9ea02637e3f6bd4fa6a5ee8fb93216edaeed6d1a113fa
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.