Overview
TokenID
91886
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
StandardERC721A
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-09-14 */ // Sources flattened with hardhat v2.9.3 https://hardhat.org // File erc721a/contracts/[email protected] // SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.2 // 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(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // 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; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @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; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](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); } // File erc721a/contracts/[email protected] // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @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 { // Reference type for token approval. 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) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an 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, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } 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. * 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) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @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 { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _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]`. 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 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 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 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. 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`. ) 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, ''); } // ============================================================= // 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 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // 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) } } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/token/common/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File erc721a/contracts/extensions/[email protected] // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File erc721a/contracts/extensions/[email protected] // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/StartTokenIdHelper.sol pragma solidity 0.8.18; /** * This Helper is used to return a dynamic value in the overridden _startTokenId() function. * Extending this Helper before the ERC721A contract give us access to the herein set `startTokenId` * to be returned by the overridden `_startTokenId()` function of ERC721A in the ERC721AStartTokenId mocks. */ contract StartTokenIdHelper { uint256 public startTokenId; constructor(uint256 startTokenId_) { startTokenId = startTokenId_; } } // File contracts/StandardErc721A.sol pragma solidity 0.8.18; contract StandardERC721A is StartTokenIdHelper, ERC165, ERC721A, ERC2981, Ownable, ERC721AQueryable { string private _baseTokenURI; uint256 public maxSupply; event UpdateRoyalty(address indexed _royaltyReceiver, uint96 _royaltyFee); event UpdateTokenRoyalty(uint256 indexed _tokenId, address indexed _royaltyReceiver, uint96 _royaltyFee); event ResetTokenRoyalty(uint256 indexed _tokenId); event DeleteDefaultRoyalty(); event UpdateMaxSupply(uint256 oldMaxSupply, uint256 newMaxSupply); constructor( string memory name_, string memory symbol_, uint256 _startTokenId_, uint256 _maxSupply, address _royaltyReceiver, uint96 _royaltyFee // 100 = 1% ) StartTokenIdHelper(_startTokenId_) ERC721A(name_, symbol_) { require(_maxSupply > 0, "maxSupply is 0"); maxSupply = _maxSupply; // set royalty information if (_royaltyReceiver != address(0)) { _setDefaultRoyalty(_royaltyReceiver, _royaltyFee); } } function _startTokenId() internal view virtual override returns (uint256) { return startTokenId; } function updateMaxSupply(uint256 _newMaxSupply) public { require(_newMaxSupply >= totalSupply(), "invalid maxSupply"); emit UpdateMaxSupply(maxSupply, _newMaxSupply); maxSupply = _newMaxSupply; } function totalMinted() public view returns (uint256) { return _totalMinted(); } function safeMint(address to) external onlyOwner { require(totalSupply() < maxSupply, "max supply reached"); _mint(to, 1); } function batchMint(address to, uint256 quantity) external onlyOwner { require(totalSupply() + quantity <= maxSupply, "max supply reached"); _mint(to, quantity); } function burn(uint256 _tokenId) public { _burn(_tokenId, true); } function batchBurn(uint256 fromIndex, uint256 toIndex) public { for (uint256 index = fromIndex; index <= toIndex; ) { _burn(index, true); unchecked { ++index; } } } function batchBurn(uint256[] calldata _tokenIds) public { uint256 length = _tokenIds.length; for (uint256 i; i < length; ) { _burn(_tokenIds[i], true); unchecked { ++i; } } } function batchTransfer( uint256 fromIndex, uint256 toIndex, address receiverAddress ) public { for (uint256 index = fromIndex; index <= toIndex; ) { transferFrom(msg.sender, receiverAddress, index); unchecked { ++index; } } } function batchTransfer(uint256[] calldata indexes, address receiverAddress) public { uint256 length = indexes.length; for (uint256 i; i < length; ) { transferFrom(msg.sender, receiverAddress, indexes[i]); unchecked { ++i; } } } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function baseURI() public view returns (string memory) { return _baseURI(); } function setBaseURI(string calldata _newBaseURI) public onlyOwner { _baseTokenURI = _newBaseURI; } function supportsInterface(bytes4 interfaceId) public view override(ERC165, ERC721A, IERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } // royalty function updateRoyalty(address _royaltyReceiver, uint96 _royaltyFee) external onlyOwner { _setDefaultRoyalty(_royaltyReceiver, _royaltyFee); emit UpdateRoyalty(_royaltyReceiver, _royaltyFee); } function deleteDefaultRoyalty() external onlyOwner { _deleteDefaultRoyalty(); emit DeleteDefaultRoyalty(); } function updateTokenRoyalty( uint256 _tokenId, address _royaltyReceiver, uint96 _royaltyFee ) external onlyOwner { _setTokenRoyalty(_tokenId, _royaltyReceiver, _royaltyFee); emit UpdateTokenRoyalty(_tokenId, _royaltyReceiver, _royaltyFee); } function resetTokenRoyalty(uint256 _tokenId) external onlyOwner { _resetTokenRoyalty(_tokenId); emit ResetTokenRoyalty(_tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"_startTokenId_","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFee","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[],"name":"DeleteDefaultRoyalty","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":"uint256","name":"_tokenId","type":"uint256"}],"name":"ResetTokenRoyalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMaxSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"UpdateMaxSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_royaltyReceiver","type":"address"},{"indexed":false,"internalType":"uint96","name":"_royaltyFee","type":"uint96"}],"name":"UpdateRoyalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_royaltyReceiver","type":"address"},{"indexed":false,"internalType":"uint96","name":"_royaltyFee","type":"uint96"}],"name":"UpdateTokenRoyalty","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromIndex","type":"uint256"},{"internalType":"uint256","name":"toIndex","type":"uint256"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexes","type":"uint256[]"},{"internalType":"address","name":"receiverAddress","type":"address"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromIndex","type":"uint256"},{"internalType":"uint256","name":"toIndex","type":"uint256"},{"internalType":"address","name":"receiverAddress","type":"address"}],"name":"batchTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"resetTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFee","type":"uint96"}],"name":"updateRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFee","type":"uint96"}],"name":"updateTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200515a3803806200515a83398181016040528101906200003791906200063f565b858585806000819055505081600390816200005391906200095a565b5080600490816200006591906200095a565b50620000766200013f60201b60201c565b60018190555050506200009e620000926200014860201b60201c565b6200015060201b60201c565b60008311620000e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000db9062000aa2565b60405180910390fd5b82600d81905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000133576200013282826200021660201b60201c565b5b50505050505062000bce565b60008054905090565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000226620003b960201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000287576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200027e9062000b3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620002f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f09062000bac565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200042c82620003e1565b810181811067ffffffffffffffff821117156200044e576200044d620003f2565b5b80604052505050565b600062000463620003c3565b905062000471828262000421565b919050565b600067ffffffffffffffff821115620004945762000493620003f2565b5b6200049f82620003e1565b9050602081019050919050565b60005b83811015620004cc578082015181840152602081019050620004af565b60008484015250505050565b6000620004ef620004e98462000476565b62000457565b9050828152602081018484840111156200050e576200050d620003dc565b5b6200051b848285620004ac565b509392505050565b600082601f8301126200053b576200053a620003d7565b5b81516200054d848260208601620004d8565b91505092915050565b6000819050919050565b6200056b8162000556565b81146200057757600080fd5b50565b6000815190506200058b8162000560565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005be8262000591565b9050919050565b620005d081620005b1565b8114620005dc57600080fd5b50565b600081519050620005f081620005c5565b92915050565b60006bffffffffffffffffffffffff82169050919050565b6200061981620005f6565b81146200062557600080fd5b50565b60008151905062000639816200060e565b92915050565b60008060008060008060c087890312156200065f576200065e620003cd565b5b600087015167ffffffffffffffff81111562000680576200067f620003d2565b5b6200068e89828a0162000523565b965050602087015167ffffffffffffffff811115620006b257620006b1620003d2565b5b620006c089828a0162000523565b9550506040620006d389828a016200057a565b9450506060620006e689828a016200057a565b9350506080620006f989828a01620005df565b92505060a06200070c89828a0162000628565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200076c57607f821691505b60208210810362000782576200078162000724565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007ec7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007ad565b620007f88683620007ad565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200083b620008356200082f8462000556565b62000810565b62000556565b9050919050565b6000819050919050565b62000857836200081a565b6200086f620008668262000842565b848454620007ba565b825550505050565b600090565b6200088662000877565b620008938184846200084c565b505050565b5b81811015620008bb57620008af6000826200087c565b60018101905062000899565b5050565b601f8211156200090a57620008d48162000788565b620008df846200079d565b81016020851015620008ef578190505b62000907620008fe856200079d565b83018262000898565b50505b505050565b600082821c905092915050565b60006200092f600019846008026200090f565b1980831691505092915050565b60006200094a83836200091c565b9150826002028217905092915050565b620009658262000719565b67ffffffffffffffff811115620009815762000980620003f2565b5b6200098d825462000753565b6200099a828285620008bf565b600060209050601f831160018114620009d25760008415620009bd578287015190505b620009c985826200093c565b86555062000a39565b601f198416620009e28662000788565b60005b8281101562000a0c57848901518255600182019150602085019450602081019050620009e5565b8683101562000a2c578489015162000a28601f8916826200091c565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f6d6178537570706c792069732030000000000000000000000000000000000000600082015250565b600062000a8a600e8362000a41565b915062000a978262000a52565b602082019050919050565b6000602082019050818103600083015262000abd8162000a7b565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000b22602a8362000a41565b915062000b2f8262000ac4565b604082019050919050565b6000602082019050818103600083015262000b558162000b13565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000b9460198362000a41565b915062000ba18262000b5c565b602082019050919050565b6000602082019050818103600083015262000bc78162000b85565b9050919050565b61457c8062000bde6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806386e228d51161013b578063c87b56dd116100b8578063dc8e92ea1161007c578063dc8e92ea146106ad578063e6798baa146106c9578063e985e9c5146106e7578063f103b43314610717578063f2fde38b146107335761023d565b8063c87b56dd1461060b578063ce40ad861461063b578063d5abeb0114610657578063daa83c6d14610675578063dc02c822146106915761023d565b8063a22cb465116100ff578063a22cb4651461057b578063a2309ff814610597578063aa1b103f146105b5578063b88d4fde146105bf578063c23dc68f146105db5761023d565b806386e228d5146104d75780638a616bc0146104f35780638da5cb5b1461050f57806395d89b411461052d57806399a2557a1461054b5761023d565b806342966c68116101c95780636c0360eb1161018d5780636c0360eb1461043357806370a0823114610451578063715018a6146104815780638462151c1461048b578063860cad79146104bb5761023d565b806342966c681461037f57806343508b051461039b57806355f804b3146103b75780635bbb2177146103d35780636352211e146104035761023d565b806318160ddd1161021057806318160ddd146102dc57806323b872dd146102fa5780632a55205a1461031657806340d097c31461034757806342842e0e146103635761023d565b806301ffc9a71461024257806306fdde0314610272578063081812fc14610290578063095ea7b3146102c0575b600080fd5b61025c6004803603810190610257919061309c565b61074f565b60405161026991906130e4565b60405180910390f35b61027a610761565b604051610287919061318f565b60405180910390f35b6102aa60048036038101906102a591906131e7565b6107f3565b6040516102b79190613255565b60405180910390f35b6102da60048036038101906102d5919061329c565b610872565b005b6102e46109b6565b6040516102f191906132eb565b60405180910390f35b610314600480360381019061030f9190613306565b6109cd565b005b610330600480360381019061032b9190613359565b610cef565b60405161033e929190613399565b60405180910390f35b610361600480360381019061035c91906133c2565b610ed9565b005b61037d60048036038101906103789190613306565b610fae565b005b610399600480360381019061039491906131e7565b610fce565b005b6103b560048036038101906103b0919061329c565b610fdc565b005b6103d160048036038101906103cc9190613454565b6110bd565b005b6103ed60048036038101906103e891906134f7565b61114f565b6040516103fa91906136a7565b60405180910390f35b61041d600480360381019061041891906131e7565b611212565b60405161042a9190613255565b60405180910390f35b61043b611224565b604051610448919061318f565b60405180910390f35b61046b600480360381019061046691906133c2565b611233565b60405161047891906132eb565b60405180910390f35b6104896112eb565b005b6104a560048036038101906104a091906133c2565b611373565b6040516104b29190613787565b60405180910390f35b6104d560048036038101906104d09190613359565b6114b6565b005b6104f160048036038101906104ec91906137ed565b6114de565b005b61050d600480360381019061050891906131e7565b6115b9565b005b61051761166e565b6040516105249190613255565b60405180910390f35b610535611698565b604051610542919061318f565b60405180910390f35b61056560048036038101906105609190613840565b61172a565b6040516105729190613787565b60405180910390f35b610595600480360381019061059091906138bf565b611936565b005b61059f611aad565b6040516105ac91906132eb565b60405180910390f35b6105bd611abc565b005b6105d960048036038101906105d49190613a2f565b611b6e565b005b6105f560048036038101906105f091906131e7565b611be1565b6040516106029190613b07565b60405180910390f35b610625600480360381019061062091906131e7565b611c4b565b604051610632919061318f565b60405180910390f35b61065560048036038101906106509190613b22565b611ce9565b005b61065f611d32565b60405161066c91906132eb565b60405180910390f35b61068f600480360381019061068a9190613b82565b611d38565b005b6106ab60048036038101906106a69190613bc2565b611e10565b005b6106c760048036038101906106c291906134f7565b611e39565b005b6106d1611e81565b6040516106de91906132eb565b60405180910390f35b61070160048036038101906106fc9190613c15565b611e87565b60405161070e91906130e4565b60405180910390f35b610731600480360381019061072c91906131e7565b611f1b565b005b61074d600480360381019061074891906133c2565b611faa565b005b600061075a826120a1565b9050919050565b60606003805461077090613c84565b80601f016020809104026020016040519081016040528092919081815260200182805461079c90613c84565b80156107e95780601f106107be576101008083540402835291602001916107e9565b820191906000526020600020905b8154815290600101906020018083116107cc57829003601f168201915b5050505050905090565b60006107fe8261211b565b610834576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087d82611212565b90508073ffffffffffffffffffffffffffffffffffffffff1661089e61217a565b73ffffffffffffffffffffffffffffffffffffffff1614610901576108ca816108c561217a565b611e87565b610900576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109c0612182565b6002546001540303905090565b60006109d88261218b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a4b84612257565b91509150610a618187610a5c61217a565b61227e565b610aad57610a7686610a7161217a565b611e87565b610aac576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610b13576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b2086868660016122c2565b8015610b2b57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bf985610bd58888876122c8565b7c0200000000000000000000000000000000000000000000000000000000176122f0565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610c7f5760006001850190506000600560008381526020019081526020016000205403610c7d576001548114610c7c578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ce7868686600161231b565b505050505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610e845760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e8e612321565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610eba9190613ce4565b610ec49190613d55565b90508160000151819350935050509250929050565b610ee161232b565b73ffffffffffffffffffffffffffffffffffffffff16610eff61166e565b73ffffffffffffffffffffffffffffffffffffffff1614610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90613dd2565b60405180910390fd5b600d54610f606109b6565b10610fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9790613e3e565b60405180910390fd5b610fab816001612333565b50565b610fc983838360405180602001604052806000815250611b6e565b505050565b610fd98160016124ef565b50565b610fe461232b565b73ffffffffffffffffffffffffffffffffffffffff1661100261166e565b73ffffffffffffffffffffffffffffffffffffffff1614611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90613dd2565b60405180910390fd5b600d54816110646109b6565b61106e9190613e5e565b11156110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a690613e3e565b60405180910390fd5b6110b98282612333565b5050565b6110c561232b565b73ffffffffffffffffffffffffffffffffffffffff166110e361166e565b73ffffffffffffffffffffffffffffffffffffffff1614611139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113090613dd2565b60405180910390fd5b8181600c918261114a929190614049565b505050565b6060600083839050905060008167ffffffffffffffff81111561117557611174613904565b5b6040519080825280602002602001820160405280156111ae57816020015b61119b612fe1565b8152602001906001900390816111935790505b50905060005b828114611206576111dd8686838181106111d1576111d0614119565b5b90506020020135611be1565b8282815181106111f0576111ef614119565b5b60200260200101819052508060010190506111b4565b50809250505092915050565b600061121d8261218b565b9050919050565b606061122e612741565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361129a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112f361232b565b73ffffffffffffffffffffffffffffffffffffffff1661131161166e565b73ffffffffffffffffffffffffffffffffffffffff1614611367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135e90613dd2565b60405180910390fd5b61137160006127d3565b565b6060600080600061138385611233565b905060008167ffffffffffffffff8111156113a1576113a0613904565b5b6040519080825280602002602001820160405280156113cf5781602001602082028036833780820191505090505b5090506113da612fe1565b60006113e4612182565b90505b8386146114a8576113f781612899565b9150816040015161149d57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461144257816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361149c578083878060010198508151811061148f5761148e614119565b5b6020026020010181815250505b5b8060010190506113e7565b508195505050505050919050565b60008290505b8181116114d9576114ce8160016124ef565b8060010190506114bc565b505050565b6114e661232b565b73ffffffffffffffffffffffffffffffffffffffff1661150461166e565b73ffffffffffffffffffffffffffffffffffffffff161461155a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155190613dd2565b60405180910390fd5b6115658383836128c4565b8173ffffffffffffffffffffffffffffffffffffffff16837f8219bae90c1815288c07ea441a930eb14c911bcee209d79219ff8098e9b243a2836040516115ac9190614157565b60405180910390a3505050565b6115c161232b565b73ffffffffffffffffffffffffffffffffffffffff166115df61166e565b73ffffffffffffffffffffffffffffffffffffffff1614611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c90613dd2565b60405180910390fd5b61163e81612a6b565b807f2d0c64cb223c165096aa5260f0c4f12caf09469f917f6139ff17e1795a01225d60405160405180910390a250565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546116a790613c84565b80601f01602080910402602001604051908101604052809291908181526020018280546116d390613c84565b80156117205780601f106116f557610100808354040283529160200191611720565b820191906000526020600020905b81548152906001019060200180831161170357829003601f168201915b5050505050905090565b6060818310611765576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611770612aca565b905061177a612182565b85101561178c57611789612182565b94505b80841115611798578093505b60006117a387611233565b9050848610156117c65760008686039050818110156117c0578091505b506117cb565b600090505b60008167ffffffffffffffff8111156117e7576117e6613904565b5b6040519080825280602002602001820160405280156118155781602001602082028036833780820191505090505b5090506000820361182c578094505050505061192f565b600061183788611be1565b90506000816040015161184c57816000015190505b60008990505b8881141580156118625750848714155b156119215761187081612899565b9250826040015161191657600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146118bb57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611915578084888060010199508151811061190857611907614119565b5b6020026020010181815250505b5b806001019050611852565b508583528296505050505050505b9392505050565b61193e61217a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119a2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006119af61217a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a5c61217a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611aa191906130e4565b60405180910390a35050565b6000611ab7612ad4565b905090565b611ac461232b565b73ffffffffffffffffffffffffffffffffffffffff16611ae261166e565b73ffffffffffffffffffffffffffffffffffffffff1614611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f90613dd2565b60405180910390fd5b611b40612ae7565b7f4a5f27b6a26c1d168b49c56a68ba4bb0aff57144387eb6bd10db8831e9cafdd960405160405180910390a1565b611b798484846109cd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bdb57611ba484848484612b34565b611bda576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611be9612fe1565b611bf1612fe1565b611bf9612182565b831080611c0d5750611c09612aca565b8310155b15611c1b5780915050611c46565b611c2483612899565b9050806040015115611c395780915050611c46565b611c4283612c84565b9150505b919050565b6060611c568261211b565b611c8c576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c96612741565b90506000815103611cb65760405180602001604052806000815250611ce1565b80611cc084612ca4565b604051602001611cd19291906141ae565b6040516020818303038152906040525b915050919050565b600083839050905060005b81811015611d2b57611d203384878785818110611d1457611d13614119565b5b905060200201356109cd565b806001019050611cf4565b5050505050565b600d5481565b611d4061232b565b73ffffffffffffffffffffffffffffffffffffffff16611d5e61166e565b73ffffffffffffffffffffffffffffffffffffffff1614611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab90613dd2565b60405180910390fd5b611dbe8282612ceb565b8173ffffffffffffffffffffffffffffffffffffffff167f3e91409a02926290c65d2e6b1c28957f255d42cb904b947d566829981d0fc8f182604051611e049190614157565b60405180910390a25050565b60008390505b828111611e3357611e283383836109cd565b806001019050611e16565b50505050565b600082829050905060005b81811015611e7b57611e70848483818110611e6257611e61614119565b5b9050602002013560016124ef565b806001019050611e44565b50505050565b60005481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f236109b6565b811015611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c9061421e565b60405180910390fd5b7f6a84334bf6663b783f2bbfcaf459b2cbc73570cf346a46d9e6a0f290fcf3ebfc600d5482604051611f9892919061423e565b60405180910390a180600d8190555050565b611fb261232b565b73ffffffffffffffffffffffffffffffffffffffff16611fd061166e565b73ffffffffffffffffffffffffffffffffffffffff1614612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d90613dd2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c906142d9565b60405180910390fd5b61209e816127d3565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612114575061211382612e80565b5b9050919050565b600081612126612182565b11158015612135575060015482105b8015612173575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b60008054905090565b6000808290508061219a612182565b116122205760015481101561221f5760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361221d575b600081036122135760056000836001900393508381526020019081526020016000205490506121e9565b8092505050612252565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86122df868684612f12565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b600033905090565b6000600154905060008203612374576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61238160008483856122c2565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506123f8836123e960008660006122c8565b6123f285612f1b565b176122f0565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461249957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061245e565b50600082036124d4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506124ea600084838561231b565b505050565b60006124fa8361218b565b9050600081905060008061250d86612257565b91509150841561257657612529818461252461217a565b61227e565b6125755761253e8361253961217a565b611e87565b612574576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6125848360008860016122c2565b801561258f57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612637836125f4856000886122c8565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176122f0565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036126bd57600060018701905060006005600083815260200190815260200160002054036126bb5760015481146126ba578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461272783600088600161231b565b600260008154809291906001019190505550505050505050565b6060600c805461275090613c84565b80601f016020809104026020016040519081016040528092919081815260200182805461277c90613c84565b80156127c95780601f1061279e576101008083540402835291602001916127c9565b820191906000526020600020905b8154815290600101906020018083116127ac57829003601f168201915b5050505050905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128a1612fe1565b6128bd6005600084815260200190815260200160002054612f2b565b9050919050565b6128cc612321565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561292a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129219061436b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612999576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612990906143d7565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600a600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b600a6000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b6000600154905090565b6000612ade612182565b60015403905090565b6009600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b5a61217a565b8786866040518563ffffffff1660e01b8152600401612b7c949392919061444c565b6020604051808303816000875af1925050508015612bb857506040513d601f19601f82011682018060405250810190612bb591906144ad565b60015b612c31573d8060008114612be8576040519150601f19603f3d011682016040523d82523d6000602084013e612bed565b606091505b506000815103612c29576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612c8c612fe1565b612c9d612c988361218b565b612f2b565b9050919050565b606060806040510190508060405280825b600115612cd757600183039250600a81066030018353600a8104905080612cb5575b508181036020830392508083525050919050565b612cf3612321565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d489061436b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db790614526565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612edb57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f0b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60009392505050565b60006001821460e11b9050919050565b612f33612fe1565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61307981613044565b811461308457600080fd5b50565b60008135905061309681613070565b92915050565b6000602082840312156130b2576130b161303a565b5b60006130c084828501613087565b91505092915050565b60008115159050919050565b6130de816130c9565b82525050565b60006020820190506130f960008301846130d5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561313957808201518184015260208101905061311e565b60008484015250505050565b6000601f19601f8301169050919050565b6000613161826130ff565b61316b818561310a565b935061317b81856020860161311b565b61318481613145565b840191505092915050565b600060208201905081810360008301526131a98184613156565b905092915050565b6000819050919050565b6131c4816131b1565b81146131cf57600080fd5b50565b6000813590506131e1816131bb565b92915050565b6000602082840312156131fd576131fc61303a565b5b600061320b848285016131d2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061323f82613214565b9050919050565b61324f81613234565b82525050565b600060208201905061326a6000830184613246565b92915050565b61327981613234565b811461328457600080fd5b50565b60008135905061329681613270565b92915050565b600080604083850312156132b3576132b261303a565b5b60006132c185828601613287565b92505060206132d2858286016131d2565b9150509250929050565b6132e5816131b1565b82525050565b600060208201905061330060008301846132dc565b92915050565b60008060006060848603121561331f5761331e61303a565b5b600061332d86828701613287565b935050602061333e86828701613287565b925050604061334f868287016131d2565b9150509250925092565b600080604083850312156133705761336f61303a565b5b600061337e858286016131d2565b925050602061338f858286016131d2565b9150509250929050565b60006040820190506133ae6000830185613246565b6133bb60208301846132dc565b9392505050565b6000602082840312156133d8576133d761303a565b5b60006133e684828501613287565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613414576134136133ef565b5b8235905067ffffffffffffffff811115613431576134306133f4565b5b60208301915083600182028301111561344d5761344c6133f9565b5b9250929050565b6000806020838503121561346b5761346a61303a565b5b600083013567ffffffffffffffff8111156134895761348861303f565b5b613495858286016133fe565b92509250509250929050565b60008083601f8401126134b7576134b66133ef565b5b8235905067ffffffffffffffff8111156134d4576134d36133f4565b5b6020830191508360208202830111156134f0576134ef6133f9565b5b9250929050565b6000806020838503121561350e5761350d61303a565b5b600083013567ffffffffffffffff81111561352c5761352b61303f565b5b613538858286016134a1565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61357981613234565b82525050565b600067ffffffffffffffff82169050919050565b61359c8161357f565b82525050565b6135ab816130c9565b82525050565b600062ffffff82169050919050565b6135c9816135b1565b82525050565b6080820160008201516135e56000850182613570565b5060208201516135f86020850182613593565b50604082015161360b60408501826135a2565b50606082015161361e60608501826135c0565b50505050565b600061363083836135cf565b60808301905092915050565b6000602082019050919050565b600061365482613544565b61365e818561354f565b935061366983613560565b8060005b8381101561369a5781516136818882613624565b975061368c8361363c565b92505060018101905061366d565b5085935050505092915050565b600060208201905081810360008301526136c18184613649565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136fe816131b1565b82525050565b600061371083836136f5565b60208301905092915050565b6000602082019050919050565b6000613734826136c9565b61373e81856136d4565b9350613749836136e5565b8060005b8381101561377a5781516137618882613704565b975061376c8361371c565b92505060018101905061374d565b5085935050505092915050565b600060208201905081810360008301526137a18184613729565b905092915050565b60006bffffffffffffffffffffffff82169050919050565b6137ca816137a9565b81146137d557600080fd5b50565b6000813590506137e7816137c1565b92915050565b6000806000606084860312156138065761380561303a565b5b6000613814868287016131d2565b935050602061382586828701613287565b9250506040613836868287016137d8565b9150509250925092565b6000806000606084860312156138595761385861303a565b5b600061386786828701613287565b9350506020613878868287016131d2565b9250506040613889868287016131d2565b9150509250925092565b61389c816130c9565b81146138a757600080fd5b50565b6000813590506138b981613893565b92915050565b600080604083850312156138d6576138d561303a565b5b60006138e485828601613287565b92505060206138f5858286016138aa565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61393c82613145565b810181811067ffffffffffffffff8211171561395b5761395a613904565b5b80604052505050565b600061396e613030565b905061397a8282613933565b919050565b600067ffffffffffffffff82111561399a57613999613904565b5b6139a382613145565b9050602081019050919050565b82818337600083830152505050565b60006139d26139cd8461397f565b613964565b9050828152602081018484840111156139ee576139ed6138ff565b5b6139f98482856139b0565b509392505050565b600082601f830112613a1657613a156133ef565b5b8135613a268482602086016139bf565b91505092915050565b60008060008060808587031215613a4957613a4861303a565b5b6000613a5787828801613287565b9450506020613a6887828801613287565b9350506040613a79878288016131d2565b925050606085013567ffffffffffffffff811115613a9a57613a9961303f565b5b613aa687828801613a01565b91505092959194509250565b608082016000820151613ac86000850182613570565b506020820151613adb6020850182613593565b506040820151613aee60408501826135a2565b506060820151613b0160608501826135c0565b50505050565b6000608082019050613b1c6000830184613ab2565b92915050565b600080600060408486031215613b3b57613b3a61303a565b5b600084013567ffffffffffffffff811115613b5957613b5861303f565b5b613b65868287016134a1565b93509350506020613b7886828701613287565b9150509250925092565b60008060408385031215613b9957613b9861303a565b5b6000613ba785828601613287565b9250506020613bb8858286016137d8565b9150509250929050565b600080600060608486031215613bdb57613bda61303a565b5b6000613be9868287016131d2565b9350506020613bfa868287016131d2565b9250506040613c0b86828701613287565b9150509250925092565b60008060408385031215613c2c57613c2b61303a565b5b6000613c3a85828601613287565b9250506020613c4b85828601613287565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c9c57607f821691505b602082108103613caf57613cae613c55565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613cef826131b1565b9150613cfa836131b1565b9250828202613d08816131b1565b91508282048414831517613d1f57613d1e613cb5565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d60826131b1565b9150613d6b836131b1565b925082613d7b57613d7a613d26565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613dbc60208361310a565b9150613dc782613d86565b602082019050919050565b60006020820190508181036000830152613deb81613daf565b9050919050565b7f6d617820737570706c7920726561636865640000000000000000000000000000600082015250565b6000613e2860128361310a565b9150613e3382613df2565b602082019050919050565b60006020820190508181036000830152613e5781613e1b565b9050919050565b6000613e69826131b1565b9150613e74836131b1565b9250828201905080821115613e8c57613e8b613cb5565b5b92915050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613eff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ec2565b613f098683613ec2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613f46613f41613f3c846131b1565b613f21565b6131b1565b9050919050565b6000819050919050565b613f6083613f2b565b613f74613f6c82613f4d565b848454613ecf565b825550505050565b600090565b613f89613f7c565b613f94818484613f57565b505050565b5b81811015613fb857613fad600082613f81565b600181019050613f9a565b5050565b601f821115613ffd57613fce81613e9d565b613fd784613eb2565b81016020851015613fe6578190505b613ffa613ff285613eb2565b830182613f99565b50505b505050565b600082821c905092915050565b600061402060001984600802614002565b1980831691505092915050565b6000614039838361400f565b9150826002028217905092915050565b6140538383613e92565b67ffffffffffffffff81111561406c5761406b613904565b5b6140768254613c84565b614081828285613fbc565b6000601f8311600181146140b0576000841561409e578287013590505b6140a8858261402d565b865550614110565b601f1984166140be86613e9d565b60005b828110156140e6578489013582556001820191506020850194506020810190506140c1565b8683101561410357848901356140ff601f89168261400f565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b614151816137a9565b82525050565b600060208201905061416c6000830184614148565b92915050565b600081905092915050565b6000614188826130ff565b6141928185614172565b93506141a281856020860161311b565b80840191505092915050565b60006141ba828561417d565b91506141c6828461417d565b91508190509392505050565b7f696e76616c6964206d6178537570706c79000000000000000000000000000000600082015250565b600061420860118361310a565b9150614213826141d2565b602082019050919050565b60006020820190508181036000830152614237816141fb565b9050919050565b600060408201905061425360008301856132dc565b61426060208301846132dc565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142c360268361310a565b91506142ce82614267565b604082019050919050565b600060208201905081810360008301526142f2816142b6565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614355602a8361310a565b9150614360826142f9565b604082019050919050565b6000602082019050818103600083015261438481614348565b9050919050565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b60006143c1601b8361310a565b91506143cc8261438b565b602082019050919050565b600060208201905081810360008301526143f0816143b4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061441e826143f7565b6144288185614402565b935061443881856020860161311b565b61444181613145565b840191505092915050565b60006080820190506144616000830187613246565b61446e6020830186613246565b61447b60408301856132dc565b818103606083015261448d8184614413565b905095945050505050565b6000815190506144a781613070565b92915050565b6000602082840312156144c3576144c261303a565b5b60006144d184828501614498565b91505092915050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061451060198361310a565b915061451b826144da565b602082019050919050565b6000602082019050818103600083015261453f81614503565b905091905056fea2646970667358221220765ac4f8d9b4b21c63f2f4068541b690de5e915e6fffa875f20579cca48111f064736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000186a00000000000000000000000005607ee6014b0ecdb649216bc93dbbe687143a8540000000000000000000000000000000000000000000000000000000000000514000000000000000000000000000000000000000000000000000000000000002e43727970746f2e636f6d2045787065646974696f6e20476561723a20546f6f6c73206f6620746865205472616465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e43727970746f2e636f6d2045787065646974696f6e20476561723a20546f6f6c73206f6620746865205472616465000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023d5760003560e01c806386e228d51161013b578063c87b56dd116100b8578063dc8e92ea1161007c578063dc8e92ea146106ad578063e6798baa146106c9578063e985e9c5146106e7578063f103b43314610717578063f2fde38b146107335761023d565b8063c87b56dd1461060b578063ce40ad861461063b578063d5abeb0114610657578063daa83c6d14610675578063dc02c822146106915761023d565b8063a22cb465116100ff578063a22cb4651461057b578063a2309ff814610597578063aa1b103f146105b5578063b88d4fde146105bf578063c23dc68f146105db5761023d565b806386e228d5146104d75780638a616bc0146104f35780638da5cb5b1461050f57806395d89b411461052d57806399a2557a1461054b5761023d565b806342966c68116101c95780636c0360eb1161018d5780636c0360eb1461043357806370a0823114610451578063715018a6146104815780638462151c1461048b578063860cad79146104bb5761023d565b806342966c681461037f57806343508b051461039b57806355f804b3146103b75780635bbb2177146103d35780636352211e146104035761023d565b806318160ddd1161021057806318160ddd146102dc57806323b872dd146102fa5780632a55205a1461031657806340d097c31461034757806342842e0e146103635761023d565b806301ffc9a71461024257806306fdde0314610272578063081812fc14610290578063095ea7b3146102c0575b600080fd5b61025c6004803603810190610257919061309c565b61074f565b60405161026991906130e4565b60405180910390f35b61027a610761565b604051610287919061318f565b60405180910390f35b6102aa60048036038101906102a591906131e7565b6107f3565b6040516102b79190613255565b60405180910390f35b6102da60048036038101906102d5919061329c565b610872565b005b6102e46109b6565b6040516102f191906132eb565b60405180910390f35b610314600480360381019061030f9190613306565b6109cd565b005b610330600480360381019061032b9190613359565b610cef565b60405161033e929190613399565b60405180910390f35b610361600480360381019061035c91906133c2565b610ed9565b005b61037d60048036038101906103789190613306565b610fae565b005b610399600480360381019061039491906131e7565b610fce565b005b6103b560048036038101906103b0919061329c565b610fdc565b005b6103d160048036038101906103cc9190613454565b6110bd565b005b6103ed60048036038101906103e891906134f7565b61114f565b6040516103fa91906136a7565b60405180910390f35b61041d600480360381019061041891906131e7565b611212565b60405161042a9190613255565b60405180910390f35b61043b611224565b604051610448919061318f565b60405180910390f35b61046b600480360381019061046691906133c2565b611233565b60405161047891906132eb565b60405180910390f35b6104896112eb565b005b6104a560048036038101906104a091906133c2565b611373565b6040516104b29190613787565b60405180910390f35b6104d560048036038101906104d09190613359565b6114b6565b005b6104f160048036038101906104ec91906137ed565b6114de565b005b61050d600480360381019061050891906131e7565b6115b9565b005b61051761166e565b6040516105249190613255565b60405180910390f35b610535611698565b604051610542919061318f565b60405180910390f35b61056560048036038101906105609190613840565b61172a565b6040516105729190613787565b60405180910390f35b610595600480360381019061059091906138bf565b611936565b005b61059f611aad565b6040516105ac91906132eb565b60405180910390f35b6105bd611abc565b005b6105d960048036038101906105d49190613a2f565b611b6e565b005b6105f560048036038101906105f091906131e7565b611be1565b6040516106029190613b07565b60405180910390f35b610625600480360381019061062091906131e7565b611c4b565b604051610632919061318f565b60405180910390f35b61065560048036038101906106509190613b22565b611ce9565b005b61065f611d32565b60405161066c91906132eb565b60405180910390f35b61068f600480360381019061068a9190613b82565b611d38565b005b6106ab60048036038101906106a69190613bc2565b611e10565b005b6106c760048036038101906106c291906134f7565b611e39565b005b6106d1611e81565b6040516106de91906132eb565b60405180910390f35b61070160048036038101906106fc9190613c15565b611e87565b60405161070e91906130e4565b60405180910390f35b610731600480360381019061072c91906131e7565b611f1b565b005b61074d600480360381019061074891906133c2565b611faa565b005b600061075a826120a1565b9050919050565b60606003805461077090613c84565b80601f016020809104026020016040519081016040528092919081815260200182805461079c90613c84565b80156107e95780601f106107be576101008083540402835291602001916107e9565b820191906000526020600020905b8154815290600101906020018083116107cc57829003601f168201915b5050505050905090565b60006107fe8261211b565b610834576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087d82611212565b90508073ffffffffffffffffffffffffffffffffffffffff1661089e61217a565b73ffffffffffffffffffffffffffffffffffffffff1614610901576108ca816108c561217a565b611e87565b610900576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109c0612182565b6002546001540303905090565b60006109d88261218b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a3f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a4b84612257565b91509150610a618187610a5c61217a565b61227e565b610aad57610a7686610a7161217a565b611e87565b610aac576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610b13576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b2086868660016122c2565b8015610b2b57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bf985610bd58888876122c8565b7c0200000000000000000000000000000000000000000000000000000000176122f0565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610c7f5760006001850190506000600560008381526020019081526020016000205403610c7d576001548114610c7c578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ce7868686600161231b565b505050505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610e845760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e8e612321565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610eba9190613ce4565b610ec49190613d55565b90508160000151819350935050509250929050565b610ee161232b565b73ffffffffffffffffffffffffffffffffffffffff16610eff61166e565b73ffffffffffffffffffffffffffffffffffffffff1614610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90613dd2565b60405180910390fd5b600d54610f606109b6565b10610fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9790613e3e565b60405180910390fd5b610fab816001612333565b50565b610fc983838360405180602001604052806000815250611b6e565b505050565b610fd98160016124ef565b50565b610fe461232b565b73ffffffffffffffffffffffffffffffffffffffff1661100261166e565b73ffffffffffffffffffffffffffffffffffffffff1614611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90613dd2565b60405180910390fd5b600d54816110646109b6565b61106e9190613e5e565b11156110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a690613e3e565b60405180910390fd5b6110b98282612333565b5050565b6110c561232b565b73ffffffffffffffffffffffffffffffffffffffff166110e361166e565b73ffffffffffffffffffffffffffffffffffffffff1614611139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113090613dd2565b60405180910390fd5b8181600c918261114a929190614049565b505050565b6060600083839050905060008167ffffffffffffffff81111561117557611174613904565b5b6040519080825280602002602001820160405280156111ae57816020015b61119b612fe1565b8152602001906001900390816111935790505b50905060005b828114611206576111dd8686838181106111d1576111d0614119565b5b90506020020135611be1565b8282815181106111f0576111ef614119565b5b60200260200101819052508060010190506111b4565b50809250505092915050565b600061121d8261218b565b9050919050565b606061122e612741565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361129a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112f361232b565b73ffffffffffffffffffffffffffffffffffffffff1661131161166e565b73ffffffffffffffffffffffffffffffffffffffff1614611367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135e90613dd2565b60405180910390fd5b61137160006127d3565b565b6060600080600061138385611233565b905060008167ffffffffffffffff8111156113a1576113a0613904565b5b6040519080825280602002602001820160405280156113cf5781602001602082028036833780820191505090505b5090506113da612fe1565b60006113e4612182565b90505b8386146114a8576113f781612899565b9150816040015161149d57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461144257816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361149c578083878060010198508151811061148f5761148e614119565b5b6020026020010181815250505b5b8060010190506113e7565b508195505050505050919050565b60008290505b8181116114d9576114ce8160016124ef565b8060010190506114bc565b505050565b6114e661232b565b73ffffffffffffffffffffffffffffffffffffffff1661150461166e565b73ffffffffffffffffffffffffffffffffffffffff161461155a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155190613dd2565b60405180910390fd5b6115658383836128c4565b8173ffffffffffffffffffffffffffffffffffffffff16837f8219bae90c1815288c07ea441a930eb14c911bcee209d79219ff8098e9b243a2836040516115ac9190614157565b60405180910390a3505050565b6115c161232b565b73ffffffffffffffffffffffffffffffffffffffff166115df61166e565b73ffffffffffffffffffffffffffffffffffffffff1614611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c90613dd2565b60405180910390fd5b61163e81612a6b565b807f2d0c64cb223c165096aa5260f0c4f12caf09469f917f6139ff17e1795a01225d60405160405180910390a250565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546116a790613c84565b80601f01602080910402602001604051908101604052809291908181526020018280546116d390613c84565b80156117205780601f106116f557610100808354040283529160200191611720565b820191906000526020600020905b81548152906001019060200180831161170357829003601f168201915b5050505050905090565b6060818310611765576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611770612aca565b905061177a612182565b85101561178c57611789612182565b94505b80841115611798578093505b60006117a387611233565b9050848610156117c65760008686039050818110156117c0578091505b506117cb565b600090505b60008167ffffffffffffffff8111156117e7576117e6613904565b5b6040519080825280602002602001820160405280156118155781602001602082028036833780820191505090505b5090506000820361182c578094505050505061192f565b600061183788611be1565b90506000816040015161184c57816000015190505b60008990505b8881141580156118625750848714155b156119215761187081612899565b9250826040015161191657600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146118bb57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611915578084888060010199508151811061190857611907614119565b5b6020026020010181815250505b5b806001019050611852565b508583528296505050505050505b9392505050565b61193e61217a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119a2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006119af61217a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a5c61217a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611aa191906130e4565b60405180910390a35050565b6000611ab7612ad4565b905090565b611ac461232b565b73ffffffffffffffffffffffffffffffffffffffff16611ae261166e565b73ffffffffffffffffffffffffffffffffffffffff1614611b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2f90613dd2565b60405180910390fd5b611b40612ae7565b7f4a5f27b6a26c1d168b49c56a68ba4bb0aff57144387eb6bd10db8831e9cafdd960405160405180910390a1565b611b798484846109cd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bdb57611ba484848484612b34565b611bda576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611be9612fe1565b611bf1612fe1565b611bf9612182565b831080611c0d5750611c09612aca565b8310155b15611c1b5780915050611c46565b611c2483612899565b9050806040015115611c395780915050611c46565b611c4283612c84565b9150505b919050565b6060611c568261211b565b611c8c576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c96612741565b90506000815103611cb65760405180602001604052806000815250611ce1565b80611cc084612ca4565b604051602001611cd19291906141ae565b6040516020818303038152906040525b915050919050565b600083839050905060005b81811015611d2b57611d203384878785818110611d1457611d13614119565b5b905060200201356109cd565b806001019050611cf4565b5050505050565b600d5481565b611d4061232b565b73ffffffffffffffffffffffffffffffffffffffff16611d5e61166e565b73ffffffffffffffffffffffffffffffffffffffff1614611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab90613dd2565b60405180910390fd5b611dbe8282612ceb565b8173ffffffffffffffffffffffffffffffffffffffff167f3e91409a02926290c65d2e6b1c28957f255d42cb904b947d566829981d0fc8f182604051611e049190614157565b60405180910390a25050565b60008390505b828111611e3357611e283383836109cd565b806001019050611e16565b50505050565b600082829050905060005b81811015611e7b57611e70848483818110611e6257611e61614119565b5b9050602002013560016124ef565b806001019050611e44565b50505050565b60005481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f236109b6565b811015611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c9061421e565b60405180910390fd5b7f6a84334bf6663b783f2bbfcaf459b2cbc73570cf346a46d9e6a0f290fcf3ebfc600d5482604051611f9892919061423e565b60405180910390a180600d8190555050565b611fb261232b565b73ffffffffffffffffffffffffffffffffffffffff16611fd061166e565b73ffffffffffffffffffffffffffffffffffffffff1614612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d90613dd2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c906142d9565b60405180910390fd5b61209e816127d3565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612114575061211382612e80565b5b9050919050565b600081612126612182565b11158015612135575060015482105b8015612173575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b60008054905090565b6000808290508061219a612182565b116122205760015481101561221f5760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361221d575b600081036122135760056000836001900393508381526020019081526020016000205490506121e9565b8092505050612252565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86122df868684612f12565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b600033905090565b6000600154905060008203612374576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61238160008483856122c2565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506123f8836123e960008660006122c8565b6123f285612f1b565b176122f0565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461249957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061245e565b50600082036124d4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506124ea600084838561231b565b505050565b60006124fa8361218b565b9050600081905060008061250d86612257565b91509150841561257657612529818461252461217a565b61227e565b6125755761253e8361253961217a565b611e87565b612574576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6125848360008860016122c2565b801561258f57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612637836125f4856000886122c8565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176122f0565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036126bd57600060018701905060006005600083815260200190815260200160002054036126bb5760015481146126ba578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461272783600088600161231b565b600260008154809291906001019190505550505050505050565b6060600c805461275090613c84565b80601f016020809104026020016040519081016040528092919081815260200182805461277c90613c84565b80156127c95780601f1061279e576101008083540402835291602001916127c9565b820191906000526020600020905b8154815290600101906020018083116127ac57829003601f168201915b5050505050905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128a1612fe1565b6128bd6005600084815260200190815260200160002054612f2b565b9050919050565b6128cc612321565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561292a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129219061436b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612999576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612990906143d7565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600a600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b600a6000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b6000600154905090565b6000612ade612182565b60015403905090565b6009600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b5a61217a565b8786866040518563ffffffff1660e01b8152600401612b7c949392919061444c565b6020604051808303816000875af1925050508015612bb857506040513d601f19601f82011682018060405250810190612bb591906144ad565b60015b612c31573d8060008114612be8576040519150601f19603f3d011682016040523d82523d6000602084013e612bed565b606091505b506000815103612c29576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612c8c612fe1565b612c9d612c988361218b565b612f2b565b9050919050565b606060806040510190508060405280825b600115612cd757600183039250600a81066030018353600a8104905080612cb5575b508181036020830392508083525050919050565b612cf3612321565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d489061436b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db790614526565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612edb57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f0b5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60009392505050565b60006001821460e11b9050919050565b612f33612fe1565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61307981613044565b811461308457600080fd5b50565b60008135905061309681613070565b92915050565b6000602082840312156130b2576130b161303a565b5b60006130c084828501613087565b91505092915050565b60008115159050919050565b6130de816130c9565b82525050565b60006020820190506130f960008301846130d5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561313957808201518184015260208101905061311e565b60008484015250505050565b6000601f19601f8301169050919050565b6000613161826130ff565b61316b818561310a565b935061317b81856020860161311b565b61318481613145565b840191505092915050565b600060208201905081810360008301526131a98184613156565b905092915050565b6000819050919050565b6131c4816131b1565b81146131cf57600080fd5b50565b6000813590506131e1816131bb565b92915050565b6000602082840312156131fd576131fc61303a565b5b600061320b848285016131d2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061323f82613214565b9050919050565b61324f81613234565b82525050565b600060208201905061326a6000830184613246565b92915050565b61327981613234565b811461328457600080fd5b50565b60008135905061329681613270565b92915050565b600080604083850312156132b3576132b261303a565b5b60006132c185828601613287565b92505060206132d2858286016131d2565b9150509250929050565b6132e5816131b1565b82525050565b600060208201905061330060008301846132dc565b92915050565b60008060006060848603121561331f5761331e61303a565b5b600061332d86828701613287565b935050602061333e86828701613287565b925050604061334f868287016131d2565b9150509250925092565b600080604083850312156133705761336f61303a565b5b600061337e858286016131d2565b925050602061338f858286016131d2565b9150509250929050565b60006040820190506133ae6000830185613246565b6133bb60208301846132dc565b9392505050565b6000602082840312156133d8576133d761303a565b5b60006133e684828501613287565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613414576134136133ef565b5b8235905067ffffffffffffffff811115613431576134306133f4565b5b60208301915083600182028301111561344d5761344c6133f9565b5b9250929050565b6000806020838503121561346b5761346a61303a565b5b600083013567ffffffffffffffff8111156134895761348861303f565b5b613495858286016133fe565b92509250509250929050565b60008083601f8401126134b7576134b66133ef565b5b8235905067ffffffffffffffff8111156134d4576134d36133f4565b5b6020830191508360208202830111156134f0576134ef6133f9565b5b9250929050565b6000806020838503121561350e5761350d61303a565b5b600083013567ffffffffffffffff81111561352c5761352b61303f565b5b613538858286016134a1565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61357981613234565b82525050565b600067ffffffffffffffff82169050919050565b61359c8161357f565b82525050565b6135ab816130c9565b82525050565b600062ffffff82169050919050565b6135c9816135b1565b82525050565b6080820160008201516135e56000850182613570565b5060208201516135f86020850182613593565b50604082015161360b60408501826135a2565b50606082015161361e60608501826135c0565b50505050565b600061363083836135cf565b60808301905092915050565b6000602082019050919050565b600061365482613544565b61365e818561354f565b935061366983613560565b8060005b8381101561369a5781516136818882613624565b975061368c8361363c565b92505060018101905061366d565b5085935050505092915050565b600060208201905081810360008301526136c18184613649565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136fe816131b1565b82525050565b600061371083836136f5565b60208301905092915050565b6000602082019050919050565b6000613734826136c9565b61373e81856136d4565b9350613749836136e5565b8060005b8381101561377a5781516137618882613704565b975061376c8361371c565b92505060018101905061374d565b5085935050505092915050565b600060208201905081810360008301526137a18184613729565b905092915050565b60006bffffffffffffffffffffffff82169050919050565b6137ca816137a9565b81146137d557600080fd5b50565b6000813590506137e7816137c1565b92915050565b6000806000606084860312156138065761380561303a565b5b6000613814868287016131d2565b935050602061382586828701613287565b9250506040613836868287016137d8565b9150509250925092565b6000806000606084860312156138595761385861303a565b5b600061386786828701613287565b9350506020613878868287016131d2565b9250506040613889868287016131d2565b9150509250925092565b61389c816130c9565b81146138a757600080fd5b50565b6000813590506138b981613893565b92915050565b600080604083850312156138d6576138d561303a565b5b60006138e485828601613287565b92505060206138f5858286016138aa565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61393c82613145565b810181811067ffffffffffffffff8211171561395b5761395a613904565b5b80604052505050565b600061396e613030565b905061397a8282613933565b919050565b600067ffffffffffffffff82111561399a57613999613904565b5b6139a382613145565b9050602081019050919050565b82818337600083830152505050565b60006139d26139cd8461397f565b613964565b9050828152602081018484840111156139ee576139ed6138ff565b5b6139f98482856139b0565b509392505050565b600082601f830112613a1657613a156133ef565b5b8135613a268482602086016139bf565b91505092915050565b60008060008060808587031215613a4957613a4861303a565b5b6000613a5787828801613287565b9450506020613a6887828801613287565b9350506040613a79878288016131d2565b925050606085013567ffffffffffffffff811115613a9a57613a9961303f565b5b613aa687828801613a01565b91505092959194509250565b608082016000820151613ac86000850182613570565b506020820151613adb6020850182613593565b506040820151613aee60408501826135a2565b506060820151613b0160608501826135c0565b50505050565b6000608082019050613b1c6000830184613ab2565b92915050565b600080600060408486031215613b3b57613b3a61303a565b5b600084013567ffffffffffffffff811115613b5957613b5861303f565b5b613b65868287016134a1565b93509350506020613b7886828701613287565b9150509250925092565b60008060408385031215613b9957613b9861303a565b5b6000613ba785828601613287565b9250506020613bb8858286016137d8565b9150509250929050565b600080600060608486031215613bdb57613bda61303a565b5b6000613be9868287016131d2565b9350506020613bfa868287016131d2565b9250506040613c0b86828701613287565b9150509250925092565b60008060408385031215613c2c57613c2b61303a565b5b6000613c3a85828601613287565b9250506020613c4b85828601613287565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c9c57607f821691505b602082108103613caf57613cae613c55565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613cef826131b1565b9150613cfa836131b1565b9250828202613d08816131b1565b91508282048414831517613d1f57613d1e613cb5565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d60826131b1565b9150613d6b836131b1565b925082613d7b57613d7a613d26565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613dbc60208361310a565b9150613dc782613d86565b602082019050919050565b60006020820190508181036000830152613deb81613daf565b9050919050565b7f6d617820737570706c7920726561636865640000000000000000000000000000600082015250565b6000613e2860128361310a565b9150613e3382613df2565b602082019050919050565b60006020820190508181036000830152613e5781613e1b565b9050919050565b6000613e69826131b1565b9150613e74836131b1565b9250828201905080821115613e8c57613e8b613cb5565b5b92915050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613eff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ec2565b613f098683613ec2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613f46613f41613f3c846131b1565b613f21565b6131b1565b9050919050565b6000819050919050565b613f6083613f2b565b613f74613f6c82613f4d565b848454613ecf565b825550505050565b600090565b613f89613f7c565b613f94818484613f57565b505050565b5b81811015613fb857613fad600082613f81565b600181019050613f9a565b5050565b601f821115613ffd57613fce81613e9d565b613fd784613eb2565b81016020851015613fe6578190505b613ffa613ff285613eb2565b830182613f99565b50505b505050565b600082821c905092915050565b600061402060001984600802614002565b1980831691505092915050565b6000614039838361400f565b9150826002028217905092915050565b6140538383613e92565b67ffffffffffffffff81111561406c5761406b613904565b5b6140768254613c84565b614081828285613fbc565b6000601f8311600181146140b0576000841561409e578287013590505b6140a8858261402d565b865550614110565b601f1984166140be86613e9d565b60005b828110156140e6578489013582556001820191506020850194506020810190506140c1565b8683101561410357848901356140ff601f89168261400f565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b614151816137a9565b82525050565b600060208201905061416c6000830184614148565b92915050565b600081905092915050565b6000614188826130ff565b6141928185614172565b93506141a281856020860161311b565b80840191505092915050565b60006141ba828561417d565b91506141c6828461417d565b91508190509392505050565b7f696e76616c6964206d6178537570706c79000000000000000000000000000000600082015250565b600061420860118361310a565b9150614213826141d2565b602082019050919050565b60006020820190508181036000830152614237816141fb565b9050919050565b600060408201905061425360008301856132dc565b61426060208301846132dc565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142c360268361310a565b91506142ce82614267565b604082019050919050565b600060208201905081810360008301526142f2816142b6565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614355602a8361310a565b9150614360826142f9565b604082019050919050565b6000602082019050818103600083015261438481614348565b9050919050565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b60006143c1601b8361310a565b91506143cc8261438b565b602082019050919050565b600060208201905081810360008301526143f0816143b4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061441e826143f7565b6144288185614402565b935061443881856020860161311b565b61444181613145565b840191505092915050565b60006080820190506144616000830187613246565b61446e6020830186613246565b61447b60408301856132dc565b818103606083015261448d8184614413565b905095945050505050565b6000815190506144a781613070565b92915050565b6000602082840312156144c3576144c261303a565b5b60006144d184828501614498565b91505092915050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061451060198361310a565b915061451b826144da565b602082019050919050565b6000602082019050818103600083015261453f81614503565b905091905056fea2646970667358221220765ac4f8d9b4b21c63f2f4068541b690de5e915e6fffa875f20579cca48111f064736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000186a00000000000000000000000005607ee6014b0ecdb649216bc93dbbe687143a8540000000000000000000000000000000000000000000000000000000000000514000000000000000000000000000000000000000000000000000000000000002e43727970746f2e636f6d2045787065646974696f6e20476561723a20546f6f6c73206f6620746865205472616465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e43727970746f2e636f6d2045787065646974696f6e20476561723a20546f6f6c73206f6620746865205472616465000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Crypto.com Expedition Gear: Tools of the Trade
Arg [1] : symbol_ (string): Crypto.com Expedition Gear: Tools of the Trade
Arg [2] : _startTokenId_ (uint256): 1
Arg [3] : _maxSupply (uint256): 100000
Arg [4] : _royaltyReceiver (address): 0x5607eE6014b0ecDB649216BC93dbbE687143A854
Arg [5] : _royaltyFee (uint96): 1300
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000000000000000000000000000000000000000186a0
Arg [4] : 0000000000000000000000005607ee6014b0ecdb649216bc93dbbe687143a854
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000514
Arg [6] : 000000000000000000000000000000000000000000000000000000000000002e
Arg [7] : 43727970746f2e636f6d2045787065646974696f6e20476561723a20546f6f6c
Arg [8] : 73206f6620746865205472616465000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000002e
Arg [10] : 43727970746f2e636f6d2045787065646974696f6e20476561723a20546f6f6c
Arg [11] : 73206f6620746865205472616465000000000000000000000000000000000000
Deployed Bytecode Sourcemap
71242:4558:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74730:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19440:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25923:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25364:400;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15191:323;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29630:2817;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55603:494;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;72766:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32543:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73114:79;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72921:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74610:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62396:528;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20833:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74511:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16375:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69795:103;;;:::i;:::-;;66272:900;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73201:243;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75339:296;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75643:154;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69144:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19616:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63312:2513;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26481:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72665:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75200:131;;;:::i;:::-;;33326:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61809:428;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19826:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74066:315;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71384:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74976:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73722:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73452:262;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71035:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26946:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72430:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70053:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74730:222;74879:4;74908:36;74932:11;74908:23;:36::i;:::-;74901:43;;74730:222;;;:::o;19440:100::-;19494:13;19527:5;19520:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19440:100;:::o;25923:218::-;25999:7;26024:16;26032:7;26024;:16::i;:::-;26019:64;;26049:34;;;;;;;;;;;;;;26019:64;26103:15;:24;26119:7;26103:24;;;;;;;;;;;:30;;;;;;;;;;;;26096:37;;25923:218;;;:::o;25364:400::-;25445:13;25461:16;25469:7;25461;:16::i;:::-;25445:32;;25517:5;25494:28;;:19;:17;:19::i;:::-;:28;;;25490:175;;25542:44;25559:5;25566:19;:17;:19::i;:::-;25542:16;:44::i;:::-;25537:128;;25614:35;;;;;;;;;;;;;;25537:128;25490:175;25710:2;25677:15;:24;25693:7;25677:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25748:7;25744:2;25728:28;;25737:5;25728:28;;;;;;;;;;;;25434:330;25364:400;;:::o;15191:323::-;15252:7;15480:15;:13;:15::i;:::-;15465:12;;15449:13;;:28;:46;15442:53;;15191:323;:::o;29630:2817::-;29764:27;29794;29813:7;29794:18;:27::i;:::-;29764:57;;29879:4;29838:45;;29854:19;29838:45;;;29834:86;;29892:28;;;;;;;;;;;;;;29834:86;29934:27;29963:23;29990:35;30017:7;29990:26;:35::i;:::-;29933:92;;;;30125:68;30150:15;30167:4;30173:19;:17;:19::i;:::-;30125:24;:68::i;:::-;30120:180;;30213:43;30230:4;30236:19;:17;:19::i;:::-;30213:16;:43::i;:::-;30208:92;;30265:35;;;;;;;;;;;;;;30208:92;30120:180;30331:1;30317:16;;:2;:16;;;30313:52;;30342:23;;;;;;;;;;;;;;30313:52;30378:43;30400:4;30406:2;30410:7;30419:1;30378:21;:43::i;:::-;30514:15;30511:160;;;30654:1;30633:19;30626:30;30511:160;31051:18;:24;31070:4;31051:24;;;;;;;;;;;;;;;;31049:26;;;;;;;;;;;;31120:18;:22;31139:2;31120:22;;;;;;;;;;;;;;;;31118:24;;;;;;;;;;;31442:146;31479:2;31528:45;31543:4;31549:2;31553:19;31528:14;:45::i;:::-;11590:8;31500:73;31442:18;:146::i;:::-;31413:17;:26;31431:7;31413:26;;;;;;;;;;;:175;;;;31759:1;11590:8;31708:19;:47;:52;31704:627;;31781:19;31813:1;31803:7;:11;31781:33;;31970:1;31936:17;:30;31954:11;31936:30;;;;;;;;;;;;:35;31932:384;;32074:13;;32059:11;:28;32055:242;;32254:19;32221:17;:30;32239:11;32221:30;;;;;;;;;;;:52;;;;32055:242;31932:384;31762:569;31704:627;32378:7;32374:2;32359:27;;32368:4;32359:27;;;;;;;;;;;;32397:42;32418:4;32424:2;32428:7;32437:1;32397:20;:42::i;:::-;29753:2694;;;29630:2817;;;:::o;55603:494::-;55747:7;55756;55781:26;55810:17;:27;55828:8;55810:27;;;;;;;;;;;55781:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55882:1;55854:30;;:7;:16;;;:30;;;55850:92;;55911:19;55901:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55850:92;55954:21;56019:17;:15;:17::i;:::-;55978:58;;55992:7;:23;;;55979:36;;:10;:36;;;;:::i;:::-;55978:58;;;;:::i;:::-;55954:82;;56057:7;:16;;;56075:13;56049:40;;;;;;55603:494;;;;;:::o;72766:147::-;69375:12;:10;:12::i;:::-;69364:23;;:7;:5;:7::i;:::-;:23;;;69356:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72850:9:::1;;72834:13;:11;:13::i;:::-;:25;72826:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;72893:12;72899:2;72903:1;72893:5;:12::i;:::-;72766:147:::0;:::o;32543:185::-;32681:39;32698:4;32704:2;32708:7;32681:39;;;;;;;;;;;;:16;:39::i;:::-;32543:185;;;:::o;73114:79::-;73164:21;73170:8;73180:4;73164:5;:21::i;:::-;73114:79;:::o;72921:185::-;69375:12;:10;:12::i;:::-;69364:23;;:7;:5;:7::i;:::-;:23;;;69356:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73036:9:::1;;73024:8;73008:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;73000:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73079:19;73085:2;73089:8;73079:5;:19::i;:::-;72921:185:::0;;:::o;74610:112::-;69375:12;:10;:12::i;:::-;69364:23;;:7;:5;:7::i;:::-;:23;;;69356:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74703:11:::1;;74687:13;:27;;;;;;;:::i;:::-;;74610:112:::0;;:::o;62396:528::-;62540:23;62606:22;62631:8;;:15;;62606:40;;62661:34;62719:14;62698:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;62661:73;;62754:9;62749:125;62770:14;62765:1;:19;62749:125;;62826:32;62846:8;;62855:1;62846:11;;;;;;;:::i;:::-;;;;;;;;62826:19;:32::i;:::-;62810:10;62821:1;62810:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;62786:3;;;;;62749:125;;;;62895:10;62888:17;;;;62396:528;;;;:::o;20833:152::-;20905:7;20948:27;20967:7;20948:18;:27::i;:::-;20925:52;;20833:152;;;:::o;74511:91::-;74551:13;74584:10;:8;:10::i;:::-;74577:17;;74511:91;:::o;16375:233::-;16447:7;16488:1;16471:19;;:5;:19;;;16467:60;;16499:28;;;;;;;;;;;;;;16467:60;10534:13;16545:18;:25;16564:5;16545:25;;;;;;;;;;;;;;;;:55;16538:62;;16375:233;;;:::o;69795:103::-;69375:12;:10;:12::i;:::-;69364:23;;:7;:5;:7::i;:::-;:23;;;69356:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69860:30:::1;69887:1;69860:18;:30::i;:::-;69795:103::o:0;66272:900::-;66350:16;66404:19;66438:25;66478:22;66503:16;66513:5;66503:9;:16::i;:::-;66478:41;;66534:25;66576:14;66562:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66534:57;;66606:31;;:::i;:::-;66657:9;66669:15;:13;:15::i;:::-;66657:27;;66652:472;66701:14;66686:11;:29;66652:472;;66753:15;66766:1;66753:12;:15::i;:::-;66741:27;;66791:9;:16;;;66832:8;66787:73;66908:1;66882:28;;:9;:14;;;:28;;;66878:111;;66955:9;:14;;;66935:34;;66878:111;67032:5;67011:26;;:17;:26;;;67007:102;;67088:1;67062:8;67071:13;;;;;;67062:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;67007:102;66652:472;66717:3;;;;;66652:472;;;;67145:8;67138:15;;;;;;;66272:900;;;:::o;73201:243::-;73279:13;73295:9;73279:25;;73274:163;73315:7;73306:5;:16;73274:163;;73341:18;73347:5;73354:4;73341:5;:18::i;:::-;73403:7;;;;;73274:163;;;;73201:243;;:::o;75339:296::-;69375:12;:10;:12::i;:::-;69364:23;;:7;:5;:7::i;:::-;:23;;;69356:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75495:57:::1;75512:8;75522:16;75540:11;75495:16;:57::i;:::-;75597:16;75568:59;;75587:8;75568:59;75615:11;75568:59;;;;;;:::i;:::-;;;;;;;;75339:296:::0;;;:::o;75643:154::-;69375:12;:10;:12::i;:::-;69364:23;;:7;:5;:7::i;:::-;:23;;;69356:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75718:28:::1;75737:8;75718:18;:28::i;:::-;75780:8;75762:27;;;;;;;;;;75643:154:::0;:::o;69144:87::-;69190:7;69217:6;;;;;;;;;;;69210:13;;69144:87;:::o;19616:104::-;19672:13;19705:7;19698:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19616:104;:::o;63312:2513::-;63455:16;63522:4;63513:5;:13;63509:45;;63535:19;;;;;;;;;;;;;;63509:45;63569:19;63603:17;63623:14;:12;:14::i;:::-;63603:34;;63723:15;:13;:15::i;:::-;63715:5;:23;63711:87;;;63767:15;:13;:15::i;:::-;63759:23;;63711:87;63874:9;63867:4;:16;63863:73;;;63911:9;63904:16;;63863:73;63950:25;63978:16;63988:5;63978:9;:16::i;:::-;63950:44;;64172:4;64164:5;:12;64160:278;;;64197:19;64226:5;64219:4;:12;64197:34;;64268:17;64254:11;:31;64250:111;;;64330:11;64310:31;;64250:111;64178:198;64160:278;;;64421:1;64401:21;;64160:278;64452:25;64494:17;64480:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64452:60;;64552:1;64531:17;:22;64527:78;;64581:8;64574:15;;;;;;;;64527:78;64749:31;64783:26;64803:5;64783:19;:26::i;:::-;64749:60;;64824:25;65069:9;:16;;;65064:92;;65126:9;:14;;;65106:34;;65064:92;65175:9;65187:5;65175:17;;65170:478;65199:4;65194:1;:9;;:45;;;;;65222:17;65207:11;:32;;65194:45;65170:478;;;65277:15;65290:1;65277:12;:15::i;:::-;65265:27;;65315:9;:16;;;65356:8;65311:73;65432:1;65406:28;;:9;:14;;;:28;;;65402:111;;65479:9;:14;;;65459:34;;65402:111;65556:5;65535:26;;:17;:26;;;65531:102;;65612:1;65586:8;65595:13;;;;;;65586:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;65531:102;65170:478;65241:3;;;;;65170:478;;;;65750:11;65740:8;65733:29;65798:8;65791:15;;;;;;;;63312:2513;;;;;;:::o;26481:308::-;26592:19;:17;:19::i;:::-;26580:31;;:8;:31;;;26576:61;;26620:17;;;;;;;;;;;;;;26576:61;26702:8;26650:18;:39;26669:19;:17;:19::i;:::-;26650:39;;;;;;;;;;;;;;;:49;26690:8;26650:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26762:8;26726:55;;26741:19;:17;:19::i;:::-;26726:55;;;26772:8;26726:55;;;;;;:::i;:::-;;;;;;;;26481:308;;:::o;72665:93::-;72709:7;72736:14;:12;:14::i;:::-;72729:21;;72665:93;:::o;75200:131::-;69375:12;:10;:12::i;:::-;69364:23;;:7;:5;:7::i;:::-;:23;;;69356:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75262:23:::1;:21;:23::i;:::-;75301:22;;;;;;;;;;75200:131::o:0;33326:399::-;33493:31;33506:4;33512:2;33516:7;33493:12;:31::i;:::-;33557:1;33539:2;:14;;;:19;33535:183;;33578:56;33609:4;33615:2;33619:7;33628:5;33578:30;:56::i;:::-;33573:145;;33662:40;;;;;;;;;;;;;;33573:145;33535:183;33326:399;;;;:::o;61809:428::-;61893:21;;:::i;:::-;61927:31;;:::i;:::-;61983:15;:13;:15::i;:::-;61973:7;:25;:54;;;;62013:14;:12;:14::i;:::-;62002:7;:25;;61973:54;61969:103;;;62051:9;62044:16;;;;;61969:103;62094:21;62107:7;62094:12;:21::i;:::-;62082:33;;62130:9;:16;;;62126:65;;;62170:9;62163:16;;;;;62126:65;62208:21;62221:7;62208:12;:21::i;:::-;62201:28;;;61809:428;;;;:::o;19826:318::-;19899:13;19930:16;19938:7;19930;:16::i;:::-;19925:59;;19955:29;;;;;;;;;;;;;;19925:59;19997:21;20021:10;:8;:10::i;:::-;19997:34;;20074:1;20055:7;20049:21;:26;:87;;;;;;;;;;;;;;;;;20102:7;20111:18;20121:7;20111:9;:18::i;:::-;20085:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20049:87;20042:94;;;19826:318;;;:::o;74066:315::-;74160:14;74177:7;;:14;;74160:31;;74207:9;74202:172;74222:6;74218:1;:10;74202:172;;;74247:53;74260:10;74272:15;74289:7;;74297:1;74289:10;;;;;;;:::i;:::-;;;;;;;;74247:12;:53::i;:::-;74344:3;;;;;74202:172;;;;74149:232;74066:315;;;:::o;71384:24::-;;;;:::o;74976:216::-;69375:12;:10;:12::i;:::-;69364:23;;:7;:5;:7::i;:::-;:23;;;69356:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75075:49:::1;75094:16;75112:11;75075:18;:49::i;:::-;75154:16;75140:44;;;75172:11;75140:44;;;;;;:::i;:::-;;;;;;;;74976:216:::0;;:::o;73722:336::-;73863:13;73879:9;73863:25;;73858:193;73899:7;73890:5;:16;73858:193;;73925:48;73938:10;73950:15;73967:5;73925:12;:48::i;:::-;74017:7;;;;;73858:193;;;;73722:336;;;:::o;73452:262::-;73519:14;73536:9;;:16;;73519:33;;73568:9;73563:144;73583:6;73579:1;:10;73563:144;;;73608:25;73614:9;;73624:1;73614:12;;;;;;;:::i;:::-;;;;;;;;73628:4;73608:5;:25::i;:::-;73677:3;;;;;73563:144;;;;73508:206;73452:262;;:::o;71035:27::-;;;;:::o;26946:164::-;27043:4;27067:18;:25;27086:5;27067:25;;;;;;;;;;;;;;;:35;27093:8;27067:35;;;;;;;;;;;;;;;;;;;;;;;;;27060:42;;26946:164;;;;:::o;72430:227::-;72521:13;:11;:13::i;:::-;72504;:30;;72496:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;72572:41;72588:9;;72599:13;72572:41;;;;;;;:::i;:::-;;;;;;;;72636:13;72624:9;:25;;;;72430:227;:::o;70053:201::-;69375:12;:10;:12::i;:::-;69364:23;;:7;:5;:7::i;:::-;:23;;;69356:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70162:1:::1;70142:22;;:8;:22;;::::0;70134:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;70218:28;70237:8;70218:18;:28::i;:::-;70053:201:::0;:::o;55333:215::-;55435:4;55474:26;55459:41;;;:11;:41;;;;:81;;;;55504:36;55528:11;55504:23;:36::i;:::-;55459:81;55452:88;;55333:215;;;:::o;27368:282::-;27433:4;27489:7;27470:15;:13;:15::i;:::-;:26;;:66;;;;;27523:13;;27513:7;:23;27470:66;:153;;;;;27622:1;11310:8;27574:17;:26;27592:7;27574:26;;;;;;;;;;;;:44;:49;27470:153;27450:173;;27368:282;;;:::o;49134:105::-;49194:7;49221:10;49214:17;;49134:105;:::o;72310:112::-;72375:7;72402:12;;72395:19;;72310:112;:::o;21988:1275::-;22055:7;22075:12;22090:7;22075:22;;22158:4;22139:15;:13;:15::i;:::-;:23;22135:1061;;22192:13;;22185:4;:20;22181:1015;;;22230:14;22247:17;:23;22265:4;22247:23;;;;;;;;;;;;22230:40;;22364:1;11310:8;22336:6;:24;:29;22332:845;;23001:113;23018:1;23008:6;:11;23001:113;;23061:17;:25;23079:6;;;;;;;23061:25;;;;;;;;;;;;23052:34;;23001:113;;;23147:6;23140:13;;;;;;22332:845;22207:989;22181:1015;22135:1061;23224:31;;;;;;;;;;;;;;21988:1275;;;;:::o;28531:479::-;28633:27;28662:23;28703:38;28744:15;:24;28760:7;28744:24;;;;;;;;;;;28703:65;;28915:18;28892:41;;28972:19;28966:26;28947:45;;28877:126;28531:479;;;:::o;27759:659::-;27908:11;28073:16;28066:5;28062:28;28053:37;;28233:16;28222:9;28218:32;28205:45;;28383:15;28372:9;28369:30;28361:5;28350:9;28347:20;28344:56;28334:66;;27759:659;;;;;:::o;34387:159::-;;;;;:::o;48443:311::-;48578:7;48598:16;11714:3;48624:19;:41;;48598:68;;11714:3;48692:31;48703:4;48709:2;48713:9;48692:10;:31::i;:::-;48684:40;;:62;;48677:69;;;48443:311;;;;;:::o;23811:450::-;23891:14;24059:16;24052:5;24048:28;24039:37;;24236:5;24222:11;24197:23;24193:41;24190:52;24183:5;24180:63;24170:73;;23811:450;;;;:::o;35211:158::-;;;;;:::o;56379:97::-;56437:6;56463:5;56456:12;;56379:97;:::o;67864:98::-;67917:7;67944:10;67937:17;;67864:98;:::o;36987:2454::-;37060:20;37083:13;;37060:36;;37123:1;37111:8;:13;37107:44;;37133:18;;;;;;;;;;;;;;37107:44;37164:61;37194:1;37198:2;37202:12;37216:8;37164:21;:61::i;:::-;37708:1;10672:2;37678:1;:26;;37677:32;37665:8;:45;37639:18;:22;37658:2;37639:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37987:139;38024:2;38078:33;38101:1;38105:2;38109:1;38078:14;:33::i;:::-;38045:30;38066:8;38045:20;:30::i;:::-;:66;37987:18;:139::i;:::-;37953:17;:31;37971:12;37953:31;;;;;;;;;;;:173;;;;38143:16;38174:11;38203:8;38188:12;:23;38174:37;;38458:16;38454:2;38450:25;38438:37;;38830:12;38790:8;38749:1;38687:25;38628:1;38567;38540:335;38955:1;38941:12;38937:20;38895:346;38996:3;38987:7;38984:16;38895:346;;39214:7;39204:8;39201:1;39174:25;39171:1;39168;39163:59;39049:1;39040:7;39036:15;39025:26;;38895:346;;;38899:77;39286:1;39274:8;:13;39270:45;;39296:19;;;;;;;;;;;;;;39270:45;39348:3;39332:13;:19;;;;37413:1950;;39373:60;39402:1;39406:2;39410:12;39424:8;39373:20;:60::i;:::-;37049:2392;36987:2454;;:::o;43663:3081::-;43743:27;43773;43792:7;43773:18;:27::i;:::-;43743:57;;43813:12;43844:19;43813:52;;43879:27;43908:23;43935:35;43962:7;43935:26;:35::i;:::-;43878:92;;;;43987:13;43983:316;;;44108:68;44133:15;44150:4;44156:19;:17;:19::i;:::-;44108:24;:68::i;:::-;44103:184;;44200:43;44217:4;44223:19;:17;:19::i;:::-;44200:16;:43::i;:::-;44195:92;;44252:35;;;;;;;;;;;;;;44195:92;44103:184;43983:316;44311:51;44333:4;44347:1;44351:7;44360:1;44311:21;:51::i;:::-;44455:15;44452:160;;;44595:1;44574:19;44567:30;44452:160;45273:1;10799:3;45243:1;:26;;45242:32;45214:18;:24;45233:4;45214:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;45541:176;45578:4;45649:53;45664:4;45678:1;45682:19;45649:14;:53::i;:::-;11590:8;11310;45602:43;45601:101;45541:18;:176::i;:::-;45512:17;:26;45530:7;45512:26;;;;;;;;;;;:205;;;;45888:1;11590:8;45837:19;:47;:52;45833:627;;45910:19;45942:1;45932:7;:11;45910:33;;46099:1;46065:17;:30;46083:11;46065:30;;;;;;;;;;;;:35;46061:384;;46203:13;;46188:11;:28;46184:242;;46383:19;46350:17;:30;46368:11;46350:30;;;;;;;;;;;:52;;;;46184:242;46061:384;45891:569;45833:627;46515:7;46511:1;46488:35;;46497:4;46488:35;;;;;;;;;;;;46534:50;46555:4;46569:1;46573:7;46582:1;46534:20;:50::i;:::-;46711:12;;:14;;;;;;;;;;;;;43732:3012;;;;43663:3081;;:::o;74389:114::-;74449:13;74482;74475:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74389:114;:::o;70414:191::-;70488:16;70507:6;;;;;;;;;;;70488:25;;70533:8;70524:6;;:17;;;;;;;;;;;;;;;;;;70588:8;70557:40;;70578:8;70557:40;;;;;;;;;;;;70477:128;70414:191;:::o;21436:161::-;21504:21;;:::i;:::-;21545:44;21564:17;:24;21582:5;21564:24;;;;;;;;;;;;21545:18;:44::i;:::-;21538:51;;21436:161;;;:::o;57574:390::-;57742:17;:15;:17::i;:::-;57726:33;;:12;:33;;;;57718:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;57845:1;57825:22;;:8;:22;;;57817:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57921:35;;;;;;;;57933:8;57921:35;;;;;;57943:12;57921:35;;;;;57892:17;:26;57910:7;57892:26;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57574:390;;;:::o;58075:114::-;58155:17;:26;58173:7;58155:26;;;;;;;;;;;;58148:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58075:114;:::o;14878:103::-;14933:7;14960:13;;14953:20;;14878:103;:::o;15612:296::-;15667:7;15874:15;:13;:15::i;:::-;15858:13;;:31;15851:38;;15612:296;:::o;57155:95::-;57223:19;;57216:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57155:95::o;35809:716::-;35972:4;36018:2;35993:45;;;36039:19;:17;:19::i;:::-;36060:4;36066:7;36075:5;35993:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35989:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36293:1;36276:6;:13;:18;36272:235;;36322:40;;;;;;;;;;;;;;36272:235;36465:6;36459:13;36450:6;36446:2;36442:15;36435:38;35989:529;36162:54;;;36152:64;;;:6;:64;;;;36145:71;;;35809:716;;;;;;:::o;21174:166::-;21244:21;;:::i;:::-;21285:47;21304:27;21323:7;21304:18;:27::i;:::-;21285:18;:47::i;:::-;21278:54;;21174:166;;;:::o;49341:1581::-;49406:17;49831:4;49824;49818:11;49814:22;49807:29;;49923:3;49917:4;49910:17;50029:3;50268:5;50250:428;50276:1;50250:428;;;50316:1;50311:3;50307:11;50300:18;;50487:2;50481:4;50477:13;50473:2;50469:22;50464:3;50456:36;50581:2;50575:4;50571:13;50563:21;;50648:4;50250:428;50638:25;50250:428;50254:21;50717:3;50712;50708:13;50832:4;50827:3;50823:14;50816:21;;50897:6;50892:3;50885:19;49445:1470;;49341:1581;;;:::o;56747:332::-;56866:17;:15;:17::i;:::-;56850:33;;:12;:33;;;;56842:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;56969:1;56949:22;;:8;:22;;;56941:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;57036:35;;;;;;;;57048:8;57036:35;;;;;;57058:12;57036:35;;;;;57014:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56747:332;;:::o;18538:639::-;18623:4;18962:10;18947:25;;:11;:25;;;;:102;;;;19039:10;19024:25;;:11;:25;;;;18947:102;:179;;;;19116:10;19101:25;;:11;:25;;;;18947:179;18927:199;;18538:639;;;:::o;48144:147::-;48281:6;48144:147;;;;;:::o;24363:324::-;24433:14;24666:1;24656:8;24653:15;24627:24;24623:46;24613:56;;24363:324;;;:::o;23362:366::-;23428:31;;:::i;:::-;23505:6;23472:9;:14;;:41;;;;;;;;;;;11193:3;23558:6;:33;;23524:9;:24;;:68;;;;;;;;;;;23650:1;11310:8;23622:6;:24;:29;;23603:9;:16;;:48;;;;;;;;;;;11714:3;23691:6;:28;;23662:9;:19;;:58;;;;;;;;;;;23362:366;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798: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:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:332::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6519:71;6587:1;6576:9;6572:17;6563:6;6519:71;:::i;:::-;6600:72;6668:2;6657:9;6653:18;6644:6;6600:72;:::i;:::-;6347:332;;;;;:::o;6685:329::-;6744:6;6793:2;6781:9;6772:7;6768:23;6764:32;6761:119;;;6799:79;;:::i;:::-;6761:119;6919:1;6944:53;6989:7;6980:6;6969:9;6965:22;6944:53;:::i;:::-;6934:63;;6890:117;6685:329;;;;:::o;7020:117::-;7129:1;7126;7119:12;7143:117;7252:1;7249;7242:12;7266:117;7375:1;7372;7365:12;7403:553;7461:8;7471:6;7521:3;7514:4;7506:6;7502:17;7498:27;7488:122;;7529:79;;:::i;:::-;7488:122;7642:6;7629:20;7619:30;;7672:18;7664:6;7661:30;7658:117;;;7694:79;;:::i;:::-;7658:117;7808:4;7800:6;7796:17;7784:29;;7862:3;7854:4;7846:6;7842:17;7832:8;7828:32;7825:41;7822:128;;;7869:79;;:::i;:::-;7822:128;7403:553;;;;;:::o;7962:529::-;8033:6;8041;8090:2;8078:9;8069:7;8065:23;8061:32;8058:119;;;8096:79;;:::i;:::-;8058:119;8244:1;8233:9;8229:17;8216:31;8274:18;8266:6;8263:30;8260:117;;;8296:79;;:::i;:::-;8260:117;8409:65;8466:7;8457:6;8446:9;8442:22;8409:65;:::i;:::-;8391:83;;;;8187:297;7962:529;;;;;:::o;8514:568::-;8587:8;8597:6;8647:3;8640:4;8632:6;8628:17;8624:27;8614:122;;8655:79;;:::i;:::-;8614:122;8768:6;8755:20;8745:30;;8798:18;8790:6;8787:30;8784:117;;;8820:79;;:::i;:::-;8784:117;8934:4;8926:6;8922:17;8910:29;;8988:3;8980:4;8972:6;8968:17;8958:8;8954:32;8951:41;8948:128;;;8995:79;;:::i;:::-;8948:128;8514:568;;;;;:::o;9088:559::-;9174:6;9182;9231:2;9219:9;9210:7;9206:23;9202:32;9199:119;;;9237:79;;:::i;:::-;9199:119;9385:1;9374:9;9370:17;9357:31;9415:18;9407:6;9404:30;9401:117;;;9437:79;;:::i;:::-;9401:117;9550:80;9622:7;9613:6;9602:9;9598:22;9550:80;:::i;:::-;9532:98;;;;9328:312;9088:559;;;;;:::o;9653:144::-;9750:6;9784:5;9778:12;9768:22;;9653:144;;;:::o;9803:214::-;9932:11;9966:6;9961:3;9954:19;10006:4;10001:3;9997:14;9982:29;;9803:214;;;;:::o;10023:162::-;10120:4;10143:3;10135:11;;10173:4;10168:3;10164:14;10156:22;;10023:162;;;:::o;10191:108::-;10268:24;10286:5;10268:24;:::i;:::-;10263:3;10256:37;10191:108;;:::o;10305:101::-;10341:7;10381:18;10374:5;10370:30;10359:41;;10305:101;;;:::o;10412:105::-;10487:23;10504:5;10487:23;:::i;:::-;10482:3;10475:36;10412:105;;:::o;10523:99::-;10594:21;10609:5;10594:21;:::i;:::-;10589:3;10582:34;10523:99;;:::o;10628:91::-;10664:7;10704:8;10697:5;10693:20;10682:31;;10628:91;;;:::o;10725:105::-;10800:23;10817:5;10800:23;:::i;:::-;10795:3;10788:36;10725:105;;:::o;10908:862::-;11055:4;11050:3;11046:14;11142:4;11135:5;11131:16;11125:23;11161:63;11218:4;11213:3;11209:14;11195:12;11161:63;:::i;:::-;11070:164;11326:4;11319:5;11315:16;11309:23;11345:61;11400:4;11395:3;11391:14;11377:12;11345:61;:::i;:::-;11244:172;11500:4;11493:5;11489:16;11483:23;11519:57;11570:4;11565:3;11561:14;11547:12;11519:57;:::i;:::-;11426:160;11673:4;11666:5;11662:16;11656:23;11692:61;11747:4;11742:3;11738:14;11724:12;11692:61;:::i;:::-;11596:167;11024:746;10908:862;;:::o;11776:299::-;11905:10;11926:106;12028:3;12020:6;11926:106;:::i;:::-;12064:4;12059:3;12055:14;12041:28;;11776:299;;;;:::o;12081:143::-;12181:4;12213;12208:3;12204:14;12196:22;;12081:143;;;:::o;12306:972::-;12485:3;12514:84;12592:5;12514:84;:::i;:::-;12614:116;12723:6;12718:3;12614:116;:::i;:::-;12607:123;;12754:86;12834:5;12754:86;:::i;:::-;12863:7;12894:1;12879:374;12904:6;12901:1;12898:13;12879:374;;;12980:6;12974:13;13007:123;13126:3;13111:13;13007:123;:::i;:::-;13000:130;;13153:90;13236:6;13153:90;:::i;:::-;13143:100;;12939:314;12926:1;12923;12919:9;12914:14;;12879:374;;;12883:14;13269:3;13262:10;;12490:788;;;12306:972;;;;:::o;13284:493::-;13487:4;13525:2;13514:9;13510:18;13502:26;;13574:9;13568:4;13564:20;13560:1;13549:9;13545:17;13538:47;13602:168;13765:4;13756:6;13602:168;:::i;:::-;13594:176;;13284:493;;;;:::o;13783:114::-;13850:6;13884:5;13878:12;13868:22;;13783:114;;;:::o;13903:184::-;14002:11;14036:6;14031:3;14024:19;14076:4;14071:3;14067:14;14052:29;;13903:184;;;;:::o;14093:132::-;14160:4;14183:3;14175:11;;14213:4;14208:3;14204:14;14196:22;;14093:132;;;:::o;14231:108::-;14308:24;14326:5;14308:24;:::i;:::-;14303:3;14296:37;14231:108;;:::o;14345:179::-;14414:10;14435:46;14477:3;14469:6;14435:46;:::i;:::-;14513:4;14508:3;14504:14;14490:28;;14345:179;;;;:::o;14530:113::-;14600:4;14632;14627:3;14623:14;14615:22;;14530:113;;;:::o;14679:732::-;14798:3;14827:54;14875:5;14827:54;:::i;:::-;14897:86;14976:6;14971:3;14897:86;:::i;:::-;14890:93;;15007:56;15057:5;15007:56;:::i;:::-;15086:7;15117:1;15102:284;15127:6;15124:1;15121:13;15102:284;;;15203:6;15197:13;15230:63;15289:3;15274:13;15230:63;:::i;:::-;15223:70;;15316:60;15369:6;15316:60;:::i;:::-;15306:70;;15162:224;15149:1;15146;15142:9;15137:14;;15102:284;;;15106:14;15402:3;15395:10;;14803:608;;;14679:732;;;;:::o;15417:373::-;15560:4;15598:2;15587:9;15583:18;15575:26;;15647:9;15641:4;15637:20;15633:1;15622:9;15618:17;15611:47;15675:108;15778:4;15769:6;15675:108;:::i;:::-;15667:116;;15417:373;;;;:::o;15796:109::-;15832:7;15872:26;15865:5;15861:38;15850:49;;15796:109;;;:::o;15911:120::-;15983:23;16000:5;15983:23;:::i;:::-;15976:5;15973:34;15963:62;;16021:1;16018;16011:12;15963:62;15911:120;:::o;16037:137::-;16082:5;16120:6;16107:20;16098:29;;16136:32;16162:5;16136:32;:::i;:::-;16037:137;;;;:::o;16180:617::-;16256:6;16264;16272;16321:2;16309:9;16300:7;16296:23;16292:32;16289:119;;;16327:79;;:::i;:::-;16289:119;16447:1;16472:53;16517:7;16508:6;16497:9;16493:22;16472:53;:::i;:::-;16462:63;;16418:117;16574:2;16600:53;16645:7;16636:6;16625:9;16621:22;16600:53;:::i;:::-;16590:63;;16545:118;16702:2;16728:52;16772:7;16763:6;16752:9;16748:22;16728:52;:::i;:::-;16718:62;;16673:117;16180:617;;;;;:::o;16803:619::-;16880:6;16888;16896;16945:2;16933:9;16924:7;16920:23;16916:32;16913:119;;;16951:79;;:::i;:::-;16913:119;17071:1;17096:53;17141:7;17132:6;17121:9;17117:22;17096:53;:::i;:::-;17086:63;;17042:117;17198:2;17224:53;17269:7;17260:6;17249:9;17245:22;17224:53;:::i;:::-;17214:63;;17169:118;17326:2;17352:53;17397:7;17388:6;17377:9;17373:22;17352:53;:::i;:::-;17342:63;;17297:118;16803:619;;;;;:::o;17428:116::-;17498:21;17513:5;17498:21;:::i;:::-;17491:5;17488:32;17478:60;;17534:1;17531;17524:12;17478:60;17428:116;:::o;17550:133::-;17593:5;17631:6;17618:20;17609:29;;17647:30;17671:5;17647:30;:::i;:::-;17550:133;;;;:::o;17689:468::-;17754:6;17762;17811:2;17799:9;17790:7;17786:23;17782:32;17779:119;;;17817:79;;:::i;:::-;17779:119;17937:1;17962:53;18007:7;17998:6;17987:9;17983:22;17962:53;:::i;:::-;17952:63;;17908:117;18064:2;18090:50;18132:7;18123:6;18112:9;18108:22;18090:50;:::i;:::-;18080:60;;18035:115;17689:468;;;;;:::o;18163:117::-;18272:1;18269;18262:12;18286:180;18334:77;18331:1;18324:88;18431:4;18428:1;18421:15;18455:4;18452:1;18445:15;18472:281;18555:27;18577:4;18555:27;:::i;:::-;18547:6;18543:40;18685:6;18673:10;18670:22;18649:18;18637:10;18634:34;18631:62;18628:88;;;18696:18;;:::i;:::-;18628:88;18736:10;18732:2;18725:22;18515:238;18472:281;;:::o;18759:129::-;18793:6;18820:20;;:::i;:::-;18810:30;;18849:33;18877:4;18869:6;18849:33;:::i;:::-;18759:129;;;:::o;18894:307::-;18955:4;19045:18;19037:6;19034:30;19031:56;;;19067:18;;:::i;:::-;19031:56;19105:29;19127:6;19105:29;:::i;:::-;19097:37;;19189:4;19183;19179:15;19171:23;;18894:307;;;:::o;19207:146::-;19304:6;19299:3;19294;19281:30;19345:1;19336:6;19331:3;19327:16;19320:27;19207:146;;;:::o;19359:423::-;19436:5;19461:65;19477:48;19518:6;19477:48;:::i;:::-;19461:65;:::i;:::-;19452:74;;19549:6;19542:5;19535:21;19587:4;19580:5;19576:16;19625:3;19616:6;19611:3;19607:16;19604:25;19601:112;;;19632:79;;:::i;:::-;19601:112;19722:54;19769:6;19764:3;19759;19722:54;:::i;:::-;19442:340;19359:423;;;;;:::o;19801:338::-;19856:5;19905:3;19898:4;19890:6;19886:17;19882:27;19872:122;;19913:79;;:::i;:::-;19872:122;20030:6;20017:20;20055:78;20129:3;20121:6;20114:4;20106:6;20102:17;20055:78;:::i;:::-;20046:87;;19862:277;19801:338;;;;:::o;20145:943::-;20240:6;20248;20256;20264;20313:3;20301:9;20292:7;20288:23;20284:33;20281:120;;;20320:79;;:::i;:::-;20281:120;20440:1;20465:53;20510:7;20501:6;20490:9;20486:22;20465:53;:::i;:::-;20455:63;;20411:117;20567:2;20593:53;20638:7;20629:6;20618:9;20614:22;20593:53;:::i;:::-;20583:63;;20538:118;20695:2;20721:53;20766:7;20757:6;20746:9;20742:22;20721:53;:::i;:::-;20711:63;;20666:118;20851:2;20840:9;20836:18;20823:32;20882:18;20874:6;20871:30;20868:117;;;20904:79;;:::i;:::-;20868:117;21009:62;21063:7;21054:6;21043:9;21039:22;21009:62;:::i;:::-;20999:72;;20794:287;20145:943;;;;;;;:::o;21166:872::-;21323:4;21318:3;21314:14;21410:4;21403:5;21399:16;21393:23;21429:63;21486:4;21481:3;21477:14;21463:12;21429:63;:::i;:::-;21338:164;21594:4;21587:5;21583:16;21577:23;21613:61;21668:4;21663:3;21659:14;21645:12;21613:61;:::i;:::-;21512:172;21768:4;21761:5;21757:16;21751:23;21787:57;21838:4;21833:3;21829:14;21815:12;21787:57;:::i;:::-;21694:160;21941:4;21934:5;21930:16;21924:23;21960:61;22015:4;22010:3;22006:14;21992:12;21960:61;:::i;:::-;21864:167;21292:746;21166:872;;:::o;22044:343::-;22197:4;22235:3;22224:9;22220:19;22212:27;;22249:131;22377:1;22366:9;22362:17;22353:6;22249:131;:::i;:::-;22044:343;;;;:::o;22393:704::-;22488:6;22496;22504;22553:2;22541:9;22532:7;22528:23;22524:32;22521:119;;;22559:79;;:::i;:::-;22521:119;22707:1;22696:9;22692:17;22679:31;22737:18;22729:6;22726:30;22723:117;;;22759:79;;:::i;:::-;22723:117;22872:80;22944:7;22935:6;22924:9;22920:22;22872:80;:::i;:::-;22854:98;;;;22650:312;23001:2;23027:53;23072:7;23063:6;23052:9;23048:22;23027:53;:::i;:::-;23017:63;;22972:118;22393:704;;;;;:::o;23103:472::-;23170:6;23178;23227:2;23215:9;23206:7;23202:23;23198:32;23195:119;;;23233:79;;:::i;:::-;23195:119;23353:1;23378:53;23423:7;23414:6;23403:9;23399:22;23378:53;:::i;:::-;23368:63;;23324:117;23480:2;23506:52;23550:7;23541:6;23530:9;23526:22;23506:52;:::i;:::-;23496:62;;23451:117;23103:472;;;;;:::o;23581:619::-;23658:6;23666;23674;23723:2;23711:9;23702:7;23698:23;23694:32;23691:119;;;23729:79;;:::i;:::-;23691:119;23849:1;23874:53;23919:7;23910:6;23899:9;23895:22;23874:53;:::i;:::-;23864:63;;23820:117;23976:2;24002:53;24047:7;24038:6;24027:9;24023:22;24002:53;:::i;:::-;23992:63;;23947:118;24104:2;24130:53;24175:7;24166:6;24155:9;24151:22;24130:53;:::i;:::-;24120:63;;24075:118;23581:619;;;;;:::o;24206:474::-;24274:6;24282;24331:2;24319:9;24310:7;24306:23;24302:32;24299:119;;;24337:79;;:::i;:::-;24299:119;24457:1;24482:53;24527:7;24518:6;24507:9;24503:22;24482:53;:::i;:::-;24472:63;;24428:117;24584:2;24610:53;24655:7;24646:6;24635:9;24631:22;24610:53;:::i;:::-;24600:63;;24555:118;24206:474;;;;;:::o;24686:180::-;24734:77;24731:1;24724:88;24831:4;24828:1;24821:15;24855:4;24852:1;24845:15;24872:320;24916:6;24953:1;24947:4;24943:12;24933:22;;25000:1;24994:4;24990:12;25021:18;25011:81;;25077:4;25069:6;25065:17;25055:27;;25011:81;25139:2;25131:6;25128:14;25108:18;25105:38;25102:84;;25158:18;;:::i;:::-;25102:84;24923:269;24872:320;;;:::o;25198:180::-;25246:77;25243:1;25236:88;25343:4;25340:1;25333:15;25367:4;25364:1;25357:15;25384:410;25424:7;25447:20;25465:1;25447:20;:::i;:::-;25442:25;;25481:20;25499:1;25481:20;:::i;:::-;25476:25;;25536:1;25533;25529:9;25558:30;25576:11;25558:30;:::i;:::-;25547:41;;25737:1;25728:7;25724:15;25721:1;25718:22;25698:1;25691:9;25671:83;25648:139;;25767:18;;:::i;:::-;25648:139;25432:362;25384:410;;;;:::o;25800:180::-;25848:77;25845:1;25838:88;25945:4;25942:1;25935:15;25969:4;25966:1;25959:15;25986:185;26026:1;26043:20;26061:1;26043:20;:::i;:::-;26038:25;;26077:20;26095:1;26077:20;:::i;:::-;26072:25;;26116:1;26106:35;;26121:18;;:::i;:::-;26106:35;26163:1;26160;26156:9;26151:14;;25986:185;;;;:::o;26177:182::-;26317:34;26313:1;26305:6;26301:14;26294:58;26177:182;:::o;26365:366::-;26507:3;26528:67;26592:2;26587:3;26528:67;:::i;:::-;26521:74;;26604:93;26693:3;26604:93;:::i;:::-;26722:2;26717:3;26713:12;26706:19;;26365:366;;;:::o;26737:419::-;26903:4;26941:2;26930:9;26926:18;26918:26;;26990:9;26984:4;26980:20;26976:1;26965:9;26961:17;26954:47;27018:131;27144:4;27018:131;:::i;:::-;27010:139;;26737:419;;;:::o;27162:168::-;27302:20;27298:1;27290:6;27286:14;27279:44;27162:168;:::o;27336:366::-;27478:3;27499:67;27563:2;27558:3;27499:67;:::i;:::-;27492:74;;27575:93;27664:3;27575:93;:::i;:::-;27693:2;27688:3;27684:12;27677:19;;27336:366;;;:::o;27708:419::-;27874:4;27912:2;27901:9;27897:18;27889:26;;27961:9;27955:4;27951:20;27947:1;27936:9;27932:17;27925:47;27989:131;28115:4;27989:131;:::i;:::-;27981:139;;27708:419;;;:::o;28133:191::-;28173:3;28192:20;28210:1;28192:20;:::i;:::-;28187:25;;28226:20;28244:1;28226:20;:::i;:::-;28221:25;;28269:1;28266;28262:9;28255:16;;28290:3;28287:1;28284:10;28281:36;;;28297:18;;:::i;:::-;28281:36;28133:191;;;;:::o;28330:97::-;28389:6;28417:3;28407:13;;28330:97;;;;:::o;28433:141::-;28482:4;28505:3;28497:11;;28528:3;28525:1;28518:14;28562:4;28559:1;28549:18;28541:26;;28433:141;;;:::o;28580:93::-;28617:6;28664:2;28659;28652:5;28648:14;28644:23;28634:33;;28580:93;;;:::o;28679:107::-;28723:8;28773:5;28767:4;28763:16;28742:37;;28679:107;;;;:::o;28792:393::-;28861:6;28911:1;28899:10;28895:18;28934:97;28964:66;28953:9;28934:97;:::i;:::-;29052:39;29082:8;29071:9;29052:39;:::i;:::-;29040:51;;29124:4;29120:9;29113:5;29109:21;29100:30;;29173:4;29163:8;29159:19;29152:5;29149:30;29139:40;;28868:317;;28792:393;;;;;:::o;29191:60::-;29219:3;29240:5;29233:12;;29191:60;;;:::o;29257:142::-;29307:9;29340:53;29358:34;29367:24;29385:5;29367:24;:::i;:::-;29358:34;:::i;:::-;29340:53;:::i;:::-;29327:66;;29257:142;;;:::o;29405:75::-;29448:3;29469:5;29462:12;;29405:75;;;:::o;29486:269::-;29596:39;29627:7;29596:39;:::i;:::-;29657:91;29706:41;29730:16;29706:41;:::i;:::-;29698:6;29691:4;29685:11;29657:91;:::i;:::-;29651:4;29644:105;29562:193;29486:269;;;:::o;29761:73::-;29806:3;29761:73;:::o;29840:189::-;29917:32;;:::i;:::-;29958:65;30016:6;30008;30002:4;29958:65;:::i;:::-;29893:136;29840:189;;:::o;30035:186::-;30095:120;30112:3;30105:5;30102:14;30095:120;;;30166:39;30203:1;30196:5;30166:39;:::i;:::-;30139:1;30132:5;30128:13;30119:22;;30095:120;;;30035:186;;:::o;30227:543::-;30328:2;30323:3;30320:11;30317:446;;;30362:38;30394:5;30362:38;:::i;:::-;30446:29;30464:10;30446:29;:::i;:::-;30436:8;30432:44;30629:2;30617:10;30614:18;30611:49;;;30650:8;30635:23;;30611:49;30673:80;30729:22;30747:3;30729:22;:::i;:::-;30719:8;30715:37;30702:11;30673:80;:::i;:::-;30332:431;;30317:446;30227:543;;;:::o;30776:117::-;30830:8;30880:5;30874:4;30870:16;30849:37;;30776:117;;;;:::o;30899:169::-;30943:6;30976:51;31024:1;31020:6;31012:5;31009:1;31005:13;30976:51;:::i;:::-;30972:56;31057:4;31051;31047:15;31037:25;;30950:118;30899:169;;;;:::o;31073:295::-;31149:4;31295:29;31320:3;31314:4;31295:29;:::i;:::-;31287:37;;31357:3;31354:1;31350:11;31344:4;31341:21;31333:29;;31073:295;;;;:::o;31373:1403::-;31497:44;31537:3;31532;31497:44;:::i;:::-;31606:18;31598:6;31595:30;31592:56;;;31628:18;;:::i;:::-;31592:56;31672:38;31704:4;31698:11;31672:38;:::i;:::-;31757:67;31817:6;31809;31803:4;31757:67;:::i;:::-;31851:1;31880:2;31872:6;31869:14;31897:1;31892:632;;;;32568:1;32585:6;32582:84;;;32641:9;32636:3;32632:19;32619:33;32610:42;;32582:84;32692:67;32752:6;32745:5;32692:67;:::i;:::-;32686:4;32679:81;32541:229;31862:908;;31892:632;31944:4;31940:9;31932:6;31928:22;31978:37;32010:4;31978:37;:::i;:::-;32037:1;32051:215;32065:7;32062:1;32059:14;32051:215;;;32151:9;32146:3;32142:19;32129:33;32121:6;32114:49;32202:1;32194:6;32190:14;32180:24;;32249:2;32238:9;32234:18;32221:31;;32088:4;32085:1;32081:12;32076:17;;32051:215;;;32294:6;32285:7;32282:19;32279:186;;;32359:9;32354:3;32350:19;32337:33;32402:48;32444:4;32436:6;32432:17;32421:9;32402:48;:::i;:::-;32394:6;32387:64;32302:163;32279:186;32511:1;32507;32499:6;32495:14;32491:22;32485:4;32478:36;31899:625;;;31862:908;;31472:1304;;;31373:1403;;;:::o;32782:180::-;32830:77;32827:1;32820:88;32927:4;32924:1;32917:15;32951:4;32948:1;32941:15;32968:115;33053:23;33070:5;33053:23;:::i;:::-;33048:3;33041:36;32968:115;;:::o;33089:218::-;33180:4;33218:2;33207:9;33203:18;33195:26;;33231:69;33297:1;33286:9;33282:17;33273:6;33231:69;:::i;:::-;33089:218;;;;:::o;33313:148::-;33415:11;33452:3;33437:18;;33313:148;;;;:::o;33467:390::-;33573:3;33601:39;33634:5;33601:39;:::i;:::-;33656:89;33738:6;33733:3;33656:89;:::i;:::-;33649:96;;33754:65;33812:6;33807:3;33800:4;33793:5;33789:16;33754:65;:::i;:::-;33844:6;33839:3;33835:16;33828:23;;33577:280;33467:390;;;;:::o;33863:435::-;34043:3;34065:95;34156:3;34147:6;34065:95;:::i;:::-;34058:102;;34177:95;34268:3;34259:6;34177:95;:::i;:::-;34170:102;;34289:3;34282:10;;33863:435;;;;;:::o;34304:167::-;34444:19;34440:1;34432:6;34428:14;34421:43;34304:167;:::o;34477:366::-;34619:3;34640:67;34704:2;34699:3;34640:67;:::i;:::-;34633:74;;34716:93;34805:3;34716:93;:::i;:::-;34834:2;34829:3;34825:12;34818:19;;34477:366;;;:::o;34849:419::-;35015:4;35053:2;35042:9;35038:18;35030:26;;35102:9;35096:4;35092:20;35088:1;35077:9;35073:17;35066:47;35130:131;35256:4;35130:131;:::i;:::-;35122:139;;34849:419;;;:::o;35274:332::-;35395:4;35433:2;35422:9;35418:18;35410:26;;35446:71;35514:1;35503:9;35499:17;35490:6;35446:71;:::i;:::-;35527:72;35595:2;35584:9;35580:18;35571:6;35527:72;:::i;:::-;35274:332;;;;;:::o;35612:225::-;35752:34;35748:1;35740:6;35736:14;35729:58;35821:8;35816:2;35808:6;35804:15;35797:33;35612:225;:::o;35843:366::-;35985:3;36006:67;36070:2;36065:3;36006:67;:::i;:::-;35999:74;;36082:93;36171:3;36082:93;:::i;:::-;36200:2;36195:3;36191:12;36184:19;;35843:366;;;:::o;36215:419::-;36381:4;36419:2;36408:9;36404:18;36396:26;;36468:9;36462:4;36458:20;36454:1;36443:9;36439:17;36432:47;36496:131;36622:4;36496:131;:::i;:::-;36488:139;;36215:419;;;:::o;36640:229::-;36780:34;36776:1;36768:6;36764:14;36757:58;36849:12;36844:2;36836:6;36832:15;36825:37;36640:229;:::o;36875:366::-;37017:3;37038:67;37102:2;37097:3;37038:67;:::i;:::-;37031:74;;37114:93;37203:3;37114:93;:::i;:::-;37232:2;37227:3;37223:12;37216:19;;36875:366;;;:::o;37247:419::-;37413:4;37451:2;37440:9;37436:18;37428:26;;37500:9;37494:4;37490:20;37486:1;37475:9;37471:17;37464:47;37528:131;37654:4;37528:131;:::i;:::-;37520:139;;37247:419;;;:::o;37672:177::-;37812:29;37808:1;37800:6;37796:14;37789:53;37672:177;:::o;37855:366::-;37997:3;38018:67;38082:2;38077:3;38018:67;:::i;:::-;38011:74;;38094:93;38183:3;38094:93;:::i;:::-;38212:2;38207:3;38203:12;38196:19;;37855:366;;;:::o;38227:419::-;38393:4;38431:2;38420:9;38416:18;38408:26;;38480:9;38474:4;38470:20;38466:1;38455:9;38451:17;38444:47;38508:131;38634:4;38508:131;:::i;:::-;38500:139;;38227:419;;;:::o;38652:98::-;38703:6;38737:5;38731:12;38721:22;;38652:98;;;:::o;38756:168::-;38839:11;38873:6;38868:3;38861:19;38913:4;38908:3;38904:14;38889:29;;38756:168;;;;:::o;38930:373::-;39016:3;39044:38;39076:5;39044:38;:::i;:::-;39098:70;39161:6;39156:3;39098:70;:::i;:::-;39091:77;;39177:65;39235:6;39230:3;39223:4;39216:5;39212:16;39177:65;:::i;:::-;39267:29;39289:6;39267:29;:::i;:::-;39262:3;39258:39;39251:46;;39020:283;38930:373;;;;:::o;39309:640::-;39504:4;39542:3;39531:9;39527:19;39519:27;;39556:71;39624:1;39613:9;39609:17;39600:6;39556:71;:::i;:::-;39637:72;39705:2;39694:9;39690:18;39681:6;39637:72;:::i;:::-;39719;39787:2;39776:9;39772:18;39763:6;39719:72;:::i;:::-;39838:9;39832:4;39828:20;39823:2;39812:9;39808:18;39801:48;39866:76;39937:4;39928:6;39866:76;:::i;:::-;39858:84;;39309:640;;;;;;;:::o;39955:141::-;40011:5;40042:6;40036:13;40027:22;;40058:32;40084:5;40058:32;:::i;:::-;39955:141;;;;:::o;40102:349::-;40171:6;40220:2;40208:9;40199:7;40195:23;40191:32;40188:119;;;40226:79;;:::i;:::-;40188:119;40346:1;40371:63;40426:7;40417:6;40406:9;40402:22;40371:63;:::i;:::-;40361:73;;40317:127;40102:349;;;;:::o;40457:175::-;40597:27;40593:1;40585:6;40581:14;40574:51;40457:175;:::o;40638:366::-;40780:3;40801:67;40865:2;40860:3;40801:67;:::i;:::-;40794:74;;40877:93;40966:3;40877:93;:::i;:::-;40995:2;40990:3;40986:12;40979:19;;40638:366;;;:::o;41010:419::-;41176:4;41214:2;41203:9;41199:18;41191:26;;41263:9;41257:4;41253:20;41249:1;41238:9;41234:17;41227:47;41291:131;41417:4;41291:131;:::i;:::-;41283:139;;41010:419;;;:::o
Swarm Source
ipfs://765ac4f8d9b4b21c63f2f4068541b690de5e915e6fffa875f20579cca48111f0
Loading...
Loading
[ 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.