ERC-721
Overview
Max Total Supply
4,444 BOKI
Holders
2,524
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 BOKILoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BokiSilhouette
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-04 */ // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721AQueryable compliant contract. */ 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` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ 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 pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721A Queryable * @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` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) public view 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[] memory tokenIds) external view 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 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 pfp collections should be fine). */ function tokensOfOwner(address owner) external view 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/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // 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/ERC165.sol // 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/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.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 paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.6.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) public 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: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: DOGE/AnimeSilhouette.sol pragma solidity ^0.8.9; contract BokiSilhouette is ERC2981, ERC721AQueryable, Ownable { using Address for address payable; using Strings for uint256; uint256 public immutable _price; uint32 public immutable _txLimit; uint32 public immutable _maxSupply; uint32 public immutable _teamReserved; uint32 public immutable _walletLimit; bool public _started; uint32 public _teamMinted; string public _metadataURI = "ipfs://QmeN2AddcizSjQzEHSMp6AfAD1uazJaJ5rzxwfHnJB7Cgo/"; struct HelperState { uint256 price; uint32 txLimit; uint32 walletLimit; uint32 maxSupply; uint32 teamReserved; uint32 totalMinted; uint32 userMinted; bool started; } constructor( uint256 price, uint32 maxSupply, uint32 txLimit, uint32 walletLimit, uint32 teamReserved) ERC721A("BokiSilhouette", "BOKI") { _price = price; _maxSupply = maxSupply; _txLimit = txLimit; _walletLimit = walletLimit; _teamReserved = teamReserved; _setDefaultRoyalty(owner(), 500); } function mint(uint32 amount) external payable { require(_started, "BokiSilhouette: Sale is not started"); require(amount + _totalMinted() <= _maxSupply - _teamReserved, "BokiSilhouette: Exceed max supply"); require(amount <= _txLimit, "BokiSilhouette: Exceed transaction limit"); uint256 minted = _numberMinted(msg.sender); if (minted > 0) { require(msg.value >= amount * _price, "BokiSilhouette: insufficient funds"); } else { require(msg.value >= (amount - 1) * _price, "BokiSilhouette: insufficient funds"); } require(minted + amount <= _walletLimit, "BokiSilhouette: Exceed wallet limit"); _safeMint(msg.sender, amount); } function _state(address minter) external view returns (HelperState memory) { return HelperState({ price: _price, txLimit: _txLimit, walletLimit: _walletLimit, maxSupply: _maxSupply, teamReserved: _teamReserved, totalMinted: uint32(ERC721A._totalMinted()), userMinted: uint32(_numberMinted(minter)), started: _started }); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _metadataURI; return string(abi.encodePacked(baseURI, tokenId.toString(), "")); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC2981, ERC721A) returns (bool) { return interfaceId == type(IERC2981).interfaceId || interfaceId == type(IERC721A).interfaceId || super.supportsInterface(interfaceId); } function devMint(address to, uint32 amount) external onlyOwner { _teamMinted += amount; require (_teamMinted <= _teamReserved, "BokiSilhouette: Exceed max supply"); _safeMint(to, amount); } function setFeeNumerator(uint96 feeNumerator) external onlyOwner { _setDefaultRoyalty(owner(), feeNumerator); } function setStarted(bool started) external onlyOwner { _started = started; } function setMetadataURI(string memory uri) external onlyOwner { _metadataURI = uri; } function withdraw() external onlyOwner { payable(msg.sender).sendValue(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint32","name":"maxSupply","type":"uint32"},{"internalType":"uint32","name":"txLimit","type":"uint32"},{"internalType":"uint32","name":"walletLimit","type":"uint32"},{"internalType":"uint32","name":"teamReserved","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_metadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_started","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"_state","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint32","name":"txLimit","type":"uint32"},{"internalType":"uint32","name":"walletLimit","type":"uint32"},{"internalType":"uint32","name":"maxSupply","type":"uint32"},{"internalType":"uint32","name":"teamReserved","type":"uint32"},{"internalType":"uint32","name":"totalMinted","type":"uint32"},{"internalType":"uint32","name":"userMinted","type":"uint32"},{"internalType":"bool","name":"started","type":"bool"}],"internalType":"struct BokiSilhouette.HelperState","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_teamMinted","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_teamReserved","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_txLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_walletLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"devMint","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":"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":"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":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"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":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setFeeNumerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"started","type":"bool"}],"name":"setStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101206040526040518060600160405280603681526020016200548460369139600b90805190602001906200003692919062000471565b503480156200004457600080fd5b50604051620054ba380380620054ba83398181016040528101906200006a9190620005a2565b6040518060400160405280600e81526020017f426f6b6953696c686f75657474650000000000000000000000000000000000008152506040518060400160405280600481526020017f424f4b49000000000000000000000000000000000000000000000000000000008152508160049080519060200190620000ee92919062000471565b5080600590805190602001906200010792919062000471565b5062000118620001c760201b60201c565b60028190555050506200014062000134620001cc60201b60201c565b620001d460201b60201c565b84608081815250508363ffffffff1660c08163ffffffff16815250508263ffffffff1660a08163ffffffff16815250508163ffffffff166101008163ffffffff16815250508063ffffffff1660e08163ffffffff1681525050620001bc620001ad6200029a60201b60201c565b6101f4620002c460201b60201c565b5050505050620007aa565b600090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620002d46200046760201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000335576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200032c90620006b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200039f9062000723565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b8280546200047f9062000774565b90600052602060002090601f016020900481019282620004a35760008555620004ef565b82601f10620004be57805160ff1916838001178555620004ef565b82800160010185558215620004ef579182015b82811115620004ee578251825591602001919060010190620004d1565b5b509050620004fe919062000502565b5090565b5b808211156200051d57600081600090555060010162000503565b5090565b600080fd5b6000819050919050565b6200053b8162000526565b81146200054757600080fd5b50565b6000815190506200055b8162000530565b92915050565b600063ffffffff82169050919050565b6200057c8162000561565b81146200058857600080fd5b50565b6000815190506200059c8162000571565b92915050565b600080600080600060a08688031215620005c157620005c062000521565b5b6000620005d1888289016200054a565b9550506020620005e4888289016200058b565b9450506040620005f7888289016200058b565b93505060606200060a888289016200058b565b92505060806200061d888289016200058b565b9150509295509295909350565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000699602a836200062a565b9150620006a6826200063b565b604082019050919050565b60006020820190508181036000830152620006cc816200068a565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006200070b6019836200062a565b91506200071882620006d3565b602082019050919050565b600060208201905081810360008301526200073e81620006fc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200078d57607f821691505b60208210811415620007a457620007a362000745565b5b50919050565b60805160a05160c05160e05161010051614c416200084360003960008181610c7d0152818161118b0152611dbc015260008181610d5c015281816111e301528181611b9101526122f2015260008181610e08015281816111b70152611bb201526000818161115f015281816113250152611c3d015260008181610e2c0152818161113901528181611cc20152611d3b0152614c416000f3fe60806040526004361061021a5760003560e01c8063653a819e11610123578063a71bbebe116100ab578063dd48f07d1161006f578063dd48f07d146107ff578063e985e9c51461082a578063ef6b141a14610867578063f2fde38b14610890578063f4e2ae58146108b95761021a565b8063a71bbebe14610715578063b88d4fde14610731578063c23dc68f1461075a578063c87b56dd14610797578063d4a67623146107d45761021a565b80638462151c116100f25780638462151c1461061c5780638da5cb5b1461065957806395d89b411461068457806399a2557a146106af578063a22cb465146106ec5761021a565b8063653a819e1461057657806370a082311461059f578063715018a6146105dc578063750521f5146105f35761021a565b806323b872dd116101a65780634df22a54116101755780634df22a54146104695780634df8bb45146104945780635bbb2177146104d15780636352211e1461050e57806363553e7c1461054b5761021a565b806323b872dd146103c25780632a55205a146103eb5780633ccfd60b1461042957806342842e0e146104405761021a565b80630e2351e2116101ed5780630e2351e2146102ed57806317a5aced1461031857806318160ddd1461034157806322f4596f1461036c578063235b6ea1146103975761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906134b8565b6108e4565b6040516102539190613500565b60405180910390f35b34801561026857600080fd5b506102716109c6565b60405161027e91906135b4565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a9919061360c565b610a58565b6040516102bb919061367a565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906136c1565b610ad4565b005b3480156102f957600080fd5b50610302610c7b565b60405161030f9190613720565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190613767565b610c9f565b005b34801561034d57600080fd5b50610356610def565b60405161036391906137b6565b60405180910390f35b34801561037857600080fd5b50610381610e06565b60405161038e9190613720565b60405180910390f35b3480156103a357600080fd5b506103ac610e2a565b6040516103b991906137b6565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e491906137d1565b610e4e565b005b3480156103f757600080fd5b50610412600480360381019061040d9190613824565b610e5e565b604051610420929190613864565b60405180910390f35b34801561043557600080fd5b5061043e611049565b005b34801561044c57600080fd5b50610467600480360381019061046291906137d1565b6110f0565b005b34801561047557600080fd5b5061047e611110565b60405161048b9190613500565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b6919061388d565b611123565b6040516104c89190613989565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f39190613aed565b611250565b6040516105059190613c59565b60405180910390f35b34801561051a57600080fd5b506105356004803603810190610530919061360c565b611311565b604051610542919061367a565b60405180910390f35b34801561055757600080fd5b50610560611323565b60405161056d9190613720565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613cbf565b611347565b005b3480156105ab57600080fd5b506105c660048036038101906105c1919061388d565b6113d7565b6040516105d391906137b6565b60405180910390f35b3480156105e857600080fd5b506105f1611490565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190613da1565b611518565b005b34801561062857600080fd5b50610643600480360381019061063e919061388d565b6115ae565b6040516106509190613e99565b60405180910390f35b34801561066557600080fd5b5061066e6116f8565b60405161067b919061367a565b60405180910390f35b34801561069057600080fd5b50610699611722565b6040516106a691906135b4565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d19190613ebb565b6117b4565b6040516106e39190613e99565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190613f3a565b6119c8565b005b61072f600480360381019061072a9190613f7a565b611b40565b005b34801561073d57600080fd5b5061075860048036038101906107539190614048565b611e48565b005b34801561076657600080fd5b50610781600480360381019061077c919061360c565b611ebb565b60405161078e919061410d565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b9919061360c565b611f25565b6040516107cb91906135b4565b60405180910390f35b3480156107e057600080fd5b506107e9612027565b6040516107f691906135b4565b60405180910390f35b34801561080b57600080fd5b506108146120b5565b6040516108219190613720565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c9190614128565b6120cb565b60405161085e9190613500565b60405180910390f35b34801561087357600080fd5b5061088e60048036038101906108899190614168565b61215f565b005b34801561089c57600080fd5b506108b760048036038101906108b2919061388d565b6121f8565b005b3480156108c557600080fd5b506108ce6122f0565b6040516108db9190613720565b60405180910390f35b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109af57507fc21b8f28000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109bf57506109be82612314565b5b9050919050565b6060600480546109d5906141c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a01906141c4565b8015610a4e5780601f10610a2357610100808354040283529160200191610a4e565b820191906000526020600020905b815481529060010190602001808311610a3157829003601f168201915b5050505050905090565b6000610a63826123a6565b610a99576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610adf82612405565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b47576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b666124d3565b73ffffffffffffffffffffffffffffffffffffffff1614610bc957610b9281610b8d6124d3565b6120cb565b610bc8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610ca76124db565b73ffffffffffffffffffffffffffffffffffffffff16610cc56116f8565b73ffffffffffffffffffffffffffffffffffffffff1614610d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1290614242565b60405180910390fd5b80600a60158282829054906101000a900463ffffffff16610d3c9190614291565b92506101000a81548163ffffffff021916908363ffffffff1602179055507f000000000000000000000000000000000000000000000000000000000000000063ffffffff16600a60159054906101000a900463ffffffff1663ffffffff161115610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd29061433d565b60405180910390fd5b610deb828263ffffffff166124e3565b5050565b6000610df9612501565b6003546002540303905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b610e59838383612506565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610ff45760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610ffe6128b0565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661102a919061435d565b61103491906143e6565b90508160000151819350935050509250929050565b6110516124db565b73ffffffffffffffffffffffffffffffffffffffff1661106f6116f8565b73ffffffffffffffffffffffffffffffffffffffff16146110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc90614242565b60405180910390fd5b6110ee473373ffffffffffffffffffffffffffffffffffffffff166128ba90919063ffffffff16565b565b61110b83838360405180602001604052806000815250611e48565b505050565b600a60149054906101000a900460ff1681565b61112b6132fb565b6040518061010001604052807f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681526020016112156129ae565b63ffffffff168152602001611229846129c1565b63ffffffff168152602001600a60149054906101000a900460ff1615158152509050919050565b606060008251905060008167ffffffffffffffff811115611274576112736139aa565b5b6040519080825280602002602001820160405280156112ad57816020015b61129a613366565b8152602001906001900390816112925790505b50905060005b828114611306576112dd8582815181106112d0576112cf614417565b5b6020026020010151611ebb565b8282815181106112f0576112ef614417565b5b60200260200101819052508060010190506112b3565b508092505050919050565b600061131c82612405565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61134f6124db565b73ffffffffffffffffffffffffffffffffffffffff1661136d6116f8565b73ffffffffffffffffffffffffffffffffffffffff16146113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90614242565b60405180910390fd5b6113d46113ce6116f8565b82612a18565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561143f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6114986124db565b73ffffffffffffffffffffffffffffffffffffffff166114b66116f8565b73ffffffffffffffffffffffffffffffffffffffff161461150c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390614242565b60405180910390fd5b6115166000612bad565b565b6115206124db565b73ffffffffffffffffffffffffffffffffffffffff1661153e6116f8565b73ffffffffffffffffffffffffffffffffffffffff1614611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b90614242565b60405180910390fd5b80600b90805190602001906115aa9291906133a9565b5050565b606060008060006115be856113d7565b905060008167ffffffffffffffff8111156115dc576115db6139aa565b5b60405190808252806020026020018201604052801561160a5781602001602082028036833780820191505090505b509050611615613366565b600061161f612501565b90505b8386146116ea5761163281612c73565b9150816040015115611643576116df565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461168357816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156116de57808387806001019850815181106116d1576116d0614417565b5b6020026020010181815250505b5b806001019050611622565b508195505050505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054611731906141c4565b80601f016020809104026020016040519081016040528092919081815260200182805461175d906141c4565b80156117aa5780601f1061177f576101008083540402835291602001916117aa565b820191906000526020600020905b81548152906001019060200180831161178d57829003601f168201915b5050505050905090565b60608183106117ef576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806117fa612c9e565b9050611804612501565b85101561181657611813612501565b94505b80841115611822578093505b600061182d876113d7565b90508486101561185057600086860390508181101561184a578091505b50611855565b600090505b60008167ffffffffffffffff811115611871576118706139aa565b5b60405190808252806020026020018201604052801561189f5781602001602082028036833780820191505090505b50905060008214156118b757809450505050506119c1565b60006118c288611ebb565b9050600081604001516118d757816000015190505b60008990505b8881141580156118ed5750848714155b156119b3576118fb81612c73565b925082604001511561190c576119a8565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461194c57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119a7578084888060010199508151811061199a57611999614417565b5b6020026020010181815250505b5b8060010190506118dd565b508583528296505050505050505b9392505050565b6119d06124d3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a35576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060096000611a426124d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aef6124d3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b349190613500565b60405180910390a35050565b600a60149054906101000a900460ff16611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b86906144b8565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611bdb91906144d8565b63ffffffff16611be96129ae565b8263ffffffff16611bfa919061450c565b1115611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c329061433d565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff161115611caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca1906145d4565b60405180910390fd5b6000611cb5336129c1565b90506000811115611d39577f00000000000000000000000000000000000000000000000000000000000000008263ffffffff16611cf2919061435d565b341015611d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2b90614666565b60405180910390fd5b611dba565b7f0000000000000000000000000000000000000000000000000000000000000000600183611d6791906144d8565b63ffffffff16611d77919061435d565b341015611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db090614666565b60405180910390fd5b5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168263ffffffff1682611df3919061450c565b1115611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b906146f8565b60405180910390fd5b611e44338363ffffffff166124e3565b5050565b611e53848484612506565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611eb557611e7e84848484612ca8565b611eb4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611ec3613366565b611ecb613366565b611ed3612501565b831080611ee75750611ee3612c9e565b8310155b15611ef55780915050611f20565b611efe83612c73565b9050806040015115611f135780915050611f20565b611f1c83612e08565b9150505b919050565b6060611f30826123a6565b611f66576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600b8054611f75906141c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa1906141c4565b8015611fee5780601f10611fc357610100808354040283529160200191611fee565b820191906000526020600020905b815481529060010190602001808311611fd157829003601f168201915b5050505050905080611fff84612e28565b60405160200161201092919061477a565b604051602081830303815290604052915050919050565b600b8054612034906141c4565b80601f0160208091040260200160405190810160405280929190818152602001828054612060906141c4565b80156120ad5780601f10612082576101008083540402835291602001916120ad565b820191906000526020600020905b81548152906001019060200180831161209057829003601f168201915b505050505081565b600a60159054906101000a900463ffffffff1681565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121676124db565b73ffffffffffffffffffffffffffffffffffffffff166121856116f8565b73ffffffffffffffffffffffffffffffffffffffff16146121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d290614242565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b6122006124db565b73ffffffffffffffffffffffffffffffffffffffff1661221e6116f8565b73ffffffffffffffffffffffffffffffffffffffff1614612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226b90614242565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122db9061481b565b60405180910390fd5b6122ed81612bad565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061236f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061239f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000816123b1612501565b111580156123c0575060025482105b80156123fe575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b60008082905080612414612501565b1161249c5760025481101561249b5760006006600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612499575b600081141561248f576006600083600190039350838152602001908152602001600020549050612464565b80925050506124ce565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b6124fd828260405180602001604052806000815250612f89565b5050565b600090565b600061251182612405565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612578576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166125996124d3565b73ffffffffffffffffffffffffffffffffffffffff1614806125c857506125c7856125c26124d3565b6120cb565b5b8061260d57506125d66124d3565b73ffffffffffffffffffffffffffffffffffffffff166125f584610a58565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612646576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156126ad576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126ba858585600161323f565b6008600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6127b786613245565b1717600660008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561284157600060018401905060006006600083815260200190815260200160002054141561283f57600254811461283e578260066000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128a9858585600161324f565b5050505050565b6000612710905090565b804710156128fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f490614887565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612923906148d5565b60006040518083038185875af1925050503d8060008114612960576040519150601f19603f3d011682016040523d82523d6000602084013e612965565b606091505b50509050806129a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a09061495c565b60405180910390fd5b505050565b60006129b8612501565b60025403905090565b600067ffffffffffffffff6040600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612a206128b0565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a75906149ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae590614a5a565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c7b613366565b612c976006600084815260200190815260200160002054613255565b9050919050565b6000600254905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cce6124d3565b8786866040518563ffffffff1660e01b8152600401612cf09493929190614acf565b602060405180830381600087803b158015612d0a57600080fd5b505af1925050508015612d3b57506040513d601f19601f82011682018060405250810190612d389190614b30565b60015b612db5573d8060008114612d6b576040519150601f19603f3d011682016040523d82523d6000602084013e612d70565b606091505b50600081511415612dad576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612e10613366565b612e21612e1c83612405565b613255565b9050919050565b60606000821415612e70576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f84565b600082905060005b60008214612ea2578080612e8b90614b5d565b915050600a82612e9b91906143e6565b9150612e78565b60008167ffffffffffffffff811115612ebe57612ebd6139aa565b5b6040519080825280601f01601f191660200182016040528015612ef05781602001600182028036833780820191505090505b5090505b60008514612f7d57600182612f099190614ba6565b9150600a85612f189190614bda565b6030612f24919061450c565b60f81b818381518110612f3a57612f39614417565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f7691906143e6565b9450612ef4565b8093505050505b919050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ff7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613032576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61303f600085838661323f565b600160406001901b178302600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16130a4600185146132f1565b901b60a042901b6130b486613245565b1717600660008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146131b8575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131686000878480600101955087612ca8565b61319e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106130f95782600254146131b357600080fd5b613223565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106131b9575b816002819055505050613239600085838661324f565b50505050565b50505050565b6000819050919050565b50505050565b61325d613366565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b6000819050919050565b60405180610100016040528060008152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff1681526020016000151581525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b8280546133b5906141c4565b90600052602060002090601f0160209004810192826133d7576000855561341e565b82601f106133f057805160ff191683800117855561341e565b8280016001018555821561341e579182015b8281111561341d578251825591602001919060010190613402565b5b50905061342b919061342f565b5090565b5b80821115613448576000816000905550600101613430565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61349581613460565b81146134a057600080fd5b50565b6000813590506134b28161348c565b92915050565b6000602082840312156134ce576134cd613456565b5b60006134dc848285016134a3565b91505092915050565b60008115159050919050565b6134fa816134e5565b82525050565b600060208201905061351560008301846134f1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561355557808201518184015260208101905061353a565b83811115613564576000848401525b50505050565b6000601f19601f8301169050919050565b60006135868261351b565b6135908185613526565b93506135a0818560208601613537565b6135a98161356a565b840191505092915050565b600060208201905081810360008301526135ce818461357b565b905092915050565b6000819050919050565b6135e9816135d6565b81146135f457600080fd5b50565b600081359050613606816135e0565b92915050565b60006020828403121561362257613621613456565b5b6000613630848285016135f7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061366482613639565b9050919050565b61367481613659565b82525050565b600060208201905061368f600083018461366b565b92915050565b61369e81613659565b81146136a957600080fd5b50565b6000813590506136bb81613695565b92915050565b600080604083850312156136d8576136d7613456565b5b60006136e6858286016136ac565b92505060206136f7858286016135f7565b9150509250929050565b600063ffffffff82169050919050565b61371a81613701565b82525050565b60006020820190506137356000830184613711565b92915050565b61374481613701565b811461374f57600080fd5b50565b6000813590506137618161373b565b92915050565b6000806040838503121561377e5761377d613456565b5b600061378c858286016136ac565b925050602061379d85828601613752565b9150509250929050565b6137b0816135d6565b82525050565b60006020820190506137cb60008301846137a7565b92915050565b6000806000606084860312156137ea576137e9613456565b5b60006137f8868287016136ac565b9350506020613809868287016136ac565b925050604061381a868287016135f7565b9150509250925092565b6000806040838503121561383b5761383a613456565b5b6000613849858286016135f7565b925050602061385a858286016135f7565b9150509250929050565b6000604082019050613879600083018561366b565b61388660208301846137a7565b9392505050565b6000602082840312156138a3576138a2613456565b5b60006138b1848285016136ac565b91505092915050565b6138c3816135d6565b82525050565b6138d281613701565b82525050565b6138e1816134e5565b82525050565b610100820160008201516138fe60008501826138ba565b50602082015161391160208501826138c9565b50604082015161392460408501826138c9565b50606082015161393760608501826138c9565b50608082015161394a60808501826138c9565b5060a082015161395d60a08501826138c9565b5060c082015161397060c08501826138c9565b5060e082015161398360e08501826138d8565b50505050565b60006101008201905061399f60008301846138e7565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139e28261356a565b810181811067ffffffffffffffff82111715613a0157613a006139aa565b5b80604052505050565b6000613a1461344c565b9050613a2082826139d9565b919050565b600067ffffffffffffffff821115613a4057613a3f6139aa565b5b602082029050602081019050919050565b600080fd5b6000613a69613a6484613a25565b613a0a565b90508083825260208201905060208402830185811115613a8c57613a8b613a51565b5b835b81811015613ab55780613aa188826135f7565b845260208401935050602081019050613a8e565b5050509392505050565b600082601f830112613ad457613ad36139a5565b5b8135613ae4848260208601613a56565b91505092915050565b600060208284031215613b0357613b02613456565b5b600082013567ffffffffffffffff811115613b2157613b2061345b565b5b613b2d84828501613abf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b6b81613659565b82525050565b600067ffffffffffffffff82169050919050565b613b8e81613b71565b82525050565b606082016000820151613baa6000850182613b62565b506020820151613bbd6020850182613b85565b506040820151613bd060408501826138d8565b50505050565b6000613be28383613b94565b60608301905092915050565b6000602082019050919050565b6000613c0682613b36565b613c108185613b41565b9350613c1b83613b52565b8060005b83811015613c4c578151613c338882613bd6565b9750613c3e83613bee565b925050600181019050613c1f565b5085935050505092915050565b60006020820190508181036000830152613c738184613bfb565b905092915050565b60006bffffffffffffffffffffffff82169050919050565b613c9c81613c7b565b8114613ca757600080fd5b50565b600081359050613cb981613c93565b92915050565b600060208284031215613cd557613cd4613456565b5b6000613ce384828501613caa565b91505092915050565b600080fd5b600067ffffffffffffffff821115613d0c57613d0b6139aa565b5b613d158261356a565b9050602081019050919050565b82818337600083830152505050565b6000613d44613d3f84613cf1565b613a0a565b905082815260208101848484011115613d6057613d5f613cec565b5b613d6b848285613d22565b509392505050565b600082601f830112613d8857613d876139a5565b5b8135613d98848260208601613d31565b91505092915050565b600060208284031215613db757613db6613456565b5b600082013567ffffffffffffffff811115613dd557613dd461345b565b5b613de184828501613d73565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000613e2283836138ba565b60208301905092915050565b6000602082019050919050565b6000613e4682613dea565b613e508185613df5565b9350613e5b83613e06565b8060005b83811015613e8c578151613e738882613e16565b9750613e7e83613e2e565b925050600181019050613e5f565b5085935050505092915050565b60006020820190508181036000830152613eb38184613e3b565b905092915050565b600080600060608486031215613ed457613ed3613456565b5b6000613ee2868287016136ac565b9350506020613ef3868287016135f7565b9250506040613f04868287016135f7565b9150509250925092565b613f17816134e5565b8114613f2257600080fd5b50565b600081359050613f3481613f0e565b92915050565b60008060408385031215613f5157613f50613456565b5b6000613f5f858286016136ac565b9250506020613f7085828601613f25565b9150509250929050565b600060208284031215613f9057613f8f613456565b5b6000613f9e84828501613752565b91505092915050565b600067ffffffffffffffff821115613fc257613fc16139aa565b5b613fcb8261356a565b9050602081019050919050565b6000613feb613fe684613fa7565b613a0a565b90508281526020810184848401111561400757614006613cec565b5b614012848285613d22565b509392505050565b600082601f83011261402f5761402e6139a5565b5b813561403f848260208601613fd8565b91505092915050565b6000806000806080858703121561406257614061613456565b5b6000614070878288016136ac565b9450506020614081878288016136ac565b9350506040614092878288016135f7565b925050606085013567ffffffffffffffff8111156140b3576140b261345b565b5b6140bf8782880161401a565b91505092959194509250565b6060820160008201516140e16000850182613b62565b5060208201516140f46020850182613b85565b50604082015161410760408501826138d8565b50505050565b600060608201905061412260008301846140cb565b92915050565b6000806040838503121561413f5761413e613456565b5b600061414d858286016136ac565b925050602061415e858286016136ac565b9150509250929050565b60006020828403121561417e5761417d613456565b5b600061418c84828501613f25565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141dc57607f821691505b602082108114156141f0576141ef614195565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061422c602083613526565b9150614237826141f6565b602082019050919050565b6000602082019050818103600083015261425b8161421f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061429c82613701565b91506142a783613701565b92508263ffffffff038211156142c0576142bf614262565b5b828201905092915050565b7f426f6b6953696c686f75657474653a20457863656564206d617820737570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b6000614327602183613526565b9150614332826142cb565b604082019050919050565b600060208201905081810360008301526143568161431a565b9050919050565b6000614368826135d6565b9150614373836135d6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143ac576143ab614262565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006143f1826135d6565b91506143fc836135d6565b92508261440c5761440b6143b7565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f426f6b6953696c686f75657474653a2053616c65206973206e6f74207374617260008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b60006144a2602383613526565b91506144ad82614446565b604082019050919050565b600060208201905081810360008301526144d181614495565b9050919050565b60006144e382613701565b91506144ee83613701565b92508282101561450157614500614262565b5b828203905092915050565b6000614517826135d6565b9150614522836135d6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561455757614556614262565b5b828201905092915050565b7f426f6b6953696c686f75657474653a20457863656564207472616e736163746960008201527f6f6e206c696d6974000000000000000000000000000000000000000000000000602082015250565b60006145be602883613526565b91506145c982614562565b604082019050919050565b600060208201905081810360008301526145ed816145b1565b9050919050565b7f426f6b6953696c686f75657474653a20696e73756666696369656e742066756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614650602283613526565b915061465b826145f4565b604082019050919050565b6000602082019050818103600083015261467f81614643565b9050919050565b7f426f6b6953696c686f75657474653a204578636565642077616c6c6574206c6960008201527f6d69740000000000000000000000000000000000000000000000000000000000602082015250565b60006146e2602383613526565b91506146ed82614686565b604082019050919050565b60006020820190508181036000830152614711816146d5565b9050919050565b600081905092915050565b600061472e8261351b565b6147388185614718565b9350614748818560208601613537565b80840191505092915050565b50565b6000614764600083614718565b915061476f82614754565b600082019050919050565b60006147868285614723565b91506147928284614723565b915061479d82614757565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614805602683613526565b9150614810826147a9565b604082019050919050565b60006020820190508181036000830152614834816147f8565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614871601d83613526565b915061487c8261483b565b602082019050919050565b600060208201905081810360008301526148a081614864565b9050919050565b600081905092915050565b60006148bf6000836148a7565b91506148ca82614754565b600082019050919050565b60006148e0826148b2565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614946603a83613526565b9150614951826148ea565b604082019050919050565b6000602082019050818103600083015261497581614939565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006149d8602a83613526565b91506149e38261497c565b604082019050919050565b60006020820190508181036000830152614a07816149cb565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614a44601983613526565b9150614a4f82614a0e565b602082019050919050565b60006020820190508181036000830152614a7381614a37565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614aa182614a7a565b614aab8185614a85565b9350614abb818560208601613537565b614ac48161356a565b840191505092915050565b6000608082019050614ae4600083018761366b565b614af1602083018661366b565b614afe60408301856137a7565b8181036060830152614b108184614a96565b905095945050505050565b600081519050614b2a8161348c565b92915050565b600060208284031215614b4657614b45613456565b5b6000614b5484828501614b1b565b91505092915050565b6000614b68826135d6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b9b57614b9a614262565b5b600182019050919050565b6000614bb1826135d6565b9150614bbc836135d6565b925082821015614bcf57614bce614262565b5b828203905092915050565b6000614be5826135d6565b9150614bf0836135d6565b925082614c0057614bff6143b7565b5b82820690509291505056fea2646970667358221220826529a45d52ad0f891b6f12e77718510b8cad644f1d7bab65866316b498861364736f6c63430008090033697066733a2f2f516d654e3241646463697a536a517a4548534d7036416641443175617a4a614a35727a787766486e4a423743676f2f000000000000000000000000000000000000000000000000000e35fa931a0000000000000000000000000000000000000000000000000000000000000000115c000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061021a5760003560e01c8063653a819e11610123578063a71bbebe116100ab578063dd48f07d1161006f578063dd48f07d146107ff578063e985e9c51461082a578063ef6b141a14610867578063f2fde38b14610890578063f4e2ae58146108b95761021a565b8063a71bbebe14610715578063b88d4fde14610731578063c23dc68f1461075a578063c87b56dd14610797578063d4a67623146107d45761021a565b80638462151c116100f25780638462151c1461061c5780638da5cb5b1461065957806395d89b411461068457806399a2557a146106af578063a22cb465146106ec5761021a565b8063653a819e1461057657806370a082311461059f578063715018a6146105dc578063750521f5146105f35761021a565b806323b872dd116101a65780634df22a54116101755780634df22a54146104695780634df8bb45146104945780635bbb2177146104d15780636352211e1461050e57806363553e7c1461054b5761021a565b806323b872dd146103c25780632a55205a146103eb5780633ccfd60b1461042957806342842e0e146104405761021a565b80630e2351e2116101ed5780630e2351e2146102ed57806317a5aced1461031857806318160ddd1461034157806322f4596f1461036c578063235b6ea1146103975761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906134b8565b6108e4565b6040516102539190613500565b60405180910390f35b34801561026857600080fd5b506102716109c6565b60405161027e91906135b4565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a9919061360c565b610a58565b6040516102bb919061367a565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906136c1565b610ad4565b005b3480156102f957600080fd5b50610302610c7b565b60405161030f9190613720565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190613767565b610c9f565b005b34801561034d57600080fd5b50610356610def565b60405161036391906137b6565b60405180910390f35b34801561037857600080fd5b50610381610e06565b60405161038e9190613720565b60405180910390f35b3480156103a357600080fd5b506103ac610e2a565b6040516103b991906137b6565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e491906137d1565b610e4e565b005b3480156103f757600080fd5b50610412600480360381019061040d9190613824565b610e5e565b604051610420929190613864565b60405180910390f35b34801561043557600080fd5b5061043e611049565b005b34801561044c57600080fd5b50610467600480360381019061046291906137d1565b6110f0565b005b34801561047557600080fd5b5061047e611110565b60405161048b9190613500565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b6919061388d565b611123565b6040516104c89190613989565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f39190613aed565b611250565b6040516105059190613c59565b60405180910390f35b34801561051a57600080fd5b506105356004803603810190610530919061360c565b611311565b604051610542919061367a565b60405180910390f35b34801561055757600080fd5b50610560611323565b60405161056d9190613720565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613cbf565b611347565b005b3480156105ab57600080fd5b506105c660048036038101906105c1919061388d565b6113d7565b6040516105d391906137b6565b60405180910390f35b3480156105e857600080fd5b506105f1611490565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190613da1565b611518565b005b34801561062857600080fd5b50610643600480360381019061063e919061388d565b6115ae565b6040516106509190613e99565b60405180910390f35b34801561066557600080fd5b5061066e6116f8565b60405161067b919061367a565b60405180910390f35b34801561069057600080fd5b50610699611722565b6040516106a691906135b4565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d19190613ebb565b6117b4565b6040516106e39190613e99565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190613f3a565b6119c8565b005b61072f600480360381019061072a9190613f7a565b611b40565b005b34801561073d57600080fd5b5061075860048036038101906107539190614048565b611e48565b005b34801561076657600080fd5b50610781600480360381019061077c919061360c565b611ebb565b60405161078e919061410d565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b9919061360c565b611f25565b6040516107cb91906135b4565b60405180910390f35b3480156107e057600080fd5b506107e9612027565b6040516107f691906135b4565b60405180910390f35b34801561080b57600080fd5b506108146120b5565b6040516108219190613720565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c9190614128565b6120cb565b60405161085e9190613500565b60405180910390f35b34801561087357600080fd5b5061088e60048036038101906108899190614168565b61215f565b005b34801561089c57600080fd5b506108b760048036038101906108b2919061388d565b6121f8565b005b3480156108c557600080fd5b506108ce6122f0565b6040516108db9190613720565b60405180910390f35b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109af57507fc21b8f28000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109bf57506109be82612314565b5b9050919050565b6060600480546109d5906141c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a01906141c4565b8015610a4e5780601f10610a2357610100808354040283529160200191610a4e565b820191906000526020600020905b815481529060010190602001808311610a3157829003601f168201915b5050505050905090565b6000610a63826123a6565b610a99576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610adf82612405565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b47576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b666124d3565b73ffffffffffffffffffffffffffffffffffffffff1614610bc957610b9281610b8d6124d3565b6120cb565b610bc8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b7f00000000000000000000000000000000000000000000000000000000000000c881565b610ca76124db565b73ffffffffffffffffffffffffffffffffffffffff16610cc56116f8565b73ffffffffffffffffffffffffffffffffffffffff1614610d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1290614242565b60405180910390fd5b80600a60158282829054906101000a900463ffffffff16610d3c9190614291565b92506101000a81548163ffffffff021916908363ffffffff1602179055507f000000000000000000000000000000000000000000000000000000000000000063ffffffff16600a60159054906101000a900463ffffffff1663ffffffff161115610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd29061433d565b60405180910390fd5b610deb828263ffffffff166124e3565b5050565b6000610df9612501565b6003546002540303905090565b7f000000000000000000000000000000000000000000000000000000000000115c81565b7f000000000000000000000000000000000000000000000000000e35fa931a000081565b610e59838383612506565b505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610ff45760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610ffe6128b0565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661102a919061435d565b61103491906143e6565b90508160000151819350935050509250929050565b6110516124db565b73ffffffffffffffffffffffffffffffffffffffff1661106f6116f8565b73ffffffffffffffffffffffffffffffffffffffff16146110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc90614242565b60405180910390fd5b6110ee473373ffffffffffffffffffffffffffffffffffffffff166128ba90919063ffffffff16565b565b61110b83838360405180602001604052806000815250611e48565b505050565b600a60149054906101000a900460ff1681565b61112b6132fb565b6040518061010001604052807f000000000000000000000000000000000000000000000000000e35fa931a000081526020017f000000000000000000000000000000000000000000000000000000000000000a63ffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000c863ffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000115c63ffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681526020016112156129ae565b63ffffffff168152602001611229846129c1565b63ffffffff168152602001600a60149054906101000a900460ff1615158152509050919050565b606060008251905060008167ffffffffffffffff811115611274576112736139aa565b5b6040519080825280602002602001820160405280156112ad57816020015b61129a613366565b8152602001906001900390816112925790505b50905060005b828114611306576112dd8582815181106112d0576112cf614417565b5b6020026020010151611ebb565b8282815181106112f0576112ef614417565b5b60200260200101819052508060010190506112b3565b508092505050919050565b600061131c82612405565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000a81565b61134f6124db565b73ffffffffffffffffffffffffffffffffffffffff1661136d6116f8565b73ffffffffffffffffffffffffffffffffffffffff16146113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90614242565b60405180910390fd5b6113d46113ce6116f8565b82612a18565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561143f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6114986124db565b73ffffffffffffffffffffffffffffffffffffffff166114b66116f8565b73ffffffffffffffffffffffffffffffffffffffff161461150c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390614242565b60405180910390fd5b6115166000612bad565b565b6115206124db565b73ffffffffffffffffffffffffffffffffffffffff1661153e6116f8565b73ffffffffffffffffffffffffffffffffffffffff1614611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b90614242565b60405180910390fd5b80600b90805190602001906115aa9291906133a9565b5050565b606060008060006115be856113d7565b905060008167ffffffffffffffff8111156115dc576115db6139aa565b5b60405190808252806020026020018201604052801561160a5781602001602082028036833780820191505090505b509050611615613366565b600061161f612501565b90505b8386146116ea5761163281612c73565b9150816040015115611643576116df565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461168357816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156116de57808387806001019850815181106116d1576116d0614417565b5b6020026020010181815250505b5b806001019050611622565b508195505050505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054611731906141c4565b80601f016020809104026020016040519081016040528092919081815260200182805461175d906141c4565b80156117aa5780601f1061177f576101008083540402835291602001916117aa565b820191906000526020600020905b81548152906001019060200180831161178d57829003601f168201915b5050505050905090565b60608183106117ef576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806117fa612c9e565b9050611804612501565b85101561181657611813612501565b94505b80841115611822578093505b600061182d876113d7565b90508486101561185057600086860390508181101561184a578091505b50611855565b600090505b60008167ffffffffffffffff811115611871576118706139aa565b5b60405190808252806020026020018201604052801561189f5781602001602082028036833780820191505090505b50905060008214156118b757809450505050506119c1565b60006118c288611ebb565b9050600081604001516118d757816000015190505b60008990505b8881141580156118ed5750848714155b156119b3576118fb81612c73565b925082604001511561190c576119a8565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461194c57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119a7578084888060010199508151811061199a57611999614417565b5b6020026020010181815250505b5b8060010190506118dd565b508583528296505050505050505b9392505050565b6119d06124d3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a35576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060096000611a426124d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aef6124d3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b349190613500565b60405180910390a35050565b600a60149054906101000a900460ff16611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b86906144b8565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000115c611bdb91906144d8565b63ffffffff16611be96129ae565b8263ffffffff16611bfa919061450c565b1115611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c329061433d565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a63ffffffff168163ffffffff161115611caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca1906145d4565b60405180910390fd5b6000611cb5336129c1565b90506000811115611d39577f000000000000000000000000000000000000000000000000000e35fa931a00008263ffffffff16611cf2919061435d565b341015611d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2b90614666565b60405180910390fd5b611dba565b7f000000000000000000000000000000000000000000000000000e35fa931a0000600183611d6791906144d8565b63ffffffff16611d77919061435d565b341015611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db090614666565b60405180910390fd5b5b7f00000000000000000000000000000000000000000000000000000000000000c863ffffffff168263ffffffff1682611df3919061450c565b1115611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b906146f8565b60405180910390fd5b611e44338363ffffffff166124e3565b5050565b611e53848484612506565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611eb557611e7e84848484612ca8565b611eb4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611ec3613366565b611ecb613366565b611ed3612501565b831080611ee75750611ee3612c9e565b8310155b15611ef55780915050611f20565b611efe83612c73565b9050806040015115611f135780915050611f20565b611f1c83612e08565b9150505b919050565b6060611f30826123a6565b611f66576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600b8054611f75906141c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa1906141c4565b8015611fee5780601f10611fc357610100808354040283529160200191611fee565b820191906000526020600020905b815481529060010190602001808311611fd157829003601f168201915b5050505050905080611fff84612e28565b60405160200161201092919061477a565b604051602081830303815290604052915050919050565b600b8054612034906141c4565b80601f0160208091040260200160405190810160405280929190818152602001828054612060906141c4565b80156120ad5780601f10612082576101008083540402835291602001916120ad565b820191906000526020600020905b81548152906001019060200180831161209057829003601f168201915b505050505081565b600a60159054906101000a900463ffffffff1681565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121676124db565b73ffffffffffffffffffffffffffffffffffffffff166121856116f8565b73ffffffffffffffffffffffffffffffffffffffff16146121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d290614242565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b6122006124db565b73ffffffffffffffffffffffffffffffffffffffff1661221e6116f8565b73ffffffffffffffffffffffffffffffffffffffff1614612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226b90614242565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122db9061481b565b60405180910390fd5b6122ed81612bad565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061236f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061239f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000816123b1612501565b111580156123c0575060025482105b80156123fe575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b60008082905080612414612501565b1161249c5760025481101561249b5760006006600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612499575b600081141561248f576006600083600190039350838152602001908152602001600020549050612464565b80925050506124ce565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b6124fd828260405180602001604052806000815250612f89565b5050565b600090565b600061251182612405565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612578576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166125996124d3565b73ffffffffffffffffffffffffffffffffffffffff1614806125c857506125c7856125c26124d3565b6120cb565b5b8061260d57506125d66124d3565b73ffffffffffffffffffffffffffffffffffffffff166125f584610a58565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612646576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156126ad576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126ba858585600161323f565b6008600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6127b786613245565b1717600660008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561284157600060018401905060006006600083815260200190815260200160002054141561283f57600254811461283e578260066000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128a9858585600161324f565b5050505050565b6000612710905090565b804710156128fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f490614887565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612923906148d5565b60006040518083038185875af1925050503d8060008114612960576040519150601f19603f3d011682016040523d82523d6000602084013e612965565b606091505b50509050806129a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a09061495c565b60405180910390fd5b505050565b60006129b8612501565b60025403905090565b600067ffffffffffffffff6040600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612a206128b0565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a75906149ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae590614a5a565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c7b613366565b612c976006600084815260200190815260200160002054613255565b9050919050565b6000600254905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cce6124d3565b8786866040518563ffffffff1660e01b8152600401612cf09493929190614acf565b602060405180830381600087803b158015612d0a57600080fd5b505af1925050508015612d3b57506040513d601f19601f82011682018060405250810190612d389190614b30565b60015b612db5573d8060008114612d6b576040519150601f19603f3d011682016040523d82523d6000602084013e612d70565b606091505b50600081511415612dad576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612e10613366565b612e21612e1c83612405565b613255565b9050919050565b60606000821415612e70576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f84565b600082905060005b60008214612ea2578080612e8b90614b5d565b915050600a82612e9b91906143e6565b9150612e78565b60008167ffffffffffffffff811115612ebe57612ebd6139aa565b5b6040519080825280601f01601f191660200182016040528015612ef05781602001600182028036833780820191505090505b5090505b60008514612f7d57600182612f099190614ba6565b9150600a85612f189190614bda565b6030612f24919061450c565b60f81b818381518110612f3a57612f39614417565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f7691906143e6565b9450612ef4565b8093505050505b919050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ff7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613032576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61303f600085838661323f565b600160406001901b178302600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16130a4600185146132f1565b901b60a042901b6130b486613245565b1717600660008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146131b8575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131686000878480600101955087612ca8565b61319e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106130f95782600254146131b357600080fd5b613223565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106131b9575b816002819055505050613239600085838661324f565b50505050565b50505050565b6000819050919050565b50505050565b61325d613366565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b6000819050919050565b60405180610100016040528060008152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff1681526020016000151581525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b8280546133b5906141c4565b90600052602060002090601f0160209004810192826133d7576000855561341e565b82601f106133f057805160ff191683800117855561341e565b8280016001018555821561341e579182015b8281111561341d578251825591602001919060010190613402565b5b50905061342b919061342f565b5090565b5b80821115613448576000816000905550600101613430565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61349581613460565b81146134a057600080fd5b50565b6000813590506134b28161348c565b92915050565b6000602082840312156134ce576134cd613456565b5b60006134dc848285016134a3565b91505092915050565b60008115159050919050565b6134fa816134e5565b82525050565b600060208201905061351560008301846134f1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561355557808201518184015260208101905061353a565b83811115613564576000848401525b50505050565b6000601f19601f8301169050919050565b60006135868261351b565b6135908185613526565b93506135a0818560208601613537565b6135a98161356a565b840191505092915050565b600060208201905081810360008301526135ce818461357b565b905092915050565b6000819050919050565b6135e9816135d6565b81146135f457600080fd5b50565b600081359050613606816135e0565b92915050565b60006020828403121561362257613621613456565b5b6000613630848285016135f7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061366482613639565b9050919050565b61367481613659565b82525050565b600060208201905061368f600083018461366b565b92915050565b61369e81613659565b81146136a957600080fd5b50565b6000813590506136bb81613695565b92915050565b600080604083850312156136d8576136d7613456565b5b60006136e6858286016136ac565b92505060206136f7858286016135f7565b9150509250929050565b600063ffffffff82169050919050565b61371a81613701565b82525050565b60006020820190506137356000830184613711565b92915050565b61374481613701565b811461374f57600080fd5b50565b6000813590506137618161373b565b92915050565b6000806040838503121561377e5761377d613456565b5b600061378c858286016136ac565b925050602061379d85828601613752565b9150509250929050565b6137b0816135d6565b82525050565b60006020820190506137cb60008301846137a7565b92915050565b6000806000606084860312156137ea576137e9613456565b5b60006137f8868287016136ac565b9350506020613809868287016136ac565b925050604061381a868287016135f7565b9150509250925092565b6000806040838503121561383b5761383a613456565b5b6000613849858286016135f7565b925050602061385a858286016135f7565b9150509250929050565b6000604082019050613879600083018561366b565b61388660208301846137a7565b9392505050565b6000602082840312156138a3576138a2613456565b5b60006138b1848285016136ac565b91505092915050565b6138c3816135d6565b82525050565b6138d281613701565b82525050565b6138e1816134e5565b82525050565b610100820160008201516138fe60008501826138ba565b50602082015161391160208501826138c9565b50604082015161392460408501826138c9565b50606082015161393760608501826138c9565b50608082015161394a60808501826138c9565b5060a082015161395d60a08501826138c9565b5060c082015161397060c08501826138c9565b5060e082015161398360e08501826138d8565b50505050565b60006101008201905061399f60008301846138e7565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139e28261356a565b810181811067ffffffffffffffff82111715613a0157613a006139aa565b5b80604052505050565b6000613a1461344c565b9050613a2082826139d9565b919050565b600067ffffffffffffffff821115613a4057613a3f6139aa565b5b602082029050602081019050919050565b600080fd5b6000613a69613a6484613a25565b613a0a565b90508083825260208201905060208402830185811115613a8c57613a8b613a51565b5b835b81811015613ab55780613aa188826135f7565b845260208401935050602081019050613a8e565b5050509392505050565b600082601f830112613ad457613ad36139a5565b5b8135613ae4848260208601613a56565b91505092915050565b600060208284031215613b0357613b02613456565b5b600082013567ffffffffffffffff811115613b2157613b2061345b565b5b613b2d84828501613abf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b6b81613659565b82525050565b600067ffffffffffffffff82169050919050565b613b8e81613b71565b82525050565b606082016000820151613baa6000850182613b62565b506020820151613bbd6020850182613b85565b506040820151613bd060408501826138d8565b50505050565b6000613be28383613b94565b60608301905092915050565b6000602082019050919050565b6000613c0682613b36565b613c108185613b41565b9350613c1b83613b52565b8060005b83811015613c4c578151613c338882613bd6565b9750613c3e83613bee565b925050600181019050613c1f565b5085935050505092915050565b60006020820190508181036000830152613c738184613bfb565b905092915050565b60006bffffffffffffffffffffffff82169050919050565b613c9c81613c7b565b8114613ca757600080fd5b50565b600081359050613cb981613c93565b92915050565b600060208284031215613cd557613cd4613456565b5b6000613ce384828501613caa565b91505092915050565b600080fd5b600067ffffffffffffffff821115613d0c57613d0b6139aa565b5b613d158261356a565b9050602081019050919050565b82818337600083830152505050565b6000613d44613d3f84613cf1565b613a0a565b905082815260208101848484011115613d6057613d5f613cec565b5b613d6b848285613d22565b509392505050565b600082601f830112613d8857613d876139a5565b5b8135613d98848260208601613d31565b91505092915050565b600060208284031215613db757613db6613456565b5b600082013567ffffffffffffffff811115613dd557613dd461345b565b5b613de184828501613d73565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000613e2283836138ba565b60208301905092915050565b6000602082019050919050565b6000613e4682613dea565b613e508185613df5565b9350613e5b83613e06565b8060005b83811015613e8c578151613e738882613e16565b9750613e7e83613e2e565b925050600181019050613e5f565b5085935050505092915050565b60006020820190508181036000830152613eb38184613e3b565b905092915050565b600080600060608486031215613ed457613ed3613456565b5b6000613ee2868287016136ac565b9350506020613ef3868287016135f7565b9250506040613f04868287016135f7565b9150509250925092565b613f17816134e5565b8114613f2257600080fd5b50565b600081359050613f3481613f0e565b92915050565b60008060408385031215613f5157613f50613456565b5b6000613f5f858286016136ac565b9250506020613f7085828601613f25565b9150509250929050565b600060208284031215613f9057613f8f613456565b5b6000613f9e84828501613752565b91505092915050565b600067ffffffffffffffff821115613fc257613fc16139aa565b5b613fcb8261356a565b9050602081019050919050565b6000613feb613fe684613fa7565b613a0a565b90508281526020810184848401111561400757614006613cec565b5b614012848285613d22565b509392505050565b600082601f83011261402f5761402e6139a5565b5b813561403f848260208601613fd8565b91505092915050565b6000806000806080858703121561406257614061613456565b5b6000614070878288016136ac565b9450506020614081878288016136ac565b9350506040614092878288016135f7565b925050606085013567ffffffffffffffff8111156140b3576140b261345b565b5b6140bf8782880161401a565b91505092959194509250565b6060820160008201516140e16000850182613b62565b5060208201516140f46020850182613b85565b50604082015161410760408501826138d8565b50505050565b600060608201905061412260008301846140cb565b92915050565b6000806040838503121561413f5761413e613456565b5b600061414d858286016136ac565b925050602061415e858286016136ac565b9150509250929050565b60006020828403121561417e5761417d613456565b5b600061418c84828501613f25565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141dc57607f821691505b602082108114156141f0576141ef614195565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061422c602083613526565b9150614237826141f6565b602082019050919050565b6000602082019050818103600083015261425b8161421f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061429c82613701565b91506142a783613701565b92508263ffffffff038211156142c0576142bf614262565b5b828201905092915050565b7f426f6b6953696c686f75657474653a20457863656564206d617820737570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b6000614327602183613526565b9150614332826142cb565b604082019050919050565b600060208201905081810360008301526143568161431a565b9050919050565b6000614368826135d6565b9150614373836135d6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143ac576143ab614262565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006143f1826135d6565b91506143fc836135d6565b92508261440c5761440b6143b7565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f426f6b6953696c686f75657474653a2053616c65206973206e6f74207374617260008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b60006144a2602383613526565b91506144ad82614446565b604082019050919050565b600060208201905081810360008301526144d181614495565b9050919050565b60006144e382613701565b91506144ee83613701565b92508282101561450157614500614262565b5b828203905092915050565b6000614517826135d6565b9150614522836135d6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561455757614556614262565b5b828201905092915050565b7f426f6b6953696c686f75657474653a20457863656564207472616e736163746960008201527f6f6e206c696d6974000000000000000000000000000000000000000000000000602082015250565b60006145be602883613526565b91506145c982614562565b604082019050919050565b600060208201905081810360008301526145ed816145b1565b9050919050565b7f426f6b6953696c686f75657474653a20696e73756666696369656e742066756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614650602283613526565b915061465b826145f4565b604082019050919050565b6000602082019050818103600083015261467f81614643565b9050919050565b7f426f6b6953696c686f75657474653a204578636565642077616c6c6574206c6960008201527f6d69740000000000000000000000000000000000000000000000000000000000602082015250565b60006146e2602383613526565b91506146ed82614686565b604082019050919050565b60006020820190508181036000830152614711816146d5565b9050919050565b600081905092915050565b600061472e8261351b565b6147388185614718565b9350614748818560208601613537565b80840191505092915050565b50565b6000614764600083614718565b915061476f82614754565b600082019050919050565b60006147868285614723565b91506147928284614723565b915061479d82614757565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614805602683613526565b9150614810826147a9565b604082019050919050565b60006020820190508181036000830152614834816147f8565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614871601d83613526565b915061487c8261483b565b602082019050919050565b600060208201905081810360008301526148a081614864565b9050919050565b600081905092915050565b60006148bf6000836148a7565b91506148ca82614754565b600082019050919050565b60006148e0826148b2565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614946603a83613526565b9150614951826148ea565b604082019050919050565b6000602082019050818103600083015261497581614939565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006149d8602a83613526565b91506149e38261497c565b604082019050919050565b60006020820190508181036000830152614a07816149cb565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614a44601983613526565b9150614a4f82614a0e565b602082019050919050565b60006020820190508181036000830152614a7381614a37565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614aa182614a7a565b614aab8185614a85565b9350614abb818560208601613537565b614ac48161356a565b840191505092915050565b6000608082019050614ae4600083018761366b565b614af1602083018661366b565b614afe60408301856137a7565b8181036060830152614b108184614a96565b905095945050505050565b600081519050614b2a8161348c565b92915050565b600060208284031215614b4657614b45613456565b5b6000614b5484828501614b1b565b91505092915050565b6000614b68826135d6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b9b57614b9a614262565b5b600182019050919050565b6000614bb1826135d6565b9150614bbc836135d6565b925082821015614bcf57614bce614262565b5b828203905092915050565b6000614be5826135d6565b9150614bf0836135d6565b925082614c0057614bff6143b7565b5b82820690509291505056fea2646970667358221220826529a45d52ad0f891b6f12e77718510b8cad644f1d7bab65866316b498861364736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000e35fa931a0000000000000000000000000000000000000000000000000000000000000000115c000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : price (uint256): 4000000000000000
Arg [1] : maxSupply (uint32): 4444
Arg [2] : txLimit (uint32): 10
Arg [3] : walletLimit (uint32): 200
Arg [4] : teamReserved (uint32): 0
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000e35fa931a0000
Arg [1] : 000000000000000000000000000000000000000000000000000000000000115c
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
68163:3658:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70833:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18086:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20154:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19614:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68468:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71141:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12127:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68383:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68306:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21040:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62123:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;71708:110;;;;;;;;;;;;;:::i;:::-;;21281:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68513:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70029:498;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42285:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17875:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68344:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71370:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13752:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67270:103;;;;;;;;;;;;;:::i;:::-;;71601:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46097:892;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66619:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18255:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43143:2505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20430:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69277:744;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21537:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41706:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70535:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68572:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68540:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20809:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71503:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67528:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68424:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70833:300;70936:4;70988:26;70973:41;;;:11;:41;;;;:99;;;;71046:26;71031:41;;;:11;:41;;;;70973:99;:152;;;;71089:36;71113:11;71089:23;:36::i;:::-;70973:152;70953:172;;70833:300;;;:::o;18086:100::-;18140:13;18173:5;18166:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18086:100;:::o;20154:204::-;20222:7;20247:16;20255:7;20247;:16::i;:::-;20242:64;;20272:34;;;;;;;;;;;;;;20242:64;20326:15;:24;20342:7;20326:24;;;;;;;;;;;;;;;;;;;;;20319:31;;20154:204;;;:::o;19614:474::-;19687:13;19719:27;19738:7;19719:18;:27::i;:::-;19687:61;;19769:5;19763:11;;:2;:11;;;19759:48;;;19783:24;;;;;;;;;;;;;;19759:48;19847:5;19824:28;;:19;:17;:19::i;:::-;:28;;;19820:175;;19872:44;19889:5;19896:19;:17;:19::i;:::-;19872:16;:44::i;:::-;19867:128;;19944:35;;;;;;;;;;;;;;19867:128;19820:175;20034:2;20007:15;:24;20023:7;20007:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20072:7;20068:2;20052:28;;20061:5;20052:28;;;;;;;;;;;;19676:412;19614:474;;:::o;68468:36::-;;;:::o;71141:221::-;66850:12;:10;:12::i;:::-;66839:23;;:7;:5;:7::i;:::-;:23;;;66831:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71230:6:::1;71215:11;;:21;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;71271:13;71256:28;;:11;;;;;;;;;;;:28;;;;71247:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;71333:21;71343:2;71347:6;71333:21;;:9;:21::i;:::-;71141:221:::0;;:::o;12127:315::-;12180:7;12408:15;:13;:15::i;:::-;12393:12;;12377:13;;:28;:46;12370:53;;12127:315;:::o;68383:34::-;;;:::o;68306:31::-;;;:::o;21040:170::-;21174:28;21184:4;21190:2;21194:7;21174:9;:28::i;:::-;21040:170;;;:::o;62123:442::-;62220:7;62229;62249:26;62278:17;:27;62296:8;62278:27;;;;;;;;;;;62249:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62350:1;62322:30;;:7;:16;;;:30;;;62318:92;;;62379:19;62369:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62318:92;62422:21;62487:17;:15;:17::i;:::-;62446:58;;62460:7;:23;;;62447:36;;:10;:36;;;;:::i;:::-;62446:58;;;;:::i;:::-;62422:82;;62525:7;:16;;;62543:13;62517:40;;;;;;62123:442;;;;;:::o;71708:110::-;66850:12;:10;:12::i;:::-;66839:23;;:7;:5;:7::i;:::-;:23;;;66831:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71758:52:::1;71788:21;71766:10;71758:29;;;;:52;;;;:::i;:::-;71708:110::o:0;21281:185::-;21419:39;21436:4;21442:2;21446:7;21419:39;;;;;;;;;;;;:16;:39::i;:::-;21281:185;;;:::o;68513:20::-;;;;;;;;;;;;;:::o;70029:498::-;70084:18;;:::i;:::-;70135:384;;;;;;;;70173:6;70135:384;;;;70207:8;70135:384;;;;;;70247:12;70135:384;;;;;;70289:10;70135:384;;;;;;70332:13;70135:384;;;;;;70384:22;:20;:22::i;:::-;70135:384;;;;;;70445:21;70459:6;70445:13;:21::i;:::-;70135:384;;;;;;70495:8;;;;;;;;;;;70135:384;;;;;70115:404;;70029:498;;;:::o;42285:468::-;42374:23;42435:22;42460:8;:15;42435:40;;42490:34;42548:14;42527:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;42490:73;;42583:9;42578:125;42599:14;42594:1;:19;42578:125;;42655:32;42675:8;42684:1;42675:11;;;;;;;;:::i;:::-;;;;;;;;42655:19;:32::i;:::-;42639:10;42650:1;42639:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;42615:3;;;;;42578:125;;;;42724:10;42717:17;;;;42285:468;;;:::o;17875:144::-;17939:7;17982:27;18001:7;17982:18;:27::i;:::-;17959:52;;17875:144;;;:::o;68344:32::-;;;:::o;71370:125::-;66850:12;:10;:12::i;:::-;66839:23;;:7;:5;:7::i;:::-;:23;;;66831:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71446:41:::1;71465:7;:5;:7::i;:::-;71474:12;71446:18;:41::i;:::-;71370:125:::0;:::o;13752:224::-;13816:7;13857:1;13840:19;;:5;:19;;;13836:60;;;13868:28;;;;;;;;;;;;;;13836:60;9091:13;13914:18;:25;13933:5;13914:25;;;;;;;;;;;;;;;;:54;13907:61;;13752:224;;;:::o;67270:103::-;66850:12;:10;:12::i;:::-;66839:23;;:7;:5;:7::i;:::-;:23;;;66831:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67335:30:::1;67362:1;67335:18;:30::i;:::-;67270:103::o:0;71601:99::-;66850:12;:10;:12::i;:::-;66839:23;;:7;:5;:7::i;:::-;:23;;;66831:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71689:3:::1;71674:12;:18;;;;;;;;;;;;:::i;:::-;;71601:99:::0;:::o;46097:892::-;46167:16;46221:19;46255:25;46295:22;46320:16;46330:5;46320:9;:16::i;:::-;46295:41;;46351:25;46393:14;46379:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46351:57;;46423:31;;:::i;:::-;46474:9;46486:15;:13;:15::i;:::-;46474:27;;46469:472;46518:14;46503:11;:29;46469:472;;46570:15;46583:1;46570:12;:15::i;:::-;46558:27;;46608:9;:16;;;46604:73;;;46649:8;;46604:73;46725:1;46699:28;;:9;:14;;;:28;;;46695:111;;46772:9;:14;;;46752:34;;46695:111;46849:5;46828:26;;:17;:26;;;46824:102;;;46905:1;46879:8;46888:13;;;;;;46879:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;46824:102;46469:472;46534:3;;;;;46469:472;;;;46962:8;46955:15;;;;;;;46097:892;;;:::o;66619:87::-;66665:7;66692:6;;;;;;;;;;;66685:13;;66619:87;:::o;18255:104::-;18311:13;18344:7;18337:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18255:104;:::o;43143:2505::-;43278:16;43345:4;43336:5;:13;43332:45;;43358:19;;;;;;;;;;;;;;43332:45;43392:19;43426:17;43446:14;:12;:14::i;:::-;43426:34;;43546:15;:13;:15::i;:::-;43538:5;:23;43534:87;;;43590:15;:13;:15::i;:::-;43582:23;;43534:87;43697:9;43690:4;:16;43686:73;;;43734:9;43727:16;;43686:73;43773:25;43801:16;43811:5;43801:9;:16::i;:::-;43773:44;;43995:4;43987:5;:12;43983:278;;;44020:19;44049:5;44042:4;:12;44020:34;;44091:17;44077:11;:31;44073:111;;;44153:11;44133:31;;44073:111;44001:198;43983:278;;;44244:1;44224:21;;43983:278;44275:25;44317:17;44303:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44275:60;;44375:1;44354:17;:22;44350:78;;;44404:8;44397:15;;;;;;;;44350:78;44572:31;44606:26;44626:5;44606:19;:26::i;:::-;44572:60;;44647:25;44892:9;:16;;;44887:92;;44949:9;:14;;;44929:34;;44887:92;44998:9;45010:5;44998:17;;44993:478;45022:4;45017:1;:9;;:45;;;;;45045:17;45030:11;:32;;45017:45;44993:478;;;45100:15;45113:1;45100:12;:15::i;:::-;45088:27;;45138:9;:16;;;45134:73;;;45179:8;;45134:73;45255:1;45229:28;;:9;:14;;;:28;;;45225:111;;45302:9;:14;;;45282:34;;45225:111;45379:5;45358:26;;:17;:26;;;45354:102;;;45435:1;45409:8;45418:13;;;;;;45409:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;45354:102;44993:478;45064:3;;;;;44993:478;;;;45573:11;45563:8;45556:29;45621:8;45614:15;;;;;;;;43143:2505;;;;;;:::o;20430:308::-;20541:19;:17;:19::i;:::-;20529:31;;:8;:31;;;20525:61;;;20569:17;;;;;;;;;;;;;;20525:61;20651:8;20599:18;:39;20618:19;:17;:19::i;:::-;20599:39;;;;;;;;;;;;;;;:49;20639:8;20599:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20711:8;20675:55;;20690:19;:17;:19::i;:::-;20675:55;;;20721:8;20675:55;;;;;;:::i;:::-;;;;;;;;20430:308;;:::o;69277:744::-;69342:8;;;;;;;;;;;69334:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;69449:13;69436:10;:26;;;;:::i;:::-;69409:53;;69418:14;:12;:14::i;:::-;69409:6;:23;;;;;;:::i;:::-;:53;;69401:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;69529:8;69519:18;;:6;:18;;;;69511:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;69595:14;69612:25;69626:10;69612:13;:25::i;:::-;69595:42;;69661:1;69652:6;:10;69648:232;;;69709:6;69700;:15;;;;;;:::i;:::-;69687:9;:28;;69679:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;69648:232;;;69823:6;69818:1;69809:6;:10;;;;:::i;:::-;69808:21;;;;;;:::i;:::-;69795:9;:34;;69787:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;69648:232;69919:12;69900:31;;69909:6;69900:15;;:6;:15;;;;:::i;:::-;:31;;69892:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;69984:29;69994:10;70006:6;69984:29;;:9;:29::i;:::-;69323:698;69277:744;:::o;21537:396::-;21704:28;21714:4;21720:2;21724:7;21704:9;:28::i;:::-;21765:1;21747:2;:14;;;:19;21743:183;;21786:56;21817:4;21823:2;21827:7;21836:5;21786:30;:56::i;:::-;21781:145;;21870:40;;;;;;;;;;;;;;21781:145;21743:183;21537:396;;;;:::o;41706:420::-;41782:21;;:::i;:::-;41816:31;;:::i;:::-;41872:15;:13;:15::i;:::-;41862:7;:25;:54;;;;41902:14;:12;:14::i;:::-;41891:7;:25;;41862:54;41858:103;;;41940:9;41933:16;;;;;41858:103;41983:21;41996:7;41983:12;:21::i;:::-;41971:33;;42019:9;:16;;;42015:65;;;42059:9;42052:16;;;;;42015:65;42097:21;42110:7;42097:12;:21::i;:::-;42090:28;;;41706:420;;;;:::o;70535:290::-;70608:13;70639:16;70647:7;70639;:16::i;:::-;70634:59;;70664:29;;;;;;;;;;;;;;70634:59;70706:21;70730:12;70706:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70784:7;70793:18;:7;:16;:18::i;:::-;70767:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70753:64;;;70535:290;;;:::o;68572:85::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68540:25::-;;;;;;;;;;;;;:::o;20809:164::-;20906:4;20930:18;:25;20949:5;20930:25;;;;;;;;;;;;;;;:35;20956:8;20930:35;;;;;;;;;;;;;;;;;;;;;;;;;20923:42;;20809:164;;;;:::o;71503:90::-;66850:12;:10;:12::i;:::-;66839:23;;:7;:5;:7::i;:::-;:23;;;66831:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71578:7:::1;71567:8;;:18;;;;;;;;;;;;;;;;;;71503:90:::0;:::o;67528:201::-;66850:12;:10;:12::i;:::-;66839:23;;:7;:5;:7::i;:::-;:23;;;66831:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67637:1:::1;67617:22;;:8;:22;;;;67609:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;67693:28;67712:8;67693:18;:28::i;:::-;67528:201:::0;:::o;68424:37::-;;;:::o;13073:615::-;13158:4;13473:10;13458:25;;:11;:25;;;;:102;;;;13550:10;13535:25;;:11;:25;;;;13458:102;:179;;;;13627:10;13612:25;;:11;:25;;;;13458:179;13438:199;;13073:615;;;:::o;22188:273::-;22245:4;22301:7;22282:15;:13;:15::i;:::-;:26;;:66;;;;;22335:13;;22325:7;:23;22282:66;:152;;;;;22433:1;9861:8;22386:17;:26;22404:7;22386:26;;;;;;;;;;;;:43;:48;22282:152;22262:172;;22188:273;;;:::o;15390:1129::-;15457:7;15477:12;15492:7;15477:22;;15560:4;15541:15;:13;:15::i;:::-;:23;15537:915;;15594:13;;15587:4;:20;15583:869;;;15632:14;15649:17;:23;15667:4;15649:23;;;;;;;;;;;;15632:40;;15765:1;9861:8;15738:6;:23;:28;15734:699;;;16257:113;16274:1;16264:6;:11;16257:113;;;16317:17;:25;16335:6;;;;;;;16317:25;;;;;;;;;;;;16308:34;;16257:113;;;16403:6;16396:13;;;;;;15734:699;15609:843;15583:869;15537:915;16480:31;;;;;;;;;;;;;;15390:1129;;;;:::o;36170:105::-;36230:7;36257:10;36250:17;;36170:105;:::o;65343:98::-;65396:7;65423:10;65416:17;;65343:98;:::o;22545:104::-;22614:27;22624:2;22628:8;22614:27;;;;;;;;;;;;:9;:27::i;:::-;22545:104;;:::o;11650:92::-;11706:7;11650:92;:::o;27427:2515::-;27542:27;27572;27591:7;27572:18;:27::i;:::-;27542:57;;27657:4;27616:45;;27632:19;27616:45;;;27612:86;;27670:28;;;;;;;;;;;;;;27612:86;27711:22;27760:4;27737:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;27781:43;27798:4;27804:19;:17;:19::i;:::-;27781:16;:43::i;:::-;27737:87;:147;;;;27865:19;:17;:19::i;:::-;27841:43;;:20;27853:7;27841:11;:20::i;:::-;:43;;;27737:147;27711:174;;27903:17;27898:66;;27929:35;;;;;;;;;;;;;;27898:66;27993:1;27979:16;;:2;:16;;;27975:52;;;28004:23;;;;;;;;;;;;;;27975:52;28040:43;28062:4;28068:2;28072:7;28081:1;28040:21;:43::i;:::-;28156:15;:24;28172:7;28156:24;;;;;;;;;;;;28149:31;;;;;;;;;;;28548:18;:24;28567:4;28548:24;;;;;;;;;;;;;;;;28546:26;;;;;;;;;;;;28617:18;:22;28636:2;28617:22;;;;;;;;;;;;;;;;28615:24;;;;;;;;;;;10143:8;9745:3;28998:15;:41;;28956:21;28974:2;28956:17;:21::i;:::-;:84;:128;28910:17;:26;28928:7;28910:26;;;;;;;;;;;:174;;;;29254:1;10143:8;29204:19;:46;:51;29200:626;;;29276:19;29308:1;29298:7;:11;29276:33;;29465:1;29431:17;:30;29449:11;29431:30;;;;;;;;;;;;:35;29427:384;;;29569:13;;29554:11;:28;29550:242;;29749:19;29716:17;:30;29734:11;29716:30;;;;;;;;;;;:52;;;;29550:242;29427:384;29257:569;29200:626;29873:7;29869:2;29854:27;;29863:4;29854:27;;;;;;;;;;;;29892:42;29913:4;29919:2;29923:7;29932:1;29892:20;:42::i;:::-;27531:2411;;27427:2515;;;:::o;62847:97::-;62905:6;62931:5;62924:12;;62847:97;:::o;51614:317::-;51729:6;51704:21;:31;;51696:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51783:12;51801:9;:14;;51823:6;51801:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51782:52;;;51853:7;51845:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;51685:246;51614:317;;:::o;12540:285::-;12587:7;12791:15;:13;:15::i;:::-;12775:13;;:31;12768:38;;12540:285;:::o;14058:176::-;14119:7;9091:13;9228:2;14147:18;:25;14166:5;14147:25;;;;;;;;;;;;;;;;:49;;14146:80;14139:87;;14058:176;;;:::o;63215:332::-;63334:17;:15;:17::i;:::-;63318:33;;:12;:33;;;;63310:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;63437:1;63417:22;;:8;:22;;;;63409:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;63504:35;;;;;;;;63516:8;63504:35;;;;;;63526:12;63504:35;;;;;63482:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63215:332;;:::o;67889:191::-;67963:16;67982:6;;;;;;;;;;;67963:25;;68008:8;67999:6;;:17;;;;;;;;;;;;;;;;;;68063:8;68032:40;;68053:8;68032:40;;;;;;;;;;;;67952:128;67889:191;:::o;16999:153::-;17059:21;;:::i;:::-;17100:44;17119:17;:24;17137:5;17119:24;;;;;;;;;;;;17100:18;:44::i;:::-;17093:51;;16999:153;;;:::o;11821:95::-;11868:7;11895:13;;11888:20;;11821:95;:::o;33639:716::-;33802:4;33848:2;33823:45;;;33869:19;:17;:19::i;:::-;33890:4;33896:7;33905:5;33823:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33819:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34123:1;34106:6;:13;:18;34102:235;;;34152:40;;;;;;;;;;;;;;34102:235;34295:6;34289:13;34280:6;34276:2;34272:15;34265:38;33819:529;33992:54;;;33982:64;;;:6;:64;;;;33975:71;;;33639:716;;;;;;:::o;17655:158::-;17717:21;;:::i;:::-;17758:47;17777:27;17796:7;17777:18;:27::i;:::-;17758:18;:47::i;:::-;17751:54;;17655:158;;;:::o;47361:723::-;47417:13;47647:1;47638:5;:10;47634:53;;;47665:10;;;;;;;;;;;;;;;;;;;;;47634:53;47697:12;47712:5;47697:20;;47728:14;47753:78;47768:1;47760:4;:9;47753:78;;47786:8;;;;;:::i;:::-;;;;47817:2;47809:10;;;;;:::i;:::-;;;47753:78;;;47841:19;47873:6;47863:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47841:39;;47891:154;47907:1;47898:5;:10;47891:154;;47935:1;47925:11;;;;;:::i;:::-;;;48002:2;47994:5;:10;;;;:::i;:::-;47981:2;:24;;;;:::i;:::-;47968:39;;47951:6;47958;47951:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;48031:2;48022:11;;;;;:::i;:::-;;;47891:154;;;48069:6;48055:21;;;;;47361:723;;;;:::o;23022:2236::-;23145:20;23168:13;;23145:36;;23210:1;23196:16;;:2;:16;;;23192:48;;;23221:19;;;;;;;;;;;;;;23192:48;23267:1;23255:8;:13;23251:44;;;23277:18;;;;;;;;;;;;;;23251:44;23308:61;23338:1;23342:2;23346:12;23360:8;23308:21;:61::i;:::-;23912:1;9228:2;23883:1;:25;;23882:31;23870:8;:44;23844:18;:22;23863:2;23844:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;10008:3;24313:29;24340:1;24328:8;:13;24313:14;:29::i;:::-;:56;;9745:3;24250:15;:41;;24208:21;24226:2;24208:17;:21::i;:::-;:84;:162;24157:17;:31;24175:12;24157:31;;;;;;;;;;;:213;;;;24387:20;24410:12;24387:35;;24437:11;24466:8;24451:12;:23;24437:37;;24513:1;24495:2;:14;;;:19;24491:635;;24535:313;24591:12;24587:2;24566:38;;24583:1;24566:38;;;;;;;;;;;;24632:69;24671:1;24675:2;24679:14;;;;;;24695:5;24632:30;:69::i;:::-;24627:174;;24737:40;;;;;;;;;;;;;;24627:174;24843:3;24828:12;:18;24535:313;;24929:12;24912:13;;:29;24908:43;;24943:8;;;24908:43;24491:635;;;24992:119;25048:14;;;;;;25044:2;25023:40;;25040:1;25023:40;;;;;;;;;;;;25106:3;25091:12;:18;24992:119;;24491:635;25156:12;25140:13;:28;;;;23621:1559;;25190:60;25219:1;25223:2;25227:12;25241:8;25190:20;:60::i;:::-;23134:2124;23022:2236;;;:::o;35003:159::-;;;;;:::o;19175:148::-;19239:14;19300:5;19290:15;;19175:148;;;:::o;35821:158::-;;;;;:::o;16613:295::-;16679:31;;:::i;:::-;16756:6;16723:9;:14;;:41;;;;;;;;;;;9745:3;16809:6;:32;;16775:9;:24;;:67;;;;;;;;;;;16899:1;9861:8;16872:6;:23;:28;;16853:9;:16;;:47;;;;;;;;;;;16613:295;;;:::o;19410:142::-;19468:14;19529:5;19519:15;;19410:142;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518: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:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:93::-;4974:7;5014:10;5007:5;5003:22;4992:33;;4938:93;;;:::o;5037:115::-;5122:23;5139:5;5122:23;:::i;:::-;5117:3;5110:36;5037:115;;:::o;5158:218::-;5249:4;5287:2;5276:9;5272:18;5264:26;;5300:69;5366:1;5355:9;5351:17;5342:6;5300:69;:::i;:::-;5158:218;;;;:::o;5382:120::-;5454:23;5471:5;5454:23;:::i;:::-;5447:5;5444:34;5434:62;;5492:1;5489;5482:12;5434:62;5382:120;:::o;5508:137::-;5553:5;5591:6;5578:20;5569:29;;5607:32;5633:5;5607:32;:::i;:::-;5508:137;;;;:::o;5651:472::-;5718:6;5726;5775:2;5763:9;5754:7;5750:23;5746:32;5743:119;;;5781:79;;:::i;:::-;5743:119;5901:1;5926:53;5971:7;5962:6;5951:9;5947:22;5926:53;:::i;:::-;5916:63;;5872:117;6028:2;6054:52;6098:7;6089:6;6078:9;6074:22;6054:52;:::i;:::-;6044:62;;5999:117;5651:472;;;;;:::o;6129:118::-;6216:24;6234:5;6216:24;:::i;:::-;6211:3;6204:37;6129:118;;:::o;6253:222::-;6346:4;6384:2;6373:9;6369:18;6361:26;;6397:71;6465:1;6454:9;6450:17;6441:6;6397:71;:::i;:::-;6253:222;;;;:::o;6481:619::-;6558:6;6566;6574;6623:2;6611:9;6602:7;6598:23;6594:32;6591:119;;;6629:79;;:::i;:::-;6591:119;6749:1;6774:53;6819:7;6810:6;6799:9;6795:22;6774:53;:::i;:::-;6764:63;;6720:117;6876:2;6902:53;6947:7;6938:6;6927:9;6923:22;6902:53;:::i;:::-;6892:63;;6847:118;7004:2;7030:53;7075:7;7066:6;7055:9;7051:22;7030:53;:::i;:::-;7020:63;;6975:118;6481:619;;;;;:::o;7106:474::-;7174:6;7182;7231:2;7219:9;7210:7;7206:23;7202:32;7199:119;;;7237:79;;:::i;:::-;7199:119;7357:1;7382:53;7427:7;7418:6;7407:9;7403:22;7382:53;:::i;:::-;7372:63;;7328:117;7484:2;7510:53;7555:7;7546:6;7535:9;7531:22;7510:53;:::i;:::-;7500:63;;7455:118;7106:474;;;;;:::o;7586:332::-;7707:4;7745:2;7734:9;7730:18;7722:26;;7758:71;7826:1;7815:9;7811:17;7802:6;7758:71;:::i;:::-;7839:72;7907:2;7896:9;7892:18;7883:6;7839:72;:::i;:::-;7586:332;;;;;:::o;7924:329::-;7983:6;8032:2;8020:9;8011:7;8007:23;8003:32;8000:119;;;8038:79;;:::i;:::-;8000:119;8158:1;8183:53;8228:7;8219:6;8208:9;8204:22;8183:53;:::i;:::-;8173:63;;8129:117;7924:329;;;;:::o;8259:108::-;8336:24;8354:5;8336:24;:::i;:::-;8331:3;8324:37;8259:108;;:::o;8373:105::-;8448:23;8465:5;8448:23;:::i;:::-;8443:3;8436:36;8373:105;;:::o;8484:99::-;8555:21;8570:5;8555:21;:::i;:::-;8550:3;8543:34;8484:99;;:::o;8667:1583::-;8822:6;8817:3;8813:16;8912:4;8905:5;8901:16;8895:23;8931:63;8988:4;8983:3;8979:14;8965:12;8931:63;:::i;:::-;8839:165;9089:4;9082:5;9078:16;9072:23;9108:61;9163:4;9158:3;9154:14;9140:12;9108:61;:::i;:::-;9014:165;9268:4;9261:5;9257:16;9251:23;9287:61;9342:4;9337:3;9333:14;9319:12;9287:61;:::i;:::-;9189:169;9445:4;9438:5;9434:16;9428:23;9464:61;9519:4;9514:3;9510:14;9496:12;9464:61;:::i;:::-;9368:167;9625:4;9618:5;9614:16;9608:23;9644:61;9699:4;9694:3;9690:14;9676:12;9644:61;:::i;:::-;9545:170;9804:4;9797:5;9793:16;9787:23;9823:61;9878:4;9873:3;9869:14;9855:12;9823:61;:::i;:::-;9725:169;9982:4;9975:5;9971:16;9965:23;10001:61;10056:4;10051:3;10047:14;10033:12;10001:61;:::i;:::-;9904:168;10157:4;10150:5;10146:16;10140:23;10176:57;10227:4;10222:3;10218:14;10204:12;10176:57;:::i;:::-;10082:161;8791:1459;8667:1583;;:::o;10256:339::-;10407:4;10445:3;10434:9;10430:19;10422:27;;10459:129;10585:1;10574:9;10570:17;10561:6;10459:129;:::i;:::-;10256:339;;;;:::o;10601:117::-;10710:1;10707;10700:12;10724:180;10772:77;10769:1;10762:88;10869:4;10866:1;10859:15;10893:4;10890:1;10883:15;10910:281;10993:27;11015:4;10993:27;:::i;:::-;10985:6;10981:40;11123:6;11111:10;11108:22;11087:18;11075:10;11072:34;11069:62;11066:88;;;11134:18;;:::i;:::-;11066:88;11174:10;11170:2;11163:22;10953:238;10910:281;;:::o;11197:129::-;11231:6;11258:20;;:::i;:::-;11248:30;;11287:33;11315:4;11307:6;11287:33;:::i;:::-;11197:129;;;:::o;11332:311::-;11409:4;11499:18;11491:6;11488:30;11485:56;;;11521:18;;:::i;:::-;11485:56;11571:4;11563:6;11559:17;11551:25;;11631:4;11625;11621:15;11613:23;;11332:311;;;:::o;11649:117::-;11758:1;11755;11748:12;11789:710;11885:5;11910:81;11926:64;11983:6;11926:64;:::i;:::-;11910:81;:::i;:::-;11901:90;;12011:5;12040:6;12033:5;12026:21;12074:4;12067:5;12063:16;12056:23;;12127:4;12119:6;12115:17;12107:6;12103:30;12156:3;12148:6;12145:15;12142:122;;;12175:79;;:::i;:::-;12142:122;12290:6;12273:220;12307:6;12302:3;12299:15;12273:220;;;12382:3;12411:37;12444:3;12432:10;12411:37;:::i;:::-;12406:3;12399:50;12478:4;12473:3;12469:14;12462:21;;12349:144;12333:4;12328:3;12324:14;12317:21;;12273:220;;;12277:21;11891:608;;11789:710;;;;;:::o;12522:370::-;12593:5;12642:3;12635:4;12627:6;12623:17;12619:27;12609:122;;12650:79;;:::i;:::-;12609:122;12767:6;12754:20;12792:94;12882:3;12874:6;12867:4;12859:6;12855:17;12792:94;:::i;:::-;12783:103;;12599:293;12522:370;;;;:::o;12898:539::-;12982:6;13031:2;13019:9;13010:7;13006:23;13002:32;12999:119;;;13037:79;;:::i;:::-;12999:119;13185:1;13174:9;13170:17;13157:31;13215:18;13207:6;13204:30;13201:117;;;13237:79;;:::i;:::-;13201:117;13342:78;13412:7;13403:6;13392:9;13388:22;13342:78;:::i;:::-;13332:88;;13128:302;12898:539;;;;:::o;13443:144::-;13540:6;13574:5;13568:12;13558:22;;13443:144;;;:::o;13593:214::-;13722:11;13756:6;13751:3;13744:19;13796:4;13791:3;13787:14;13772:29;;13593:214;;;;:::o;13813:162::-;13910:4;13933:3;13925:11;;13963:4;13958:3;13954:14;13946:22;;13813:162;;;:::o;13981:108::-;14058:24;14076:5;14058:24;:::i;:::-;14053:3;14046:37;13981:108;;:::o;14095:101::-;14131:7;14171:18;14164:5;14160:30;14149:41;;14095:101;;;:::o;14202:105::-;14277:23;14294:5;14277:23;:::i;:::-;14272:3;14265:36;14202:105;;:::o;14385:685::-;14532:4;14527:3;14523:14;14619:4;14612:5;14608:16;14602:23;14638:63;14695:4;14690:3;14686:14;14672:12;14638:63;:::i;:::-;14547:164;14803:4;14796:5;14792:16;14786:23;14822:61;14877:4;14872:3;14868:14;14854:12;14822:61;:::i;:::-;14721:172;14977:4;14970:5;14966:16;14960:23;14996:57;15047:4;15042:3;15038:14;15024:12;14996:57;:::i;:::-;14903:160;14501:569;14385:685;;:::o;15076:299::-;15205:10;15226:106;15328:3;15320:6;15226:106;:::i;:::-;15364:4;15359:3;15355:14;15341:28;;15076:299;;;;:::o;15381:143::-;15481:4;15513;15508:3;15504:14;15496:22;;15381:143;;;:::o;15606:972::-;15785:3;15814:84;15892:5;15814:84;:::i;:::-;15914:116;16023:6;16018:3;15914:116;:::i;:::-;15907:123;;16054:86;16134:5;16054:86;:::i;:::-;16163:7;16194:1;16179:374;16204:6;16201:1;16198:13;16179:374;;;16280:6;16274:13;16307:123;16426:3;16411:13;16307:123;:::i;:::-;16300:130;;16453:90;16536:6;16453:90;:::i;:::-;16443:100;;16239:314;16226:1;16223;16219:9;16214:14;;16179:374;;;16183:14;16569:3;16562:10;;15790:788;;;15606:972;;;;:::o;16584:493::-;16787:4;16825:2;16814:9;16810:18;16802:26;;16874:9;16868:4;16864:20;16860:1;16849:9;16845:17;16838:47;16902:168;17065:4;17056:6;16902:168;:::i;:::-;16894:176;;16584:493;;;;:::o;17083:109::-;17119:7;17159:26;17152:5;17148:38;17137:49;;17083:109;;;:::o;17198:120::-;17270:23;17287:5;17270:23;:::i;:::-;17263:5;17260:34;17250:62;;17308:1;17305;17298:12;17250:62;17198:120;:::o;17324:137::-;17369:5;17407:6;17394:20;17385:29;;17423:32;17449:5;17423:32;:::i;:::-;17324:137;;;;:::o;17467:327::-;17525:6;17574:2;17562:9;17553:7;17549:23;17545:32;17542:119;;;17580:79;;:::i;:::-;17542:119;17700:1;17725:52;17769:7;17760:6;17749:9;17745:22;17725:52;:::i;:::-;17715:62;;17671:116;17467:327;;;;:::o;17800:117::-;17909:1;17906;17899:12;17923:308;17985:4;18075:18;18067:6;18064:30;18061:56;;;18097:18;;:::i;:::-;18061:56;18135:29;18157:6;18135:29;:::i;:::-;18127:37;;18219:4;18213;18209:15;18201:23;;17923:308;;;:::o;18237:154::-;18321:6;18316:3;18311;18298:30;18383:1;18374:6;18369:3;18365:16;18358:27;18237:154;;;:::o;18397:412::-;18475:5;18500:66;18516:49;18558:6;18516:49;:::i;:::-;18500:66;:::i;:::-;18491:75;;18589:6;18582:5;18575:21;18627:4;18620:5;18616:16;18665:3;18656:6;18651:3;18647:16;18644:25;18641:112;;;18672:79;;:::i;:::-;18641:112;18762:41;18796:6;18791:3;18786;18762:41;:::i;:::-;18481:328;18397:412;;;;;:::o;18829:340::-;18885:5;18934:3;18927:4;18919:6;18915:17;18911:27;18901:122;;18942:79;;:::i;:::-;18901:122;19059:6;19046:20;19084:79;19159:3;19151:6;19144:4;19136:6;19132:17;19084:79;:::i;:::-;19075:88;;18891:278;18829:340;;;;:::o;19175:509::-;19244:6;19293:2;19281:9;19272:7;19268:23;19264:32;19261:119;;;19299:79;;:::i;:::-;19261:119;19447:1;19436:9;19432:17;19419:31;19477:18;19469:6;19466:30;19463:117;;;19499:79;;:::i;:::-;19463:117;19604:63;19659:7;19650:6;19639:9;19635:22;19604:63;:::i;:::-;19594:73;;19390:287;19175:509;;;;:::o;19690:114::-;19757:6;19791:5;19785:12;19775:22;;19690:114;;;:::o;19810:184::-;19909:11;19943:6;19938:3;19931:19;19983:4;19978:3;19974:14;19959:29;;19810:184;;;;:::o;20000:132::-;20067:4;20090:3;20082:11;;20120:4;20115:3;20111:14;20103:22;;20000:132;;;:::o;20138:179::-;20207:10;20228:46;20270:3;20262:6;20228:46;:::i;:::-;20306:4;20301:3;20297:14;20283:28;;20138:179;;;;:::o;20323:113::-;20393:4;20425;20420:3;20416:14;20408:22;;20323:113;;;:::o;20472:732::-;20591:3;20620:54;20668:5;20620:54;:::i;:::-;20690:86;20769:6;20764:3;20690:86;:::i;:::-;20683:93;;20800:56;20850:5;20800:56;:::i;:::-;20879:7;20910:1;20895:284;20920:6;20917:1;20914:13;20895:284;;;20996:6;20990:13;21023:63;21082:3;21067:13;21023:63;:::i;:::-;21016:70;;21109:60;21162:6;21109:60;:::i;:::-;21099:70;;20955:224;20942:1;20939;20935:9;20930:14;;20895:284;;;20899:14;21195:3;21188:10;;20596:608;;;20472:732;;;;:::o;21210:373::-;21353:4;21391:2;21380:9;21376:18;21368:26;;21440:9;21434:4;21430:20;21426:1;21415:9;21411:17;21404:47;21468:108;21571:4;21562:6;21468:108;:::i;:::-;21460:116;;21210:373;;;;:::o;21589:619::-;21666:6;21674;21682;21731:2;21719:9;21710:7;21706:23;21702:32;21699:119;;;21737:79;;:::i;:::-;21699:119;21857:1;21882:53;21927:7;21918:6;21907:9;21903:22;21882:53;:::i;:::-;21872:63;;21828:117;21984:2;22010:53;22055:7;22046:6;22035:9;22031:22;22010:53;:::i;:::-;22000:63;;21955:118;22112:2;22138:53;22183:7;22174:6;22163:9;22159:22;22138:53;:::i;:::-;22128:63;;22083:118;21589:619;;;;;:::o;22214:116::-;22284:21;22299:5;22284:21;:::i;:::-;22277:5;22274:32;22264:60;;22320:1;22317;22310:12;22264:60;22214:116;:::o;22336:133::-;22379:5;22417:6;22404:20;22395:29;;22433:30;22457:5;22433:30;:::i;:::-;22336:133;;;;:::o;22475:468::-;22540:6;22548;22597:2;22585:9;22576:7;22572:23;22568:32;22565:119;;;22603:79;;:::i;:::-;22565:119;22723:1;22748:53;22793:7;22784:6;22773:9;22769:22;22748:53;:::i;:::-;22738:63;;22694:117;22850:2;22876:50;22918:7;22909:6;22898:9;22894:22;22876:50;:::i;:::-;22866:60;;22821:115;22475:468;;;;;:::o;22949:327::-;23007:6;23056:2;23044:9;23035:7;23031:23;23027:32;23024:119;;;23062:79;;:::i;:::-;23024:119;23182:1;23207:52;23251:7;23242:6;23231:9;23227:22;23207:52;:::i;:::-;23197:62;;23153:116;22949:327;;;;:::o;23282:307::-;23343:4;23433:18;23425:6;23422:30;23419:56;;;23455:18;;:::i;:::-;23419:56;23493:29;23515:6;23493:29;:::i;:::-;23485:37;;23577:4;23571;23567:15;23559:23;;23282:307;;;:::o;23595:410::-;23672:5;23697:65;23713:48;23754:6;23713:48;:::i;:::-;23697:65;:::i;:::-;23688:74;;23785:6;23778:5;23771:21;23823:4;23816:5;23812:16;23861:3;23852:6;23847:3;23843:16;23840:25;23837:112;;;23868:79;;:::i;:::-;23837:112;23958:41;23992:6;23987:3;23982;23958:41;:::i;:::-;23678:327;23595:410;;;;;:::o;24024:338::-;24079:5;24128:3;24121:4;24113:6;24109:17;24105:27;24095:122;;24136:79;;:::i;:::-;24095:122;24253:6;24240:20;24278:78;24352:3;24344:6;24337:4;24329:6;24325:17;24278:78;:::i;:::-;24269:87;;24085:277;24024:338;;;;:::o;24368:943::-;24463:6;24471;24479;24487;24536:3;24524:9;24515:7;24511:23;24507:33;24504:120;;;24543:79;;:::i;:::-;24504:120;24663:1;24688:53;24733:7;24724:6;24713:9;24709:22;24688:53;:::i;:::-;24678:63;;24634:117;24790:2;24816:53;24861:7;24852:6;24841:9;24837:22;24816:53;:::i;:::-;24806:63;;24761:118;24918:2;24944:53;24989:7;24980:6;24969:9;24965:22;24944:53;:::i;:::-;24934:63;;24889:118;25074:2;25063:9;25059:18;25046:32;25105:18;25097:6;25094:30;25091:117;;;25127:79;;:::i;:::-;25091:117;25232:62;25286:7;25277:6;25266:9;25262:22;25232:62;:::i;:::-;25222:72;;25017:287;24368:943;;;;;;;:::o;25389:695::-;25546:4;25541:3;25537:14;25633:4;25626:5;25622:16;25616:23;25652:63;25709:4;25704:3;25700:14;25686:12;25652:63;:::i;:::-;25561:164;25817:4;25810:5;25806:16;25800:23;25836:61;25891:4;25886:3;25882:14;25868:12;25836:61;:::i;:::-;25735:172;25991:4;25984:5;25980:16;25974:23;26010:57;26061:4;26056:3;26052:14;26038:12;26010:57;:::i;:::-;25917:160;25515:569;25389:695;;:::o;26090:342::-;26243:4;26281:2;26270:9;26266:18;26258:26;;26294:131;26422:1;26411:9;26407:17;26398:6;26294:131;:::i;:::-;26090:342;;;;:::o;26438:474::-;26506:6;26514;26563:2;26551:9;26542:7;26538:23;26534:32;26531:119;;;26569:79;;:::i;:::-;26531:119;26689:1;26714:53;26759:7;26750:6;26739:9;26735:22;26714:53;:::i;:::-;26704:63;;26660:117;26816:2;26842:53;26887:7;26878:6;26867:9;26863:22;26842:53;:::i;:::-;26832:63;;26787:118;26438:474;;;;;:::o;26918:323::-;26974:6;27023:2;27011:9;27002:7;26998:23;26994:32;26991:119;;;27029:79;;:::i;:::-;26991:119;27149:1;27174:50;27216:7;27207:6;27196:9;27192:22;27174:50;:::i;:::-;27164:60;;27120:114;26918:323;;;;:::o;27247:180::-;27295:77;27292:1;27285:88;27392:4;27389:1;27382:15;27416:4;27413:1;27406:15;27433:320;27477:6;27514:1;27508:4;27504:12;27494:22;;27561:1;27555:4;27551:12;27582:18;27572:81;;27638:4;27630:6;27626:17;27616:27;;27572:81;27700:2;27692:6;27689:14;27669:18;27666:38;27663:84;;;27719:18;;:::i;:::-;27663:84;27484:269;27433:320;;;:::o;27759:182::-;27899:34;27895:1;27887:6;27883:14;27876:58;27759:182;:::o;27947:366::-;28089:3;28110:67;28174:2;28169:3;28110:67;:::i;:::-;28103:74;;28186:93;28275:3;28186:93;:::i;:::-;28304:2;28299:3;28295:12;28288:19;;27947:366;;;:::o;28319:419::-;28485:4;28523:2;28512:9;28508:18;28500:26;;28572:9;28566:4;28562:20;28558:1;28547:9;28543:17;28536:47;28600:131;28726:4;28600:131;:::i;:::-;28592:139;;28319:419;;;:::o;28744:180::-;28792:77;28789:1;28782:88;28889:4;28886:1;28879:15;28913:4;28910:1;28903:15;28930:246;28969:3;28988:19;29005:1;28988:19;:::i;:::-;28983:24;;29021:19;29038:1;29021:19;:::i;:::-;29016:24;;29118:1;29106:10;29102:18;29099:1;29096:25;29093:51;;;29124:18;;:::i;:::-;29093:51;29168:1;29165;29161:9;29154:16;;28930:246;;;;:::o;29182:220::-;29322:34;29318:1;29310:6;29306:14;29299:58;29391:3;29386:2;29378:6;29374:15;29367:28;29182:220;:::o;29408:366::-;29550:3;29571:67;29635:2;29630:3;29571:67;:::i;:::-;29564:74;;29647:93;29736:3;29647:93;:::i;:::-;29765:2;29760:3;29756:12;29749:19;;29408:366;;;:::o;29780:419::-;29946:4;29984:2;29973:9;29969:18;29961:26;;30033:9;30027:4;30023:20;30019:1;30008:9;30004:17;29997:47;30061:131;30187:4;30061:131;:::i;:::-;30053:139;;29780:419;;;:::o;30205:348::-;30245:7;30268:20;30286:1;30268:20;:::i;:::-;30263:25;;30302:20;30320:1;30302:20;:::i;:::-;30297:25;;30490:1;30422:66;30418:74;30415:1;30412:81;30407:1;30400:9;30393:17;30389:105;30386:131;;;30497:18;;:::i;:::-;30386:131;30545:1;30542;30538:9;30527:20;;30205:348;;;;:::o;30559:180::-;30607:77;30604:1;30597:88;30704:4;30701:1;30694:15;30728:4;30725:1;30718:15;30745:185;30785:1;30802:20;30820:1;30802:20;:::i;:::-;30797:25;;30836:20;30854:1;30836:20;:::i;:::-;30831:25;;30875:1;30865:35;;30880:18;;:::i;:::-;30865:35;30922:1;30919;30915:9;30910:14;;30745:185;;;;:::o;30936:180::-;30984:77;30981:1;30974:88;31081:4;31078:1;31071:15;31105:4;31102:1;31095:15;31122:222;31262:34;31258:1;31250:6;31246:14;31239:58;31331:5;31326:2;31318:6;31314:15;31307:30;31122:222;:::o;31350:366::-;31492:3;31513:67;31577:2;31572:3;31513:67;:::i;:::-;31506:74;;31589:93;31678:3;31589:93;:::i;:::-;31707:2;31702:3;31698:12;31691:19;;31350:366;;;:::o;31722:419::-;31888:4;31926:2;31915:9;31911:18;31903:26;;31975:9;31969:4;31965:20;31961:1;31950:9;31946:17;31939:47;32003:131;32129:4;32003:131;:::i;:::-;31995:139;;31722:419;;;:::o;32147:188::-;32186:4;32206:19;32223:1;32206:19;:::i;:::-;32201:24;;32239:19;32256:1;32239:19;:::i;:::-;32234:24;;32277:1;32274;32271:8;32268:34;;;32282:18;;:::i;:::-;32268:34;32327:1;32324;32320:9;32312:17;;32147:188;;;;:::o;32341:305::-;32381:3;32400:20;32418:1;32400:20;:::i;:::-;32395:25;;32434:20;32452:1;32434:20;:::i;:::-;32429:25;;32588:1;32520:66;32516:74;32513:1;32510:81;32507:107;;;32594:18;;:::i;:::-;32507:107;32638:1;32635;32631:9;32624:16;;32341:305;;;;:::o;32652:227::-;32792:34;32788:1;32780:6;32776:14;32769:58;32861:10;32856:2;32848:6;32844:15;32837:35;32652:227;:::o;32885:366::-;33027:3;33048:67;33112:2;33107:3;33048:67;:::i;:::-;33041:74;;33124:93;33213:3;33124:93;:::i;:::-;33242:2;33237:3;33233:12;33226:19;;32885:366;;;:::o;33257:419::-;33423:4;33461:2;33450:9;33446:18;33438:26;;33510:9;33504:4;33500:20;33496:1;33485:9;33481:17;33474:47;33538:131;33664:4;33538:131;:::i;:::-;33530:139;;33257:419;;;:::o;33682:221::-;33822:34;33818:1;33810:6;33806:14;33799:58;33891:4;33886:2;33878:6;33874:15;33867:29;33682:221;:::o;33909:366::-;34051:3;34072:67;34136:2;34131:3;34072:67;:::i;:::-;34065:74;;34148:93;34237:3;34148:93;:::i;:::-;34266:2;34261:3;34257:12;34250:19;;33909:366;;;:::o;34281:419::-;34447:4;34485:2;34474:9;34470:18;34462:26;;34534:9;34528:4;34524:20;34520:1;34509:9;34505:17;34498:47;34562:131;34688:4;34562:131;:::i;:::-;34554:139;;34281:419;;;:::o;34706:222::-;34846:34;34842:1;34834:6;34830:14;34823:58;34915:5;34910:2;34902:6;34898:15;34891:30;34706:222;:::o;34934:366::-;35076:3;35097:67;35161:2;35156:3;35097:67;:::i;:::-;35090:74;;35173:93;35262:3;35173:93;:::i;:::-;35291:2;35286:3;35282:12;35275:19;;34934:366;;;:::o;35306:419::-;35472:4;35510:2;35499:9;35495:18;35487:26;;35559:9;35553:4;35549:20;35545:1;35534:9;35530:17;35523:47;35587:131;35713:4;35587:131;:::i;:::-;35579:139;;35306:419;;;:::o;35731:148::-;35833:11;35870:3;35855:18;;35731:148;;;;:::o;35885:377::-;35991:3;36019:39;36052:5;36019:39;:::i;:::-;36074:89;36156:6;36151:3;36074:89;:::i;:::-;36067:96;;36172:52;36217:6;36212:3;36205:4;36198:5;36194:16;36172:52;:::i;:::-;36249:6;36244:3;36240:16;36233:23;;35995:267;35885:377;;;;:::o;36268:114::-;;:::o;36388:400::-;36548:3;36569:84;36651:1;36646:3;36569:84;:::i;:::-;36562:91;;36662:93;36751:3;36662:93;:::i;:::-;36780:1;36775:3;36771:11;36764:18;;36388:400;;;:::o;36794:701::-;37075:3;37097:95;37188:3;37179:6;37097:95;:::i;:::-;37090:102;;37209:95;37300:3;37291:6;37209:95;:::i;:::-;37202:102;;37321:148;37465:3;37321:148;:::i;:::-;37314:155;;37486:3;37479:10;;36794:701;;;;;:::o;37501:225::-;37641:34;37637:1;37629:6;37625:14;37618:58;37710:8;37705:2;37697:6;37693:15;37686:33;37501:225;:::o;37732:366::-;37874:3;37895:67;37959:2;37954:3;37895:67;:::i;:::-;37888:74;;37971:93;38060:3;37971:93;:::i;:::-;38089:2;38084:3;38080:12;38073:19;;37732:366;;;:::o;38104:419::-;38270:4;38308:2;38297:9;38293:18;38285:26;;38357:9;38351:4;38347:20;38343:1;38332:9;38328:17;38321:47;38385:131;38511:4;38385:131;:::i;:::-;38377:139;;38104:419;;;:::o;38529:179::-;38669:31;38665:1;38657:6;38653:14;38646:55;38529:179;:::o;38714:366::-;38856:3;38877:67;38941:2;38936:3;38877:67;:::i;:::-;38870:74;;38953:93;39042:3;38953:93;:::i;:::-;39071:2;39066:3;39062:12;39055:19;;38714:366;;;:::o;39086:419::-;39252:4;39290:2;39279:9;39275:18;39267:26;;39339:9;39333:4;39329:20;39325:1;39314:9;39310:17;39303:47;39367:131;39493:4;39367:131;:::i;:::-;39359:139;;39086:419;;;:::o;39511:147::-;39612:11;39649:3;39634:18;;39511:147;;;;:::o;39664:398::-;39823:3;39844:83;39925:1;39920:3;39844:83;:::i;:::-;39837:90;;39936:93;40025:3;39936:93;:::i;:::-;40054:1;40049:3;40045:11;40038:18;;39664:398;;;:::o;40068:379::-;40252:3;40274:147;40417:3;40274:147;:::i;:::-;40267:154;;40438:3;40431:10;;40068:379;;;:::o;40453:245::-;40593:34;40589:1;40581:6;40577:14;40570:58;40662:28;40657:2;40649:6;40645:15;40638:53;40453:245;:::o;40704:366::-;40846:3;40867:67;40931:2;40926:3;40867:67;:::i;:::-;40860:74;;40943:93;41032:3;40943:93;:::i;:::-;41061:2;41056:3;41052:12;41045:19;;40704:366;;;:::o;41076:419::-;41242:4;41280:2;41269:9;41265:18;41257:26;;41329:9;41323:4;41319:20;41315:1;41304:9;41300:17;41293:47;41357:131;41483:4;41357:131;:::i;:::-;41349:139;;41076:419;;;:::o;41501:229::-;41641:34;41637:1;41629:6;41625:14;41618:58;41710:12;41705:2;41697:6;41693:15;41686:37;41501:229;:::o;41736:366::-;41878:3;41899:67;41963:2;41958:3;41899:67;:::i;:::-;41892:74;;41975:93;42064:3;41975:93;:::i;:::-;42093:2;42088:3;42084:12;42077:19;;41736:366;;;:::o;42108:419::-;42274:4;42312:2;42301:9;42297:18;42289:26;;42361:9;42355:4;42351:20;42347:1;42336:9;42332:17;42325:47;42389:131;42515:4;42389:131;:::i;:::-;42381:139;;42108:419;;;:::o;42533:175::-;42673:27;42669:1;42661:6;42657:14;42650:51;42533:175;:::o;42714:366::-;42856:3;42877:67;42941:2;42936:3;42877:67;:::i;:::-;42870:74;;42953:93;43042:3;42953:93;:::i;:::-;43071:2;43066:3;43062:12;43055:19;;42714:366;;;:::o;43086:419::-;43252:4;43290:2;43279:9;43275:18;43267:26;;43339:9;43333:4;43329:20;43325:1;43314:9;43310:17;43303:47;43367:131;43493:4;43367:131;:::i;:::-;43359:139;;43086:419;;;:::o;43511:98::-;43562:6;43596:5;43590:12;43580:22;;43511:98;;;:::o;43615:168::-;43698:11;43732:6;43727:3;43720:19;43772:4;43767:3;43763:14;43748:29;;43615:168;;;;:::o;43789:360::-;43875:3;43903:38;43935:5;43903:38;:::i;:::-;43957:70;44020:6;44015:3;43957:70;:::i;:::-;43950:77;;44036:52;44081:6;44076:3;44069:4;44062:5;44058:16;44036:52;:::i;:::-;44113:29;44135:6;44113:29;:::i;:::-;44108:3;44104:39;44097:46;;43879:270;43789:360;;;;:::o;44155:640::-;44350:4;44388:3;44377:9;44373:19;44365:27;;44402:71;44470:1;44459:9;44455:17;44446:6;44402:71;:::i;:::-;44483:72;44551:2;44540:9;44536:18;44527:6;44483:72;:::i;:::-;44565;44633:2;44622:9;44618:18;44609:6;44565:72;:::i;:::-;44684:9;44678:4;44674:20;44669:2;44658:9;44654:18;44647:48;44712:76;44783:4;44774:6;44712:76;:::i;:::-;44704:84;;44155:640;;;;;;;:::o;44801:141::-;44857:5;44888:6;44882:13;44873:22;;44904:32;44930:5;44904:32;:::i;:::-;44801:141;;;;:::o;44948:349::-;45017:6;45066:2;45054:9;45045:7;45041:23;45037:32;45034:119;;;45072:79;;:::i;:::-;45034:119;45192:1;45217:63;45272:7;45263:6;45252:9;45248:22;45217:63;:::i;:::-;45207:73;;45163:127;44948:349;;;;:::o;45303:233::-;45342:3;45365:24;45383:5;45365:24;:::i;:::-;45356:33;;45411:66;45404:5;45401:77;45398:103;;;45481:18;;:::i;:::-;45398:103;45528:1;45521:5;45517:13;45510:20;;45303:233;;;:::o;45542:191::-;45582:4;45602:20;45620:1;45602:20;:::i;:::-;45597:25;;45636:20;45654:1;45636:20;:::i;:::-;45631:25;;45675:1;45672;45669:8;45666:34;;;45680:18;;:::i;:::-;45666:34;45725:1;45722;45718:9;45710:17;;45542:191;;;;:::o;45739:176::-;45771:1;45788:20;45806:1;45788:20;:::i;:::-;45783:25;;45822:20;45840:1;45822:20;:::i;:::-;45817:25;;45861:1;45851:35;;45866:18;;:::i;:::-;45851:35;45907:1;45904;45900:9;45895:14;;45739:176;;;;:::o
Swarm Source
ipfs://826529a45d52ad0f891b6f12e77718510b8cad644f1d7bab65866316b4988613
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.