ERC-721
Overview
Max Total Supply
1,000 CNM
Holders
795
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 CNMLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CareNoMore
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./ERC721A.sol"; import "./Ownable.sol"; import "./Counters.sol"; import "./MerkelProof.sol"; import "./DefaultOperatorFilterer.sol"; contract CareNoMore is ERC721A, Ownable, DefaultOperatorFilterer { // MintPrice = "Free Mint" string _baseTokenURI; bytes32 public merkleRoot; bool public isActive = false; bool public isWhitelistSaleActive = false; uint256 public MAX_SUPPLY = 1000; uint256 public maximumAllowedTokensPerPurchase = 2; uint256 public whitelistWalletLimitation = 2; uint256 public publicWalletLimitation = 1; mapping(address => uint256) private _whitelistWalletMints; mapping(address => uint256) private _publicWalletMints; constructor(string memory baseURI) ERC721A("CARE NO MORE", "CNM") { setBaseURI(baseURI); } modifier saleIsOpen { require(totalSupply() <= MAX_SUPPLY, "Sale has ended."); _; } // Minting for devs to use in future giveaways and raffles and treasury function devMint(uint256 _count, address _address) external onlyOwner { uint256 supply = totalSupply(); require(supply + _count <= MAX_SUPPLY, "Total supply exceeded."); require(supply <= MAX_SUPPLY, "Total supply spent."); _safeMint(_address, _count); } // Free mint for whitelisted people function whitelistMint(bytes32[] calldata _merkleProof, uint256 _count) public payable isValidMerkleProof(_merkleProof) saleIsOpen { uint256 mintIndex = totalSupply(); require(isWhitelistSaleActive, "Presale is not active"); require(mintIndex < MAX_SUPPLY, "All tokens have been minted"); require(balanceOf(msg.sender) + _count <= whitelistWalletLimitation, "Cannot purchase this many tokens"); require(_whitelistWalletMints[msg.sender] + _count <= whitelistWalletLimitation, "You have already minted max"); _whitelistWalletMints[msg.sender] += _count; _safeMint(msg.sender, _count); } // Free mint for public function mint(uint256 _count) public payable saleIsOpen { uint256 mintIndex = totalSupply(); require(isActive, "Sale is not active currently."); require(mintIndex + _count <= MAX_SUPPLY, "Total supply exceeded."); require( _count <= maximumAllowedTokensPerPurchase, "Exceeds maximum allowed tokens"); require(_publicWalletMints[msg.sender] + _count <= publicWalletLimitation, "You have already minted or minting more than allowed."); _publicWalletMints[msg.sender] += _count; _safeMint(msg.sender, _count); } modifier isValidMerkleProof(bytes32[] calldata merkleProof) { require( MerkleProof.verify( merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender)) ), "Address does not exist in list" ); _; } function setMerkleRootHash(bytes32 _rootHash) public onlyOwner { merkleRoot = _rootHash; } function setWhitelistSaleWalletLimitation(uint256 _maxMint) external onlyOwner { whitelistWalletLimitation = _maxMint; } function setPublicSaleWalletLimitation(uint256 _count) external onlyOwner { publicWalletLimitation = _count; } function setMaximumAllowedTokensPerPurchase(uint256 _count) public onlyOwner { maximumAllowedTokensPerPurchase = _count; } function setMaxMintSupply(uint256 _maxMintSupply) external onlyOwner { MAX_SUPPLY = _maxMintSupply; } function toggleSaleStatus() public onlyOwner { isActive = !isActive; } function toggleWhiteslistSaleStatus() external onlyOwner { isWhitelistSaleActive = !isWhitelistSaleActive; } function setBaseURI(string memory baseURI) public onlyOwner { _baseTokenURI = baseURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function withdraw() external onlyOwner { uint balance = address(this).balance; payable(owner()).transfer(balance); } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override payable onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
// 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {OperatorFilterer} from "./OperatorFilterer.sol"; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) { if (_startTokenId() <= tokenId) { packed = _packedOwnerships[tokenId]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // If the data at the starting slot does not exist, start the scan. if (packed == 0) { if (tokenId >= _currentIndex) revert OwnerQueryForNonexistentToken(); // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `tokenId` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. for (;;) { unchecked { packed = _packedOwnerships[--tokenId]; } if (packed == 0) continue; return packed; } } // Otherwise, the data exists and is not burned. We can skip the scan. // This is possible because we have already achieved the target condition. // This saves 2143 gas on transfers of initialized tokens. return packed; } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. * * Requirements: * * - The caller must own the token or be an approved operator. */ function approve(address to, uint256 tokenId) public payable virtual override { _approve(to, tokenId, true); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Equivalent to `_approve(to, tokenId, false)`. */ function _approve(address to, uint256 tokenId) internal virtual { _approve(to, tokenId, false); } /** * @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: * * - `tokenId` must exist. * * Emits an {Approval} event. */ function _approve( address to, uint256 tokenId, bool approvalCheck ) internal virtual { address owner = ownerOf(tokenId); if (approvalCheck) if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * 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. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ 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 simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _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} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _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 sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _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}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _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 pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"devMint","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":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isWhitelistSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumAllowedTokensPerPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicWalletLimitation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintSupply","type":"uint256"}],"name":"setMaxMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokensPerPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_rootHash","type":"bytes32"}],"name":"setMerkleRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setPublicSaleWalletLimitation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"name":"setWhitelistSaleWalletLimitation","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":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteslistSaleStatus","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistWalletLimitation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff0219169083151502179055506103e8600c556002600d556002600e556001600f553480156200005c57600080fd5b506040516200455d3803806200455d8339818101604052810190620000829190620006b6565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600c81526020017f43415245204e4f204d4f524500000000000000000000000000000000000000008152506040518060400160405280600381526020017f434e4d0000000000000000000000000000000000000000000000000000000000815250816002908162000116919062000952565b50806003908162000128919062000952565b50620001396200037060201b60201c565b600081905550505062000161620001556200037560201b60201c565b6200037d60201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003565780156200021c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001e292919062000a7e565b600060405180830381600087803b158015620001fd57600080fd5b505af115801562000212573d6000803e3d6000fd5b5050505062000355565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002d6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200029c92919062000a7e565b600060405180830381600087803b158015620002b757600080fd5b505af1158015620002cc573d6000803e3d6000fd5b5050505062000354565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200031f919062000aab565b600060405180830381600087803b1580156200033a57600080fd5b505af11580156200034f573d6000803e3d6000fd5b505050505b5b5b505062000369816200044360201b60201c565b5062000b4b565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004536200046860201b60201c565b806009908162000464919062000952565b5050565b620004786200037560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200049e620004f960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ee9062000b29565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200058c8262000541565b810181811067ffffffffffffffff82111715620005ae57620005ad62000552565b5b80604052505050565b6000620005c362000523565b9050620005d1828262000581565b919050565b600067ffffffffffffffff821115620005f457620005f362000552565b5b620005ff8262000541565b9050602081019050919050565b60005b838110156200062c5780820151818401526020810190506200060f565b60008484015250505050565b60006200064f6200064984620005d6565b620005b7565b9050828152602081018484840111156200066e576200066d6200053c565b5b6200067b8482856200060c565b509392505050565b600082601f8301126200069b576200069a62000537565b5b8151620006ad84826020860162000638565b91505092915050565b600060208284031215620006cf57620006ce6200052d565b5b600082015167ffffffffffffffff811115620006f057620006ef62000532565b5b620006fe8482850162000683565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200075a57607f821691505b60208210810362000770576200076f62000712565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007da7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200079b565b620007e686836200079b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008336200082d6200082784620007fe565b62000808565b620007fe565b9050919050565b6000819050919050565b6200084f8362000812565b620008676200085e826200083a565b848454620007a8565b825550505050565b600090565b6200087e6200086f565b6200088b81848462000844565b505050565b5b81811015620008b357620008a760008262000874565b60018101905062000891565b5050565b601f8211156200090257620008cc8162000776565b620008d7846200078b565b81016020851015620008e7578190505b620008ff620008f6856200078b565b83018262000890565b50505b505050565b600082821c905092915050565b6000620009276000198460080262000907565b1980831691505092915050565b600062000942838362000914565b9150826002028217905092915050565b6200095d8262000707565b67ffffffffffffffff81111562000979576200097862000552565b5b62000985825462000741565b62000992828285620008b7565b600060209050601f831160018114620009ca5760008415620009b5578287015190505b620009c1858262000934565b86555062000a31565b601f198416620009da8662000776565b60005b8281101562000a0457848901518255600182019150602085019450602081019050620009dd565b8683101562000a24578489015162000a20601f89168262000914565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a668262000a39565b9050919050565b62000a788162000a59565b82525050565b600060408201905062000a95600083018562000a6d565b62000aa4602083018462000a6d565b9392505050565b600060208201905062000ac2600083018462000a6d565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000b1160208362000ac8565b915062000b1e8262000ad9565b602082019050919050565b6000602082019050818103600083015262000b448162000b02565b9050919050565b613a028062000b5b6000396000f3fe60806040526004361061021a5760003560e01c80636352211e116101235780639ba411b1116100ab578063b88d4fde1161006f578063b88d4fde1461071c578063b98451cf14610738578063c87b56dd14610763578063e985e9c5146107a0578063f2fde38b146107dd5761021a565b80639ba411b11461065a578063a0712d6814610683578063a22cb4651461069f578063af8f8aa7146106c8578063b601be43146106f35761021a565b8063715018a6116100f2578063715018a6146105995780637389fbb7146105b05780638da5cb5b146105d957806395d89b41146106045780639a3bf7281461062f5761021a565b80636352211e146104df57806367999d2f1461051c5780636e920fc61461054557806370a082311461055c5761021a565b80632a97e449116101a657806335ac3c581161017557806335ac3c581461042d5780633ccfd60b1461045857806341f434341461046f57806342842e0e1461049a57806355f804b3146104b65761021a565b80632a97e449146103855780632d1a12f6146103ae5780632eb4a7ab146103d757806332cb6b0c146104025761021a565b8063095ea7b3116101ed578063095ea7b3146102db57806318160ddd146102f757806322f3e2d41461032257806323b872dd1461034d5780632904e6d9146103695761021a565b806301ffc9a71461021f578063049c5c491461025c57806306fdde0314610273578063081812fc1461029e575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612606565b610806565b604051610253919061264e565b60405180910390f35b34801561026857600080fd5b50610271610898565b005b34801561027f57600080fd5b506102886108cc565b60405161029591906126f9565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c09190612751565b61095e565b6040516102d291906127bf565b60405180910390f35b6102f560048036038101906102f09190612806565b6109dd565b005b34801561030357600080fd5b5061030c6109f6565b6040516103199190612855565b60405180910390f35b34801561032e57600080fd5b50610337610a0d565b604051610344919061264e565b60405180910390f35b61036760048036038101906103629190612870565b610a20565b005b610383600480360381019061037e9190612928565b610a6f565b005b34801561039157600080fd5b506103ac60048036038101906103a79190612751565b610d5e565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190612988565b610d70565b005b3480156103e357600080fd5b506103ec610e28565b6040516103f991906129e1565b60405180910390f35b34801561040e57600080fd5b50610417610e2e565b6040516104249190612855565b60405180910390f35b34801561043957600080fd5b50610442610e34565b60405161044f9190612855565b60405180910390f35b34801561046457600080fd5b5061046d610e3a565b005b34801561047b57600080fd5b50610484610e98565b6040516104919190612a5b565b60405180910390f35b6104b460048036038101906104af9190612870565b610eaa565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190612ba6565b610ef9565b005b3480156104eb57600080fd5b5061050660048036038101906105019190612751565b610f14565b60405161051391906127bf565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e9190612751565b610f26565b005b34801561055157600080fd5b5061055a610f38565b005b34801561056857600080fd5b50610583600480360381019061057e9190612bef565b610f6c565b6040516105909190612855565b60405180910390f35b3480156105a557600080fd5b506105ae611024565b005b3480156105bc57600080fd5b506105d760048036038101906105d29190612751565b611038565b005b3480156105e557600080fd5b506105ee61104a565b6040516105fb91906127bf565b60405180910390f35b34801561061057600080fd5b50610619611074565b60405161062691906126f9565b60405180910390f35b34801561063b57600080fd5b50610644611106565b6040516106519190612855565b60405180910390f35b34801561066657600080fd5b50610681600480360381019061067c9190612c48565b61110c565b005b61069d60048036038101906106989190612751565b61111e565b005b3480156106ab57600080fd5b506106c660048036038101906106c19190612ca1565b61134d565b005b3480156106d457600080fd5b506106dd611366565b6040516106ea9190612855565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190612751565b61136c565b005b61073660048036038101906107319190612d82565b61137e565b005b34801561074457600080fd5b5061074d6113cf565b60405161075a919061264e565b60405180910390f35b34801561076f57600080fd5b5061078a60048036038101906107859190612751565b6113e2565b60405161079791906126f9565b60405180910390f35b3480156107ac57600080fd5b506107c760048036038101906107c29190612e05565b611480565b6040516107d4919061264e565b60405180910390f35b3480156107e957600080fd5b5061080460048036038101906107ff9190612bef565b611514565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108915750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6108a0611597565b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b6060600280546108db90612e74565b80601f016020809104026020016040519081016040528092919081815260200182805461090790612e74565b80156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b5050505050905090565b600061096982611615565b61099f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b816109e781611674565b6109f18383611771565b505050565b6000610a00611781565b6001546000540303905090565b600b60009054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a5e57610a5d33611674565b5b610a69848484611786565b50505050565b8282610ae5828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5433604051602001610aca9190612eed565b60405160208183030381529060405280519060200120611aa8565b610b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1b90612f54565b60405180910390fd5b600c54610b2f6109f6565b1115610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790612fc0565b60405180910390fd5b6000610b7a6109f6565b9050600b60019054906101000a900460ff16610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc29061302c565b60405180910390fd5b600c548110610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0690613098565b60405180910390fd5b600e5484610c1c33610f6c565b610c2691906130e7565b1115610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90613167565b60405180910390fd5b600e5484601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610cb591906130e7565b1115610cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ced906131d3565b60405180910390fd5b83601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d4591906130e7565b92505081905550610d563385611abf565b505050505050565b610d66611597565b80600e8190555050565b610d78611597565b6000610d826109f6565b9050600c548382610d9391906130e7565b1115610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb9061323f565b60405180910390fd5b600c54811115610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e10906132ab565b60405180910390fd5b610e238284611abf565b505050565b600a5481565b600c5481565b600e5481565b610e42611597565b6000479050610e4f61104a565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e94573d6000803e3d6000fd5b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ee857610ee733611674565b5b610ef3848484611add565b50505050565b610f01611597565b8060099081610f10919061346d565b5050565b6000610f1f82611afd565b9050919050565b610f2e611597565b80600f8190555050565b610f40611597565b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fd3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61102c611597565b6110366000611bf5565b565b611040611597565b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461108390612e74565b80601f01602080910402602001604051908101604052809291908181526020018280546110af90612e74565b80156110fc5780601f106110d1576101008083540402835291602001916110fc565b820191906000526020600020905b8154815290600101906020018083116110df57829003601f168201915b5050505050905090565b600d5481565b611114611597565b80600a8190555050565b600c546111296109f6565b111561116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190612fc0565b60405180910390fd5b60006111746109f6565b9050600b60009054906101000a900460ff166111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc9061358b565b60405180910390fd5b600c5482826111d491906130e7565b1115611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c9061323f565b60405180910390fd5b600d5482111561125a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611251906135f7565b60405180910390fd5b600f5482601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112a891906130e7565b11156112e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e090613689565b60405180910390fd5b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461133891906130e7565b925050819055506113493383611abf565b5050565b8161135781611674565b6113618383611cbb565b505050565b600f5481565b611374611597565b80600d8190555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113bc576113bb33611674565b5b6113c885858585611dc6565b5050505050565b600b60019054906101000a900460ff1681565b60606113ed82611615565b611423576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061142d611e39565b9050600081510361144d5760405180602001604052806000815250611478565b8061145784611ecb565b6040516020016114689291906136e5565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61151c611597565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361158b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115829061377b565b60405180910390fd5b61159481611bf5565b50565b61159f611f1b565b73ffffffffffffffffffffffffffffffffffffffff166115bd61104a565b73ffffffffffffffffffffffffffffffffffffffff1614611613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160a906137e7565b60405180910390fd5b565b600081611620611781565b1115801561162f575060005482105b801561166d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561176e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016116eb929190613807565b602060405180830381865afa158015611708573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172c9190613845565b61176d57806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161176491906127bf565b60405180910390fd5b5b50565b61177d82826001611f23565b5050565b600090565b600061179182611afd565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117f8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806118048461206f565b9150915061181a8187611815612096565b61209e565b6118665761182f8661182a612096565b611480565b611865576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036118cc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d986868660016120e2565b80156118e457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506119b28561198e8888876120e8565b7c020000000000000000000000000000000000000000000000000000000017612110565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611a385760006001850190506000600460008381526020019081526020016000205403611a36576000548114611a35578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aa0868686600161213b565b505050505050565b600082611ab58584612141565b1490509392505050565b611ad9828260405180602001604052806000815250612197565b5050565b611af88383836040518060200160405280600081525061137e565b505050565b600081611b08611781565b11611bbe576004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611bbd5760008103611bb8576000548210611b8d576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600460008360019003935083815260200190815260200160002054905060008103611bf057611b8e565b611bf0565b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060076000611cc8612096565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d75612096565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dba919061264e565b60405180910390a35050565b611dd1848484610a20565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e3357611dfc84848484612234565b611e32576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060098054611e4890612e74565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7490612e74565b8015611ec15780601f10611e9657610100808354040283529160200191611ec1565b820191906000526020600020905b815481529060010190602001808311611ea457829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115611f0657600184039350600a81066030018453600a8104905080611ee4575b50828103602084039350808452505050919050565b600033905090565b6000611f2e83610f14565b90508115611fb9578073ffffffffffffffffffffffffffffffffffffffff16611f55612096565b73ffffffffffffffffffffffffffffffffffffffff1614611fb857611f8181611f7c612096565b611480565b611fb7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86120ff868684612384565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008082905060005b845181101561218c576121778286838151811061216a57612169613872565b5b602002602001015161238d565b91508080612184906138a1565b91505061214a565b508091505092915050565b6121a183836123b8565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461222f57600080549050600083820390505b6121e16000868380600101945086612234565b612217576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106121ce57816000541461222c57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261225a612096565b8786866040518563ffffffff1660e01b815260040161227c949392919061393e565b6020604051808303816000875af19250505080156122b857506040513d601f19601f820116820180604052508101906122b5919061399f565b60015b612331573d80600081146122e8576040519150601f19603f3d011682016040523d82523d6000602084013e6122ed565b606091505b506000815103612329576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008183106123a5576123a08284612573565b6123b0565b6123af8383612573565b5b905092915050565b600080549050600082036123f8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61240560008483856120e2565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061247c8361246d60008660006120e8565b6124768561258a565b17612110565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461251d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506124e2565b5060008203612558576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061256e600084838561213b565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125e3816125ae565b81146125ee57600080fd5b50565b600081359050612600816125da565b92915050565b60006020828403121561261c5761261b6125a4565b5b600061262a848285016125f1565b91505092915050565b60008115159050919050565b61264881612633565b82525050565b6000602082019050612663600083018461263f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126a3578082015181840152602081019050612688565b60008484015250505050565b6000601f19601f8301169050919050565b60006126cb82612669565b6126d58185612674565b93506126e5818560208601612685565b6126ee816126af565b840191505092915050565b6000602082019050818103600083015261271381846126c0565b905092915050565b6000819050919050565b61272e8161271b565b811461273957600080fd5b50565b60008135905061274b81612725565b92915050565b600060208284031215612767576127666125a4565b5b60006127758482850161273c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127a98261277e565b9050919050565b6127b98161279e565b82525050565b60006020820190506127d460008301846127b0565b92915050565b6127e38161279e565b81146127ee57600080fd5b50565b600081359050612800816127da565b92915050565b6000806040838503121561281d5761281c6125a4565b5b600061282b858286016127f1565b925050602061283c8582860161273c565b9150509250929050565b61284f8161271b565b82525050565b600060208201905061286a6000830184612846565b92915050565b600080600060608486031215612889576128886125a4565b5b6000612897868287016127f1565b93505060206128a8868287016127f1565b92505060406128b98682870161273c565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126128e8576128e76128c3565b5b8235905067ffffffffffffffff811115612905576129046128c8565b5b602083019150836020820283011115612921576129206128cd565b5b9250929050565b600080600060408486031215612941576129406125a4565b5b600084013567ffffffffffffffff81111561295f5761295e6125a9565b5b61296b868287016128d2565b9350935050602061297e8682870161273c565b9150509250925092565b6000806040838503121561299f5761299e6125a4565b5b60006129ad8582860161273c565b92505060206129be858286016127f1565b9150509250929050565b6000819050919050565b6129db816129c8565b82525050565b60006020820190506129f660008301846129d2565b92915050565b6000819050919050565b6000612a21612a1c612a178461277e565b6129fc565b61277e565b9050919050565b6000612a3382612a06565b9050919050565b6000612a4582612a28565b9050919050565b612a5581612a3a565b82525050565b6000602082019050612a706000830184612a4c565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ab3826126af565b810181811067ffffffffffffffff82111715612ad257612ad1612a7b565b5b80604052505050565b6000612ae561259a565b9050612af18282612aaa565b919050565b600067ffffffffffffffff821115612b1157612b10612a7b565b5b612b1a826126af565b9050602081019050919050565b82818337600083830152505050565b6000612b49612b4484612af6565b612adb565b905082815260208101848484011115612b6557612b64612a76565b5b612b70848285612b27565b509392505050565b600082601f830112612b8d57612b8c6128c3565b5b8135612b9d848260208601612b36565b91505092915050565b600060208284031215612bbc57612bbb6125a4565b5b600082013567ffffffffffffffff811115612bda57612bd96125a9565b5b612be684828501612b78565b91505092915050565b600060208284031215612c0557612c046125a4565b5b6000612c13848285016127f1565b91505092915050565b612c25816129c8565b8114612c3057600080fd5b50565b600081359050612c4281612c1c565b92915050565b600060208284031215612c5e57612c5d6125a4565b5b6000612c6c84828501612c33565b91505092915050565b612c7e81612633565b8114612c8957600080fd5b50565b600081359050612c9b81612c75565b92915050565b60008060408385031215612cb857612cb76125a4565b5b6000612cc6858286016127f1565b9250506020612cd785828601612c8c565b9150509250929050565b600067ffffffffffffffff821115612cfc57612cfb612a7b565b5b612d05826126af565b9050602081019050919050565b6000612d25612d2084612ce1565b612adb565b905082815260208101848484011115612d4157612d40612a76565b5b612d4c848285612b27565b509392505050565b600082601f830112612d6957612d686128c3565b5b8135612d79848260208601612d12565b91505092915050565b60008060008060808587031215612d9c57612d9b6125a4565b5b6000612daa878288016127f1565b9450506020612dbb878288016127f1565b9350506040612dcc8782880161273c565b925050606085013567ffffffffffffffff811115612ded57612dec6125a9565b5b612df987828801612d54565b91505092959194509250565b60008060408385031215612e1c57612e1b6125a4565b5b6000612e2a858286016127f1565b9250506020612e3b858286016127f1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e8c57607f821691505b602082108103612e9f57612e9e612e45565b5b50919050565b60008160601b9050919050565b6000612ebd82612ea5565b9050919050565b6000612ecf82612eb2565b9050919050565b612ee7612ee28261279e565b612ec4565b82525050565b6000612ef98284612ed6565b60148201915081905092915050565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b6000612f3e601e83612674565b9150612f4982612f08565b602082019050919050565b60006020820190508181036000830152612f6d81612f31565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000612faa600f83612674565b9150612fb582612f74565b602082019050919050565b60006020820190508181036000830152612fd981612f9d565b9050919050565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b6000613016601583612674565b915061302182612fe0565b602082019050919050565b6000602082019050818103600083015261304581613009565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b6000613082601b83612674565b915061308d8261304c565b602082019050919050565b600060208201905081810360008301526130b181613075565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130f28261271b565b91506130fd8361271b565b9250828201905080821115613115576131146130b8565b5b92915050565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b6000613151602083612674565b915061315c8261311b565b602082019050919050565b6000602082019050818103600083015261318081613144565b9050919050565b7f596f75206861766520616c7265616479206d696e746564206d61780000000000600082015250565b60006131bd601b83612674565b91506131c882613187565b602082019050919050565b600060208201905081810360008301526131ec816131b0565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b6000613229601683612674565b9150613234826131f3565b602082019050919050565b600060208201905081810360008301526132588161321c565b9050919050565b7f546f74616c20737570706c79207370656e742e00000000000000000000000000600082015250565b6000613295601383612674565b91506132a08261325f565b602082019050919050565b600060208201905081810360008301526132c481613288565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261332d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826132f0565b61333786836132f0565b95508019841693508086168417925050509392505050565b600061336a6133656133608461271b565b6129fc565b61271b565b9050919050565b6000819050919050565b6133848361334f565b61339861339082613371565b8484546132fd565b825550505050565b600090565b6133ad6133a0565b6133b881848461337b565b505050565b5b818110156133dc576133d16000826133a5565b6001810190506133be565b5050565b601f821115613421576133f2816132cb565b6133fb846132e0565b8101602085101561340a578190505b61341e613416856132e0565b8301826133bd565b50505b505050565b600082821c905092915050565b600061344460001984600802613426565b1980831691505092915050565b600061345d8383613433565b9150826002028217905092915050565b61347682612669565b67ffffffffffffffff81111561348f5761348e612a7b565b5b6134998254612e74565b6134a48282856133e0565b600060209050601f8311600181146134d757600084156134c5578287015190505b6134cf8582613451565b865550613537565b601f1984166134e5866132cb565b60005b8281101561350d578489015182556001820191506020850194506020810190506134e8565b8683101561352a5784890151613526601f891682613433565b8355505b6001600288020188555050505b505050505050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b6000613575601d83612674565b91506135808261353f565b602082019050919050565b600060208201905081810360008301526135a481613568565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b60006135e1601e83612674565b91506135ec826135ab565b602082019050919050565b60006020820190508181036000830152613610816135d4565b9050919050565b7f596f75206861766520616c7265616479206d696e746564206f72206d696e746960008201527f6e67206d6f7265207468616e20616c6c6f7765642e0000000000000000000000602082015250565b6000613673603583612674565b915061367e82613617565b604082019050919050565b600060208201905081810360008301526136a281613666565b9050919050565b600081905092915050565b60006136bf82612669565b6136c981856136a9565b93506136d9818560208601612685565b80840191505092915050565b60006136f182856136b4565b91506136fd82846136b4565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613765602683612674565b915061377082613709565b604082019050919050565b6000602082019050818103600083015261379481613758565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137d1602083612674565b91506137dc8261379b565b602082019050919050565b60006020820190508181036000830152613800816137c4565b9050919050565b600060408201905061381c60008301856127b0565b61382960208301846127b0565b9392505050565b60008151905061383f81612c75565b92915050565b60006020828403121561385b5761385a6125a4565b5b600061386984828501613830565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006138ac8261271b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138de576138dd6130b8565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000613910826138e9565b61391a81856138f4565b935061392a818560208601612685565b613933816126af565b840191505092915050565b600060808201905061395360008301876127b0565b61396060208301866127b0565b61396d6040830185612846565b818103606083015261397f8184613905565b905095945050505050565b600081519050613999816125da565b92915050565b6000602082840312156139b5576139b46125a4565b5b60006139c38482850161398a565b9150509291505056fea2646970667358221220be47d9d328056778e9fc0bd2ee17ac113900c51d0ad56dadd0ff39ad9cd850b064736f6c634300081100330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001868747470733a2f2f6d617877656c6c6164656e2e78797a2f0000000000000000
Deployed Bytecode
0x60806040526004361061021a5760003560e01c80636352211e116101235780639ba411b1116100ab578063b88d4fde1161006f578063b88d4fde1461071c578063b98451cf14610738578063c87b56dd14610763578063e985e9c5146107a0578063f2fde38b146107dd5761021a565b80639ba411b11461065a578063a0712d6814610683578063a22cb4651461069f578063af8f8aa7146106c8578063b601be43146106f35761021a565b8063715018a6116100f2578063715018a6146105995780637389fbb7146105b05780638da5cb5b146105d957806395d89b41146106045780639a3bf7281461062f5761021a565b80636352211e146104df57806367999d2f1461051c5780636e920fc61461054557806370a082311461055c5761021a565b80632a97e449116101a657806335ac3c581161017557806335ac3c581461042d5780633ccfd60b1461045857806341f434341461046f57806342842e0e1461049a57806355f804b3146104b65761021a565b80632a97e449146103855780632d1a12f6146103ae5780632eb4a7ab146103d757806332cb6b0c146104025761021a565b8063095ea7b3116101ed578063095ea7b3146102db57806318160ddd146102f757806322f3e2d41461032257806323b872dd1461034d5780632904e6d9146103695761021a565b806301ffc9a71461021f578063049c5c491461025c57806306fdde0314610273578063081812fc1461029e575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612606565b610806565b604051610253919061264e565b60405180910390f35b34801561026857600080fd5b50610271610898565b005b34801561027f57600080fd5b506102886108cc565b60405161029591906126f9565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c09190612751565b61095e565b6040516102d291906127bf565b60405180910390f35b6102f560048036038101906102f09190612806565b6109dd565b005b34801561030357600080fd5b5061030c6109f6565b6040516103199190612855565b60405180910390f35b34801561032e57600080fd5b50610337610a0d565b604051610344919061264e565b60405180910390f35b61036760048036038101906103629190612870565b610a20565b005b610383600480360381019061037e9190612928565b610a6f565b005b34801561039157600080fd5b506103ac60048036038101906103a79190612751565b610d5e565b005b3480156103ba57600080fd5b506103d560048036038101906103d09190612988565b610d70565b005b3480156103e357600080fd5b506103ec610e28565b6040516103f991906129e1565b60405180910390f35b34801561040e57600080fd5b50610417610e2e565b6040516104249190612855565b60405180910390f35b34801561043957600080fd5b50610442610e34565b60405161044f9190612855565b60405180910390f35b34801561046457600080fd5b5061046d610e3a565b005b34801561047b57600080fd5b50610484610e98565b6040516104919190612a5b565b60405180910390f35b6104b460048036038101906104af9190612870565b610eaa565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190612ba6565b610ef9565b005b3480156104eb57600080fd5b5061050660048036038101906105019190612751565b610f14565b60405161051391906127bf565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e9190612751565b610f26565b005b34801561055157600080fd5b5061055a610f38565b005b34801561056857600080fd5b50610583600480360381019061057e9190612bef565b610f6c565b6040516105909190612855565b60405180910390f35b3480156105a557600080fd5b506105ae611024565b005b3480156105bc57600080fd5b506105d760048036038101906105d29190612751565b611038565b005b3480156105e557600080fd5b506105ee61104a565b6040516105fb91906127bf565b60405180910390f35b34801561061057600080fd5b50610619611074565b60405161062691906126f9565b60405180910390f35b34801561063b57600080fd5b50610644611106565b6040516106519190612855565b60405180910390f35b34801561066657600080fd5b50610681600480360381019061067c9190612c48565b61110c565b005b61069d60048036038101906106989190612751565b61111e565b005b3480156106ab57600080fd5b506106c660048036038101906106c19190612ca1565b61134d565b005b3480156106d457600080fd5b506106dd611366565b6040516106ea9190612855565b60405180910390f35b3480156106ff57600080fd5b5061071a60048036038101906107159190612751565b61136c565b005b61073660048036038101906107319190612d82565b61137e565b005b34801561074457600080fd5b5061074d6113cf565b60405161075a919061264e565b60405180910390f35b34801561076f57600080fd5b5061078a60048036038101906107859190612751565b6113e2565b60405161079791906126f9565b60405180910390f35b3480156107ac57600080fd5b506107c760048036038101906107c29190612e05565b611480565b6040516107d4919061264e565b60405180910390f35b3480156107e957600080fd5b5061080460048036038101906107ff9190612bef565b611514565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108915750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6108a0611597565b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b6060600280546108db90612e74565b80601f016020809104026020016040519081016040528092919081815260200182805461090790612e74565b80156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b5050505050905090565b600061096982611615565b61099f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b816109e781611674565b6109f18383611771565b505050565b6000610a00611781565b6001546000540303905090565b600b60009054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a5e57610a5d33611674565b5b610a69848484611786565b50505050565b8282610ae5828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5433604051602001610aca9190612eed565b60405160208183030381529060405280519060200120611aa8565b610b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1b90612f54565b60405180910390fd5b600c54610b2f6109f6565b1115610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790612fc0565b60405180910390fd5b6000610b7a6109f6565b9050600b60019054906101000a900460ff16610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc29061302c565b60405180910390fd5b600c548110610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0690613098565b60405180910390fd5b600e5484610c1c33610f6c565b610c2691906130e7565b1115610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90613167565b60405180910390fd5b600e5484601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610cb591906130e7565b1115610cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ced906131d3565b60405180910390fd5b83601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d4591906130e7565b92505081905550610d563385611abf565b505050505050565b610d66611597565b80600e8190555050565b610d78611597565b6000610d826109f6565b9050600c548382610d9391906130e7565b1115610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb9061323f565b60405180910390fd5b600c54811115610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e10906132ab565b60405180910390fd5b610e238284611abf565b505050565b600a5481565b600c5481565b600e5481565b610e42611597565b6000479050610e4f61104a565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e94573d6000803e3d6000fd5b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ee857610ee733611674565b5b610ef3848484611add565b50505050565b610f01611597565b8060099081610f10919061346d565b5050565b6000610f1f82611afd565b9050919050565b610f2e611597565b80600f8190555050565b610f40611597565b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fd3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61102c611597565b6110366000611bf5565b565b611040611597565b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461108390612e74565b80601f01602080910402602001604051908101604052809291908181526020018280546110af90612e74565b80156110fc5780601f106110d1576101008083540402835291602001916110fc565b820191906000526020600020905b8154815290600101906020018083116110df57829003601f168201915b5050505050905090565b600d5481565b611114611597565b80600a8190555050565b600c546111296109f6565b111561116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190612fc0565b60405180910390fd5b60006111746109f6565b9050600b60009054906101000a900460ff166111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc9061358b565b60405180910390fd5b600c5482826111d491906130e7565b1115611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c9061323f565b60405180910390fd5b600d5482111561125a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611251906135f7565b60405180910390fd5b600f5482601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112a891906130e7565b11156112e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e090613689565b60405180910390fd5b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461133891906130e7565b925050819055506113493383611abf565b5050565b8161135781611674565b6113618383611cbb565b505050565b600f5481565b611374611597565b80600d8190555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113bc576113bb33611674565b5b6113c885858585611dc6565b5050505050565b600b60019054906101000a900460ff1681565b60606113ed82611615565b611423576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061142d611e39565b9050600081510361144d5760405180602001604052806000815250611478565b8061145784611ecb565b6040516020016114689291906136e5565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61151c611597565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361158b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115829061377b565b60405180910390fd5b61159481611bf5565b50565b61159f611f1b565b73ffffffffffffffffffffffffffffffffffffffff166115bd61104a565b73ffffffffffffffffffffffffffffffffffffffff1614611613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160a906137e7565b60405180910390fd5b565b600081611620611781565b1115801561162f575060005482105b801561166d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561176e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016116eb929190613807565b602060405180830381865afa158015611708573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172c9190613845565b61176d57806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161176491906127bf565b60405180910390fd5b5b50565b61177d82826001611f23565b5050565b600090565b600061179182611afd565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117f8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806118048461206f565b9150915061181a8187611815612096565b61209e565b6118665761182f8661182a612096565b611480565b611865576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036118cc576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d986868660016120e2565b80156118e457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506119b28561198e8888876120e8565b7c020000000000000000000000000000000000000000000000000000000017612110565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611a385760006001850190506000600460008381526020019081526020016000205403611a36576000548114611a35578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aa0868686600161213b565b505050505050565b600082611ab58584612141565b1490509392505050565b611ad9828260405180602001604052806000815250612197565b5050565b611af88383836040518060200160405280600081525061137e565b505050565b600081611b08611781565b11611bbe576004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611bbd5760008103611bb8576000548210611b8d576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600460008360019003935083815260200190815260200160002054905060008103611bf057611b8e565b611bf0565b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060076000611cc8612096565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d75612096565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dba919061264e565b60405180910390a35050565b611dd1848484610a20565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e3357611dfc84848484612234565b611e32576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060098054611e4890612e74565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7490612e74565b8015611ec15780601f10611e9657610100808354040283529160200191611ec1565b820191906000526020600020905b815481529060010190602001808311611ea457829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115611f0657600184039350600a81066030018453600a8104905080611ee4575b50828103602084039350808452505050919050565b600033905090565b6000611f2e83610f14565b90508115611fb9578073ffffffffffffffffffffffffffffffffffffffff16611f55612096565b73ffffffffffffffffffffffffffffffffffffffff1614611fb857611f8181611f7c612096565b611480565b611fb7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86120ff868684612384565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008082905060005b845181101561218c576121778286838151811061216a57612169613872565b5b602002602001015161238d565b91508080612184906138a1565b91505061214a565b508091505092915050565b6121a183836123b8565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461222f57600080549050600083820390505b6121e16000868380600101945086612234565b612217576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106121ce57816000541461222c57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261225a612096565b8786866040518563ffffffff1660e01b815260040161227c949392919061393e565b6020604051808303816000875af19250505080156122b857506040513d601f19601f820116820180604052508101906122b5919061399f565b60015b612331573d80600081146122e8576040519150601f19603f3d011682016040523d82523d6000602084013e6122ed565b606091505b506000815103612329576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008183106123a5576123a08284612573565b6123b0565b6123af8383612573565b5b905092915050565b600080549050600082036123f8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61240560008483856120e2565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061247c8361246d60008660006120e8565b6124768561258a565b17612110565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461251d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506124e2565b5060008203612558576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061256e600084838561213b565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125e3816125ae565b81146125ee57600080fd5b50565b600081359050612600816125da565b92915050565b60006020828403121561261c5761261b6125a4565b5b600061262a848285016125f1565b91505092915050565b60008115159050919050565b61264881612633565b82525050565b6000602082019050612663600083018461263f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126a3578082015181840152602081019050612688565b60008484015250505050565b6000601f19601f8301169050919050565b60006126cb82612669565b6126d58185612674565b93506126e5818560208601612685565b6126ee816126af565b840191505092915050565b6000602082019050818103600083015261271381846126c0565b905092915050565b6000819050919050565b61272e8161271b565b811461273957600080fd5b50565b60008135905061274b81612725565b92915050565b600060208284031215612767576127666125a4565b5b60006127758482850161273c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127a98261277e565b9050919050565b6127b98161279e565b82525050565b60006020820190506127d460008301846127b0565b92915050565b6127e38161279e565b81146127ee57600080fd5b50565b600081359050612800816127da565b92915050565b6000806040838503121561281d5761281c6125a4565b5b600061282b858286016127f1565b925050602061283c8582860161273c565b9150509250929050565b61284f8161271b565b82525050565b600060208201905061286a6000830184612846565b92915050565b600080600060608486031215612889576128886125a4565b5b6000612897868287016127f1565b93505060206128a8868287016127f1565b92505060406128b98682870161273c565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126128e8576128e76128c3565b5b8235905067ffffffffffffffff811115612905576129046128c8565b5b602083019150836020820283011115612921576129206128cd565b5b9250929050565b600080600060408486031215612941576129406125a4565b5b600084013567ffffffffffffffff81111561295f5761295e6125a9565b5b61296b868287016128d2565b9350935050602061297e8682870161273c565b9150509250925092565b6000806040838503121561299f5761299e6125a4565b5b60006129ad8582860161273c565b92505060206129be858286016127f1565b9150509250929050565b6000819050919050565b6129db816129c8565b82525050565b60006020820190506129f660008301846129d2565b92915050565b6000819050919050565b6000612a21612a1c612a178461277e565b6129fc565b61277e565b9050919050565b6000612a3382612a06565b9050919050565b6000612a4582612a28565b9050919050565b612a5581612a3a565b82525050565b6000602082019050612a706000830184612a4c565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ab3826126af565b810181811067ffffffffffffffff82111715612ad257612ad1612a7b565b5b80604052505050565b6000612ae561259a565b9050612af18282612aaa565b919050565b600067ffffffffffffffff821115612b1157612b10612a7b565b5b612b1a826126af565b9050602081019050919050565b82818337600083830152505050565b6000612b49612b4484612af6565b612adb565b905082815260208101848484011115612b6557612b64612a76565b5b612b70848285612b27565b509392505050565b600082601f830112612b8d57612b8c6128c3565b5b8135612b9d848260208601612b36565b91505092915050565b600060208284031215612bbc57612bbb6125a4565b5b600082013567ffffffffffffffff811115612bda57612bd96125a9565b5b612be684828501612b78565b91505092915050565b600060208284031215612c0557612c046125a4565b5b6000612c13848285016127f1565b91505092915050565b612c25816129c8565b8114612c3057600080fd5b50565b600081359050612c4281612c1c565b92915050565b600060208284031215612c5e57612c5d6125a4565b5b6000612c6c84828501612c33565b91505092915050565b612c7e81612633565b8114612c8957600080fd5b50565b600081359050612c9b81612c75565b92915050565b60008060408385031215612cb857612cb76125a4565b5b6000612cc6858286016127f1565b9250506020612cd785828601612c8c565b9150509250929050565b600067ffffffffffffffff821115612cfc57612cfb612a7b565b5b612d05826126af565b9050602081019050919050565b6000612d25612d2084612ce1565b612adb565b905082815260208101848484011115612d4157612d40612a76565b5b612d4c848285612b27565b509392505050565b600082601f830112612d6957612d686128c3565b5b8135612d79848260208601612d12565b91505092915050565b60008060008060808587031215612d9c57612d9b6125a4565b5b6000612daa878288016127f1565b9450506020612dbb878288016127f1565b9350506040612dcc8782880161273c565b925050606085013567ffffffffffffffff811115612ded57612dec6125a9565b5b612df987828801612d54565b91505092959194509250565b60008060408385031215612e1c57612e1b6125a4565b5b6000612e2a858286016127f1565b9250506020612e3b858286016127f1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e8c57607f821691505b602082108103612e9f57612e9e612e45565b5b50919050565b60008160601b9050919050565b6000612ebd82612ea5565b9050919050565b6000612ecf82612eb2565b9050919050565b612ee7612ee28261279e565b612ec4565b82525050565b6000612ef98284612ed6565b60148201915081905092915050565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b6000612f3e601e83612674565b9150612f4982612f08565b602082019050919050565b60006020820190508181036000830152612f6d81612f31565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000612faa600f83612674565b9150612fb582612f74565b602082019050919050565b60006020820190508181036000830152612fd981612f9d565b9050919050565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b6000613016601583612674565b915061302182612fe0565b602082019050919050565b6000602082019050818103600083015261304581613009565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b6000613082601b83612674565b915061308d8261304c565b602082019050919050565b600060208201905081810360008301526130b181613075565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130f28261271b565b91506130fd8361271b565b9250828201905080821115613115576131146130b8565b5b92915050565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b6000613151602083612674565b915061315c8261311b565b602082019050919050565b6000602082019050818103600083015261318081613144565b9050919050565b7f596f75206861766520616c7265616479206d696e746564206d61780000000000600082015250565b60006131bd601b83612674565b91506131c882613187565b602082019050919050565b600060208201905081810360008301526131ec816131b0565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b6000613229601683612674565b9150613234826131f3565b602082019050919050565b600060208201905081810360008301526132588161321c565b9050919050565b7f546f74616c20737570706c79207370656e742e00000000000000000000000000600082015250565b6000613295601383612674565b91506132a08261325f565b602082019050919050565b600060208201905081810360008301526132c481613288565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261332d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826132f0565b61333786836132f0565b95508019841693508086168417925050509392505050565b600061336a6133656133608461271b565b6129fc565b61271b565b9050919050565b6000819050919050565b6133848361334f565b61339861339082613371565b8484546132fd565b825550505050565b600090565b6133ad6133a0565b6133b881848461337b565b505050565b5b818110156133dc576133d16000826133a5565b6001810190506133be565b5050565b601f821115613421576133f2816132cb565b6133fb846132e0565b8101602085101561340a578190505b61341e613416856132e0565b8301826133bd565b50505b505050565b600082821c905092915050565b600061344460001984600802613426565b1980831691505092915050565b600061345d8383613433565b9150826002028217905092915050565b61347682612669565b67ffffffffffffffff81111561348f5761348e612a7b565b5b6134998254612e74565b6134a48282856133e0565b600060209050601f8311600181146134d757600084156134c5578287015190505b6134cf8582613451565b865550613537565b601f1984166134e5866132cb565b60005b8281101561350d578489015182556001820191506020850194506020810190506134e8565b8683101561352a5784890151613526601f891682613433565b8355505b6001600288020188555050505b505050505050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b6000613575601d83612674565b91506135808261353f565b602082019050919050565b600060208201905081810360008301526135a481613568565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b60006135e1601e83612674565b91506135ec826135ab565b602082019050919050565b60006020820190508181036000830152613610816135d4565b9050919050565b7f596f75206861766520616c7265616479206d696e746564206f72206d696e746960008201527f6e67206d6f7265207468616e20616c6c6f7765642e0000000000000000000000602082015250565b6000613673603583612674565b915061367e82613617565b604082019050919050565b600060208201905081810360008301526136a281613666565b9050919050565b600081905092915050565b60006136bf82612669565b6136c981856136a9565b93506136d9818560208601612685565b80840191505092915050565b60006136f182856136b4565b91506136fd82846136b4565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613765602683612674565b915061377082613709565b604082019050919050565b6000602082019050818103600083015261379481613758565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137d1602083612674565b91506137dc8261379b565b602082019050919050565b60006020820190508181036000830152613800816137c4565b9050919050565b600060408201905061381c60008301856127b0565b61382960208301846127b0565b9392505050565b60008151905061383f81612c75565b92915050565b60006020828403121561385b5761385a6125a4565b5b600061386984828501613830565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006138ac8261271b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138de576138dd6130b8565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000613910826138e9565b61391a81856138f4565b935061392a818560208601612685565b613933816126af565b840191505092915050565b600060808201905061395360008301876127b0565b61396060208301866127b0565b61396d6040830185612846565b818103606083015261397f8184613905565b905095945050505050565b600081519050613999816125da565b92915050565b6000602082840312156139b5576139b46125a4565b5b60006139c38482850161398a565b9150509291505056fea2646970667358221220be47d9d328056778e9fc0bd2ee17ac113900c51d0ad56dadd0ff39ad9cd850b064736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001868747470733a2f2f6d617877656c6c6164656e2e78797a2f0000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): https://maxwelladen.xyz/
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [2] : 68747470733a2f2f6d617877656c6c6164656e2e78797a2f0000000000000000
Deployed Bytecode Sourcemap
208:4812:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9410:639:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3530:78:0;;;;;;;;;;;;;:::i;:::-;;10312:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16712:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4265:161:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6063:323:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;369:28:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4432:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1375:631;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3018:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1047:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;337:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;450:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;542:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3952:129;;;;;;;;;;;;;:::i;:::-;;753:143:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4605:175:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3736:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11705:152:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3153:119:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3614:116;;;;;;;;;;;;;:::i;:::-;;7247:233:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:103:9;;;;;;;;;;;;;:::i;:::-;;3414:110:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1236:87:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10488:104:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;487:50:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2912:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2041:560;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4087:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;591:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3278:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4786:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;402:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10698:318:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17661:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2142:201:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9410:639:4;9495:4;9834:10;9819:25;;:11;:25;;;;:102;;;;9911:10;9896:25;;:11;:25;;;;9819:102;:179;;;;9988:10;9973:25;;:11;:25;;;;9819:179;9799:199;;9410:639;;;:::o;3530:78:0:-;1122:13:9;:11;:13::i;:::-;3594:8:0::1;;;;;;;;;;;3593:9;3582:8;;:20;;;;;;;;;;;;;;;;;;3530:78::o:0;10312:100:4:-;10366:13;10399:5;10392:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10312:100;:::o;16712:218::-;16788:7;16813:16;16821:7;16813;:16::i;:::-;16808:64;;16838:34;;;;;;;;;;;;;;16808:64;16892:15;:24;16908:7;16892:24;;;;;;;;;;;:30;;;;;;;;;;;;16885:37;;16712:218;;;:::o;4265:161:0:-;4369:8;2274:30:8;2295:8;2274:20;:30::i;:::-;4388:32:0::1;4402:8;4412:7;4388:13;:32::i;:::-;4265:161:::0;;;:::o;6063:323:4:-;6124:7;6352:15;:13;:15::i;:::-;6337:12;;6321:13;;:28;:46;6314:53;;6063:323;:::o;369:28:0:-;;;;;;;;;;;;;:::o;4432:167::-;4541:4;2102:10:8;2094:18;;:4;:18;;;2090:83;;2129:32;2150:10;2129:20;:32::i;:::-;2090:83;4556:37:0::1;4575:4;4581:2;4585:7;4556:18;:37::i;:::-;4432:167:::0;;;;:::o;1375:631::-;1481:12;;2696:142;2731:11;;2696:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2759:10;;2813;2796:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;2786:39;;;;;;2696:18;:142::i;:::-;2676:216;;;;;;;;;;;;:::i;:::-;;;;;;;;;920:10:::1;;903:13;:11;:13::i;:::-;:27;;895:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;1513:17:::2;1533:13;:11;:13::i;:::-;1513:33;;1563:21;;;;;;;;;;;1555:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;1637:10;;1625:9;:22;1617:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;1728:25;;1718:6;1694:21;1704:10;1694:9;:21::i;:::-;:30;;;;:::i;:::-;:59;;1686:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;1851:25;;1841:6;1805:21;:33;1827:10;1805:33;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:71;;1797:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;1954:6;1917:21;:33;1939:10;1917:33;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;1969:29;1979:10;1991:6;1969:9;:29::i;:::-;1506:500;1375:631:::0;;;;;:::o;3018:129::-;1122:13:9;:11;:13::i;:::-;3133:8:0::1;3105:25;:36;;;;3018:129:::0;:::o;1047:281::-;1122:13:9;:11;:13::i;:::-;1124:14:0::1;1141:13;:11;:13::i;:::-;1124:30;;1190:10;;1180:6;1171;:15;;;;:::i;:::-;:29;;1163:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1252:10;;1242:6;:20;;1234:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1295:27;1305:8;1315:6;1295:9;:27::i;:::-;1117:211;1047:281:::0;;:::o;337:25::-;;;;:::o;450:32::-;;;;:::o;542:44::-;;;;:::o;3952:129::-;1122:13:9;:11;:13::i;:::-;3998:12:0::1;4013:21;3998:36;;4049:7;:5;:7::i;:::-;4041:25;;:34;4067:7;4041:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;3991:90;3952:129::o:0;753:143:8:-;853:42;753:143;:::o;4605:175:0:-;4718:4;2102:10:8;2094:18;;:4;:18;;;2090:83;;2129:32;2150:10;2129:20;:32::i;:::-;2090:83;4733:41:0::1;4756:4;4762:2;4766:7;4733:22;:41::i;:::-;4605:175:::0;;;;:::o;3736:96::-;1122:13:9;:11;:13::i;:::-;3819:7:0::1;3803:13;:23;;;;;;:::i;:::-;;3736:96:::0;:::o;11705:152:4:-;11777:7;11820:27;11839:7;11820:18;:27::i;:::-;11797:52;;11705:152;;;:::o;3153:119:0:-;1122:13:9;:11;:13::i;:::-;3260:6:0::1;3235:22;:31;;;;3153:119:::0;:::o;3614:116::-;1122:13:9;:11;:13::i;:::-;3703:21:0::1;;;;;;;;;;;3702:22;3678:21;;:46;;;;;;;;;;;;;;;;;;3614:116::o:0;7247:233:4:-;7319:7;7360:1;7343:19;;:5;:19;;;7339:60;;7371:28;;;;;;;;;;;;;;7339:60;1406:13;7417:18;:25;7436:5;7417:25;;;;;;;;;;;;;;;;:55;7410:62;;7247:233;;;:::o;1884:103:9:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;3414:110:0:-;1122:13:9;:11;:13::i;:::-;3504:14:0::1;3491:10;:27;;;;3414:110:::0;:::o;1236:87:9:-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;10488:104:4:-;10544:13;10577:7;10570:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10488:104;:::o;487:50:0:-;;;;:::o;2912:98::-;1122:13:9;:11;:13::i;:::-;2995:9:0::1;2982:10;:22;;;;2912:98:::0;:::o;2041:560::-;920:10;;903:13;:11;:13::i;:::-;:27;;895:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2104:17:::1;2124:13;:11;:13::i;:::-;2104:33;;2154:8;;;;;;;;;;;2146:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;2233:10;;2223:6;2211:9;:18;;;;:::i;:::-;:32;;2203:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2296:31;;2286:6;:41;;2277:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;2420:22;;2410:6;2377:18;:30;2396:10;2377:30;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:65;;2369:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;2545:6;2511:18;:30;2530:10;2511:30;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;2560:29;2570:10;2582:6;2560:9;:29::i;:::-;2097:504;2041:560:::0;:::o;4087:172::-;4191:8;2274:30:8;2295:8;2274:20;:30::i;:::-;4210:43:0::1;4234:8;4244;4210:23;:43::i;:::-;4087:172:::0;;;:::o;591:41::-;;;;:::o;3278:130::-;1122:13:9;:11;:13::i;:::-;3396:6:0::1;3362:31;:40;;;;3278:130:::0;:::o;4786:231::-;4946:4;2102:10:8;2094:18;;:4;:18;;;2090:83;;2129:32;2150:10;2129:20;:32::i;:::-;2090:83;4964:47:0::1;4987:4;4993:2;4997:7;5006:4;4964:22;:47::i;:::-;4786:231:::0;;;;;:::o;402:41::-;;;;;;;;;;;;;:::o;10698:318:4:-;10771:13;10802:16;10810:7;10802;:16::i;:::-;10797:59;;10827:29;;;;;;;;;;;;;;10797:59;10869:21;10893:10;:8;:10::i;:::-;10869:34;;10946:1;10927:7;10921:21;:26;:87;;;;;;;;;;;;;;;;;10974:7;10983:18;10993:7;10983:9;:18::i;:::-;10957:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10921:87;10914:94;;;10698:318;;;:::o;17661:164::-;17758:4;17782:18;:25;17801:5;17782:25;;;;;;;;;;;;;;;:35;17808:8;17782:35;;;;;;;;;;;;;;;;;;;;;;;;;17775:42;;17661:164;;;;:::o;2142:201:9:-;1122:13;:11;:13::i;:::-;2251:1:::1;2231:22;;:8;:22;;::::0;2223:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:28;2326:8;2307:18;:28::i;:::-;2142:201:::0;:::o;1401:132::-;1476:12;:10;:12::i;:::-;1465:23;;:7;:5;:7::i;:::-;:23;;;1457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1401:132::o;18083:282:4:-;18148:4;18204:7;18185:15;:13;:15::i;:::-;:26;;:66;;;;;18238:13;;18228:7;:23;18185:66;:153;;;;;18337:1;2182:8;18289:17;:26;18307:7;18289:26;;;;;;;;;;;;:44;:49;18185:153;18165:173;;18083:282;;;:::o;2332:419:8:-;2571:1;853:42;2523:45;;;:49;2519:225;;;853:42;2594;;;2645:4;2652:8;2594:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2589:144;;2708:8;2689:28;;;;;;;;;;;:::i;:::-;;;;;;;;2589:144;2519:225;2332:419;:::o;16429:124:4:-;16518:27;16527:2;16531:7;16540:4;16518:8;:27::i;:::-;16429:124;;:::o;5579:92::-;5635:7;5579:92;:::o;20351:2825::-;20493:27;20523;20542:7;20523:18;:27::i;:::-;20493:57;;20608:4;20567:45;;20583:19;20567:45;;;20563:86;;20621:28;;;;;;;;;;;;;;20563:86;20663:27;20692:23;20719:35;20746:7;20719:26;:35::i;:::-;20662:92;;;;20854:68;20879:15;20896:4;20902:19;:17;:19::i;:::-;20854:24;:68::i;:::-;20849:180;;20942:43;20959:4;20965:19;:17;:19::i;:::-;20942:16;:43::i;:::-;20937:92;;20994:35;;;;;;;;;;;;;;20937:92;20849:180;21060:1;21046:16;;:2;:16;;;21042:52;;21071:23;;;;;;;;;;;;;;21042:52;21107:43;21129:4;21135:2;21139:7;21148:1;21107:21;:43::i;:::-;21243:15;21240:160;;;21383:1;21362:19;21355:30;21240:160;21780:18;:24;21799:4;21780:24;;;;;;;;;;;;;;;;21778:26;;;;;;;;;;;;21849:18;:22;21868:2;21849:22;;;;;;;;;;;;;;;;21847:24;;;;;;;;;;;22171:146;22208:2;22257:45;22272:4;22278:2;22282:19;22257:14;:45::i;:::-;2462:8;22229:73;22171:18;:146::i;:::-;22142:17;:26;22160:7;22142:26;;;;;;;;;;;:175;;;;22488:1;2462:8;22437:19;:47;:52;22433:627;;22510:19;22542:1;22532:7;:11;22510:33;;22699:1;22665:17;:30;22683:11;22665:30;;;;;;;;;;;;:35;22661:384;;22803:13;;22788:11;:28;22784:242;;22983:19;22950:17;:30;22968:11;22950:30;;;;;;;;;;;:52;;;;22784:242;22661:384;22491:569;22433:627;23107:7;23103:2;23088:27;;23097:4;23088:27;;;;;;;;;;;;23126:42;23147:4;23153:2;23157:7;23166:1;23126:20;:42::i;:::-;20482:2694;;;20351:2825;;;:::o;1182:190:7:-;1307:4;1360;1331:25;1344:5;1351:4;1331:12;:25::i;:::-;:33;1324:40;;1182:190;;;;;:::o;34223:112:4:-;34300:27;34310:2;34314:8;34300:27;;;;;;;;;;;;:9;:27::i;:::-;34223:112;;:::o;23272:193::-;23418:39;23435:4;23441:2;23445:7;23418:39;;;;;;;;;;;;:16;:39::i;:::-;23272:193;;;:::o;12860:1712::-;12927:14;12977:7;12958:15;:13;:15::i;:::-;:26;12954:1562;;13010:17;:26;13028:7;13010:26;;;;;;;;;;;;13001:35;;13114:1;2182:8;13086:6;:24;:29;13082:1423;;13235:1;13225:6;:11;13221:981;;13276:13;;13265:7;:24;13261:68;;13298:31;;;;;;;;;;;;;;13261:68;13926:257;14012:17;:28;14030:9;;;;;;;14012:28;;;;;;;;;;;;14003:37;;14108:1;14098:6;:11;14146:13;14094:25;13926:257;;13221:981;14476:13;;13082:1423;12954:1562;14533:31;;;;;;;;;;;;;;12860:1712;;;;:::o;2503:191:9:-;2577:16;2596:6;;;;;;;;;;;2577:25;;2622:8;2613:6;;:17;;;;;;;;;;;;;;;;;;2677:8;2646:40;;2667:8;2646:40;;;;;;;;;;;;2566:128;2503:191;:::o;17270:234:4:-;17417:8;17365:18;:39;17384:19;:17;:19::i;:::-;17365:39;;;;;;;;;;;;;;;:49;17405:8;17365:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17477:8;17441:55;;17456:19;:17;:19::i;:::-;17441:55;;;17487:8;17441:55;;;;;;:::i;:::-;;;;;;;;17270:234;;:::o;24063:407::-;24238:31;24251:4;24257:2;24261:7;24238:12;:31::i;:::-;24302:1;24284:2;:14;;;:19;24280:183;;24323:56;24354:4;24360:2;24364:7;24373:5;24323:30;:56::i;:::-;24318:145;;24407:40;;;;;;;;;;;;;;24318:145;24280:183;24063:407;;;;:::o;3838:108:0:-;3898:13;3927;3920:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3838:108;:::o;41896:1745:4:-;41961:17;42395:4;42388;42382:11;42378:22;42487:1;42481:4;42474:15;42562:4;42559:1;42555:12;42548:19;;42644:1;42639:3;42632:14;42748:3;42987:5;42969:428;42995:1;42969:428;;;43035:1;43030:3;43026:11;43019:18;;43206:2;43200:4;43196:13;43192:2;43188:22;43183:3;43175:36;43300:2;43294:4;43290:13;43282:21;;43367:4;42969:428;43357:25;42969:428;42973:21;43436:3;43431;43427:13;43551:4;43546:3;43542:14;43535:21;;43616:6;43611:3;43604:19;42000:1634;;;41896:1745;;;:::o;656:98:1:-;709:7;736:10;729:17;;656:98;:::o;35141:492:4:-;35270:13;35286:16;35294:7;35286;:16::i;:::-;35270:32;;35319:13;35315:219;;;35374:5;35351:28;;:19;:17;:19::i;:::-;:28;;;35347:187;;35403:44;35420:5;35427:19;:17;:19::i;:::-;35403:16;:44::i;:::-;35398:136;;35479:35;;;;;;;;;;;;;;35398:136;35347:187;35315:219;35579:2;35546:15;:24;35562:7;35546:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;35617:7;35613:2;35597:28;;35606:5;35597:28;;;;;;;;;;;;35259:374;35141:492;;;:::o;19246:485::-;19348:27;19377:23;19418:38;19459:15;:24;19475:7;19459:24;;;;;;;;;;;19418:65;;19636:18;19613:41;;19693:19;19687:26;19668:45;;19598:126;19246:485;;;:::o;41689:105::-;41749:7;41776:10;41769:17;;41689:105;:::o;18474:659::-;18623:11;18788:16;18781:5;18777:28;18768:37;;18948:16;18937:9;18933:32;18920:45;;19098:15;19087:9;19084:30;19076:5;19065:9;19062:20;19059:56;19049:66;;18474:659;;;;;:::o;25132:159::-;;;;;:::o;40998:311::-;41133:7;41153:16;2586:3;41179:19;:41;;41153:68;;2586:3;41247:31;41258:4;41264:2;41268:9;41247:10;:31::i;:::-;41239:40;;:62;;41232:69;;;40998:311;;;;;:::o;15120:450::-;15200:14;15368:16;15361:5;15357:28;15348:37;;15545:5;15531:11;15506:23;15502:41;15499:52;15492:5;15489:63;15479:73;;15120:450;;;;:::o;25956:158::-;;;;;:::o;2049:296:7:-;2132:7;2152:20;2175:4;2152:27;;2195:9;2190:118;2214:5;:12;2210:1;:16;2190:118;;;2263:33;2273:12;2287:5;2293:1;2287:8;;;;;;;;:::i;:::-;;;;;;;;2263:9;:33::i;:::-;2248:48;;2228:3;;;;;:::i;:::-;;;;2190:118;;;;2325:12;2318:19;;;2049:296;;;;:::o;33450:689:4:-;33581:19;33587:2;33591:8;33581:5;:19::i;:::-;33660:1;33642:2;:14;;;:19;33638:483;;33682:11;33696:13;;33682:27;;33728:13;33750:8;33744:3;:14;33728:30;;33777:233;33808:62;33847:1;33851:2;33855:7;;;;;;33864:5;33808:30;:62::i;:::-;33803:167;;33906:40;;;;;;;;;;;;;;33803:167;34005:3;33997:5;:11;33777:233;;34092:3;34075:13;;:20;34071:34;;34097:8;;;34071:34;33663:458;;33638:483;33450:689;;;:::o;26554:716::-;26717:4;26763:2;26738:45;;;26784:19;:17;:19::i;:::-;26805:4;26811:7;26820:5;26738:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26734:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27038:1;27021:6;:13;:18;27017:235;;27067:40;;;;;;;;;;;;;;27017:235;27210:6;27204:13;27195:6;27191:2;27187:15;27180:38;26734:529;26907:54;;;26897:64;;;:6;:64;;;;26890:71;;;26554:716;;;;;;:::o;40699:147::-;40836:6;40699:147;;;;;:::o;9089:149:7:-;9152:7;9183:1;9179;:5;:51;;9210:20;9225:1;9228;9210:14;:20::i;:::-;9179:51;;;9187:20;9202:1;9205;9187:14;:20::i;:::-;9179:51;9172:58;;9089:149;;;;:::o;27732:2966:4:-;27805:20;27828:13;;27805:36;;27868:1;27856:8;:13;27852:44;;27878:18;;;;;;;;;;;;;;27852:44;27909:61;27939:1;27943:2;27947:12;27961:8;27909:21;:61::i;:::-;28453:1;1544:2;28423:1;:26;;28422:32;28410:8;:45;28384:18;:22;28403:2;28384:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28732:139;28769:2;28823:33;28846:1;28850:2;28854:1;28823:14;:33::i;:::-;28790:30;28811:8;28790:20;:30::i;:::-;:66;28732:18;:139::i;:::-;28698:17;:31;28716:12;28698:31;;;;;;;;;;;:173;;;;28888:16;28919:11;28948:8;28933:12;:23;28919:37;;29469:16;29465:2;29461:25;29449:37;;29841:12;29801:8;29760:1;29698:25;29639:1;29578;29551:335;30212:1;30198:12;30194:20;30152:346;30253:3;30244:7;30241:16;30152:346;;30471:7;30461:8;30458:1;30431:25;30428:1;30425;30420:59;30306:1;30297:7;30293:15;30282:26;;30152:346;;;30156:77;30543:1;30531:8;:13;30527:45;;30553:19;;;;;;;;;;;;;;30527:45;30605:3;30589:13;:19;;;;28158:2462;;30630:60;30659:1;30663:2;30667:12;30681:8;30630:20;:60::i;:::-;27794:2904;27732:2966;;:::o;9246:268:7:-;9314:13;9421:1;9415:4;9408:15;9450:1;9444:4;9437:15;9491:4;9485;9475:21;9466:30;;9246:268;;;;:::o;15672:324:4:-;15742:14;15975:1;15965:8;15962:15;15936:24;15932:46;15922:56;;15672:324;;;:::o;7:75:10:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:117;6222:1;6219;6212:12;6253:568;6326:8;6336:6;6386:3;6379:4;6371:6;6367:17;6363:27;6353:122;;6394:79;;:::i;:::-;6353:122;6507:6;6494:20;6484:30;;6537:18;6529:6;6526:30;6523:117;;;6559:79;;:::i;:::-;6523:117;6673:4;6665:6;6661:17;6649:29;;6727:3;6719:4;6711:6;6707:17;6697:8;6693:32;6690:41;6687:128;;;6734:79;;:::i;:::-;6687:128;6253:568;;;;;:::o;6827:704::-;6922:6;6930;6938;6987:2;6975:9;6966:7;6962:23;6958:32;6955:119;;;6993:79;;:::i;:::-;6955:119;7141:1;7130:9;7126:17;7113:31;7171:18;7163:6;7160:30;7157:117;;;7193:79;;:::i;:::-;7157:117;7306:80;7378:7;7369:6;7358:9;7354:22;7306:80;:::i;:::-;7288:98;;;;7084:312;7435:2;7461:53;7506:7;7497:6;7486:9;7482:22;7461:53;:::i;:::-;7451:63;;7406:118;6827:704;;;;;:::o;7537:474::-;7605:6;7613;7662:2;7650:9;7641:7;7637:23;7633:32;7630:119;;;7668:79;;:::i;:::-;7630:119;7788:1;7813:53;7858:7;7849:6;7838:9;7834:22;7813:53;:::i;:::-;7803:63;;7759:117;7915:2;7941:53;7986:7;7977:6;7966:9;7962:22;7941:53;:::i;:::-;7931:63;;7886:118;7537:474;;;;;:::o;8017:77::-;8054:7;8083:5;8072:16;;8017:77;;;:::o;8100:118::-;8187:24;8205:5;8187:24;:::i;:::-;8182:3;8175:37;8100:118;;:::o;8224:222::-;8317:4;8355:2;8344:9;8340:18;8332:26;;8368:71;8436:1;8425:9;8421:17;8412:6;8368:71;:::i;:::-;8224:222;;;;:::o;8452:60::-;8480:3;8501:5;8494:12;;8452:60;;;:::o;8518:142::-;8568:9;8601:53;8619:34;8628:24;8646:5;8628:24;:::i;:::-;8619:34;:::i;:::-;8601:53;:::i;:::-;8588:66;;8518:142;;;:::o;8666:126::-;8716:9;8749:37;8780:5;8749:37;:::i;:::-;8736:50;;8666:126;;;:::o;8798:158::-;8880:9;8913:37;8944:5;8913:37;:::i;:::-;8900:50;;8798:158;;;:::o;8962:195::-;9081:69;9144:5;9081:69;:::i;:::-;9076:3;9069:82;8962:195;;:::o;9163:286::-;9288:4;9326:2;9315:9;9311:18;9303:26;;9339:103;9439:1;9428:9;9424:17;9415:6;9339:103;:::i;:::-;9163:286;;;;:::o;9455:117::-;9564:1;9561;9554:12;9578:180;9626:77;9623:1;9616:88;9723:4;9720:1;9713:15;9747:4;9744:1;9737:15;9764:281;9847:27;9869:4;9847:27;:::i;:::-;9839:6;9835:40;9977:6;9965:10;9962:22;9941:18;9929:10;9926:34;9923:62;9920:88;;;9988:18;;:::i;:::-;9920:88;10028:10;10024:2;10017:22;9807:238;9764:281;;:::o;10051:129::-;10085:6;10112:20;;:::i;:::-;10102:30;;10141:33;10169:4;10161:6;10141:33;:::i;:::-;10051:129;;;:::o;10186:308::-;10248:4;10338:18;10330:6;10327:30;10324:56;;;10360:18;;:::i;:::-;10324:56;10398:29;10420:6;10398:29;:::i;:::-;10390:37;;10482:4;10476;10472:15;10464:23;;10186:308;;;:::o;10500:146::-;10597:6;10592:3;10587;10574:30;10638:1;10629:6;10624:3;10620:16;10613:27;10500:146;;;:::o;10652:425::-;10730:5;10755:66;10771:49;10813:6;10771:49;:::i;:::-;10755:66;:::i;:::-;10746:75;;10844:6;10837:5;10830:21;10882:4;10875:5;10871:16;10920:3;10911:6;10906:3;10902:16;10899:25;10896:112;;;10927:79;;:::i;:::-;10896:112;11017:54;11064:6;11059:3;11054;11017:54;:::i;:::-;10736:341;10652:425;;;;;:::o;11097:340::-;11153:5;11202:3;11195:4;11187:6;11183:17;11179:27;11169:122;;11210:79;;:::i;:::-;11169:122;11327:6;11314:20;11352:79;11427:3;11419:6;11412:4;11404:6;11400:17;11352:79;:::i;:::-;11343:88;;11159:278;11097:340;;;;:::o;11443:509::-;11512:6;11561:2;11549:9;11540:7;11536:23;11532:32;11529:119;;;11567:79;;:::i;:::-;11529:119;11715:1;11704:9;11700:17;11687:31;11745:18;11737:6;11734:30;11731:117;;;11767:79;;:::i;:::-;11731:117;11872:63;11927:7;11918:6;11907:9;11903:22;11872:63;:::i;:::-;11862:73;;11658:287;11443:509;;;;:::o;11958:329::-;12017:6;12066:2;12054:9;12045:7;12041:23;12037:32;12034:119;;;12072:79;;:::i;:::-;12034:119;12192:1;12217:53;12262:7;12253:6;12242:9;12238:22;12217:53;:::i;:::-;12207:63;;12163:117;11958:329;;;;:::o;12293:122::-;12366:24;12384:5;12366:24;:::i;:::-;12359:5;12356:35;12346:63;;12405:1;12402;12395:12;12346:63;12293:122;:::o;12421:139::-;12467:5;12505:6;12492:20;12483:29;;12521:33;12548:5;12521:33;:::i;:::-;12421:139;;;;:::o;12566:329::-;12625:6;12674:2;12662:9;12653:7;12649:23;12645:32;12642:119;;;12680:79;;:::i;:::-;12642:119;12800:1;12825:53;12870:7;12861:6;12850:9;12846:22;12825:53;:::i;:::-;12815:63;;12771:117;12566:329;;;;:::o;12901:116::-;12971:21;12986:5;12971:21;:::i;:::-;12964:5;12961:32;12951:60;;13007:1;13004;12997:12;12951:60;12901:116;:::o;13023:133::-;13066:5;13104:6;13091:20;13082:29;;13120:30;13144:5;13120:30;:::i;:::-;13023:133;;;;:::o;13162:468::-;13227:6;13235;13284:2;13272:9;13263:7;13259:23;13255:32;13252:119;;;13290:79;;:::i;:::-;13252:119;13410:1;13435:53;13480:7;13471:6;13460:9;13456:22;13435:53;:::i;:::-;13425:63;;13381:117;13537:2;13563:50;13605:7;13596:6;13585:9;13581:22;13563:50;:::i;:::-;13553:60;;13508:115;13162:468;;;;;:::o;13636:307::-;13697:4;13787:18;13779:6;13776:30;13773:56;;;13809:18;;:::i;:::-;13773:56;13847:29;13869:6;13847:29;:::i;:::-;13839:37;;13931:4;13925;13921:15;13913:23;;13636:307;;;:::o;13949:423::-;14026:5;14051:65;14067:48;14108:6;14067:48;:::i;:::-;14051:65;:::i;:::-;14042:74;;14139:6;14132:5;14125:21;14177:4;14170:5;14166:16;14215:3;14206:6;14201:3;14197:16;14194:25;14191:112;;;14222:79;;:::i;:::-;14191:112;14312:54;14359:6;14354:3;14349;14312:54;:::i;:::-;14032:340;13949:423;;;;;:::o;14391:338::-;14446:5;14495:3;14488:4;14480:6;14476:17;14472:27;14462:122;;14503:79;;:::i;:::-;14462:122;14620:6;14607:20;14645:78;14719:3;14711:6;14704:4;14696:6;14692:17;14645:78;:::i;:::-;14636:87;;14452:277;14391:338;;;;:::o;14735:943::-;14830:6;14838;14846;14854;14903:3;14891:9;14882:7;14878:23;14874:33;14871:120;;;14910:79;;:::i;:::-;14871:120;15030:1;15055:53;15100:7;15091:6;15080:9;15076:22;15055:53;:::i;:::-;15045:63;;15001:117;15157:2;15183:53;15228:7;15219:6;15208:9;15204:22;15183:53;:::i;:::-;15173:63;;15128:118;15285:2;15311:53;15356:7;15347:6;15336:9;15332:22;15311:53;:::i;:::-;15301:63;;15256:118;15441:2;15430:9;15426:18;15413:32;15472:18;15464:6;15461:30;15458:117;;;15494:79;;:::i;:::-;15458:117;15599:62;15653:7;15644:6;15633:9;15629:22;15599:62;:::i;:::-;15589:72;;15384:287;14735:943;;;;;;;:::o;15684:474::-;15752:6;15760;15809:2;15797:9;15788:7;15784:23;15780:32;15777:119;;;15815:79;;:::i;:::-;15777:119;15935:1;15960:53;16005:7;15996:6;15985:9;15981:22;15960:53;:::i;:::-;15950:63;;15906:117;16062:2;16088:53;16133:7;16124:6;16113:9;16109:22;16088:53;:::i;:::-;16078:63;;16033:118;15684:474;;;;;:::o;16164:180::-;16212:77;16209:1;16202:88;16309:4;16306:1;16299:15;16333:4;16330:1;16323:15;16350:320;16394:6;16431:1;16425:4;16421:12;16411:22;;16478:1;16472:4;16468:12;16499:18;16489:81;;16555:4;16547:6;16543:17;16533:27;;16489:81;16617:2;16609:6;16606:14;16586:18;16583:38;16580:84;;16636:18;;:::i;:::-;16580:84;16401:269;16350:320;;;:::o;16676:94::-;16709:8;16757:5;16753:2;16749:14;16728:35;;16676:94;;;:::o;16776:::-;16815:7;16844:20;16858:5;16844:20;:::i;:::-;16833:31;;16776:94;;;:::o;16876:100::-;16915:7;16944:26;16964:5;16944:26;:::i;:::-;16933:37;;16876:100;;;:::o;16982:157::-;17087:45;17107:24;17125:5;17107:24;:::i;:::-;17087:45;:::i;:::-;17082:3;17075:58;16982:157;;:::o;17145:256::-;17257:3;17272:75;17343:3;17334:6;17272:75;:::i;:::-;17372:2;17367:3;17363:12;17356:19;;17392:3;17385:10;;17145:256;;;;:::o;17407:180::-;17547:32;17543:1;17535:6;17531:14;17524:56;17407:180;:::o;17593:366::-;17735:3;17756:67;17820:2;17815:3;17756:67;:::i;:::-;17749:74;;17832:93;17921:3;17832:93;:::i;:::-;17950:2;17945:3;17941:12;17934:19;;17593:366;;;:::o;17965:419::-;18131:4;18169:2;18158:9;18154:18;18146:26;;18218:9;18212:4;18208:20;18204:1;18193:9;18189:17;18182:47;18246:131;18372:4;18246:131;:::i;:::-;18238:139;;17965:419;;;:::o;18390:165::-;18530:17;18526:1;18518:6;18514:14;18507:41;18390:165;:::o;18561:366::-;18703:3;18724:67;18788:2;18783:3;18724:67;:::i;:::-;18717:74;;18800:93;18889:3;18800:93;:::i;:::-;18918:2;18913:3;18909:12;18902:19;;18561:366;;;:::o;18933:419::-;19099:4;19137:2;19126:9;19122:18;19114:26;;19186:9;19180:4;19176:20;19172:1;19161:9;19157:17;19150:47;19214:131;19340:4;19214:131;:::i;:::-;19206:139;;18933:419;;;:::o;19358:171::-;19498:23;19494:1;19486:6;19482:14;19475:47;19358:171;:::o;19535:366::-;19677:3;19698:67;19762:2;19757:3;19698:67;:::i;:::-;19691:74;;19774:93;19863:3;19774:93;:::i;:::-;19892:2;19887:3;19883:12;19876:19;;19535:366;;;:::o;19907:419::-;20073:4;20111:2;20100:9;20096:18;20088:26;;20160:9;20154:4;20150:20;20146:1;20135:9;20131:17;20124:47;20188:131;20314:4;20188:131;:::i;:::-;20180:139;;19907:419;;;:::o;20332:177::-;20472:29;20468:1;20460:6;20456:14;20449:53;20332:177;:::o;20515:366::-;20657:3;20678:67;20742:2;20737:3;20678:67;:::i;:::-;20671:74;;20754:93;20843:3;20754:93;:::i;:::-;20872:2;20867:3;20863:12;20856:19;;20515:366;;;:::o;20887:419::-;21053:4;21091:2;21080:9;21076:18;21068:26;;21140:9;21134:4;21130:20;21126:1;21115:9;21111:17;21104:47;21168:131;21294:4;21168:131;:::i;:::-;21160:139;;20887:419;;;:::o;21312:180::-;21360:77;21357:1;21350:88;21457:4;21454:1;21447:15;21481:4;21478:1;21471:15;21498:191;21538:3;21557:20;21575:1;21557:20;:::i;:::-;21552:25;;21591:20;21609:1;21591:20;:::i;:::-;21586:25;;21634:1;21631;21627:9;21620:16;;21655:3;21652:1;21649:10;21646:36;;;21662:18;;:::i;:::-;21646:36;21498:191;;;;:::o;21695:182::-;21835:34;21831:1;21823:6;21819:14;21812:58;21695:182;:::o;21883:366::-;22025:3;22046:67;22110:2;22105:3;22046:67;:::i;:::-;22039:74;;22122:93;22211:3;22122:93;:::i;:::-;22240:2;22235:3;22231:12;22224:19;;21883:366;;;:::o;22255:419::-;22421:4;22459:2;22448:9;22444:18;22436:26;;22508:9;22502:4;22498:20;22494:1;22483:9;22479:17;22472:47;22536:131;22662:4;22536:131;:::i;:::-;22528:139;;22255:419;;;:::o;22680:177::-;22820:29;22816:1;22808:6;22804:14;22797:53;22680:177;:::o;22863:366::-;23005:3;23026:67;23090:2;23085:3;23026:67;:::i;:::-;23019:74;;23102:93;23191:3;23102:93;:::i;:::-;23220:2;23215:3;23211:12;23204:19;;22863:366;;;:::o;23235:419::-;23401:4;23439:2;23428:9;23424:18;23416:26;;23488:9;23482:4;23478:20;23474:1;23463:9;23459:17;23452:47;23516:131;23642:4;23516:131;:::i;:::-;23508:139;;23235:419;;;:::o;23660:172::-;23800:24;23796:1;23788:6;23784:14;23777:48;23660:172;:::o;23838:366::-;23980:3;24001:67;24065:2;24060:3;24001:67;:::i;:::-;23994:74;;24077:93;24166:3;24077:93;:::i;:::-;24195:2;24190:3;24186:12;24179:19;;23838:366;;;:::o;24210:419::-;24376:4;24414:2;24403:9;24399:18;24391:26;;24463:9;24457:4;24453:20;24449:1;24438:9;24434:17;24427:47;24491:131;24617:4;24491:131;:::i;:::-;24483:139;;24210:419;;;:::o;24635:169::-;24775:21;24771:1;24763:6;24759:14;24752:45;24635:169;:::o;24810:366::-;24952:3;24973:67;25037:2;25032:3;24973:67;:::i;:::-;24966:74;;25049:93;25138:3;25049:93;:::i;:::-;25167:2;25162:3;25158:12;25151:19;;24810:366;;;:::o;25182:419::-;25348:4;25386:2;25375:9;25371:18;25363:26;;25435:9;25429:4;25425:20;25421:1;25410:9;25406:17;25399:47;25463:131;25589:4;25463:131;:::i;:::-;25455:139;;25182:419;;;:::o;25607:141::-;25656:4;25679:3;25671:11;;25702:3;25699:1;25692:14;25736:4;25733:1;25723:18;25715:26;;25607:141;;;:::o;25754:93::-;25791:6;25838:2;25833;25826:5;25822:14;25818:23;25808:33;;25754:93;;;:::o;25853:107::-;25897:8;25947:5;25941:4;25937:16;25916:37;;25853:107;;;;:::o;25966:393::-;26035:6;26085:1;26073:10;26069:18;26108:97;26138:66;26127:9;26108:97;:::i;:::-;26226:39;26256:8;26245:9;26226:39;:::i;:::-;26214:51;;26298:4;26294:9;26287:5;26283:21;26274:30;;26347:4;26337:8;26333:19;26326:5;26323:30;26313:40;;26042:317;;25966:393;;;;;:::o;26365:142::-;26415:9;26448:53;26466:34;26475:24;26493:5;26475:24;:::i;:::-;26466:34;:::i;:::-;26448:53;:::i;:::-;26435:66;;26365:142;;;:::o;26513:75::-;26556:3;26577:5;26570:12;;26513:75;;;:::o;26594:269::-;26704:39;26735:7;26704:39;:::i;:::-;26765:91;26814:41;26838:16;26814:41;:::i;:::-;26806:6;26799:4;26793:11;26765:91;:::i;:::-;26759:4;26752:105;26670:193;26594:269;;;:::o;26869:73::-;26914:3;26869:73;:::o;26948:189::-;27025:32;;:::i;:::-;27066:65;27124:6;27116;27110:4;27066:65;:::i;:::-;27001:136;26948:189;;:::o;27143:186::-;27203:120;27220:3;27213:5;27210:14;27203:120;;;27274:39;27311:1;27304:5;27274:39;:::i;:::-;27247:1;27240:5;27236:13;27227:22;;27203:120;;;27143:186;;:::o;27335:543::-;27436:2;27431:3;27428:11;27425:446;;;27470:38;27502:5;27470:38;:::i;:::-;27554:29;27572:10;27554:29;:::i;:::-;27544:8;27540:44;27737:2;27725:10;27722:18;27719:49;;;27758:8;27743:23;;27719:49;27781:80;27837:22;27855:3;27837:22;:::i;:::-;27827:8;27823:37;27810:11;27781:80;:::i;:::-;27440:431;;27425:446;27335:543;;;:::o;27884:117::-;27938:8;27988:5;27982:4;27978:16;27957:37;;27884:117;;;;:::o;28007:169::-;28051:6;28084:51;28132:1;28128:6;28120:5;28117:1;28113:13;28084:51;:::i;:::-;28080:56;28165:4;28159;28155:15;28145:25;;28058:118;28007:169;;;;:::o;28181:295::-;28257:4;28403:29;28428:3;28422:4;28403:29;:::i;:::-;28395:37;;28465:3;28462:1;28458:11;28452:4;28449:21;28441:29;;28181:295;;;;:::o;28481:1395::-;28598:37;28631:3;28598:37;:::i;:::-;28700:18;28692:6;28689:30;28686:56;;;28722:18;;:::i;:::-;28686:56;28766:38;28798:4;28792:11;28766:38;:::i;:::-;28851:67;28911:6;28903;28897:4;28851:67;:::i;:::-;28945:1;28969:4;28956:17;;29001:2;28993:6;28990:14;29018:1;29013:618;;;;29675:1;29692:6;29689:77;;;29741:9;29736:3;29732:19;29726:26;29717:35;;29689:77;29792:67;29852:6;29845:5;29792:67;:::i;:::-;29786:4;29779:81;29648:222;28983:887;;29013:618;29065:4;29061:9;29053:6;29049:22;29099:37;29131:4;29099:37;:::i;:::-;29158:1;29172:208;29186:7;29183:1;29180:14;29172:208;;;29265:9;29260:3;29256:19;29250:26;29242:6;29235:42;29316:1;29308:6;29304:14;29294:24;;29363:2;29352:9;29348:18;29335:31;;29209:4;29206:1;29202:12;29197:17;;29172:208;;;29408:6;29399:7;29396:19;29393:179;;;29466:9;29461:3;29457:19;29451:26;29509:48;29551:4;29543:6;29539:17;29528:9;29509:48;:::i;:::-;29501:6;29494:64;29416:156;29393:179;29618:1;29614;29606:6;29602:14;29598:22;29592:4;29585:36;29020:611;;;28983:887;;28573:1303;;;28481:1395;;:::o;29882:179::-;30022:31;30018:1;30010:6;30006:14;29999:55;29882:179;:::o;30067:366::-;30209:3;30230:67;30294:2;30289:3;30230:67;:::i;:::-;30223:74;;30306:93;30395:3;30306:93;:::i;:::-;30424:2;30419:3;30415:12;30408:19;;30067:366;;;:::o;30439:419::-;30605:4;30643:2;30632:9;30628:18;30620:26;;30692:9;30686:4;30682:20;30678:1;30667:9;30663:17;30656:47;30720:131;30846:4;30720:131;:::i;:::-;30712:139;;30439:419;;;:::o;30864:180::-;31004:32;31000:1;30992:6;30988:14;30981:56;30864:180;:::o;31050:366::-;31192:3;31213:67;31277:2;31272:3;31213:67;:::i;:::-;31206:74;;31289:93;31378:3;31289:93;:::i;:::-;31407:2;31402:3;31398:12;31391:19;;31050:366;;;:::o;31422:419::-;31588:4;31626:2;31615:9;31611:18;31603:26;;31675:9;31669:4;31665:20;31661:1;31650:9;31646:17;31639:47;31703:131;31829:4;31703:131;:::i;:::-;31695:139;;31422:419;;;:::o;31847:240::-;31987:34;31983:1;31975:6;31971:14;31964:58;32056:23;32051:2;32043:6;32039:15;32032:48;31847:240;:::o;32093:366::-;32235:3;32256:67;32320:2;32315:3;32256:67;:::i;:::-;32249:74;;32332:93;32421:3;32332:93;:::i;:::-;32450:2;32445:3;32441:12;32434:19;;32093:366;;;:::o;32465:419::-;32631:4;32669:2;32658:9;32654:18;32646:26;;32718:9;32712:4;32708:20;32704:1;32693:9;32689:17;32682:47;32746:131;32872:4;32746:131;:::i;:::-;32738:139;;32465:419;;;:::o;32890:148::-;32992:11;33029:3;33014:18;;32890:148;;;;:::o;33044:390::-;33150:3;33178:39;33211:5;33178:39;:::i;:::-;33233:89;33315:6;33310:3;33233:89;:::i;:::-;33226:96;;33331:65;33389:6;33384:3;33377:4;33370:5;33366:16;33331:65;:::i;:::-;33421:6;33416:3;33412:16;33405:23;;33154:280;33044:390;;;;:::o;33440:435::-;33620:3;33642:95;33733:3;33724:6;33642:95;:::i;:::-;33635:102;;33754:95;33845:3;33836:6;33754:95;:::i;:::-;33747:102;;33866:3;33859:10;;33440:435;;;;;:::o;33881:225::-;34021:34;34017:1;34009:6;34005:14;33998:58;34090:8;34085:2;34077:6;34073:15;34066:33;33881:225;:::o;34112:366::-;34254:3;34275:67;34339:2;34334:3;34275:67;:::i;:::-;34268:74;;34351:93;34440:3;34351:93;:::i;:::-;34469:2;34464:3;34460:12;34453:19;;34112:366;;;:::o;34484:419::-;34650:4;34688:2;34677:9;34673:18;34665:26;;34737:9;34731:4;34727:20;34723:1;34712:9;34708:17;34701:47;34765:131;34891:4;34765:131;:::i;:::-;34757:139;;34484:419;;;:::o;34909:182::-;35049:34;35045:1;35037:6;35033:14;35026:58;34909:182;:::o;35097:366::-;35239:3;35260:67;35324:2;35319:3;35260:67;:::i;:::-;35253:74;;35336:93;35425:3;35336:93;:::i;:::-;35454:2;35449:3;35445:12;35438:19;;35097:366;;;:::o;35469:419::-;35635:4;35673:2;35662:9;35658:18;35650:26;;35722:9;35716:4;35712:20;35708:1;35697:9;35693:17;35686:47;35750:131;35876:4;35750:131;:::i;:::-;35742:139;;35469:419;;;:::o;35894:332::-;36015:4;36053:2;36042:9;36038:18;36030:26;;36066:71;36134:1;36123:9;36119:17;36110:6;36066:71;:::i;:::-;36147:72;36215:2;36204:9;36200:18;36191:6;36147:72;:::i;:::-;35894:332;;;;;:::o;36232:137::-;36286:5;36317:6;36311:13;36302:22;;36333:30;36357:5;36333:30;:::i;:::-;36232:137;;;;:::o;36375:345::-;36442:6;36491:2;36479:9;36470:7;36466:23;36462:32;36459:119;;;36497:79;;:::i;:::-;36459:119;36617:1;36642:61;36695:7;36686:6;36675:9;36671:22;36642:61;:::i;:::-;36632:71;;36588:125;36375:345;;;;:::o;36726:180::-;36774:77;36771:1;36764:88;36871:4;36868:1;36861:15;36895:4;36892:1;36885:15;36912:233;36951:3;36974:24;36992:5;36974:24;:::i;:::-;36965:33;;37020:66;37013:5;37010:77;37007:103;;37090:18;;:::i;:::-;37007:103;37137:1;37130:5;37126:13;37119:20;;36912:233;;;:::o;37151:98::-;37202:6;37236:5;37230:12;37220:22;;37151:98;;;:::o;37255:168::-;37338:11;37372:6;37367:3;37360:19;37412:4;37407:3;37403:14;37388:29;;37255:168;;;;:::o;37429:373::-;37515:3;37543:38;37575:5;37543:38;:::i;:::-;37597:70;37660:6;37655:3;37597:70;:::i;:::-;37590:77;;37676:65;37734:6;37729:3;37722:4;37715:5;37711:16;37676:65;:::i;:::-;37766:29;37788:6;37766:29;:::i;:::-;37761:3;37757:39;37750:46;;37519:283;37429:373;;;;:::o;37808:640::-;38003:4;38041:3;38030:9;38026:19;38018:27;;38055:71;38123:1;38112:9;38108:17;38099:6;38055:71;:::i;:::-;38136:72;38204:2;38193:9;38189:18;38180:6;38136:72;:::i;:::-;38218;38286:2;38275:9;38271:18;38262:6;38218:72;:::i;:::-;38337:9;38331:4;38327:20;38322:2;38311:9;38307:18;38300:48;38365:76;38436:4;38427:6;38365:76;:::i;:::-;38357:84;;37808:640;;;;;;;:::o;38454:141::-;38510:5;38541:6;38535:13;38526:22;;38557:32;38583:5;38557:32;:::i;:::-;38454:141;;;;:::o;38601:349::-;38670:6;38719:2;38707:9;38698:7;38694:23;38690:32;38687:119;;;38725:79;;:::i;:::-;38687:119;38845:1;38870:63;38925:7;38916:6;38905:9;38901:22;38870:63;:::i;:::-;38860:73;;38816:127;38601:349;;;;:::o
Swarm Source
ipfs://be47d9d328056778e9fc0bd2ee17ac113900c51d0ad56dadd0ff39ad9cd850b0
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.