ERC-721
NFT
Overview
Max Total Supply
2,000 LINGBEGGAR
Holders
779
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 LINGBEGGARLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LingBeggar
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "erc721a/contracts/ERC721A.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; contract LingBeggar is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; address public vaultAddress; string public baseURI = ""; string public hiddenMetadataURI = ""; string public baseURIExtension = ".json"; uint256 public constant MAX_SUPPLY = 2000; uint256 public constant VAULT_SUPPLY = 50; uint256 public constant MAX_MINT_WHITELIST = 2; uint256 public MAX_MINT_PUBLIC = 1; bytes32 public merkleRoot; bool public isWhitelistMintActive = false; bool public isPublicMintActive = false; bool public revealed = false; mapping(address => uint256) public totalMinted; constructor( string memory _hiddenMetadataURI, string memory _initBaseURI, bytes32 _merkleRoot ) ERC721A("LingBeggar", "LINGBEGGAR") { vaultAddress = msg.sender; hiddenMetadataURI = _hiddenMetadataURI; baseURI = _initBaseURI; merkleRoot = _merkleRoot; } function setVaultAddress(address _vaultAddress) public onlyOwner { vaultAddress = _vaultAddress; } modifier callerIsUser() { // solhint-disable-next-line avoid-tx-origin require(tx.origin == msg.sender, "Contract Denied"); _; } function publicMint(uint256 _quantity) external payable nonReentrant callerIsUser { require(isPublicMintActive, "Public sale is not active"); require(_quantity > 0, "Invalid quantity"); require( totalMinted[msg.sender] + _quantity <= MAX_MINT_PUBLIC, "Max mint reached" ); require(totalSupply() + _quantity <= MAX_SUPPLY, "Max supply reached"); totalMinted[msg.sender] += _quantity; _safeMint(msg.sender, _quantity); } // Whitelist function whitelistMint(uint256 _quantity, bytes32[] calldata _proof) external payable nonReentrant callerIsUser { require(isWhitelistMintActive, "Whitelist mint is not active"); require(isWhiteListed(msg.sender, _proof), "Not whitelisted"); require(_quantity > 0, "Invalid quantity"); require( totalMinted[msg.sender] + _quantity <= MAX_MINT_WHITELIST, "Max mint reached" ); require(totalSupply() + _quantity <= MAX_SUPPLY, "Max supply reached"); totalMinted[msg.sender] += _quantity; _safeMint(msg.sender, _quantity); } function isWhiteListed(address _account, bytes32[] calldata _proof) internal view returns (bool) { return _verify(leaf(_account), _proof); } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } function leaf(address _account) internal pure returns (bytes32) { return keccak256(abi.encodePacked(_account)); } function _verify(bytes32 _leaf, bytes32[] memory _proof) internal view returns (bool) { return MerkleProof.verify(_proof, merkleRoot, _leaf); } // Metadata function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "URI query for nonexistent token"); if (!revealed) { return hiddenMetadataURI; } string memory currentBaseURI = _baseURI(); return string( abi.encodePacked( currentBaseURI, _tokenId.toString(), baseURIExtension ) ); } function setBaseURI(string memory _newURI) public onlyOwner { baseURI = _newURI; } function setHiddenMetadataURI(string memory _newURI) public onlyOwner { hiddenMetadataURI = _newURI; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setBaseExtension(string memory _newBaseURIExtension) public onlyOwner { baseURIExtension = _newBaseURIExtension; } // Admin function toggleWhitelistMint() external onlyOwner { isWhitelistMintActive = !isWhitelistMintActive; } function togglePublicSale() external onlyOwner { isPublicMintActive = !isPublicMintActive; } function closeSale() external onlyOwner { isWhitelistMintActive = false; isPublicMintActive = false; } function toggleReveal() external onlyOwner { revealed = !revealed; } // For marketing and airdrop etc. function airdrop(address[] memory _team, uint256[] memory _teamMint) external onlyOwner { for (uint256 i = 0; i < _team.length; i++) { require( totalSupply() + _teamMint[i] <= MAX_SUPPLY, "Max supply exceeded" ); _safeMint(_team[i], _teamMint[i]); } } function setMaxMintPublic(uint256 _newMaxMints) external onlyOwner { MAX_MINT_PUBLIC = _newMaxMints; } function teamMint() external onlyOwner { require( totalSupply() + VAULT_SUPPLY <= MAX_SUPPLY, "Max supply reached" ); _safeMint(vaultAddress, VAULT_SUPPLY); } function withdraw() external onlyOwner nonReentrant { uint256 balance = address(this).balance; payable(vaultAddress).transfer(balance); } function getLuckyUserAddress(uint256 _index) public view returns (address[] memory) { uint256 sum = totalSupply(); address[] memory luckyUsers = new address[](20); uint256 j; for (uint256 i = _index; i < sum; i += 100) { luckyUsers[j] = ownerOf(_index); j++; } return luckyUsers; } function _sendValue(address recipient, uint256 amount) internal { require(address(this).balance >= amount, "insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = payable(recipient).call{value: amount}(""); require(success, "unable to send ETH"); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_hiddenMetadataURI","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAULT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_team","type":"address[]"},{"internalType":"uint256[]","name":"_teamMint","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","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":[],"name":"baseURIExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeSale","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":"uint256","name":"_index","type":"uint256"}],"name":"getLuckyUserAddress","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isPublicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_newBaseURIExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setHiddenMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMints","type":"uint256"}],"name":"setMaxMintPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultAddress","type":"address"}],"name":"setVaultAddress","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":[],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600b90805190602001906200002b9291906200035f565b5060405180602001604052806000815250600c9080519060200190620000539291906200035f565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d9080519060200190620000a19291906200035f565b506001600e556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055506000601060026101000a81548160ff0219169083151502179055503480156200010557600080fd5b50604051620049e0380380620049e083398181016040528101906200012b919062000498565b6040518060400160405280600a81526020017f4c696e67426567676172000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f4c494e47424547474152000000000000000000000000000000000000000000008152508160029080519060200190620001af9291906200035f565b508060039080519060200190620001c89291906200035f565b50620001d96200028c60201b60201c565b600081905550505062000201620001f56200029160201b60201c565b6200029960201b60201c565b600160098190555033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600c9080519060200190620002629291906200035f565b5081600b90805190602001906200027b9291906200035f565b5080600f81905550505050620006b4565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200036d90620005bf565b90600052602060002090601f016020900481019282620003915760008555620003dd565b82601f10620003ac57805160ff1916838001178555620003dd565b82800160010185558215620003dd579182015b82811115620003dc578251825591602001919060010190620003bf565b5b509050620003ec9190620003f0565b5090565b5b808211156200040b576000816000905550600101620003f1565b5090565b600062000426620004208462000549565b62000520565b9050828152602081018484840111156200043f57600080fd5b6200044c84828562000589565b509392505050565b60008151905062000465816200069a565b92915050565b600082601f8301126200047d57600080fd5b81516200048f8482602086016200040f565b91505092915050565b600080600060608486031215620004ae57600080fd5b600084015167ffffffffffffffff811115620004c957600080fd5b620004d7868287016200046b565b935050602084015167ffffffffffffffff811115620004f557600080fd5b62000503868287016200046b565b9250506040620005168682870162000454565b9150509250925092565b60006200052c6200053f565b90506200053a8282620005f5565b919050565b6000604051905090565b600067ffffffffffffffff8211156200056757620005666200065a565b5b620005728262000689565b9050602081019050919050565b6000819050919050565b60005b83811015620005a95780820151818401526020810190506200058c565b83811115620005b9576000848401525b50505050565b60006002820490506001821680620005d857607f821691505b60208210811415620005ef57620005ee6200062b565b5b50919050565b620006008262000689565b810181811067ffffffffffffffff821117156200062257620006216200065a565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b620006a5816200057f565b8114620006b157600080fd5b50565b61431c80620006c46000396000f3fe60806040526004361061027c5760003560e01c80636c0360eb1161014f578063ba7a86b8116100c1578063da3ef23f1161007a578063da3ef23f1461091f578063e222c7f914610948578063e985e9c51461095f578063ee55efee1461099c578063f2fde38b146109b3578063fabd1d2d146109dc5761027c565b8063ba7a86b81461081c578063ba9e12f714610833578063bfe28a4b1461085e578063c87b56dd1461089b578063d2cab056146108d8578063d7f7a742146108f45761027c565b80637cb64759116101135780637cb647591461072257806385535cc51461074b5780638da5cb5b1461077457806395d89b411461079f578063a22cb465146107ca578063b88d4fde146107f35761027c565b80636c0360eb146106635780636dc5f1ce1461068e5780636f63b60a146106b757806370a08231146106ce578063715018a61461070b5761027c565b806332cb6b0c116101f357806355f804b3116101ac57806355f804b31461056757806358941a4d146105905780635b8ad429146105bb57806363172ac1146105d25780636352211e146105fd578063672434821461063a5761027c565b806332cb6b0c1461047d5780633ccfd60b146104a857806342842e0e146104bf578063430bf08a146104e8578063512507c614610513578063518302271461053c5761027c565b80630d34ea58116102455780630d34ea581461038c57806318160ddd146103b757806323b872dd146103e25780632d6b62241461040b5780632db11544146104365780632eb4a7ab146104525761027c565b80623d47901461028157806301ffc9a7146102be57806306fdde03146102fb578063081812fc14610326578063095ea7b314610363575b600080fd5b34801561028d57600080fd5b506102a860048036038101906102a391906131e5565b610a07565b6040516102b59190613b80565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613421565b610a1f565b6040516102f291906139a8565b60405180910390f35b34801561030757600080fd5b50610310610ab1565b60405161031d91906139de565b60405180910390f35b34801561033257600080fd5b5061034d600480360381019061034891906134b4565b610b43565b60405161035a919061391f565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613350565b610bbf565b005b34801561039857600080fd5b506103a1610d00565b6040516103ae91906139de565b60405180910390f35b3480156103c357600080fd5b506103cc610d8e565b6040516103d99190613b80565b60405180910390f35b3480156103ee57600080fd5b506104096004803603810190610404919061324a565b610da5565b005b34801561041757600080fd5b506104206110ca565b60405161042d91906139a8565b60405180910390f35b610450600480360381019061044b91906134b4565b6110dd565b005b34801561045e57600080fd5b5061046761137c565b60405161047491906139c3565b60405180910390f35b34801561048957600080fd5b50610492611382565b60405161049f9190613b80565b60405180910390f35b3480156104b457600080fd5b506104bd611388565b005b3480156104cb57600080fd5b506104e660048036038101906104e1919061324a565b611457565b005b3480156104f457600080fd5b506104fd611477565b60405161050a919061391f565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613473565b61149d565b005b34801561054857600080fd5b506105516114bf565b60405161055e91906139a8565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190613473565b6114d2565b005b34801561059c57600080fd5b506105a56114f4565b6040516105b29190613b80565b60405180910390f35b3480156105c757600080fd5b506105d06114f9565b005b3480156105de57600080fd5b506105e761152d565b6040516105f49190613b80565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f91906134b4565b611533565b604051610631919061391f565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c919061338c565b611545565b005b34801561066f57600080fd5b50610678611692565b60405161068591906139de565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b091906134b4565b611720565b005b3480156106c357600080fd5b506106cc611732565b005b3480156106da57600080fd5b506106f560048036038101906106f091906131e5565b611766565b6040516107029190613b80565b60405180910390f35b34801561071757600080fd5b5061072061181f565b005b34801561072e57600080fd5b50610749600480360381019061074491906133f8565b611833565b005b34801561075757600080fd5b50610772600480360381019061076d91906131e5565b611845565b005b34801561078057600080fd5b50610789611891565b604051610796919061391f565b60405180910390f35b3480156107ab57600080fd5b506107b46118bb565b6040516107c191906139de565b60405180910390f35b3480156107d657600080fd5b506107f160048036038101906107ec9190613314565b61194d565b005b3480156107ff57600080fd5b5061081a60048036038101906108159190613299565b611ac5565b005b34801561082857600080fd5b50610831611b38565b005b34801561083f57600080fd5b50610848611bc7565b60405161085591906139de565b60405180910390f35b34801561086a57600080fd5b50610885600480360381019061088091906134b4565b611c55565b6040516108929190613986565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd91906134b4565b611d90565b6040516108cf91906139de565b60405180910390f35b6108f260048036038101906108ed91906134dd565b611ec2565b005b34801561090057600080fd5b506109096121ac565b6040516109169190613b80565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190613473565b6121b1565b005b34801561095457600080fd5b5061095d6121d3565b005b34801561096b57600080fd5b506109866004803603810190610981919061320e565b612207565b60405161099391906139a8565b60405180910390f35b3480156109a857600080fd5b506109b161229b565b005b3480156109bf57600080fd5b506109da60048036038101906109d591906131e5565b6122db565b005b3480156109e857600080fd5b506109f161235f565b6040516109fe91906139a8565b60405180910390f35b60116020528060005260406000206000915090505481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a7a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aaa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610ac090613e86565b80601f0160208091040260200160405190810160405280929190818152602001828054610aec90613e86565b8015610b395780601f10610b0e57610100808354040283529160200191610b39565b820191906000526020600020905b815481529060010190602001808311610b1c57829003601f168201915b5050505050905090565b6000610b4e82612372565b610b84576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bca82611533565b90508073ffffffffffffffffffffffffffffffffffffffff16610beb6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614610c4e57610c1781610c126123d1565b612207565b610c4d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600d8054610d0d90613e86565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3990613e86565b8015610d865780601f10610d5b57610100808354040283529160200191610d86565b820191906000526020600020905b815481529060010190602001808311610d6957829003601f168201915b505050505081565b6000610d986123d9565b6001546000540303905090565b6000610db0826123de565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e17576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e23846124ac565b91509150610e398187610e346123d1565b6124ce565b610e8557610e4e86610e496123d1565b612207565b610e84576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610eec576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ef98686866001612512565b8015610f0457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610fd285610fae888887612518565b7c020000000000000000000000000000000000000000000000000000000017612540565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561105a576000600185019050600060046000838152602001908152602001600020541415611058576000548114611057578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110c2868686600161256b565b505050505050565b601060019054906101000a900460ff1681565b60026009541415611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a90613b60565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119090613a80565b60405180910390fd5b601060019054906101000a900460ff166111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df90613ae0565b60405180910390fd5b6000811161122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122290613aa0565b60405180910390fd5b600e5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112799190613d0b565b11156112ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b190613b20565b60405180910390fd5b6107d0816112c6610d8e565b6112d09190613d0b565b1115611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890613b40565b60405180910390fd5b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113609190613d0b565b925050819055506113713382612571565b600160098190555050565b600f5481565b6107d081565b61139061258f565b600260095414156113d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cd90613b60565b60405180910390fd5b60026009819055506000479050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561144b573d6000803e3d6000fd5b50506001600981905550565b61147283838360405180602001604052806000815250611ac5565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114a561258f565b80600c90805190602001906114bb929190612e7e565b5050565b601060029054906101000a900460ff1681565b6114da61258f565b80600b90805190602001906114f0929190612e7e565b5050565b600281565b61150161258f565b601060029054906101000a900460ff1615601060026101000a81548160ff021916908315150217905550565b600e5481565b600061153e826123de565b9050919050565b61154d61258f565b60005b825181101561168d576107d0828281518110611595577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516115a5610d8e565b6115af9190613d0b565b11156115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e790613a20565b60405180910390fd5b61167a83828151811061162c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183838151811061166d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612571565b808061168590613ee9565b915050611550565b505050565b600b805461169f90613e86565b80601f01602080910402602001604051908101604052809291908181526020018280546116cb90613e86565b80156117185780601f106116ed57610100808354040283529160200191611718565b820191906000526020600020905b8154815290600101906020018083116116fb57829003601f168201915b505050505081565b61172861258f565b80600e8190555050565b61173a61258f565b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ce576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61182761258f565b611831600061260d565b565b61183b61258f565b80600f8190555050565b61184d61258f565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118ca90613e86565b80601f01602080910402602001604051908101604052809291908181526020018280546118f690613e86565b80156119435780601f1061191857610100808354040283529160200191611943565b820191906000526020600020905b81548152906001019060200180831161192657829003601f168201915b5050505050905090565b6119556123d1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ba576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119c76123d1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a746123d1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ab991906139a8565b60405180910390a35050565b611ad0848484610da5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b3257611afb848484846126d3565b611b31576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b4061258f565b6107d06032611b4d610d8e565b611b579190613d0b565b1115611b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8f90613b40565b60405180910390fd5b611bc5600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166032612571565b565b600c8054611bd490613e86565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0090613e86565b8015611c4d5780601f10611c2257610100808354040283529160200191611c4d565b820191906000526020600020905b815481529060010190602001808311611c3057829003601f168201915b505050505081565b60606000611c61610d8e565b90506000601467ffffffffffffffff811115611ca6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611cd45781602001602082028036833780820191505090505b5090506000808590505b83811015611d8457611cef86611533565b838381518110611d28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508180611d6d90613ee9565b925050606481611d7d9190613d0b565b9050611cde565b50819350505050919050565b6060611d9b82612372565b611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd190613a40565b60405180910390fd5b601060029054906101000a900460ff16611e8057600c8054611dfb90613e86565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2790613e86565b8015611e745780601f10611e4957610100808354040283529160200191611e74565b820191906000526020600020905b815481529060010190602001808311611e5757829003601f168201915b50505050509050611ebd565b6000611e8a612833565b905080611e96846128c5565b600d604051602001611eaa939291906138ee565b6040516020818303038152906040529150505b919050565b60026009541415611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90613b60565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590613a80565b60405180910390fd5b601060009054906101000a900460ff16611fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc490613a00565b60405180910390fd5b611fd8338383612a72565b612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e90613ac0565b60405180910390fd5b6000831161205a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205190613aa0565b60405180910390fd5b600283601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120a79190613d0b565b11156120e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120df90613b20565b60405180910390fd5b6107d0836120f4610d8e565b6120fe9190613d0b565b111561213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213690613b40565b60405180910390fd5b82601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218e9190613d0b565b9250508190555061219f3384612571565b6001600981905550505050565b603281565b6121b961258f565b80600d90805190602001906121cf929190612e7e565b5050565b6121db61258f565b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122a361258f565b6000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff021916908315150217905550565b6122e361258f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234a90613a60565b60405180910390fd5b61235c8161260d565b50565b601060009054906101000a900460ff1681565b60008161237d6123d9565b1115801561238c575060005482105b80156123ca575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b600080829050806123ed6123d9565b11612475576000548110156124745760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612472575b600081141561246857600460008360019003935083815260200190815260200160002054905061243d565b80925050506124a7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861252f868684612ad0565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61258b828260405180602001604052806000815250612ad9565b5050565b612597612b76565b73ffffffffffffffffffffffffffffffffffffffff166125b5611891565b73ffffffffffffffffffffffffffffffffffffffff161461260b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260290613b00565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126f96123d1565b8786866040518563ffffffff1660e01b815260040161271b949392919061393a565b602060405180830381600087803b15801561273557600080fd5b505af192505050801561276657506040513d601f19601f82011682018060405250810190612763919061344a565b60015b6127e0573d8060008114612796576040519150601f19603f3d011682016040523d82523d6000602084013e61279b565b606091505b506000815114156127d8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b805461284290613e86565b80601f016020809104026020016040519081016040528092919081815260200182805461286e90613e86565b80156128bb5780601f10612890576101008083540402835291602001916128bb565b820191906000526020600020905b81548152906001019060200180831161289e57829003601f168201915b5050505050905090565b6060600082141561290d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a6d565b600082905060005b6000821461293f57808061292890613ee9565b915050600a826129389190613d61565b9150612915565b60008167ffffffffffffffff811115612981577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129b35781602001600182028036833780820191505090505b5090505b60008514612a66576001826129cc9190613d92565b9150600a856129db9190613f56565b60306129e79190613d0b565b60f81b818381518110612a23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a5f9190613d61565b94506129b7565b8093505050505b919050565b6000612ac7612a8085612b7e565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612bae565b90509392505050565b60009392505050565b612ae38383612bc5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b7157600080549050600083820390505b612b2360008683806001019450866126d3565b612b59576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612b10578160005414612b6e57600080fd5b50505b505050565b600033905090565b600081604051602001612b9191906138d3565b604051602081830303815290604052805190602001209050919050565b6000612bbd82600f5485612d99565b905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c32576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612c6d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c7a6000848385612512565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612cf183612ce26000866000612518565b612ceb85612db0565b17612540565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d1557806000819055505050612d94600084838561256b565b505050565b600082612da68584612dc0565b1490509392505050565b60006001821460e11b9050919050565b60008082905060005b8451811015612e3157612e1c82868381518110612e0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612e3c565b91508080612e2990613ee9565b915050612dc9565b508091505092915050565b6000818310612e5457612e4f8284612e67565b612e5f565b612e5e8383612e67565b5b905092915050565b600082600052816020526040600020905092915050565b828054612e8a90613e86565b90600052602060002090601f016020900481019282612eac5760008555612ef3565b82601f10612ec557805160ff1916838001178555612ef3565b82800160010185558215612ef3579182015b82811115612ef2578251825591602001919060010190612ed7565b5b509050612f009190612f04565b5090565b5b80821115612f1d576000816000905550600101612f05565b5090565b6000612f34612f2f84613bc0565b613b9b565b90508083825260208201905082856020860282011115612f5357600080fd5b60005b85811015612f835781612f698882613075565b845260208401935060208301925050600181019050612f56565b5050509392505050565b6000612fa0612f9b84613bec565b613b9b565b90508083825260208201905082856020860282011115612fbf57600080fd5b60005b85811015612fef5781612fd588826131d0565b845260208401935060208301925050600181019050612fc2565b5050509392505050565b600061300c61300784613c18565b613b9b565b90508281526020810184848401111561302457600080fd5b61302f848285613e44565b509392505050565b600061304a61304584613c49565b613b9b565b90508281526020810184848401111561306257600080fd5b61306d848285613e44565b509392505050565b60008135905061308481614273565b92915050565b600082601f83011261309b57600080fd5b81356130ab848260208601612f21565b91505092915050565b60008083601f8401126130c657600080fd5b8235905067ffffffffffffffff8111156130df57600080fd5b6020830191508360208202830111156130f757600080fd5b9250929050565b600082601f83011261310f57600080fd5b813561311f848260208601612f8d565b91505092915050565b6000813590506131378161428a565b92915050565b60008135905061314c816142a1565b92915050565b600081359050613161816142b8565b92915050565b600081519050613176816142b8565b92915050565b600082601f83011261318d57600080fd5b813561319d848260208601612ff9565b91505092915050565b600082601f8301126131b757600080fd5b81356131c7848260208601613037565b91505092915050565b6000813590506131df816142cf565b92915050565b6000602082840312156131f757600080fd5b600061320584828501613075565b91505092915050565b6000806040838503121561322157600080fd5b600061322f85828601613075565b925050602061324085828601613075565b9150509250929050565b60008060006060848603121561325f57600080fd5b600061326d86828701613075565b935050602061327e86828701613075565b925050604061328f868287016131d0565b9150509250925092565b600080600080608085870312156132af57600080fd5b60006132bd87828801613075565b94505060206132ce87828801613075565b93505060406132df878288016131d0565b925050606085013567ffffffffffffffff8111156132fc57600080fd5b6133088782880161317c565b91505092959194509250565b6000806040838503121561332757600080fd5b600061333585828601613075565b925050602061334685828601613128565b9150509250929050565b6000806040838503121561336357600080fd5b600061337185828601613075565b9250506020613382858286016131d0565b9150509250929050565b6000806040838503121561339f57600080fd5b600083013567ffffffffffffffff8111156133b957600080fd5b6133c58582860161308a565b925050602083013567ffffffffffffffff8111156133e257600080fd5b6133ee858286016130fe565b9150509250929050565b60006020828403121561340a57600080fd5b60006134188482850161313d565b91505092915050565b60006020828403121561343357600080fd5b600061344184828501613152565b91505092915050565b60006020828403121561345c57600080fd5b600061346a84828501613167565b91505092915050565b60006020828403121561348557600080fd5b600082013567ffffffffffffffff81111561349f57600080fd5b6134ab848285016131a6565b91505092915050565b6000602082840312156134c657600080fd5b60006134d4848285016131d0565b91505092915050565b6000806000604084860312156134f257600080fd5b6000613500868287016131d0565b935050602084013567ffffffffffffffff81111561351d57600080fd5b613529868287016130b4565b92509250509250925092565b6000613541838361354d565b60208301905092915050565b61355681613dc6565b82525050565b61356581613dc6565b82525050565b61357c61357782613dc6565b613f32565b82525050565b600061358d82613c9f565b6135978185613ccd565b93506135a283613c7a565b8060005b838110156135d35781516135ba8882613535565b97506135c583613cc0565b9250506001810190506135a6565b5085935050505092915050565b6135e981613dd8565b82525050565b6135f881613de4565b82525050565b600061360982613caa565b6136138185613cde565b9350613623818560208601613e53565b61362c81614043565b840191505092915050565b600061364282613cb5565b61364c8185613cef565b935061365c818560208601613e53565b61366581614043565b840191505092915050565b600061367b82613cb5565b6136858185613d00565b9350613695818560208601613e53565b80840191505092915050565b600081546136ae81613e86565b6136b88186613d00565b945060018216600081146136d357600181146136e457613717565b60ff19831686528186019350613717565b6136ed85613c8a565b60005b8381101561370f578154818901526001820191506020810190506136f0565b838801955050505b50505092915050565b600061372d601c83613cef565b915061373882614061565b602082019050919050565b6000613750601383613cef565b915061375b8261408a565b602082019050919050565b6000613773601f83613cef565b915061377e826140b3565b602082019050919050565b6000613796602683613cef565b91506137a1826140dc565b604082019050919050565b60006137b9600f83613cef565b91506137c48261412b565b602082019050919050565b60006137dc601083613cef565b91506137e782614154565b602082019050919050565b60006137ff600f83613cef565b915061380a8261417d565b602082019050919050565b6000613822601983613cef565b915061382d826141a6565b602082019050919050565b6000613845602083613cef565b9150613850826141cf565b602082019050919050565b6000613868601083613cef565b9150613873826141f8565b602082019050919050565b600061388b601283613cef565b915061389682614221565b602082019050919050565b60006138ae601f83613cef565b91506138b98261424a565b602082019050919050565b6138cd81613e3a565b82525050565b60006138df828461356b565b60148201915081905092915050565b60006138fa8286613670565b91506139068285613670565b915061391282846136a1565b9150819050949350505050565b6000602082019050613934600083018461355c565b92915050565b600060808201905061394f600083018761355c565b61395c602083018661355c565b61396960408301856138c4565b818103606083015261397b81846135fe565b905095945050505050565b600060208201905081810360008301526139a08184613582565b905092915050565b60006020820190506139bd60008301846135e0565b92915050565b60006020820190506139d860008301846135ef565b92915050565b600060208201905081810360008301526139f88184613637565b905092915050565b60006020820190508181036000830152613a1981613720565b9050919050565b60006020820190508181036000830152613a3981613743565b9050919050565b60006020820190508181036000830152613a5981613766565b9050919050565b60006020820190508181036000830152613a7981613789565b9050919050565b60006020820190508181036000830152613a99816137ac565b9050919050565b60006020820190508181036000830152613ab9816137cf565b9050919050565b60006020820190508181036000830152613ad9816137f2565b9050919050565b60006020820190508181036000830152613af981613815565b9050919050565b60006020820190508181036000830152613b1981613838565b9050919050565b60006020820190508181036000830152613b398161385b565b9050919050565b60006020820190508181036000830152613b598161387e565b9050919050565b60006020820190508181036000830152613b79816138a1565b9050919050565b6000602082019050613b9560008301846138c4565b92915050565b6000613ba5613bb6565b9050613bb18282613eb8565b919050565b6000604051905090565b600067ffffffffffffffff821115613bdb57613bda614014565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c0757613c06614014565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c3357613c32614014565b5b613c3c82614043565b9050602081019050919050565b600067ffffffffffffffff821115613c6457613c63614014565b5b613c6d82614043565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d1682613e3a565b9150613d2183613e3a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d5657613d55613f87565b5b828201905092915050565b6000613d6c82613e3a565b9150613d7783613e3a565b925082613d8757613d86613fb6565b5b828204905092915050565b6000613d9d82613e3a565b9150613da883613e3a565b925082821015613dbb57613dba613f87565b5b828203905092915050565b6000613dd182613e1a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e71578082015181840152602081019050613e56565b83811115613e80576000848401525b50505050565b60006002820490506001821680613e9e57607f821691505b60208210811415613eb257613eb1613fe5565b5b50919050565b613ec182614043565b810181811067ffffffffffffffff82111715613ee057613edf614014565b5b80604052505050565b6000613ef482613e3a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f2757613f26613f87565b5b600182019050919050565b6000613f3d82613f44565b9050919050565b6000613f4f82614054565b9050919050565b6000613f6182613e3a565b9150613f6c83613e3a565b925082613f7c57613f7b613fb6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f57686974656c697374206d696e74206973206e6f742061637469766500000000600082015250565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f436f6e74726163742044656e6965640000000000000000000000000000000000600082015250565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f5075626c69632073616c65206973206e6f742061637469766500000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d6178206d696e74207265616368656400000000000000000000000000000000600082015250565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61427c81613dc6565b811461428757600080fd5b50565b61429381613dd8565b811461429e57600080fd5b50565b6142aa81613de4565b81146142b557600080fd5b50565b6142c181613dee565b81146142cc57600080fd5b50565b6142d881613e3a565b81146142e357600080fd5b5056fea2646970667358221220118b96750ef6f7fb7df0f1aa3aa454c69ca5c95bfdf8665236f15e64c7f03e7164736f6c63430008040033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0b3df65da8d63f2a04dc8bd3fdd9dd4401e6c661517816ffb247885367b108dba000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d556b736558645050676a576a544e72776e414a4677665268764664527331643154477971766e32555355745a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061027c5760003560e01c80636c0360eb1161014f578063ba7a86b8116100c1578063da3ef23f1161007a578063da3ef23f1461091f578063e222c7f914610948578063e985e9c51461095f578063ee55efee1461099c578063f2fde38b146109b3578063fabd1d2d146109dc5761027c565b8063ba7a86b81461081c578063ba9e12f714610833578063bfe28a4b1461085e578063c87b56dd1461089b578063d2cab056146108d8578063d7f7a742146108f45761027c565b80637cb64759116101135780637cb647591461072257806385535cc51461074b5780638da5cb5b1461077457806395d89b411461079f578063a22cb465146107ca578063b88d4fde146107f35761027c565b80636c0360eb146106635780636dc5f1ce1461068e5780636f63b60a146106b757806370a08231146106ce578063715018a61461070b5761027c565b806332cb6b0c116101f357806355f804b3116101ac57806355f804b31461056757806358941a4d146105905780635b8ad429146105bb57806363172ac1146105d25780636352211e146105fd578063672434821461063a5761027c565b806332cb6b0c1461047d5780633ccfd60b146104a857806342842e0e146104bf578063430bf08a146104e8578063512507c614610513578063518302271461053c5761027c565b80630d34ea58116102455780630d34ea581461038c57806318160ddd146103b757806323b872dd146103e25780632d6b62241461040b5780632db11544146104365780632eb4a7ab146104525761027c565b80623d47901461028157806301ffc9a7146102be57806306fdde03146102fb578063081812fc14610326578063095ea7b314610363575b600080fd5b34801561028d57600080fd5b506102a860048036038101906102a391906131e5565b610a07565b6040516102b59190613b80565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613421565b610a1f565b6040516102f291906139a8565b60405180910390f35b34801561030757600080fd5b50610310610ab1565b60405161031d91906139de565b60405180910390f35b34801561033257600080fd5b5061034d600480360381019061034891906134b4565b610b43565b60405161035a919061391f565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613350565b610bbf565b005b34801561039857600080fd5b506103a1610d00565b6040516103ae91906139de565b60405180910390f35b3480156103c357600080fd5b506103cc610d8e565b6040516103d99190613b80565b60405180910390f35b3480156103ee57600080fd5b506104096004803603810190610404919061324a565b610da5565b005b34801561041757600080fd5b506104206110ca565b60405161042d91906139a8565b60405180910390f35b610450600480360381019061044b91906134b4565b6110dd565b005b34801561045e57600080fd5b5061046761137c565b60405161047491906139c3565b60405180910390f35b34801561048957600080fd5b50610492611382565b60405161049f9190613b80565b60405180910390f35b3480156104b457600080fd5b506104bd611388565b005b3480156104cb57600080fd5b506104e660048036038101906104e1919061324a565b611457565b005b3480156104f457600080fd5b506104fd611477565b60405161050a919061391f565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190613473565b61149d565b005b34801561054857600080fd5b506105516114bf565b60405161055e91906139a8565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190613473565b6114d2565b005b34801561059c57600080fd5b506105a56114f4565b6040516105b29190613b80565b60405180910390f35b3480156105c757600080fd5b506105d06114f9565b005b3480156105de57600080fd5b506105e761152d565b6040516105f49190613b80565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f91906134b4565b611533565b604051610631919061391f565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c919061338c565b611545565b005b34801561066f57600080fd5b50610678611692565b60405161068591906139de565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b091906134b4565b611720565b005b3480156106c357600080fd5b506106cc611732565b005b3480156106da57600080fd5b506106f560048036038101906106f091906131e5565b611766565b6040516107029190613b80565b60405180910390f35b34801561071757600080fd5b5061072061181f565b005b34801561072e57600080fd5b50610749600480360381019061074491906133f8565b611833565b005b34801561075757600080fd5b50610772600480360381019061076d91906131e5565b611845565b005b34801561078057600080fd5b50610789611891565b604051610796919061391f565b60405180910390f35b3480156107ab57600080fd5b506107b46118bb565b6040516107c191906139de565b60405180910390f35b3480156107d657600080fd5b506107f160048036038101906107ec9190613314565b61194d565b005b3480156107ff57600080fd5b5061081a60048036038101906108159190613299565b611ac5565b005b34801561082857600080fd5b50610831611b38565b005b34801561083f57600080fd5b50610848611bc7565b60405161085591906139de565b60405180910390f35b34801561086a57600080fd5b50610885600480360381019061088091906134b4565b611c55565b6040516108929190613986565b60405180910390f35b3480156108a757600080fd5b506108c260048036038101906108bd91906134b4565b611d90565b6040516108cf91906139de565b60405180910390f35b6108f260048036038101906108ed91906134dd565b611ec2565b005b34801561090057600080fd5b506109096121ac565b6040516109169190613b80565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190613473565b6121b1565b005b34801561095457600080fd5b5061095d6121d3565b005b34801561096b57600080fd5b506109866004803603810190610981919061320e565b612207565b60405161099391906139a8565b60405180910390f35b3480156109a857600080fd5b506109b161229b565b005b3480156109bf57600080fd5b506109da60048036038101906109d591906131e5565b6122db565b005b3480156109e857600080fd5b506109f161235f565b6040516109fe91906139a8565b60405180910390f35b60116020528060005260406000206000915090505481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a7a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aaa5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610ac090613e86565b80601f0160208091040260200160405190810160405280929190818152602001828054610aec90613e86565b8015610b395780601f10610b0e57610100808354040283529160200191610b39565b820191906000526020600020905b815481529060010190602001808311610b1c57829003601f168201915b5050505050905090565b6000610b4e82612372565b610b84576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bca82611533565b90508073ffffffffffffffffffffffffffffffffffffffff16610beb6123d1565b73ffffffffffffffffffffffffffffffffffffffff1614610c4e57610c1781610c126123d1565b612207565b610c4d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600d8054610d0d90613e86565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3990613e86565b8015610d865780601f10610d5b57610100808354040283529160200191610d86565b820191906000526020600020905b815481529060010190602001808311610d6957829003601f168201915b505050505081565b6000610d986123d9565b6001546000540303905090565b6000610db0826123de565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e17576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e23846124ac565b91509150610e398187610e346123d1565b6124ce565b610e8557610e4e86610e496123d1565b612207565b610e84576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610eec576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ef98686866001612512565b8015610f0457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610fd285610fae888887612518565b7c020000000000000000000000000000000000000000000000000000000017612540565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561105a576000600185019050600060046000838152602001908152602001600020541415611058576000548114611057578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46110c2868686600161256b565b505050505050565b601060019054906101000a900460ff1681565b60026009541415611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a90613b60565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119090613a80565b60405180910390fd5b601060019054906101000a900460ff166111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df90613ae0565b60405180910390fd5b6000811161122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122290613aa0565b60405180910390fd5b600e5481601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112799190613d0b565b11156112ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b190613b20565b60405180910390fd5b6107d0816112c6610d8e565b6112d09190613d0b565b1115611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890613b40565b60405180910390fd5b80601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113609190613d0b565b925050819055506113713382612571565b600160098190555050565b600f5481565b6107d081565b61139061258f565b600260095414156113d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cd90613b60565b60405180910390fd5b60026009819055506000479050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561144b573d6000803e3d6000fd5b50506001600981905550565b61147283838360405180602001604052806000815250611ac5565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114a561258f565b80600c90805190602001906114bb929190612e7e565b5050565b601060029054906101000a900460ff1681565b6114da61258f565b80600b90805190602001906114f0929190612e7e565b5050565b600281565b61150161258f565b601060029054906101000a900460ff1615601060026101000a81548160ff021916908315150217905550565b600e5481565b600061153e826123de565b9050919050565b61154d61258f565b60005b825181101561168d576107d0828281518110611595577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516115a5610d8e565b6115af9190613d0b565b11156115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e790613a20565b60405180910390fd5b61167a83828151811061162c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183838151811061166d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612571565b808061168590613ee9565b915050611550565b505050565b600b805461169f90613e86565b80601f01602080910402602001604051908101604052809291908181526020018280546116cb90613e86565b80156117185780601f106116ed57610100808354040283529160200191611718565b820191906000526020600020905b8154815290600101906020018083116116fb57829003601f168201915b505050505081565b61172861258f565b80600e8190555050565b61173a61258f565b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ce576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61182761258f565b611831600061260d565b565b61183b61258f565b80600f8190555050565b61184d61258f565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546118ca90613e86565b80601f01602080910402602001604051908101604052809291908181526020018280546118f690613e86565b80156119435780601f1061191857610100808354040283529160200191611943565b820191906000526020600020905b81548152906001019060200180831161192657829003601f168201915b5050505050905090565b6119556123d1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ba576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119c76123d1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a746123d1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ab991906139a8565b60405180910390a35050565b611ad0848484610da5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b3257611afb848484846126d3565b611b31576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b4061258f565b6107d06032611b4d610d8e565b611b579190613d0b565b1115611b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8f90613b40565b60405180910390fd5b611bc5600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166032612571565b565b600c8054611bd490613e86565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0090613e86565b8015611c4d5780601f10611c2257610100808354040283529160200191611c4d565b820191906000526020600020905b815481529060010190602001808311611c3057829003601f168201915b505050505081565b60606000611c61610d8e565b90506000601467ffffffffffffffff811115611ca6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611cd45781602001602082028036833780820191505090505b5090506000808590505b83811015611d8457611cef86611533565b838381518110611d28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508180611d6d90613ee9565b925050606481611d7d9190613d0b565b9050611cde565b50819350505050919050565b6060611d9b82612372565b611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd190613a40565b60405180910390fd5b601060029054906101000a900460ff16611e8057600c8054611dfb90613e86565b80601f0160208091040260200160405190810160405280929190818152602001828054611e2790613e86565b8015611e745780601f10611e4957610100808354040283529160200191611e74565b820191906000526020600020905b815481529060010190602001808311611e5757829003601f168201915b50505050509050611ebd565b6000611e8a612833565b905080611e96846128c5565b600d604051602001611eaa939291906138ee565b6040516020818303038152906040529150505b919050565b60026009541415611f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eff90613b60565b60405180910390fd5b60026009819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7590613a80565b60405180910390fd5b601060009054906101000a900460ff16611fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc490613a00565b60405180910390fd5b611fd8338383612a72565b612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e90613ac0565b60405180910390fd5b6000831161205a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205190613aa0565b60405180910390fd5b600283601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120a79190613d0b565b11156120e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120df90613b20565b60405180910390fd5b6107d0836120f4610d8e565b6120fe9190613d0b565b111561213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213690613b40565b60405180910390fd5b82601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218e9190613d0b565b9250508190555061219f3384612571565b6001600981905550505050565b603281565b6121b961258f565b80600d90805190602001906121cf929190612e7e565b5050565b6121db61258f565b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122a361258f565b6000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff021916908315150217905550565b6122e361258f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234a90613a60565b60405180910390fd5b61235c8161260d565b50565b601060009054906101000a900460ff1681565b60008161237d6123d9565b1115801561238c575060005482105b80156123ca575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b600080829050806123ed6123d9565b11612475576000548110156124745760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612472575b600081141561246857600460008360019003935083815260200190815260200160002054905061243d565b80925050506124a7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861252f868684612ad0565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61258b828260405180602001604052806000815250612ad9565b5050565b612597612b76565b73ffffffffffffffffffffffffffffffffffffffff166125b5611891565b73ffffffffffffffffffffffffffffffffffffffff161461260b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260290613b00565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126f96123d1565b8786866040518563ffffffff1660e01b815260040161271b949392919061393a565b602060405180830381600087803b15801561273557600080fd5b505af192505050801561276657506040513d601f19601f82011682018060405250810190612763919061344a565b60015b6127e0573d8060008114612796576040519150601f19603f3d011682016040523d82523d6000602084013e61279b565b606091505b506000815114156127d8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b805461284290613e86565b80601f016020809104026020016040519081016040528092919081815260200182805461286e90613e86565b80156128bb5780601f10612890576101008083540402835291602001916128bb565b820191906000526020600020905b81548152906001019060200180831161289e57829003601f168201915b5050505050905090565b6060600082141561290d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a6d565b600082905060005b6000821461293f57808061292890613ee9565b915050600a826129389190613d61565b9150612915565b60008167ffffffffffffffff811115612981577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129b35781602001600182028036833780820191505090505b5090505b60008514612a66576001826129cc9190613d92565b9150600a856129db9190613f56565b60306129e79190613d0b565b60f81b818381518110612a23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a5f9190613d61565b94506129b7565b8093505050505b919050565b6000612ac7612a8085612b7e565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612bae565b90509392505050565b60009392505050565b612ae38383612bc5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b7157600080549050600083820390505b612b2360008683806001019450866126d3565b612b59576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612b10578160005414612b6e57600080fd5b50505b505050565b600033905090565b600081604051602001612b9191906138d3565b604051602081830303815290604052805190602001209050919050565b6000612bbd82600f5485612d99565b905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c32576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612c6d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c7a6000848385612512565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612cf183612ce26000866000612518565b612ceb85612db0565b17612540565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d1557806000819055505050612d94600084838561256b565b505050565b600082612da68584612dc0565b1490509392505050565b60006001821460e11b9050919050565b60008082905060005b8451811015612e3157612e1c82868381518110612e0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612e3c565b91508080612e2990613ee9565b915050612dc9565b508091505092915050565b6000818310612e5457612e4f8284612e67565b612e5f565b612e5e8383612e67565b5b905092915050565b600082600052816020526040600020905092915050565b828054612e8a90613e86565b90600052602060002090601f016020900481019282612eac5760008555612ef3565b82601f10612ec557805160ff1916838001178555612ef3565b82800160010185558215612ef3579182015b82811115612ef2578251825591602001919060010190612ed7565b5b509050612f009190612f04565b5090565b5b80821115612f1d576000816000905550600101612f05565b5090565b6000612f34612f2f84613bc0565b613b9b565b90508083825260208201905082856020860282011115612f5357600080fd5b60005b85811015612f835781612f698882613075565b845260208401935060208301925050600181019050612f56565b5050509392505050565b6000612fa0612f9b84613bec565b613b9b565b90508083825260208201905082856020860282011115612fbf57600080fd5b60005b85811015612fef5781612fd588826131d0565b845260208401935060208301925050600181019050612fc2565b5050509392505050565b600061300c61300784613c18565b613b9b565b90508281526020810184848401111561302457600080fd5b61302f848285613e44565b509392505050565b600061304a61304584613c49565b613b9b565b90508281526020810184848401111561306257600080fd5b61306d848285613e44565b509392505050565b60008135905061308481614273565b92915050565b600082601f83011261309b57600080fd5b81356130ab848260208601612f21565b91505092915050565b60008083601f8401126130c657600080fd5b8235905067ffffffffffffffff8111156130df57600080fd5b6020830191508360208202830111156130f757600080fd5b9250929050565b600082601f83011261310f57600080fd5b813561311f848260208601612f8d565b91505092915050565b6000813590506131378161428a565b92915050565b60008135905061314c816142a1565b92915050565b600081359050613161816142b8565b92915050565b600081519050613176816142b8565b92915050565b600082601f83011261318d57600080fd5b813561319d848260208601612ff9565b91505092915050565b600082601f8301126131b757600080fd5b81356131c7848260208601613037565b91505092915050565b6000813590506131df816142cf565b92915050565b6000602082840312156131f757600080fd5b600061320584828501613075565b91505092915050565b6000806040838503121561322157600080fd5b600061322f85828601613075565b925050602061324085828601613075565b9150509250929050565b60008060006060848603121561325f57600080fd5b600061326d86828701613075565b935050602061327e86828701613075565b925050604061328f868287016131d0565b9150509250925092565b600080600080608085870312156132af57600080fd5b60006132bd87828801613075565b94505060206132ce87828801613075565b93505060406132df878288016131d0565b925050606085013567ffffffffffffffff8111156132fc57600080fd5b6133088782880161317c565b91505092959194509250565b6000806040838503121561332757600080fd5b600061333585828601613075565b925050602061334685828601613128565b9150509250929050565b6000806040838503121561336357600080fd5b600061337185828601613075565b9250506020613382858286016131d0565b9150509250929050565b6000806040838503121561339f57600080fd5b600083013567ffffffffffffffff8111156133b957600080fd5b6133c58582860161308a565b925050602083013567ffffffffffffffff8111156133e257600080fd5b6133ee858286016130fe565b9150509250929050565b60006020828403121561340a57600080fd5b60006134188482850161313d565b91505092915050565b60006020828403121561343357600080fd5b600061344184828501613152565b91505092915050565b60006020828403121561345c57600080fd5b600061346a84828501613167565b91505092915050565b60006020828403121561348557600080fd5b600082013567ffffffffffffffff81111561349f57600080fd5b6134ab848285016131a6565b91505092915050565b6000602082840312156134c657600080fd5b60006134d4848285016131d0565b91505092915050565b6000806000604084860312156134f257600080fd5b6000613500868287016131d0565b935050602084013567ffffffffffffffff81111561351d57600080fd5b613529868287016130b4565b92509250509250925092565b6000613541838361354d565b60208301905092915050565b61355681613dc6565b82525050565b61356581613dc6565b82525050565b61357c61357782613dc6565b613f32565b82525050565b600061358d82613c9f565b6135978185613ccd565b93506135a283613c7a565b8060005b838110156135d35781516135ba8882613535565b97506135c583613cc0565b9250506001810190506135a6565b5085935050505092915050565b6135e981613dd8565b82525050565b6135f881613de4565b82525050565b600061360982613caa565b6136138185613cde565b9350613623818560208601613e53565b61362c81614043565b840191505092915050565b600061364282613cb5565b61364c8185613cef565b935061365c818560208601613e53565b61366581614043565b840191505092915050565b600061367b82613cb5565b6136858185613d00565b9350613695818560208601613e53565b80840191505092915050565b600081546136ae81613e86565b6136b88186613d00565b945060018216600081146136d357600181146136e457613717565b60ff19831686528186019350613717565b6136ed85613c8a565b60005b8381101561370f578154818901526001820191506020810190506136f0565b838801955050505b50505092915050565b600061372d601c83613cef565b915061373882614061565b602082019050919050565b6000613750601383613cef565b915061375b8261408a565b602082019050919050565b6000613773601f83613cef565b915061377e826140b3565b602082019050919050565b6000613796602683613cef565b91506137a1826140dc565b604082019050919050565b60006137b9600f83613cef565b91506137c48261412b565b602082019050919050565b60006137dc601083613cef565b91506137e782614154565b602082019050919050565b60006137ff600f83613cef565b915061380a8261417d565b602082019050919050565b6000613822601983613cef565b915061382d826141a6565b602082019050919050565b6000613845602083613cef565b9150613850826141cf565b602082019050919050565b6000613868601083613cef565b9150613873826141f8565b602082019050919050565b600061388b601283613cef565b915061389682614221565b602082019050919050565b60006138ae601f83613cef565b91506138b98261424a565b602082019050919050565b6138cd81613e3a565b82525050565b60006138df828461356b565b60148201915081905092915050565b60006138fa8286613670565b91506139068285613670565b915061391282846136a1565b9150819050949350505050565b6000602082019050613934600083018461355c565b92915050565b600060808201905061394f600083018761355c565b61395c602083018661355c565b61396960408301856138c4565b818103606083015261397b81846135fe565b905095945050505050565b600060208201905081810360008301526139a08184613582565b905092915050565b60006020820190506139bd60008301846135e0565b92915050565b60006020820190506139d860008301846135ef565b92915050565b600060208201905081810360008301526139f88184613637565b905092915050565b60006020820190508181036000830152613a1981613720565b9050919050565b60006020820190508181036000830152613a3981613743565b9050919050565b60006020820190508181036000830152613a5981613766565b9050919050565b60006020820190508181036000830152613a7981613789565b9050919050565b60006020820190508181036000830152613a99816137ac565b9050919050565b60006020820190508181036000830152613ab9816137cf565b9050919050565b60006020820190508181036000830152613ad9816137f2565b9050919050565b60006020820190508181036000830152613af981613815565b9050919050565b60006020820190508181036000830152613b1981613838565b9050919050565b60006020820190508181036000830152613b398161385b565b9050919050565b60006020820190508181036000830152613b598161387e565b9050919050565b60006020820190508181036000830152613b79816138a1565b9050919050565b6000602082019050613b9560008301846138c4565b92915050565b6000613ba5613bb6565b9050613bb18282613eb8565b919050565b6000604051905090565b600067ffffffffffffffff821115613bdb57613bda614014565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c0757613c06614014565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613c3357613c32614014565b5b613c3c82614043565b9050602081019050919050565b600067ffffffffffffffff821115613c6457613c63614014565b5b613c6d82614043565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d1682613e3a565b9150613d2183613e3a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d5657613d55613f87565b5b828201905092915050565b6000613d6c82613e3a565b9150613d7783613e3a565b925082613d8757613d86613fb6565b5b828204905092915050565b6000613d9d82613e3a565b9150613da883613e3a565b925082821015613dbb57613dba613f87565b5b828203905092915050565b6000613dd182613e1a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e71578082015181840152602081019050613e56565b83811115613e80576000848401525b50505050565b60006002820490506001821680613e9e57607f821691505b60208210811415613eb257613eb1613fe5565b5b50919050565b613ec182614043565b810181811067ffffffffffffffff82111715613ee057613edf614014565b5b80604052505050565b6000613ef482613e3a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f2757613f26613f87565b5b600182019050919050565b6000613f3d82613f44565b9050919050565b6000613f4f82614054565b9050919050565b6000613f6182613e3a565b9150613f6c83613e3a565b925082613f7c57613f7b613fb6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f57686974656c697374206d696e74206973206e6f742061637469766500000000600082015250565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f436f6e74726163742044656e6965640000000000000000000000000000000000600082015250565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f5075626c69632073616c65206973206e6f742061637469766500000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d6178206d696e74207265616368656400000000000000000000000000000000600082015250565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61427c81613dc6565b811461428757600080fd5b50565b61429381613dd8565b811461429e57600080fd5b50565b6142aa81613de4565b81146142b557600080fd5b50565b6142c181613dee565b81146142cc57600080fd5b50565b6142d881613e3a565b81146142e357600080fd5b5056fea2646970667358221220118b96750ef6f7fb7df0f1aa3aa454c69ca5c95bfdf8665236f15e64c7f03e7164736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0b3df65da8d63f2a04dc8bd3fdd9dd4401e6c661517816ffb247885367b108dba000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d556b736558645050676a576a544e72776e414a4677665268764664527331643154477971766e32555355745a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _hiddenMetadataURI (string): https://gateway.pinata.cloud/ipfs/QmUkseXdPPgjWjTNrwnAJFwfRhvFdRs1d1TGyqvn2USUtZ
Arg [1] : _initBaseURI (string):
Arg [2] : _merkleRoot (bytes32): 0xb3df65da8d63f2a04dc8bd3fdd9dd4401e6c661517816ffb247885367b108dba
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : b3df65da8d63f2a04dc8bd3fdd9dd4401e6c661517816ffb247885367b108dba
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [4] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [5] : 732f516d556b736558645050676a576a544e72776e414a467766526876466452
Arg [6] : 7331643154477971766e32555355745a00000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
335:6240:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;930:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5653:607:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11161:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13048:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12611:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;538:40:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4736:309:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22055:2739;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;851:38:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1584:538;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;772:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;585:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5678:157;;;;;;;;;;;;;:::i;:::-;;13912:179:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;430:27:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4090:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;895:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3990:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;679:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4853:80;;;;;;;;;;;;;:::i;:::-;;731:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10957:142:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4977:359:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;464:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5342:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4496:113;;;;;;;;;;;;;:::i;:::-;;6319:221:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;2985:104:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1306:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1201:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11323:102:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13315:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14157:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5462:210:5;;;;;;;;;;;;;:::i;:::-;;496:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5841:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3431:553;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2145:648;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;632:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4322:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4615:104;;;;;;;;;;;;;:::i;:::-;;13684:162:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4725:122:5;;;;;;;;;;;;;:::i;:::-;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;804:41:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;930:46;;;;;;;;;;;;;;;;;:::o;5653:607:6:-;5738:4;6048:10;6033:25;;:11;:25;;;;:101;;;;6124:10;6109:25;;:11;:25;;;;6033:101;:177;;;;6200:10;6185:25;;:11;:25;;;;6033:177;6014:196;;5653:607;;;:::o;11161:98::-;11215:13;11247:5;11240:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11161:98;:::o;13048:200::-;13116:7;13140:16;13148:7;13140;:16::i;:::-;13135:64;;13165:34;;;;;;;;;;;;;;13135:64;13217:15;:24;13233:7;13217:24;;;;;;;;;;;;;;;;;;;;;13210:31;;13048:200;;;:::o;12611:376::-;12683:13;12699:16;12707:7;12699;:16::i;:::-;12683:32;;12753:5;12730:28;;:19;:17;:19::i;:::-;:28;;;12726:172;;12777:44;12794:5;12801:19;:17;:19::i;:::-;12777:16;:44::i;:::-;12772:126;;12848:35;;;;;;;;;;;;;;12772:126;12726:172;12935:2;12908:15;:24;12924:7;12908:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12972:7;12968:2;12952:28;;12961:5;12952:28;;;;;;;;;;;;12611:376;;;:::o;538:40:5:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4736:309:6:-;4789:7;5013:15;:13;:15::i;:::-;4998:12;;4982:13;;:28;:46;4975:53;;4736:309;:::o;22055:2739::-;22184:27;22214;22233:7;22214:18;:27::i;:::-;22184:57;;22297:4;22256:45;;22272:19;22256:45;;;22252:86;;22310:28;;;;;;;;;;;;;;22252:86;22350:27;22379:23;22406:28;22426:7;22406:19;:28::i;:::-;22349:85;;;;22531:62;22550:15;22567:4;22573:19;:17;:19::i;:::-;22531:18;:62::i;:::-;22526:173;;22612:43;22629:4;22635:19;:17;:19::i;:::-;22612:16;:43::i;:::-;22607:92;;22664:35;;;;;;;;;;;;;;22607:92;22526:173;22728:1;22714:16;;:2;:16;;;22710:52;;;22739:23;;;;;;;;;;;;;;22710:52;22773:43;22795:4;22801:2;22805:7;22814:1;22773:21;:43::i;:::-;22905:15;22902:2;;;23043:1;23022:19;23015:30;22902:2;23429:18;:24;23448:4;23429:24;;;;;;;;;;;;;;;;23427:26;;;;;;;;;;;;23497:18;:22;23516:2;23497:22;;;;;;;;;;;;;;;;23495:24;;;;;;;;;;;23812:142;23848:2;23895:45;23910:4;23916:2;23920:19;23895:14;:45::i;:::-;2046:8;23868:72;23812:18;:142::i;:::-;23783:17;:26;23801:7;23783:26;;;;;;;;;;;:171;;;;24121:1;2046:8;24071:19;:46;:51;24067:616;;;24142:19;24174:1;24164:7;:11;24142:33;;24329:1;24295:17;:30;24313:11;24295:30;;;;;;;;;;;;:35;24291:378;;;24431:13;;24416:11;:28;24412:239;;24609:19;24576:17;:30;24594:11;24576:30;;;;;;;;;;;:52;;;;24412:239;24291:378;24067:616;;24727:7;24723:2;24708:27;;24717:4;24708:27;;;;;;;;;;;;24745:42;24766:4;24772:2;24776:7;24785:1;24745:20;:42::i;:::-;22055:2739;;;;;;:::o;851:38:5:-;;;;;;;;;;;;;:::o;1584:538::-;1744:1:1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1530:10:5::1;1517:23;;:9;:23;;;1509:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;1720:18:::2;;;;;;;;;;;1712:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;1798:1;1786:9;:13;1778:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;1890:15;;1877:9;1851:11;:23;1863:10;1851:23;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:54;;1830:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;622:4;1981:9;1965:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;1957:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:9;2037:11;:23;2049:10;2037:23;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;2083:32;2093:10;2105:9;2083;:32::i;:::-;1701:1:1::0;2628:7;:22;;;;1584:538:5;:::o;772:25::-;;;;:::o;585:41::-;622:4;585:41;:::o;5678:157::-;1094:13:0;:11;:13::i;:::-;1744:1:1::1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;5740:15:5::2;5758:21;5740:39;;5797:12;;;;;;;;;;;5789:30;;:39;5820:7;5789:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;2484:1:1;1701::::1;2628:7;:22;;;;5678:157:5:o:0;13912:179:6:-;14045:39;14062:4;14068:2;14072:7;14045:39;;;;;;;;;;;;:16;:39::i;:::-;13912:179;;;:::o;430:27:5:-;;;;;;;;;;;;;:::o;4090:114::-;1094:13:0;:11;:13::i;:::-;4190:7:5::1;4170:17;:27;;;;;;;;;;;;:::i;:::-;;4090:114:::0;:::o;895:28::-;;;;;;;;;;;;;:::o;3990:94::-;1094:13:0;:11;:13::i;:::-;4070:7:5::1;4060;:17;;;;;;;;;;;;:::i;:::-;;3990:94:::0;:::o;679:46::-;724:1;679:46;:::o;4853:80::-;1094:13:0;:11;:13::i;:::-;4918:8:5::1;;;;;;;;;;;4917:9;4906:8;;:20;;;;;;;;;;;;;;;;;;4853:80::o:0;731:34::-;;;;:::o;10957:142:6:-;11021:7;11063:27;11082:7;11063:18;:27::i;:::-;11040:52;;10957:142;;;:::o;4977:359:5:-;1094:13:0;:11;:13::i;:::-;5100:9:5::1;5095:235;5119:5;:12;5115:1;:16;5095:235;;;622:4;5193:9;5203:1;5193:12;;;;;;;;;;;;;;;;;;;;;;5177:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:42;;5152:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;5286:33;5296:5;5302:1;5296:8;;;;;;;;;;;;;;;;;;;;;;5306:9;5316:1;5306:12;;;;;;;;;;;;;;;;;;;;;;5286:9;:33::i;:::-;5133:3;;;;;:::i;:::-;;;;5095:235;;;;4977:359:::0;;:::o;464:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5342:114::-;1094:13:0;:11;:13::i;:::-;5437:12:5::1;5419:15;:30;;;;5342:114:::0;:::o;4496:113::-;1094:13:0;:11;:13::i;:::-;4581:21:5::1;;;;;;;;;;;4580:22;4556:21;;:46;;;;;;;;;;;;;;;;;;4496:113::o:0;6319:221:6:-;6383:7;6423:1;6406:19;;:5;:19;;;6402:60;;;6434:28;;;;;;;;;;;;;;6402:60;1022:13;6479:18;:25;6498:5;6479:25;;;;;;;;;;;;;;;;:54;6472:61;;6319:221;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;2985:104:5:-;1094:13:0;:11;:13::i;:::-;3071:11:5::1;3058:10;:24;;;;2985:104:::0;:::o;1306:110::-;1094:13:0;:11;:13::i;:::-;1396::5::1;1381:12;;:28;;;;;;;;;;;;;;;;;;1306:110:::0;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;11323:102:6:-;11379:13;11411:7;11404:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11323:102;:::o;13315:303::-;13425:19;:17;:19::i;:::-;13413:31;;:8;:31;;;13409:61;;;13453:17;;;;;;;;;;;;;;13409:61;13533:8;13481:18;:39;13500:19;:17;:19::i;:::-;13481:39;;;;;;;;;;;;;;;:49;13521:8;13481:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;13592:8;13556:55;;13571:19;:17;:19::i;:::-;13556:55;;;13602:8;13556:55;;;;;;:::i;:::-;;;;;;;;13315:303;;:::o;14157:388::-;14318:31;14331:4;14337:2;14341:7;14318:12;:31::i;:::-;14381:1;14363:2;:14;;;:19;14359:180;;14401:56;14432:4;14438:2;14442:7;14451:5;14401:30;:56::i;:::-;14396:143;;14484:40;;;;;;;;;;;;;;14396:143;14359:180;14157:388;;;;:::o;5462:210:5:-;1094:13:0;:11;:13::i;:::-;622:4:5::1;671:2;5532:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:42;;5511:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;5628:37;5638:12;;;;;;;;;;;671:2;5628:9;:37::i;:::-;5462:210::o:0;496:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5841:385::-;5931:16;5963:11;5977:13;:11;:13::i;:::-;5963:27;;6000;6044:2;6030:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6000:47;;6057:9;6081;6093:6;6081:18;;6076:117;6105:3;6101:1;:7;6076:117;;;6150:15;6158:6;6150:7;:15::i;:::-;6134:10;6145:1;6134:13;;;;;;;;;;;;;;;;;;;;;:31;;;;;;;;;;;6179:3;;;;;:::i;:::-;;;;6115;6110:8;;;;;:::i;:::-;;;6076:117;;;;6209:10;6202:17;;;;;5841:385;;;:::o;3431:553::-;3545:13;3582:17;3590:8;3582:7;:17::i;:::-;3574:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3651:8;;;;;;;;;;;3646:64;;3682:17;3675:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:64;3720:28;3751:10;:8;:10::i;:::-;3720:41;;3852:14;3888:19;:8;:17;:19::i;:::-;3929:16;3814:149;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3771:206;;;3431:553;;;;:::o;2145:648::-;1744:1:1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1530:10:5::1;1517:23;;:9;:23;;;1509:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;2311:21:::2;;;;;;;;;;;2303:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2383:33;2397:10;2409:6;;2383:13;:33::i;:::-;2375:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;2466:1;2454:9;:13;2446:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;724:1;2545:9;2519:11;:23;2531:10;2519:23;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:57;;2498:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;622:4;2652:9;2636:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;2628:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;2735:9;2708:11;:23;2720:10;2708:23;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;2754:32;2764:10;2776:9;2754;:32::i;:::-;1701:1:1::0;2628:7;:22;;;;2145:648:5;;;:::o;632:41::-;671:2;632:41;:::o;4322:155::-;1094:13:0;:11;:13::i;:::-;4450:20:5::1;4431:16;:39;;;;;;;;;;;;:::i;:::-;;4322:155:::0;:::o;4615:104::-;1094:13:0;:11;:13::i;:::-;4694:18:5::1;;;;;;;;;;;4693:19;4672:18;;:40;;;;;;;;;;;;;;;;;;4615:104::o:0;13684:162:6:-;13781:4;13804:18;:25;13823:5;13804:25;;;;;;;;;;;;;;;:35;13830:8;13804:35;;;;;;;;;;;;;;;;;;;;;;;;;13797:42;;13684:162;;;;:::o;4725:122:5:-;1094:13:0;:11;:13::i;:::-;4799:5:5::1;4775:21;;:29;;;;;;;;;;;;;;;;;;4835:5;4814:18;;:26;;;;;;;;;;;;;;;;;;4725:122::o:0;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;;;2161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;804:41:5:-;;;;;;;;;;;;;:::o;14791:268:6:-;14848:4;14902:7;14883:15;:13;:15::i;:::-;:26;;:65;;;;;14935:13;;14925:7;:23;14883:65;:150;;;;;15032:1;1774:8;14985:17;:26;15003:7;14985:26;;;;;;;;;;;;:43;:48;14883:150;14864:169;;14791:268;;;:::o;32874:103::-;32934:7;32960:10;32953:17;;32874:103;:::o;4276:90::-;4332:7;4276:90;:::o;7949:1105::-;8016:7;8035:12;8050:7;8035:22;;8115:4;8096:15;:13;:15::i;:::-;:23;8092:898;;8148:13;;8141:4;:20;8137:853;;;8185:14;8202:17;:23;8220:4;8202:23;;;;;;;;;;;;8185:40;;8316:1;1774:8;8289:6;:23;:28;8285:687;;;8800:111;8817:1;8807:6;:11;8800:111;;;8859:17;:25;8877:6;;;;;;;8859:25;;;;;;;;;;;;8850:34;;8800:111;;;8943:6;8936:13;;;;;;8285:687;8137:853;;8092:898;9016:31;;;;;;;;;;;;;;7949:1105;;;;:::o;20436:637::-;20528:27;20557:23;20596:53;20652:15;20596:71;;20834:7;20828:4;20821:21;20868:22;20862:4;20855:36;20943:4;20937;20927:21;20904:44;;21037:19;21031:26;21012:45;;20774:293;;;;:::o;21181:632::-;21319:11;21478:15;21472:4;21468:26;21460:34;;21635:15;21624:9;21620:31;21607:44;;21780:15;21769:9;21766:30;21759:4;21748:9;21745:19;21742:55;21732:65;;21351:456;;;;;:::o;31742:154::-;;;;;:::o;30099:302::-;30230:7;30249:16;2166:3;30275:19;:40;;30249:67;;2166:3;30341:31;30352:4;30358:2;30362:9;30341:10;:31::i;:::-;30333:40;;:61;;30326:68;;;30099:302;;;;;:::o;10460:440::-;10540:14;10705:15;10698:5;10694:27;10685:36;;10877:5;10863:11;10839:22;10835:40;10832:51;10825:5;10822:62;10812:72;;10575:319;;;;:::o;32537:153::-;;;;;:::o;15138:102::-;15206:27;15216:2;15220:8;15206:27;;;;;;;;;;;;:9;:27::i;:::-;15138:102;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;2433:187::-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2433:187;;:::o;28649:697:6:-;28807:4;28852:2;28827:45;;;28873:19;:17;:19::i;:::-;28894:4;28900:7;28909:5;28827:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28823:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29122:1;29105:6;:13;:18;29101:229;;;29150:40;;;;;;;;;;;;;;29101:229;29290:6;29284:13;29275:6;29271:2;29267:15;29260:38;28823:517;28993:54;;;28983:64;;;:6;:64;;;;28976:71;;;28649:697;;;;;;:::o;4210:106:5:-;4270:13;4302:7;4295:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4210:106;:::o;392:703:3:-;448:13;674:1;665:5;:10;661:51;;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;2799:180:5:-;2914:4;2941:31;2949:14;2954:8;2949:4;:14::i;:::-;2965:6;;2941:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:31::i;:::-;2934:38;;2799:180;;;;;:::o;30961:143:6:-;31094:6;30961:143;;;;;:::o;15641:661::-;15759:19;15765:2;15769:8;15759:5;:19::i;:::-;15835:1;15817:2;:14;;;:19;15813:473;;15856:11;15870:13;;15856:27;;15901:13;15923:8;15917:3;:14;15901:30;;15949:229;15979:62;16018:1;16022:2;16026:7;;;;;;16035:5;15979:30;:62::i;:::-;15974:165;;16076:40;;;;;;;;;;;;;;15974:165;16173:3;16165:5;:11;15949:229;;16258:3;16241:13;;:20;16237:34;;16263:8;;;16237:34;15813:473;;;15641:661;;;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;3095:125:5:-;3150:7;3203:8;3186:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;3176:37;;;;;;3169:44;;3095:125;;;:::o;3226:183::-;3330:4;3357:45;3376:6;3384:10;;3396:5;3357:18;:45::i;:::-;3350:52;;3226:183;;;;:::o;16563:1492:6:-;16627:20;16650:13;;16627:36;;16691:1;16677:16;;:2;:16;;;16673:48;;;16702:19;;;;;;;;;;;;;;16673:48;16747:1;16735:8;:13;16731:44;;;16757:18;;;;;;;;;;;;;;16731:44;16786:61;16816:1;16820:2;16824:12;16838:8;16786:21;:61::i;:::-;17318:1;1156:2;17289:1;:25;;17288:31;17276:8;:44;17250:18;:22;17269:2;17250:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;17590:136;17626:2;17679:33;17702:1;17706:2;17710:1;17679:14;:33::i;:::-;17646:30;17667:8;17646:20;:30::i;:::-;:66;17590:18;:136::i;:::-;17556:17;:31;17574:12;17556:31;;;;;;;;;;;:170;;;;17741:15;17759:12;17741:30;;17785:11;17814:8;17799:12;:23;17785:37;;17836:99;17887:9;;;;;;17883:2;17862:35;;17879:1;17862:35;;;;;;;;;;;;17930:3;17920:7;:13;17836:99;;17965:3;17949:13;:19;;;;16563:1492;;17988:60;18017:1;18021:2;18025:12;18039:8;17988:20;:60::i;:::-;16563:1492;;;:::o;1153:184:4:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;1290:40;;1153:184;;;;;:::o;12238:316:6:-;12308:14;12535:1;12525:8;12522:15;12497:23;12493:45;12483:55;;12408:140;;;:::o;1991:290:4:-;2074:7;2093:20;2116:4;2093:27;;2135:9;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;;;;;;;;;;;;;;;2202:9;:33::i;:::-;2187:48;;2168:3;;;;;:::i;:::-;;;;2130:116;;;;2262:12;2255:19;;;1991:290;;;;:::o;8054:147::-;8117:7;8147:1;8143;:5;:51;;8174:20;8189:1;8192;8174:14;:20::i;:::-;8143:51;;;8151:20;8166:1;8169;8151:14;:20::i;:::-;8143:51;8136:58;;8054:147;;;;:::o;8207:261::-;8275:13;8379:1;8373:4;8366:15;8407:1;8401:4;8394:15;8447:4;8441;8431:21;8422:30;;8352:110;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:8:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;702:655::-;798:5;823:81;839:64;896:6;839:64;:::i;:::-;823:81;:::i;:::-;814:90;;924:5;953:6;946:5;939:21;987:4;980:5;976:16;969:23;;1013:6;1063:3;1055:4;1047:6;1043:17;1038:3;1034:27;1031:36;1028:2;;;1092:1;1089;1082:12;1028:2;1128:1;1113:238;1138:6;1135:1;1132:13;1113:238;;;1206:3;1235:37;1268:3;1256:10;1235:37;:::i;:::-;1230:3;1223:50;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1173:178;1160:1;1157;1153:9;1148:14;;1113:238;;;1117:14;804:553;;;;;;;:::o;1363:343::-;1440:5;1465:65;1481:48;1522:6;1481:48;:::i;:::-;1465:65;:::i;:::-;1456:74;;1553:6;1546:5;1539:21;1591:4;1584:5;1580:16;1629:3;1620:6;1615:3;1611:16;1608:25;1605:2;;;1646:1;1643;1636:12;1605:2;1659:41;1693:6;1688:3;1683;1659:41;:::i;:::-;1446:260;;;;;;:::o;1712:345::-;1790:5;1815:66;1831:49;1873:6;1831:49;:::i;:::-;1815:66;:::i;:::-;1806:75;;1904:6;1897:5;1890:21;1942:4;1935:5;1931:16;1980:3;1971:6;1966:3;1962:16;1959:25;1956:2;;;1997:1;1994;1987:12;1956:2;2010:41;2044:6;2039:3;2034;2010:41;:::i;:::-;1796:261;;;;;;:::o;2063:139::-;2109:5;2147:6;2134:20;2125:29;;2163:33;2190:5;2163:33;:::i;:::-;2115:87;;;;:::o;2225:303::-;2296:5;2345:3;2338:4;2330:6;2326:17;2322:27;2312:2;;2363:1;2360;2353:12;2312:2;2403:6;2390:20;2428:94;2518:3;2510:6;2503:4;2495:6;2491:17;2428:94;:::i;:::-;2419:103;;2302:226;;;;;:::o;2551:367::-;2624:8;2634:6;2684:3;2677:4;2669:6;2665:17;2661:27;2651:2;;2702:1;2699;2692:12;2651:2;2738:6;2725:20;2715:30;;2768:18;2760:6;2757:30;2754:2;;;2800:1;2797;2790:12;2754:2;2837:4;2829:6;2825:17;2813:29;;2891:3;2883:4;2875:6;2871:17;2861:8;2857:32;2854:41;2851:2;;;2908:1;2905;2898:12;2851:2;2641:277;;;;;:::o;2941:303::-;3012:5;3061:3;3054:4;3046:6;3042:17;3038:27;3028:2;;3079:1;3076;3069:12;3028:2;3119:6;3106:20;3144:94;3234:3;3226:6;3219:4;3211:6;3207:17;3144:94;:::i;:::-;3135:103;;3018:226;;;;;:::o;3250:133::-;3293:5;3331:6;3318:20;3309:29;;3347:30;3371:5;3347:30;:::i;:::-;3299:84;;;;:::o;3389:139::-;3435:5;3473:6;3460:20;3451:29;;3489:33;3516:5;3489:33;:::i;:::-;3441:87;;;;:::o;3534:137::-;3579:5;3617:6;3604:20;3595:29;;3633:32;3659:5;3633:32;:::i;:::-;3585:86;;;;:::o;3677:141::-;3733:5;3764:6;3758:13;3749:22;;3780:32;3806:5;3780:32;:::i;:::-;3739:79;;;;:::o;3837:271::-;3892:5;3941:3;3934:4;3926:6;3922:17;3918:27;3908:2;;3959:1;3956;3949:12;3908:2;3999:6;3986:20;4024:78;4098:3;4090:6;4083:4;4075:6;4071:17;4024:78;:::i;:::-;4015:87;;3898:210;;;;;:::o;4128:273::-;4184:5;4233:3;4226:4;4218:6;4214:17;4210:27;4200:2;;4251:1;4248;4241:12;4200:2;4291:6;4278:20;4316:79;4391:3;4383:6;4376:4;4368:6;4364:17;4316:79;:::i;:::-;4307:88;;4190:211;;;;;:::o;4407:139::-;4453:5;4491:6;4478:20;4469:29;;4507:33;4534:5;4507:33;:::i;:::-;4459:87;;;;:::o;4552:262::-;4611:6;4660:2;4648:9;4639:7;4635:23;4631:32;4628:2;;;4676:1;4673;4666:12;4628:2;4719:1;4744:53;4789:7;4780:6;4769:9;4765:22;4744:53;:::i;:::-;4734:63;;4690:117;4618:196;;;;:::o;4820:407::-;4888:6;4896;4945:2;4933:9;4924:7;4920:23;4916:32;4913:2;;;4961:1;4958;4951:12;4913:2;5004:1;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4975:117;5131:2;5157:53;5202:7;5193:6;5182:9;5178:22;5157:53;:::i;:::-;5147:63;;5102:118;4903:324;;;;;:::o;5233:552::-;5310:6;5318;5326;5375:2;5363:9;5354:7;5350:23;5346:32;5343:2;;;5391:1;5388;5381:12;5343:2;5434:1;5459:53;5504:7;5495:6;5484:9;5480:22;5459:53;:::i;:::-;5449:63;;5405:117;5561:2;5587:53;5632:7;5623:6;5612:9;5608:22;5587:53;:::i;:::-;5577:63;;5532:118;5689:2;5715:53;5760:7;5751:6;5740:9;5736:22;5715:53;:::i;:::-;5705:63;;5660:118;5333:452;;;;;:::o;5791:809::-;5886:6;5894;5902;5910;5959:3;5947:9;5938:7;5934:23;5930:33;5927:2;;;5976:1;5973;5966:12;5927:2;6019:1;6044:53;6089:7;6080:6;6069:9;6065:22;6044:53;:::i;:::-;6034:63;;5990:117;6146:2;6172:53;6217:7;6208:6;6197:9;6193:22;6172:53;:::i;:::-;6162:63;;6117:118;6274:2;6300:53;6345:7;6336:6;6325:9;6321:22;6300:53;:::i;:::-;6290:63;;6245:118;6430:2;6419:9;6415:18;6402:32;6461:18;6453:6;6450:30;6447:2;;;6493:1;6490;6483:12;6447:2;6521:62;6575:7;6566:6;6555:9;6551:22;6521:62;:::i;:::-;6511:72;;6373:220;5917:683;;;;;;;:::o;6606:401::-;6671:6;6679;6728:2;6716:9;6707:7;6703:23;6699:32;6696:2;;;6744:1;6741;6734:12;6696:2;6787:1;6812:53;6857:7;6848:6;6837:9;6833:22;6812:53;:::i;:::-;6802:63;;6758:117;6914:2;6940:50;6982:7;6973:6;6962:9;6958:22;6940:50;:::i;:::-;6930:60;;6885:115;6686:321;;;;;:::o;7013:407::-;7081:6;7089;7138:2;7126:9;7117:7;7113:23;7109:32;7106:2;;;7154:1;7151;7144:12;7106:2;7197:1;7222:53;7267:7;7258:6;7247:9;7243:22;7222:53;:::i;:::-;7212:63;;7168:117;7324:2;7350:53;7395:7;7386:6;7375:9;7371:22;7350:53;:::i;:::-;7340:63;;7295:118;7096:324;;;;;:::o;7426:693::-;7544:6;7552;7601:2;7589:9;7580:7;7576:23;7572:32;7569:2;;;7617:1;7614;7607:12;7569:2;7688:1;7677:9;7673:17;7660:31;7718:18;7710:6;7707:30;7704:2;;;7750:1;7747;7740:12;7704:2;7778:78;7848:7;7839:6;7828:9;7824:22;7778:78;:::i;:::-;7768:88;;7631:235;7933:2;7922:9;7918:18;7905:32;7964:18;7956:6;7953:30;7950:2;;;7996:1;7993;7986:12;7950:2;8024:78;8094:7;8085:6;8074:9;8070:22;8024:78;:::i;:::-;8014:88;;7876:236;7559:560;;;;;:::o;8125:262::-;8184:6;8233:2;8221:9;8212:7;8208:23;8204:32;8201:2;;;8249:1;8246;8239:12;8201:2;8292:1;8317:53;8362:7;8353:6;8342:9;8338:22;8317:53;:::i;:::-;8307:63;;8263:117;8191:196;;;;:::o;8393:260::-;8451:6;8500:2;8488:9;8479:7;8475:23;8471:32;8468:2;;;8516:1;8513;8506:12;8468:2;8559:1;8584:52;8628:7;8619:6;8608:9;8604:22;8584:52;:::i;:::-;8574:62;;8530:116;8458:195;;;;:::o;8659:282::-;8728:6;8777:2;8765:9;8756:7;8752:23;8748:32;8745:2;;;8793:1;8790;8783:12;8745:2;8836:1;8861:63;8916:7;8907:6;8896:9;8892:22;8861:63;:::i;:::-;8851:73;;8807:127;8735:206;;;;:::o;8947:375::-;9016:6;9065:2;9053:9;9044:7;9040:23;9036:32;9033:2;;;9081:1;9078;9071:12;9033:2;9152:1;9141:9;9137:17;9124:31;9182:18;9174:6;9171:30;9168:2;;;9214:1;9211;9204:12;9168:2;9242:63;9297:7;9288:6;9277:9;9273:22;9242:63;:::i;:::-;9232:73;;9095:220;9023:299;;;;:::o;9328:262::-;9387:6;9436:2;9424:9;9415:7;9411:23;9407:32;9404:2;;;9452:1;9449;9442:12;9404:2;9495:1;9520:53;9565:7;9556:6;9545:9;9541:22;9520:53;:::i;:::-;9510:63;;9466:117;9394:196;;;;:::o;9596:570::-;9691:6;9699;9707;9756:2;9744:9;9735:7;9731:23;9727:32;9724:2;;;9772:1;9769;9762:12;9724:2;9815:1;9840:53;9885:7;9876:6;9865:9;9861:22;9840:53;:::i;:::-;9830:63;;9786:117;9970:2;9959:9;9955:18;9942:32;10001:18;9993:6;9990:30;9987:2;;;10033:1;10030;10023:12;9987:2;10069:80;10141:7;10132:6;10121:9;10117:22;10069:80;:::i;:::-;10051:98;;;;9913:246;9714:452;;;;;:::o;10172:179::-;10241:10;10262:46;10304:3;10296:6;10262:46;:::i;:::-;10340:4;10335:3;10331:14;10317:28;;10252:99;;;;:::o;10357:108::-;10434:24;10452:5;10434:24;:::i;:::-;10429:3;10422:37;10412:53;;:::o;10471:118::-;10558:24;10576:5;10558:24;:::i;:::-;10553:3;10546:37;10536:53;;:::o;10595:157::-;10700:45;10720:24;10738:5;10720:24;:::i;:::-;10700:45;:::i;:::-;10695:3;10688:58;10678:74;;:::o;10788:732::-;10907:3;10936:54;10984:5;10936:54;:::i;:::-;11006:86;11085:6;11080:3;11006:86;:::i;:::-;10999:93;;11116:56;11166:5;11116:56;:::i;:::-;11195:7;11226:1;11211:284;11236:6;11233:1;11230:13;11211:284;;;11312:6;11306:13;11339:63;11398:3;11383:13;11339:63;:::i;:::-;11332:70;;11425:60;11478:6;11425:60;:::i;:::-;11415:70;;11271:224;11258:1;11255;11251:9;11246:14;;11211:284;;;11215:14;11511:3;11504:10;;10912:608;;;;;;;:::o;11526:109::-;11607:21;11622:5;11607:21;:::i;:::-;11602:3;11595:34;11585:50;;:::o;11641:118::-;11728:24;11746:5;11728:24;:::i;:::-;11723:3;11716:37;11706:53;;:::o;11765:360::-;11851:3;11879:38;11911:5;11879:38;:::i;:::-;11933:70;11996:6;11991:3;11933:70;:::i;:::-;11926:77;;12012:52;12057:6;12052:3;12045:4;12038:5;12034:16;12012:52;:::i;:::-;12089:29;12111:6;12089:29;:::i;:::-;12084:3;12080:39;12073:46;;11855:270;;;;;:::o;12131:364::-;12219:3;12247:39;12280:5;12247:39;:::i;:::-;12302:71;12366:6;12361:3;12302:71;:::i;:::-;12295:78;;12382:52;12427:6;12422:3;12415:4;12408:5;12404:16;12382:52;:::i;:::-;12459:29;12481:6;12459:29;:::i;:::-;12454:3;12450:39;12443:46;;12223:272;;;;;:::o;12501:377::-;12607:3;12635:39;12668:5;12635:39;:::i;:::-;12690:89;12772:6;12767:3;12690:89;:::i;:::-;12683:96;;12788:52;12833:6;12828:3;12821:4;12814:5;12810:16;12788:52;:::i;:::-;12865:6;12860:3;12856:16;12849:23;;12611:267;;;;;:::o;12908:845::-;13011:3;13048:5;13042:12;13077:36;13103:9;13077:36;:::i;:::-;13129:89;13211:6;13206:3;13129:89;:::i;:::-;13122:96;;13249:1;13238:9;13234:17;13265:1;13260:137;;;;13411:1;13406:341;;;;13227:520;;13260:137;13344:4;13340:9;13329;13325:25;13320:3;13313:38;13380:6;13375:3;13371:16;13364:23;;13260:137;;13406:341;13473:38;13505:5;13473:38;:::i;:::-;13533:1;13547:154;13561:6;13558:1;13555:13;13547:154;;;13635:7;13629:14;13625:1;13620:3;13616:11;13609:35;13685:1;13676:7;13672:15;13661:26;;13583:4;13580:1;13576:12;13571:17;;13547:154;;;13730:6;13725:3;13721:16;13714:23;;13413:334;;13227:520;;13015:738;;;;;;:::o;13759:366::-;13901:3;13922:67;13986:2;13981:3;13922:67;:::i;:::-;13915:74;;13998:93;14087:3;13998:93;:::i;:::-;14116:2;14111:3;14107:12;14100:19;;13905:220;;;:::o;14131:366::-;14273:3;14294:67;14358:2;14353:3;14294:67;:::i;:::-;14287:74;;14370:93;14459:3;14370:93;:::i;:::-;14488:2;14483:3;14479:12;14472:19;;14277:220;;;:::o;14503:366::-;14645:3;14666:67;14730:2;14725:3;14666:67;:::i;:::-;14659:74;;14742:93;14831:3;14742:93;:::i;:::-;14860:2;14855:3;14851:12;14844:19;;14649:220;;;:::o;14875:366::-;15017:3;15038:67;15102:2;15097:3;15038:67;:::i;:::-;15031:74;;15114:93;15203:3;15114:93;:::i;:::-;15232:2;15227:3;15223:12;15216:19;;15021:220;;;:::o;15247:366::-;15389:3;15410:67;15474:2;15469:3;15410:67;:::i;:::-;15403:74;;15486:93;15575:3;15486:93;:::i;:::-;15604:2;15599:3;15595:12;15588:19;;15393:220;;;:::o;15619:366::-;15761:3;15782:67;15846:2;15841:3;15782:67;:::i;:::-;15775:74;;15858:93;15947:3;15858:93;:::i;:::-;15976:2;15971:3;15967:12;15960:19;;15765:220;;;:::o;15991:366::-;16133:3;16154:67;16218:2;16213:3;16154:67;:::i;:::-;16147:74;;16230:93;16319:3;16230:93;:::i;:::-;16348:2;16343:3;16339:12;16332:19;;16137:220;;;:::o;16363:366::-;16505:3;16526:67;16590:2;16585:3;16526:67;:::i;:::-;16519:74;;16602:93;16691:3;16602:93;:::i;:::-;16720:2;16715:3;16711:12;16704:19;;16509:220;;;:::o;16735:366::-;16877:3;16898:67;16962:2;16957:3;16898:67;:::i;:::-;16891:74;;16974:93;17063:3;16974:93;:::i;:::-;17092:2;17087:3;17083:12;17076:19;;16881:220;;;:::o;17107:366::-;17249:3;17270:67;17334:2;17329:3;17270:67;:::i;:::-;17263:74;;17346:93;17435:3;17346:93;:::i;:::-;17464:2;17459:3;17455:12;17448:19;;17253:220;;;:::o;17479:366::-;17621:3;17642:67;17706:2;17701:3;17642:67;:::i;:::-;17635:74;;17718:93;17807:3;17718:93;:::i;:::-;17836:2;17831:3;17827:12;17820:19;;17625:220;;;:::o;17851:366::-;17993:3;18014:67;18078:2;18073:3;18014:67;:::i;:::-;18007:74;;18090:93;18179:3;18090:93;:::i;:::-;18208:2;18203:3;18199:12;18192:19;;17997:220;;;:::o;18223:118::-;18310:24;18328:5;18310:24;:::i;:::-;18305:3;18298:37;18288:53;;:::o;18347:256::-;18459:3;18474:75;18545:3;18536:6;18474:75;:::i;:::-;18574:2;18569:3;18565:12;18558:19;;18594:3;18587:10;;18463:140;;;;:::o;18609:589::-;18834:3;18856:95;18947:3;18938:6;18856:95;:::i;:::-;18849:102;;18968:95;19059:3;19050:6;18968:95;:::i;:::-;18961:102;;19080:92;19168:3;19159:6;19080:92;:::i;:::-;19073:99;;19189:3;19182:10;;18838:360;;;;;;:::o;19204:222::-;19297:4;19335:2;19324:9;19320:18;19312:26;;19348:71;19416:1;19405:9;19401:17;19392:6;19348:71;:::i;:::-;19302:124;;;;:::o;19432:640::-;19627:4;19665:3;19654:9;19650:19;19642:27;;19679:71;19747:1;19736:9;19732:17;19723:6;19679:71;:::i;:::-;19760:72;19828:2;19817:9;19813:18;19804:6;19760:72;:::i;:::-;19842;19910:2;19899:9;19895:18;19886:6;19842:72;:::i;:::-;19961:9;19955:4;19951:20;19946:2;19935:9;19931:18;19924:48;19989:76;20060:4;20051:6;19989:76;:::i;:::-;19981:84;;19632:440;;;;;;;:::o;20078:373::-;20221:4;20259:2;20248:9;20244:18;20236:26;;20308:9;20302:4;20298:20;20294:1;20283:9;20279:17;20272:47;20336:108;20439:4;20430:6;20336:108;:::i;:::-;20328:116;;20226:225;;;;:::o;20457:210::-;20544:4;20582:2;20571:9;20567:18;20559:26;;20595:65;20657:1;20646:9;20642:17;20633:6;20595:65;:::i;:::-;20549:118;;;;:::o;20673:222::-;20766:4;20804:2;20793:9;20789:18;20781:26;;20817:71;20885:1;20874:9;20870:17;20861:6;20817:71;:::i;:::-;20771:124;;;;:::o;20901:313::-;21014:4;21052:2;21041:9;21037:18;21029:26;;21101:9;21095:4;21091:20;21087:1;21076:9;21072:17;21065:47;21129:78;21202:4;21193:6;21129:78;:::i;:::-;21121:86;;21019:195;;;;:::o;21220:419::-;21386:4;21424:2;21413:9;21409:18;21401:26;;21473:9;21467:4;21463:20;21459:1;21448:9;21444:17;21437:47;21501:131;21627:4;21501:131;:::i;:::-;21493:139;;21391:248;;;:::o;21645:419::-;21811:4;21849:2;21838:9;21834:18;21826:26;;21898:9;21892:4;21888:20;21884:1;21873:9;21869:17;21862:47;21926:131;22052:4;21926:131;:::i;:::-;21918:139;;21816:248;;;:::o;22070:419::-;22236:4;22274:2;22263:9;22259:18;22251:26;;22323:9;22317:4;22313:20;22309:1;22298:9;22294:17;22287:47;22351:131;22477:4;22351:131;:::i;:::-;22343:139;;22241:248;;;:::o;22495:419::-;22661:4;22699:2;22688:9;22684:18;22676:26;;22748:9;22742:4;22738:20;22734:1;22723:9;22719:17;22712:47;22776:131;22902:4;22776:131;:::i;:::-;22768:139;;22666:248;;;:::o;22920:419::-;23086:4;23124:2;23113:9;23109:18;23101:26;;23173:9;23167:4;23163:20;23159:1;23148:9;23144:17;23137:47;23201:131;23327:4;23201:131;:::i;:::-;23193:139;;23091:248;;;:::o;23345:419::-;23511:4;23549:2;23538:9;23534:18;23526:26;;23598:9;23592:4;23588:20;23584:1;23573:9;23569:17;23562:47;23626:131;23752:4;23626:131;:::i;:::-;23618:139;;23516:248;;;:::o;23770:419::-;23936:4;23974:2;23963:9;23959:18;23951:26;;24023:9;24017:4;24013:20;24009:1;23998:9;23994:17;23987:47;24051:131;24177:4;24051:131;:::i;:::-;24043:139;;23941:248;;;:::o;24195:419::-;24361:4;24399:2;24388:9;24384:18;24376:26;;24448:9;24442:4;24438:20;24434:1;24423:9;24419:17;24412:47;24476:131;24602:4;24476:131;:::i;:::-;24468:139;;24366:248;;;:::o;24620:419::-;24786:4;24824:2;24813:9;24809:18;24801:26;;24873:9;24867:4;24863:20;24859:1;24848:9;24844:17;24837:47;24901:131;25027:4;24901:131;:::i;:::-;24893:139;;24791:248;;;:::o;25045:419::-;25211:4;25249:2;25238:9;25234:18;25226:26;;25298:9;25292:4;25288:20;25284:1;25273:9;25269:17;25262:47;25326:131;25452:4;25326:131;:::i;:::-;25318:139;;25216:248;;;:::o;25470:419::-;25636:4;25674:2;25663:9;25659:18;25651:26;;25723:9;25717:4;25713:20;25709:1;25698:9;25694:17;25687:47;25751:131;25877:4;25751:131;:::i;:::-;25743:139;;25641:248;;;:::o;25895:419::-;26061:4;26099:2;26088:9;26084:18;26076:26;;26148:9;26142:4;26138:20;26134:1;26123:9;26119:17;26112:47;26176:131;26302:4;26176:131;:::i;:::-;26168:139;;26066:248;;;:::o;26320:222::-;26413:4;26451:2;26440:9;26436:18;26428:26;;26464:71;26532:1;26521:9;26517:17;26508:6;26464:71;:::i;:::-;26418:124;;;;:::o;26548:129::-;26582:6;26609:20;;:::i;:::-;26599:30;;26638:33;26666:4;26658:6;26638:33;:::i;:::-;26589:88;;;:::o;26683:75::-;26716:6;26749:2;26743:9;26733:19;;26723:35;:::o;26764:311::-;26841:4;26931:18;26923:6;26920:30;26917:2;;;26953:18;;:::i;:::-;26917:2;27003:4;26995:6;26991:17;26983:25;;27063:4;27057;27053:15;27045:23;;26846:229;;;:::o;27081:311::-;27158:4;27248:18;27240:6;27237:30;27234:2;;;27270:18;;:::i;:::-;27234:2;27320:4;27312:6;27308:17;27300:25;;27380:4;27374;27370:15;27362:23;;27163:229;;;:::o;27398:307::-;27459:4;27549:18;27541:6;27538:30;27535:2;;;27571:18;;:::i;:::-;27535:2;27609:29;27631:6;27609:29;:::i;:::-;27601:37;;27693:4;27687;27683:15;27675:23;;27464:241;;;:::o;27711:308::-;27773:4;27863:18;27855:6;27852:30;27849:2;;;27885:18;;:::i;:::-;27849:2;27923:29;27945:6;27923:29;:::i;:::-;27915:37;;28007:4;28001;27997:15;27989:23;;27778:241;;;:::o;28025:132::-;28092:4;28115:3;28107:11;;28145:4;28140:3;28136:14;28128:22;;28097:60;;;:::o;28163:141::-;28212:4;28235:3;28227:11;;28258:3;28255:1;28248:14;28292:4;28289:1;28279:18;28271:26;;28217:87;;;:::o;28310:114::-;28377:6;28411:5;28405:12;28395:22;;28384:40;;;:::o;28430:98::-;28481:6;28515:5;28509:12;28499:22;;28488:40;;;:::o;28534:99::-;28586:6;28620:5;28614:12;28604:22;;28593:40;;;:::o;28639:113::-;28709:4;28741;28736:3;28732:14;28724:22;;28714:38;;;:::o;28758:184::-;28857:11;28891:6;28886:3;28879:19;28931:4;28926:3;28922:14;28907:29;;28869:73;;;;:::o;28948:168::-;29031:11;29065:6;29060:3;29053:19;29105:4;29100:3;29096:14;29081:29;;29043:73;;;;:::o;29122:169::-;29206:11;29240:6;29235:3;29228:19;29280:4;29275:3;29271:14;29256:29;;29218:73;;;;:::o;29297:148::-;29399:11;29436:3;29421:18;;29411:34;;;;:::o;29451:305::-;29491:3;29510:20;29528:1;29510:20;:::i;:::-;29505:25;;29544:20;29562:1;29544:20;:::i;:::-;29539:25;;29698:1;29630:66;29626:74;29623:1;29620:81;29617:2;;;29704:18;;:::i;:::-;29617:2;29748:1;29745;29741:9;29734:16;;29495:261;;;;:::o;29762:185::-;29802:1;29819:20;29837:1;29819:20;:::i;:::-;29814:25;;29853:20;29871:1;29853:20;:::i;:::-;29848:25;;29892:1;29882:2;;29897:18;;:::i;:::-;29882:2;29939:1;29936;29932:9;29927:14;;29804:143;;;;:::o;29953:191::-;29993:4;30013:20;30031:1;30013:20;:::i;:::-;30008:25;;30047:20;30065:1;30047:20;:::i;:::-;30042:25;;30086:1;30083;30080:8;30077:2;;;30091:18;;:::i;:::-;30077:2;30136:1;30133;30129:9;30121:17;;29998:146;;;;:::o;30150:96::-;30187:7;30216:24;30234:5;30216:24;:::i;:::-;30205:35;;30195:51;;;:::o;30252:90::-;30286:7;30329:5;30322:13;30315:21;30304:32;;30294:48;;;:::o;30348:77::-;30385:7;30414:5;30403:16;;30393:32;;;:::o;30431:149::-;30467:7;30507:66;30500:5;30496:78;30485:89;;30475:105;;;:::o;30586:126::-;30623:7;30663:42;30656:5;30652:54;30641:65;;30631:81;;;:::o;30718:77::-;30755:7;30784:5;30773:16;;30763:32;;;:::o;30801:154::-;30885:6;30880:3;30875;30862:30;30947:1;30938:6;30933:3;30929:16;30922:27;30852:103;;;:::o;30961:307::-;31029:1;31039:113;31053:6;31050:1;31047:13;31039:113;;;31138:1;31133:3;31129:11;31123:18;31119:1;31114:3;31110:11;31103:39;31075:2;31072:1;31068:10;31063:15;;31039:113;;;31170:6;31167:1;31164:13;31161:2;;;31250:1;31241:6;31236:3;31232:16;31225:27;31161:2;31010:258;;;;:::o;31274:320::-;31318:6;31355:1;31349:4;31345:12;31335:22;;31402:1;31396:4;31392:12;31423:18;31413:2;;31479:4;31471:6;31467:17;31457:27;;31413:2;31541;31533:6;31530:14;31510:18;31507:38;31504:2;;;31560:18;;:::i;:::-;31504:2;31325:269;;;;:::o;31600:281::-;31683:27;31705:4;31683:27;:::i;:::-;31675:6;31671:40;31813:6;31801:10;31798:22;31777:18;31765:10;31762:34;31759:62;31756:2;;;31824:18;;:::i;:::-;31756:2;31864:10;31860:2;31853:22;31643:238;;;:::o;31887:233::-;31926:3;31949:24;31967:5;31949:24;:::i;:::-;31940:33;;31995:66;31988:5;31985:77;31982:2;;;32065:18;;:::i;:::-;31982:2;32112:1;32105:5;32101:13;32094:20;;31930:190;;;:::o;32126:100::-;32165:7;32194:26;32214:5;32194:26;:::i;:::-;32183:37;;32173:53;;;:::o;32232:94::-;32271:7;32300:20;32314:5;32300:20;:::i;:::-;32289:31;;32279:47;;;:::o;32332:176::-;32364:1;32381:20;32399:1;32381:20;:::i;:::-;32376:25;;32415:20;32433:1;32415:20;:::i;:::-;32410:25;;32454:1;32444:2;;32459:18;;:::i;:::-;32444:2;32500:1;32497;32493:9;32488:14;;32366:142;;;;:::o;32514:180::-;32562:77;32559:1;32552:88;32659:4;32656:1;32649:15;32683:4;32680:1;32673:15;32700:180;32748:77;32745:1;32738:88;32845:4;32842:1;32835:15;32869:4;32866:1;32859:15;32886:180;32934:77;32931:1;32924:88;33031:4;33028:1;33021:15;33055:4;33052:1;33045:15;33072:180;33120:77;33117:1;33110:88;33217:4;33214:1;33207:15;33241:4;33238:1;33231:15;33258:102;33299:6;33350:2;33346:7;33341:2;33334:5;33330:14;33326:28;33316:38;;33306:54;;;:::o;33366:94::-;33399:8;33447:5;33443:2;33439:14;33418:35;;33408:52;;;:::o;33466:178::-;33606:30;33602:1;33594:6;33590:14;33583:54;33572:72;:::o;33650:169::-;33790:21;33786:1;33778:6;33774:14;33767:45;33756:63;:::o;33825:181::-;33965:33;33961:1;33953:6;33949:14;33942:57;33931:75;:::o;34012:225::-;34152:34;34148:1;34140:6;34136:14;34129:58;34221:8;34216:2;34208:6;34204:15;34197:33;34118:119;:::o;34243:165::-;34383:17;34379:1;34371:6;34367:14;34360:41;34349:59;:::o;34414:166::-;34554:18;34550:1;34542:6;34538:14;34531:42;34520:60;:::o;34586:165::-;34726:17;34722:1;34714:6;34710:14;34703:41;34692:59;:::o;34757:175::-;34897:27;34893:1;34885:6;34881:14;34874:51;34863:69;:::o;34938:182::-;35078:34;35074:1;35066:6;35062:14;35055:58;35044:76;:::o;35126:166::-;35266:18;35262:1;35254:6;35250:14;35243:42;35232:60;:::o;35298:168::-;35438:20;35434:1;35426:6;35422:14;35415:44;35404:62;:::o;35472:181::-;35612:33;35608:1;35600:6;35596:14;35589:57;35578:75;:::o;35659:122::-;35732:24;35750:5;35732:24;:::i;:::-;35725:5;35722:35;35712:2;;35771:1;35768;35761:12;35712:2;35702:79;:::o;35787:116::-;35857:21;35872:5;35857:21;:::i;:::-;35850:5;35847:32;35837:2;;35893:1;35890;35883:12;35837:2;35827:76;:::o;35909:122::-;35982:24;36000:5;35982:24;:::i;:::-;35975:5;35972:35;35962:2;;36021:1;36018;36011:12;35962:2;35952:79;:::o;36037:120::-;36109:23;36126:5;36109:23;:::i;:::-;36102:5;36099:34;36089:2;;36147:1;36144;36137:12;36089:2;36079:78;:::o;36163:122::-;36236:24;36254:5;36236:24;:::i;:::-;36229:5;36226:35;36216:2;;36275:1;36272;36265:12;36216:2;36206:79;:::o
Swarm Source
ipfs://118b96750ef6f7fb7df0f1aa3aa454c69ca5c95bfdf8665236f15e64c7f03e71
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.