Feature Tip: Add private address tag to any address under My Name Tag !
Note: This token's displayed name does not match its contract's Name function.
ERC-721
NFT
Overview
Max Total Supply
10,000 TEST
Holders
4,536
Market
Volume (24H)
2.594 ETH
Min Price (24H)
$3,981.88 @ 1.255000 ETH
Max Price (24H)
$4,248.39 @ 1.339000 ETH
Other Info
Token Contract
Balance
0 TESTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Remilia
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-11 */ // SPDX-License-Identifier: MIT // 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); } } // Archetype v0.2.0 // ERC721A Contracts v4.2.2 // Creator: Chiru Labs // ERC721A Contracts v4.2.2 // Creator: Chiru Labs /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev 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); } } // OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol) /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } //import "hardhat/console.sol"; error InvalidConfig(); error MintNotYetStarted(); error WalletUnauthorizedToMint(); error InsufficientEthSent(); error ExcessiveEthSent(); error MaxSupplyExceeded(); error NumberOfMintsExceeded(); error MintingPaused(); error InvalidReferral(); error InvalidSignature(); error BalanceEmpty(); error TransferFailed(); error MaxBatchSizeExceeded(); error WrongPassword(); error LockedForever(); contract Remilia is ERC721A, Ownable { // // EVENTS // event Invited(bytes32 indexed key, bytes32 indexed cid); event Referral(address indexed affiliate, uint128 wad); event Withdrawal(address indexed src, uint128 wad); // // STRUCTS // struct Auth { bytes32 key; bytes32[] proof; } struct Config { string unrevealedUri; string baseUri; address affiliateSigner; uint32 maxSupply; uint32 maxBatchSize; uint32 affiliateFee; uint32 platformFee; } struct Invite { uint128 price; uint64 start; uint64 limit; } struct Invitelist { bytes32 key; bytes32 cid; Invite invite; } struct OwnerBalance { uint128 owner; uint128 platform; } // // VARIABLES // mapping(bytes32 => Invite) public invites; mapping(address => mapping(bytes32 => uint256)) private minted; mapping(address => uint128) public affiliateBalance; address private constant PLATFORM = 0x86B82972282Dd22348374bC63fd21620F7ED847B; // address private constant PLATFORM = 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC; // TEST (account[2]) bool public revealed; bool public uriUnlocked; string public provenance; bool public provenanceHashUnlocked; OwnerBalance public ownerBalance; Config public config; // // METHODS // constructor( ) ERC721A("TEST NFT", "TEST") { config.baseUri = ""; config.affiliateSigner = 0x1f285dD528cf4cDE3081C6d48D9df7A4F8FA9383; config.maxSupply = 10000; config.maxBatchSize = 1000; config.affiliateFee = 1500; config.platformFee = 500; /* // affiliateFee max is 50%, platformFee min is 5% and max is 50% if (config_.affiliateFee > 5000 || config_.platformFee > 5000 || config_.platformFee < 500) { revert InvalidConfig(); } config = config_;*/ revealed = false; uriUnlocked = true; provenanceHashUnlocked = true; } function mint( Auth calldata auth, uint256 quantity, address affiliate, bytes calldata signature ) external payable { Invite memory i = invites[auth.key]; if (affiliate != address(0)) { if (affiliate == PLATFORM || affiliate == owner() || affiliate == msg.sender) { revert InvalidReferral(); } validateAffiliate(affiliate, signature, config.affiliateSigner); } if (i.limit == 0) { revert MintingPaused(); } if (!verify(auth, _msgSender())) { revert WalletUnauthorizedToMint(); } if (block.timestamp < i.start) { revert MintNotYetStarted(); } if (i.limit < config.maxSupply) { uint256 totalAfterMint = minted[_msgSender()][auth.key] + quantity; if (totalAfterMint > i.limit) { revert NumberOfMintsExceeded(); } } if (quantity > config.maxBatchSize) { revert MaxBatchSizeExceeded(); } if ((_totalMinted() + quantity) > config.maxSupply) { revert MaxSupplyExceeded(); } uint256 cost = computePrice(i.price, quantity); if (msg.value < cost) { revert InsufficientEthSent(); } if (msg.value > cost) { revert ExcessiveEthSent(); } _safeMint(msg.sender, quantity); if (i.limit < config.maxSupply) { minted[_msgSender()][auth.key] += quantity; } uint128 value = uint128(msg.value); uint128 affiliateWad = 0; if (affiliate != address(0)) { affiliateWad = (value * config.affiliateFee) / 10000; affiliateBalance[affiliate] += affiliateWad; emit Referral(affiliate, affiliateWad); } OwnerBalance memory balance = ownerBalance; uint128 platformWad = (value * config.platformFee) / 10000; uint128 ownerWad = value - affiliateWad - platformWad; ownerBalance = OwnerBalance({ owner: balance.owner + ownerWad, platform: balance.platform + platformWad }); } function computePrice(uint128 price, uint256 numTokens) public pure returns (uint256){ // 5+ = 4% off // 10+ = 10% off // 30+ = 13.33% off // 100+ = 20% off uint256 cost = price * numTokens; if (numTokens >= 100) { return cost * 8 / 10; } else if (numTokens >= 30) { return cost * 8667 / 10000; } else if (numTokens >= 10) { return cost * 9 / 10; } else if (numTokens >= 5) { return cost * 96 / 100; } else { return cost; } } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); if (revealed == false) { return string(abi.encodePacked(config.unrevealedUri, Strings.toString(tokenId))); } return bytes(config.baseUri).length != 0 ? string(abi.encodePacked(config.baseUri, Strings.toString(tokenId))) : ""; } function reveal() public onlyOwner { revealed = true; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } /// @notice the password is "forever" function lockURI(string memory password) public onlyOwner { if (keccak256(abi.encodePacked(password)) != keccak256(abi.encodePacked("forever"))) { revert WrongPassword(); } uriUnlocked = false; } function setUnrevealedURI(string memory _unrevealedURI) public onlyOwner { config.unrevealedUri = _unrevealedURI; } function setBaseURI(string memory baseUri_) public onlyOwner { if (!uriUnlocked) { revert LockedForever(); } config.baseUri = baseUri_; } /// @notice Set BAYC-style provenance once it's calculated function setProvenanceHash(string memory provenanceHash) public onlyOwner { if (!provenanceHashUnlocked) { revert LockedForever(); } provenance = provenanceHash; } /// @notice the password is "forever" function lockProvenanceHash(string memory password) public onlyOwner { if (keccak256(abi.encodePacked(password)) != keccak256(abi.encodePacked("forever"))) { revert WrongPassword(); } provenanceHashUnlocked = false; } function withdraw() public { uint128 wad = 0; if (msg.sender == owner() || msg.sender == PLATFORM) { OwnerBalance memory balance = ownerBalance; if (msg.sender == owner()) { wad = balance.owner; ownerBalance = OwnerBalance({ owner: 0, platform: balance.platform }); } else { wad = balance.platform; ownerBalance = OwnerBalance({ owner: balance.owner, platform: 0 }); } } else { wad = affiliateBalance[msg.sender]; affiliateBalance[msg.sender] = 0; } if (wad == 0) { revert BalanceEmpty(); } (bool success, ) = msg.sender.call{ value: wad }(""); if (!success) { revert TransferFailed(); } emit Withdrawal(msg.sender, wad); } function setInvites(Invitelist[] calldata invitelist) external onlyOwner { for (uint256 i = 0; i < invitelist.length; i++) { Invitelist calldata list = invitelist[i]; invites[list.key] = list.invite; emit Invited(list.key, list.cid); } } function setInvite( bytes32 _key, bytes32 _cid, Invite calldata _invite ) external onlyOwner { invites[_key] = _invite; emit Invited(_key, _cid); } // based on: https://github.com/miguelmota/merkletreejs-solidity/blob/master/contracts/MerkleProof.sol function verify(Auth calldata auth, address account) internal pure returns (bool) { if (auth.key == "") return true; bytes32 computedHash = keccak256(abi.encodePacked(account)); for (uint256 i = 0; i < auth.proof.length; i++) { bytes32 proofElement = auth.proof[i]; if (computedHash <= proofElement) { computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash == auth.key; } function validateAffiliate( address affiliate, bytes memory signature, address affiliateSigner ) internal view { //console.log("affiliate"); //console.log(affiliate); bytes32 signedMessagehash = ECDSA.toEthSignedMessageHash( keccak256(abi.encodePacked(affiliate)) ); address signer = ECDSA.recover(signedMessagehash, signature); //console.log("affiliateSigner"); //console.log(affiliateSigner); //console.log("signer"); //console.log(signer); if (signer != affiliateSigner) { revert InvalidSignature(); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceEmpty","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"ExcessiveEthSent","type":"error"},{"inputs":[],"name":"InsufficientEthSent","type":"error"},{"inputs":[],"name":"InvalidReferral","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"LockedForever","type":"error"},{"inputs":[],"name":"MaxBatchSizeExceeded","type":"error"},{"inputs":[],"name":"MaxSupplyExceeded","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintNotYetStarted","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintingPaused","type":"error"},{"inputs":[],"name":"NumberOfMintsExceeded","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WalletUnauthorizedToMint","type":"error"},{"inputs":[],"name":"WrongPassword","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"cid","type":"bytes32"}],"name":"Invited","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":"affiliate","type":"address"},{"indexed":false,"internalType":"uint128","name":"wad","type":"uint128"}],"name":"Referral","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":false,"internalType":"uint128","name":"wad","type":"uint128"}],"name":"Withdrawal","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"affiliateBalance","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"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":"uint128","name":"price","type":"uint128"},{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"computePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"string","name":"unrevealedUri","type":"string"},{"internalType":"string","name":"baseUri","type":"string"},{"internalType":"address","name":"affiliateSigner","type":"address"},{"internalType":"uint32","name":"maxSupply","type":"uint32"},{"internalType":"uint32","name":"maxBatchSize","type":"uint32"},{"internalType":"uint32","name":"affiliateFee","type":"uint32"},{"internalType":"uint32","name":"platformFee","type":"uint32"}],"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":"bytes32","name":"","type":"bytes32"}],"name":"invites","outputs":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"limit","type":"uint64"}],"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":"string","name":"password","type":"string"}],"name":"lockProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"password","type":"string"}],"name":"lockURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"internalType":"struct Remilia.Auth","name":"auth","type":"tuple"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"affiliate","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"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":[],"name":"ownerBalance","outputs":[{"internalType":"uint128","name":"owner","type":"uint128"},{"internalType":"uint128","name":"platform","type":"uint128"}],"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":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHashUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_key","type":"bytes32"},{"internalType":"bytes32","name":"_cid","type":"bytes32"},{"components":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"limit","type":"uint64"}],"internalType":"struct Remilia.Invite","name":"_invite","type":"tuple"}],"name":"setInvite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"bytes32","name":"cid","type":"bytes32"},{"components":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"limit","type":"uint64"}],"internalType":"struct Remilia.Invite","name":"invite","type":"tuple"}],"internalType":"struct Remilia.Invitelist[]","name":"invitelist","type":"tuple[]"}],"name":"setInvites","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_unrevealedURI","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600881526020017f54455354204e46540000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f544553540000000000000000000000000000000000000000000000000000000081525081600290816200008f919062000596565b508060039081620000a1919062000596565b50620000b26200024560201b60201c565b6000819055505050620000da620000ce6200024e60201b60201c565b6200025660201b60201c565b6040518060200160405280600081525060106001019081620000fd919062000596565b50731f285dd528cf4cde3081c6d48d9df7a4f8fa9383601060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612710601060020160146101000a81548163ffffffff021916908363ffffffff1602179055506103e8601060020160186101000a81548163ffffffff021916908363ffffffff1602179055506105dc6010600201601c6101000a81548163ffffffff021916908363ffffffff1602179055506101f4601060030160006101000a81548163ffffffff021916908363ffffffff1602179055506000600c60006101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff0219169083151502179055506001600e60006101000a81548160ff0219169083151502179055506200067d565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200039e57607f821691505b602082108103620003b457620003b362000356565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200041e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003df565b6200042a8683620003df565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000477620004716200046b8462000442565b6200044c565b62000442565b9050919050565b6000819050919050565b620004938362000456565b620004ab620004a2826200047e565b848454620003ec565b825550505050565b600090565b620004c2620004b3565b620004cf81848462000488565b505050565b5b81811015620004f757620004eb600082620004b8565b600181019050620004d5565b5050565b601f82111562000546576200051081620003ba565b6200051b84620003cf565b810160208510156200052b578190505b620005436200053a85620003cf565b830182620004d4565b50505b505050565b600082821c905092915050565b60006200056b600019846008026200054b565b1980831691505092915050565b600062000586838362000558565b9150826002028217905092915050565b620005a1826200031c565b67ffffffffffffffff811115620005bd57620005bc62000327565b5b620005c9825462000385565b620005d6828285620004fb565b600060209050601f8311600181146200060e5760008415620005f9578287015190505b62000605858262000578565b86555062000675565b601f1984166200061e86620003ba565b60005b82811015620006485784890151825560018201915060208501945060208101905062000621565b8683101562000668578489015162000664601f89168262000558565b8355505b6001600288020188555050505b505050505050565b6157cc806200068d6000396000f3fe60806040526004361061020f5760003560e01c8063715018a611610118578063b88d4fde116100a0578063e072e16d1161006f578063e072e16d14610783578063e4963dd5146107ae578063e985e9c5146107d7578063f2fde38b14610814578063fe2c7fee1461083d5761020f565b8063b88d4fde146106c8578063bedcf003146106f1578063c87b56dd1461071d578063de6cd0db1461075a5761020f565b8063978a4509116100e7578063978a4509146105e3578063a15947c414610620578063a22cb46514610649578063a475b5dd14610672578063a5aa4aa4146106895761020f565b8063715018a61461054557806379502c551461055c5780638da5cb5b1461058d57806395d89b41146105b85761020f565b80633ccfd60b1161019b57806355f804b31161016a57806355f804b31461043c5780636352211e14610465578063690ed4d3146104a25780636f5ba15a146104df57806370a08231146105085761020f565b80633ccfd60b146103b557806342842e0e146103cc5780634a21a2df146103f557806351830227146104115761020f565b80630f7309e8116101e25780630f7309e8146102e2578063109695231461030d57806318160ddd1461033657806323b872dd146103615780632cb020e51461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613d14565b610866565b6040516102489190613d5c565b60405180910390f35b34801561025d57600080fd5b506102666108f8565b6040516102739190613e07565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613e5f565b61098a565b6040516102b09190613ecd565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613f14565b610a09565b005b3480156102ee57600080fd5b506102f7610b4d565b6040516103049190613e07565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190614089565b610bdb565b005b34801561034257600080fd5b5061034b610cb0565b60405161035891906140e1565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906140fc565b610cc7565b005b34801561039657600080fd5b5061039f610fe9565b6040516103ac9190613d5c565b60405180910390f35b3480156103c157600080fd5b506103ca610ffc565b005b3480156103d857600080fd5b506103f360048036038101906103ee91906140fc565b611527565b005b61040f600480360381019061040a91906141d3565b611547565b005b34801561041d57600080fd5b50610426611e9d565b6040516104339190613d5c565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e9190614089565b611eb0565b005b34801561047157600080fd5b5061048c60048036038101906104879190613e5f565b611f88565b6040516104999190613ecd565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c491906142bf565b611f9a565b6040516104d691906140e1565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190614355565b61206e565b005b34801561051457600080fd5b5061052f600480360381019061052a91906143a2565b61218d565b60405161053c91906140e1565b60405180910390f35b34801561055157600080fd5b5061055a612245565b005b34801561056857600080fd5b506105716122cd565b60405161058497969594939291906143ee565b60405180910390f35b34801561059957600080fd5b506105a261246d565b6040516105af9190613ecd565b60405180910390f35b3480156105c457600080fd5b506105cd612497565b6040516105da9190613e07565b60405180910390f35b3480156105ef57600080fd5b5061060a600480360381019061060591906143a2565b612529565b604051610617919061447a565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190614089565b612558565b005b34801561065557600080fd5b50610670600480360381019061066b91906144c1565b612675565b005b34801561067e57600080fd5b506106876127ec565b005b34801561069557600080fd5b506106b060048036038101906106ab9190614537565b612885565b6040516106bf93929190614587565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea919061465f565b6128f3565b005b3480156106fd57600080fd5b50610706612966565b6040516107149291906146e2565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f9190613e5f565b6129b0565b6040516107519190613e07565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190614089565b612aa6565b005b34801561078f57600080fd5b50610798612bc3565b6040516107a59190613d5c565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d0919061472a565b612bd6565b005b3480156107e357600080fd5b506107fe60048036038101906107f9919061477d565b612ca8565b60405161080b9190613d5c565b60405180910390f35b34801561082057600080fd5b5061083b600480360381019061083691906143a2565b612d3c565b005b34801561084957600080fd5b50610864600480360381019061085f9190614089565b612e33565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108f15750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610907906147ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610933906147ec565b80156109805780601f1061095557610100808354040283529160200191610980565b820191906000526020600020905b81548152906001019060200180831161096357829003601f168201915b5050505050905090565b600061099582612ec5565b6109cb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a1482611f88565b90508073ffffffffffffffffffffffffffffffffffffffff16610a35612f24565b73ffffffffffffffffffffffffffffffffffffffff1614610a9857610a6181610a5c612f24565b612ca8565b610a97576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600d8054610b5a906147ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610b86906147ec565b8015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b505050505081565b610be3612f2c565b73ffffffffffffffffffffffffffffffffffffffff16610c0161246d565b73ffffffffffffffffffffffffffffffffffffffff1614610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e90614869565b60405180910390fd5b600e60009054906101000a900460ff16610c9d576040517f249fab5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d9081610cac9190614a35565b5050565b6000610cba612f34565b6001546000540303905090565b6000610cd282612f3d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d39576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d4584613009565b91509150610d5b8187610d56612f24565b613030565b610da757610d7086610d6b612f24565b612ca8565b610da6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e0d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1a8686866001613074565b8015610e2557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ef385610ecf88888761307a565b7c0200000000000000000000000000000000000000000000000000000000176130a2565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f795760006001850190506000600460008381526020019081526020016000205403610f77576000548114610f76578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fe186868660016130cd565b505050505050565b600e60009054906101000a900460ff1681565b600061100661246d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061107e57507386b82972282dd22348374bc63fd21620f7ed847b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156112fe576000600f6040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905061113061246d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361122f5780600001519150604051806040016040528060006fffffffffffffffffffffffffffffffff16815260200182602001516fffffffffffffffffffffffffffffffff16815250600f60008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050506112f8565b80602001519150604051806040016040528082600001516fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815250600f60008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050505b506113d4565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046fffffffffffffffffffffffffffffffff1690506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505b6000816fffffffffffffffffffffffffffffffff1603611420576040517f8735c8fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1660405161145890614b38565b60006040518083038185875af1925050503d8060008114611495576040519150601f19603f3d011682016040523d82523d6000602084013e61149a565b606091505b50509050806114d5576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f8bb044d1bb6a7b421504ef7f7045b22152b504f683e8c1bcbc8222af46cb68b38360405161151b919061447a565b60405180910390a25050565b611542838383604051806020016040528060008152506128f3565b505050565b600060096000876000013581526020019081526020016000206040518060600160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146117b1577386b82972282dd22348374bc63fd21620f7ed847b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806116cf57506116a061246d565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8061170557503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b1561173c576040517f233067ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117b08484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050601060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166130d3565b5b6000816040015167ffffffffffffffff16036117f9576040517feb56075600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180a86611805612f2c565b613180565b611840576040517fd838648f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806020015167ffffffffffffffff16421015611888576040517f1d23a74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601060020160149054906101000a900463ffffffff1663ffffffff16816040015167ffffffffffffffff16101561196e57600085600a60006118c8612f2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089600001358152602001908152602001600020546119229190614b7c565b9050816040015167ffffffffffffffff1681111561196c576040517f15fcbc9d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b601060020160189054906101000a900463ffffffff1663ffffffff168511156119c3576040517f7a7e96df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601060020160149054906101000a900463ffffffff1663ffffffff16856119e8613292565b6119f29190614b7c565b1115611a2a576040517f8a164f6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a3a826000015187611f9a565b905080341015611a76576040517ff244866f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80341115611ab0576040517f6c9089c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aba33876132a5565b601060020160149054906101000a900463ffffffff1663ffffffff16826040015167ffffffffffffffff161015611b5e5785600a6000611af8612f2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000896000013581526020019081526020016000206000828254611b569190614b7c565b925050819055505b600034905060008073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611cbd576127106010600201601c9054906101000a900463ffffffff1663ffffffff1683611bc29190614bb0565b611bcc9190614c29565b905080600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a90046fffffffffffffffffffffffffffffffff16611c389190614c5a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508673ffffffffffffffffffffffffffffffffffffffff167f5e627b23e8981317689f5541931b5e9805545e7601aa2c86e84217555368dc0382604051611cb4919061447a565b60405180910390a25b6000600f6040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000612710601060030160009054906101000a900463ffffffff1663ffffffff1685611d8e9190614bb0565b611d989190614c29565b90506000818486611da99190614c9e565b611db39190614c9e565b90506040518060400160405280828560000151611dd09190614c5a565b6fffffffffffffffffffffffffffffffff168152602001838560200151611df79190614c5a565b6fffffffffffffffffffffffffffffffff16815250600f60008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550905050505050505050505050505050565b600c60009054906101000a900460ff1681565b611eb8612f2c565b73ffffffffffffffffffffffffffffffffffffffff16611ed661246d565b73ffffffffffffffffffffffffffffffffffffffff1614611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2390614869565b60405180910390fd5b600c60019054906101000a900460ff16611f72576040517f249fab5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060106001019081611f849190614a35565b5050565b6000611f9382612f3d565b9050919050565b60008082846fffffffffffffffffffffffffffffffff16611fbb9190614ce2565b905060648310611fe657600a600882611fd49190614ce2565b611fde9190614d3c565b915050612068565b601e8310612011576127106121db82611fff9190614ce2565b6120099190614d3c565b915050612068565b600a831061203a57600a6009826120289190614ce2565b6120329190614d3c565b915050612068565b600583106120635760646060826120519190614ce2565b61205b9190614d3c565b915050612068565b809150505b92915050565b612076612f2c565b73ffffffffffffffffffffffffffffffffffffffff1661209461246d565b73ffffffffffffffffffffffffffffffffffffffff16146120ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e190614869565b60405180910390fd5b60005b82829050811015612188573683838381811061210c5761210b614d6d565b5b905060a002019050806040016009600083600001358152602001908152602001600020818161213b9190614fdc565b905050806020013581600001357fe9a0c17645ed78ccc9996259f00297ffc75e6b9d22cd605ccc9992cc8ca3f4c160405160405180910390a350808061218090614fea565b9150506120ed565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121f4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61224d612f2c565b73ffffffffffffffffffffffffffffffffffffffff1661226b61246d565b73ffffffffffffffffffffffffffffffffffffffff16146122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b890614869565b60405180910390fd5b6122cb60006132c3565b565b60108060000180546122de906147ec565b80601f016020809104026020016040519081016040528092919081815260200182805461230a906147ec565b80156123575780601f1061232c57610100808354040283529160200191612357565b820191906000526020600020905b81548152906001019060200180831161233a57829003601f168201915b50505050509080600101805461236c906147ec565b80601f0160208091040260200160405190810160405280929190818152602001828054612398906147ec565b80156123e55780601f106123ba576101008083540402835291602001916123e5565b820191906000526020600020905b8154815290600101906020018083116123c857829003601f168201915b5050505050908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160149054906101000a900463ffffffff16908060020160189054906101000a900463ffffffff169080600201601c9054906101000a900463ffffffff16908060030160009054906101000a900463ffffffff16905087565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546124a6906147ec565b80601f01602080910402602001604051908101604052809291908181526020018280546124d2906147ec565b801561251f5780601f106124f45761010080835404028352916020019161251f565b820191906000526020600020905b81548152906001019060200180831161250257829003601f168201915b5050505050905090565b600b6020528060005260406000206000915054906101000a90046fffffffffffffffffffffffffffffffff1681565b612560612f2c565b73ffffffffffffffffffffffffffffffffffffffff1661257e61246d565b73ffffffffffffffffffffffffffffffffffffffff16146125d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cb90614869565b60405180910390fd5b6040516020016125e390615089565b604051602081830303815290604052805190602001208160405160200161260a91906150cf565b6040516020818303038152906040528051906020012014612657576040517f5ee88f9700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600e60006101000a81548160ff02191690831515021790555050565b61267d612f24565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126e1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006126ee612f24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661279b612f24565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127e09190613d5c565b60405180910390a35050565b6127f4612f2c565b73ffffffffffffffffffffffffffffffffffffffff1661281261246d565b73ffffffffffffffffffffffffffffffffffffffff1614612868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285f90614869565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b60096020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16908060000160189054906101000a900467ffffffffffffffff16905083565b6128fe848484610cc7565b60008373ffffffffffffffffffffffffffffffffffffffff163b146129605761292984848484613389565b61295f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f8060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b60606129bb82612ec5565b6129f1576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600c60009054906101000a900460ff16151503612a41576010600001612a1a836134d9565b604051602001612a2b929190615169565b6040516020818303038152906040529050612aa1565b600060106001018054612a53906147ec565b905003612a6f5760405180602001604052806000815250612a9e565b6010600101612a7d836134d9565b604051602001612a8e929190615169565b6040516020818303038152906040525b90505b919050565b612aae612f2c565b73ffffffffffffffffffffffffffffffffffffffff16612acc61246d565b73ffffffffffffffffffffffffffffffffffffffff1614612b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1990614869565b60405180910390fd5b604051602001612b3190615089565b6040516020818303038152906040528051906020012081604051602001612b5891906150cf565b6040516020818303038152906040528051906020012014612ba5576040517f5ee88f9700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600c60016101000a81548160ff02191690831515021790555050565b600c60019054906101000a900460ff1681565b612bde612f2c565b73ffffffffffffffffffffffffffffffffffffffff16612bfc61246d565b73ffffffffffffffffffffffffffffffffffffffff1614612c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4990614869565b60405180910390fd5b80600960008581526020019081526020016000208181612c729190614fdc565b90505081837fe9a0c17645ed78ccc9996259f00297ffc75e6b9d22cd605ccc9992cc8ca3f4c160405160405180910390a3505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612d44612f2c565b73ffffffffffffffffffffffffffffffffffffffff16612d6261246d565b73ffffffffffffffffffffffffffffffffffffffff1614612db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612daf90614869565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1e906151ff565b60405180910390fd5b612e30816132c3565b50565b612e3b612f2c565b73ffffffffffffffffffffffffffffffffffffffff16612e5961246d565b73ffffffffffffffffffffffffffffffffffffffff1614612eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea690614869565b60405180910390fd5b8060106000019081612ec19190614a35565b5050565b600081612ed0612f34565b11158015612edf575060005482105b8015612f1d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b60006001905090565b60008082905080612f4c612f34565b11612fd257600054811015612fd15760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612fcf575b60008103612fc5576004600083600190039350838152602001908152602001600020549050612f9b565b8092505050613004565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613091868684613639565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000613104846040516020016130e99190615267565b60405160208183030381529060405280519060200120613642565b905060006131128285613672565b90508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613179576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600080836000013503613196576001905061328c565b6000826040516020016131a99190615267565b60405160208183030381529060405280519060200120905060005b8480602001906131d49190615291565b90508110156132805760008580602001906131ef9190615291565b83818110613200576131ff614d6d565b5b905060200201359050808311613240578281604051602001613223929190615315565b60405160208183030381529060405280519060200120925061326c565b8083604051602001613253929190615315565b6040516020818303038152906040528051906020012092505b50808061327890614fea565b9150506131c4565b50836000013581149150505b92915050565b600061329c612f34565b60005403905090565b6132bf828260405180602001604052806000815250613699565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133af612f24565b8786866040518563ffffffff1660e01b81526004016133d19493929190615396565b6020604051808303816000875af192505050801561340d57506040513d601f19601f8201168201806040525081019061340a91906153f7565b60015b613486573d806000811461343d576040519150601f19603f3d011682016040523d82523d6000602084013e613442565b606091505b50600081510361347e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203613520576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613634565b600082905060005b6000821461355257808061353b90614fea565b915050600a8261354b9190614d3c565b9150613528565b60008167ffffffffffffffff81111561356e5761356d613f5e565b5b6040519080825280601f01601f1916602001820160405280156135a05781602001600182028036833780820191505090505b5090505b6000851461362d576001826135b99190615424565b9150600a856135c89190615458565b60306135d49190614b7c565b60f81b8183815181106135ea576135e9614d6d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136269190614d3c565b94506135a4565b8093505050505b919050565b60009392505050565b60008160405160200161365591906154d5565b604051602081830303815290604052805190602001209050919050565b60008060006136818585613736565b9150915061368e816137b7565b819250505092915050565b6136a38383613983565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461373157600080549050600083820390505b6136e36000868380600101945086613389565b613719576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106136d057816000541461372e57600080fd5b50505b505050565b60008060418351036137775760008060006020860151925060408601519150606086015160001a905061376b87828585613b3e565b945094505050506137b0565b60408351036137a757600080602085015191506040850151905061379c868383613c4a565b9350935050506137b0565b60006002915091505b9250929050565b600060048111156137cb576137ca6154fb565b5b8160048111156137de576137dd6154fb565b5b031561398057600160048111156137f8576137f76154fb565b5b81600481111561380b5761380a6154fb565b5b0361384b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384290615576565b60405180910390fd5b6002600481111561385f5761385e6154fb565b5b816004811115613872576138716154fb565b5b036138b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138a9906155e2565b60405180910390fd5b600360048111156138c6576138c56154fb565b5b8160048111156138d9576138d86154fb565b5b03613919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391090615674565b60405180910390fd5b60048081111561392c5761392b6154fb565b5b81600481111561393f5761393e6154fb565b5b0361397f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397690615706565b60405180910390fd5b5b50565b600080549050600082036139c3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139d06000848385613074565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613a4783613a38600086600061307a565b613a4185613c98565b176130a2565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613ae857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613aad565b5060008203613b23576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613b3960008483856130cd565b505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613b79576000600391509150613c41565b601b8560ff1614158015613b915750601c8560ff1614155b15613ba3576000600491509150613c41565b600060018787878760405160008152602001604052604051613bc89493929190615751565b6020604051602081039080840390855afa158015613bea573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613c3857600060019250925050613c41565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613c8a87828885613b3e565b935093505050935093915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cf181613cbc565b8114613cfc57600080fd5b50565b600081359050613d0e81613ce8565b92915050565b600060208284031215613d2a57613d29613cb2565b5b6000613d3884828501613cff565b91505092915050565b60008115159050919050565b613d5681613d41565b82525050565b6000602082019050613d716000830184613d4d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613db1578082015181840152602081019050613d96565b60008484015250505050565b6000601f19601f8301169050919050565b6000613dd982613d77565b613de38185613d82565b9350613df3818560208601613d93565b613dfc81613dbd565b840191505092915050565b60006020820190508181036000830152613e218184613dce565b905092915050565b6000819050919050565b613e3c81613e29565b8114613e4757600080fd5b50565b600081359050613e5981613e33565b92915050565b600060208284031215613e7557613e74613cb2565b5b6000613e8384828501613e4a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613eb782613e8c565b9050919050565b613ec781613eac565b82525050565b6000602082019050613ee26000830184613ebe565b92915050565b613ef181613eac565b8114613efc57600080fd5b50565b600081359050613f0e81613ee8565b92915050565b60008060408385031215613f2b57613f2a613cb2565b5b6000613f3985828601613eff565b9250506020613f4a85828601613e4a565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f9682613dbd565b810181811067ffffffffffffffff82111715613fb557613fb4613f5e565b5b80604052505050565b6000613fc8613ca8565b9050613fd48282613f8d565b919050565b600067ffffffffffffffff821115613ff457613ff3613f5e565b5b613ffd82613dbd565b9050602081019050919050565b82818337600083830152505050565b600061402c61402784613fd9565b613fbe565b90508281526020810184848401111561404857614047613f59565b5b61405384828561400a565b509392505050565b600082601f8301126140705761406f613f54565b5b8135614080848260208601614019565b91505092915050565b60006020828403121561409f5761409e613cb2565b5b600082013567ffffffffffffffff8111156140bd576140bc613cb7565b5b6140c98482850161405b565b91505092915050565b6140db81613e29565b82525050565b60006020820190506140f660008301846140d2565b92915050565b60008060006060848603121561411557614114613cb2565b5b600061412386828701613eff565b935050602061413486828701613eff565b925050604061414586828701613e4a565b9150509250925092565b600080fd5b60006040828403121561416a5761416961414f565b5b81905092915050565b600080fd5b600080fd5b60008083601f84011261419357614192613f54565b5b8235905067ffffffffffffffff8111156141b0576141af614173565b5b6020830191508360018202830111156141cc576141cb614178565b5b9250929050565b6000806000806000608086880312156141ef576141ee613cb2565b5b600086013567ffffffffffffffff81111561420d5761420c613cb7565b5b61421988828901614154565b955050602061422a88828901613e4a565b945050604061423b88828901613eff565b935050606086013567ffffffffffffffff81111561425c5761425b613cb7565b5b6142688882890161417d565b92509250509295509295909350565b60006fffffffffffffffffffffffffffffffff82169050919050565b61429c81614277565b81146142a757600080fd5b50565b6000813590506142b981614293565b92915050565b600080604083850312156142d6576142d5613cb2565b5b60006142e4858286016142aa565b92505060206142f585828601613e4a565b9150509250929050565b60008083601f84011261431557614314613f54565b5b8235905067ffffffffffffffff81111561433257614331614173565b5b6020830191508360a082028301111561434e5761434d614178565b5b9250929050565b6000806020838503121561436c5761436b613cb2565b5b600083013567ffffffffffffffff81111561438a57614389613cb7565b5b614396858286016142ff565b92509250509250929050565b6000602082840312156143b8576143b7613cb2565b5b60006143c684828501613eff565b91505092915050565b600063ffffffff82169050919050565b6143e8816143cf565b82525050565b600060e0820190508181036000830152614408818a613dce565b9050818103602083015261441c8189613dce565b905061442b6040830188613ebe565b61443860608301876143df565b61444560808301866143df565b61445260a08301856143df565b61445f60c08301846143df565b98975050505050505050565b61447481614277565b82525050565b600060208201905061448f600083018461446b565b92915050565b61449e81613d41565b81146144a957600080fd5b50565b6000813590506144bb81614495565b92915050565b600080604083850312156144d8576144d7613cb2565b5b60006144e685828601613eff565b92505060206144f7858286016144ac565b9150509250929050565b6000819050919050565b61451481614501565b811461451f57600080fd5b50565b6000813590506145318161450b565b92915050565b60006020828403121561454d5761454c613cb2565b5b600061455b84828501614522565b91505092915050565b600067ffffffffffffffff82169050919050565b61458181614564565b82525050565b600060608201905061459c600083018661446b565b6145a96020830185614578565b6145b66040830184614578565b949350505050565b600067ffffffffffffffff8211156145d9576145d8613f5e565b5b6145e282613dbd565b9050602081019050919050565b60006146026145fd846145be565b613fbe565b90508281526020810184848401111561461e5761461d613f59565b5b61462984828561400a565b509392505050565b600082601f83011261464657614645613f54565b5b81356146568482602086016145ef565b91505092915050565b6000806000806080858703121561467957614678613cb2565b5b600061468787828801613eff565b945050602061469887828801613eff565b93505060406146a987828801613e4a565b925050606085013567ffffffffffffffff8111156146ca576146c9613cb7565b5b6146d687828801614631565b91505092959194509250565b60006040820190506146f7600083018561446b565b614704602083018461446b565b9392505050565b6000606082840312156147215761472061414f565b5b81905092915050565b600080600060a0848603121561474357614742613cb2565b5b600061475186828701614522565b935050602061476286828701614522565b92505060406147738682870161470b565b9150509250925092565b6000806040838503121561479457614793613cb2565b5b60006147a285828601613eff565b92505060206147b385828601613eff565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061480457607f821691505b602082108103614817576148166147bd565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614853602083613d82565b915061485e8261481d565b602082019050919050565b6000602082019050818103600083015261488281614846565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148eb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826148ae565b6148f586836148ae565b95508019841693508086168417925050509392505050565b6000819050919050565b600061493261492d61492884613e29565b61490d565b613e29565b9050919050565b6000819050919050565b61494c83614917565b61496061495882614939565b8484546148bb565b825550505050565b600090565b614975614968565b614980818484614943565b505050565b5b818110156149a45761499960008261496d565b600181019050614986565b5050565b601f8211156149e9576149ba81614889565b6149c38461489e565b810160208510156149d2578190505b6149e66149de8561489e565b830182614985565b50505b505050565b600082821c905092915050565b6000614a0c600019846008026149ee565b1980831691505092915050565b6000614a2583836149fb565b9150826002028217905092915050565b614a3e82613d77565b67ffffffffffffffff811115614a5757614a56613f5e565b5b614a6182546147ec565b614a6c8282856149a8565b600060209050601f831160018114614a9f5760008415614a8d578287015190505b614a978582614a19565b865550614aff565b601f198416614aad86614889565b60005b82811015614ad557848901518255600182019150602085019450602081019050614ab0565b86831015614af25784890151614aee601f8916826149fb565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b50565b6000614b22600083614b07565b9150614b2d82614b12565b600082019050919050565b6000614b4382614b15565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b8782613e29565b9150614b9283613e29565b9250828201905080821115614baa57614ba9614b4d565b5b92915050565b6000614bbb82614277565b9150614bc683614277565b9250816fffffffffffffffffffffffffffffffff0483118215151615614bef57614bee614b4d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c3482614277565b9150614c3f83614277565b925082614c4f57614c4e614bfa565b5b828204905092915050565b6000614c6582614277565b9150614c7083614277565b925082820190506fffffffffffffffffffffffffffffffff811115614c9857614c97614b4d565b5b92915050565b6000614ca982614277565b9150614cb483614277565b925082820390506fffffffffffffffffffffffffffffffff811115614cdc57614cdb614b4d565b5b92915050565b6000614ced82613e29565b9150614cf883613e29565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d3157614d30614b4d565b5b828202905092915050565b6000614d4782613e29565b9150614d5283613e29565b925082614d6257614d61614bfa565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008135614da981614293565b80915050919050565b60008160001b9050919050565b60006fffffffffffffffffffffffffffffffff614ddb84614db2565b9350801983169250808416831791505092915050565b6000614e0c614e07614e0284614277565b61490d565b614277565b9050919050565b6000819050919050565b614e2682614df1565b614e39614e3282614e13565b8354614dbf565b8255505050565b614e4981614564565b8114614e5457600080fd5b50565b60008135614e6481614e40565b80915050919050565b60008160801b9050919050565b600077ffffffffffffffff00000000000000000000000000000000614e9e84614e6d565b9350801983169250808416831791505092915050565b6000614ecf614eca614ec584614564565b61490d565b614564565b9050919050565b6000819050919050565b614ee982614eb4565b614efc614ef582614ed6565b8354614e7a565b8255505050565b60008160c01b9050919050565b60007fffffffffffffffff000000000000000000000000000000000000000000000000614f3c84614f03565b9350801983169250808416831791505092915050565b614f5b82614eb4565b614f6e614f6782614ed6565b8354614f10565b8255505050565b600081016000830180614f8781614d9c565b9050614f938184614e1d565b505050600081016020830180614fa881614e57565b9050614fb48184614ee0565b505050600081016040830180614fc981614e57565b9050614fd58184614f52565b5050505050565b614fe68282614f75565b5050565b6000614ff582613e29565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361502757615026614b4d565b5b600182019050919050565b600081905092915050565b7f666f726576657200000000000000000000000000000000000000000000000000600082015250565b6000615073600783615032565b915061507e8261503d565b600782019050919050565b600061509482615066565b9150819050919050565b60006150a982613d77565b6150b38185615032565b93506150c3818560208601613d93565b80840191505092915050565b60006150db828461509e565b915081905092915050565b600081546150f3816147ec565b6150fd8186615032565b94506001821660008114615118576001811461512d57615160565b60ff1983168652811515820286019350615160565b61513685614889565b60005b8381101561515857815481890152600182019150602081019050615139565b838801955050505b50505092915050565b600061517582856150e6565b9150615181828461509e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151e9602683613d82565b91506151f48261518d565b604082019050919050565b60006020820190508181036000830152615218816151dc565b9050919050565b60008160601b9050919050565b60006152378261521f565b9050919050565b60006152498261522c565b9050919050565b61526161525c82613eac565b61523e565b82525050565b60006152738284615250565b60148201915081905092915050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126152ae576152ad615282565b5b80840192508235915067ffffffffffffffff8211156152d0576152cf615287565b5b6020830192506020820236038313156152ec576152eb61528c565b5b509250929050565b6000819050919050565b61530f61530a82614501565b6152f4565b82525050565b600061532182856152fe565b60208201915061533182846152fe565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061536882615341565b615372818561534c565b9350615382818560208601613d93565b61538b81613dbd565b840191505092915050565b60006080820190506153ab6000830187613ebe565b6153b86020830186613ebe565b6153c560408301856140d2565b81810360608301526153d7818461535d565b905095945050505050565b6000815190506153f181613ce8565b92915050565b60006020828403121561540d5761540c613cb2565b5b600061541b848285016153e2565b91505092915050565b600061542f82613e29565b915061543a83613e29565b925082820390508181111561545257615451614b4d565b5b92915050565b600061546382613e29565b915061546e83613e29565b92508261547e5761547d614bfa565b5b828206905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b60006154bf601c83615032565b91506154ca82615489565b601c82019050919050565b60006154e0826154b2565b91506154ec82846152fe565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000615560601883613d82565b915061556b8261552a565b602082019050919050565b6000602082019050818103600083015261558f81615553565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006155cc601f83613d82565b91506155d782615596565b602082019050919050565b600060208201905081810360008301526155fb816155bf565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061565e602283613d82565b915061566982615602565b604082019050919050565b6000602082019050818103600083015261568d81615651565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006156f0602283613d82565b91506156fb82615694565b604082019050919050565b6000602082019050818103600083015261571f816156e3565b9050919050565b61572f81614501565b82525050565b600060ff82169050919050565b61574b81615735565b82525050565b60006080820190506157666000830187615726565b6157736020830186615742565b6157806040830185615726565b61578d6060830184615726565b9594505050505056fea2646970667358221220e753ac089c532b933887ae2fda619562ce370b1eb6a5616feb586b4b059a927264736f6c63430008100033
Deployed Bytecode
0x60806040526004361061020f5760003560e01c8063715018a611610118578063b88d4fde116100a0578063e072e16d1161006f578063e072e16d14610783578063e4963dd5146107ae578063e985e9c5146107d7578063f2fde38b14610814578063fe2c7fee1461083d5761020f565b8063b88d4fde146106c8578063bedcf003146106f1578063c87b56dd1461071d578063de6cd0db1461075a5761020f565b8063978a4509116100e7578063978a4509146105e3578063a15947c414610620578063a22cb46514610649578063a475b5dd14610672578063a5aa4aa4146106895761020f565b8063715018a61461054557806379502c551461055c5780638da5cb5b1461058d57806395d89b41146105b85761020f565b80633ccfd60b1161019b57806355f804b31161016a57806355f804b31461043c5780636352211e14610465578063690ed4d3146104a25780636f5ba15a146104df57806370a08231146105085761020f565b80633ccfd60b146103b557806342842e0e146103cc5780634a21a2df146103f557806351830227146104115761020f565b80630f7309e8116101e25780630f7309e8146102e2578063109695231461030d57806318160ddd1461033657806323b872dd146103615780632cb020e51461038a5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613d14565b610866565b6040516102489190613d5c565b60405180910390f35b34801561025d57600080fd5b506102666108f8565b6040516102739190613e07565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190613e5f565b61098a565b6040516102b09190613ecd565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613f14565b610a09565b005b3480156102ee57600080fd5b506102f7610b4d565b6040516103049190613e07565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190614089565b610bdb565b005b34801561034257600080fd5b5061034b610cb0565b60405161035891906140e1565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906140fc565b610cc7565b005b34801561039657600080fd5b5061039f610fe9565b6040516103ac9190613d5c565b60405180910390f35b3480156103c157600080fd5b506103ca610ffc565b005b3480156103d857600080fd5b506103f360048036038101906103ee91906140fc565b611527565b005b61040f600480360381019061040a91906141d3565b611547565b005b34801561041d57600080fd5b50610426611e9d565b6040516104339190613d5c565b60405180910390f35b34801561044857600080fd5b50610463600480360381019061045e9190614089565b611eb0565b005b34801561047157600080fd5b5061048c60048036038101906104879190613e5f565b611f88565b6040516104999190613ecd565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c491906142bf565b611f9a565b6040516104d691906140e1565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190614355565b61206e565b005b34801561051457600080fd5b5061052f600480360381019061052a91906143a2565b61218d565b60405161053c91906140e1565b60405180910390f35b34801561055157600080fd5b5061055a612245565b005b34801561056857600080fd5b506105716122cd565b60405161058497969594939291906143ee565b60405180910390f35b34801561059957600080fd5b506105a261246d565b6040516105af9190613ecd565b60405180910390f35b3480156105c457600080fd5b506105cd612497565b6040516105da9190613e07565b60405180910390f35b3480156105ef57600080fd5b5061060a600480360381019061060591906143a2565b612529565b604051610617919061447a565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190614089565b612558565b005b34801561065557600080fd5b50610670600480360381019061066b91906144c1565b612675565b005b34801561067e57600080fd5b506106876127ec565b005b34801561069557600080fd5b506106b060048036038101906106ab9190614537565b612885565b6040516106bf93929190614587565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea919061465f565b6128f3565b005b3480156106fd57600080fd5b50610706612966565b6040516107149291906146e2565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f9190613e5f565b6129b0565b6040516107519190613e07565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190614089565b612aa6565b005b34801561078f57600080fd5b50610798612bc3565b6040516107a59190613d5c565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d0919061472a565b612bd6565b005b3480156107e357600080fd5b506107fe60048036038101906107f9919061477d565b612ca8565b60405161080b9190613d5c565b60405180910390f35b34801561082057600080fd5b5061083b600480360381019061083691906143a2565b612d3c565b005b34801561084957600080fd5b50610864600480360381019061085f9190614089565b612e33565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108f15750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610907906147ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610933906147ec565b80156109805780601f1061095557610100808354040283529160200191610980565b820191906000526020600020905b81548152906001019060200180831161096357829003601f168201915b5050505050905090565b600061099582612ec5565b6109cb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a1482611f88565b90508073ffffffffffffffffffffffffffffffffffffffff16610a35612f24565b73ffffffffffffffffffffffffffffffffffffffff1614610a9857610a6181610a5c612f24565b612ca8565b610a97576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600d8054610b5a906147ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610b86906147ec565b8015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b505050505081565b610be3612f2c565b73ffffffffffffffffffffffffffffffffffffffff16610c0161246d565b73ffffffffffffffffffffffffffffffffffffffff1614610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e90614869565b60405180910390fd5b600e60009054906101000a900460ff16610c9d576040517f249fab5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d9081610cac9190614a35565b5050565b6000610cba612f34565b6001546000540303905090565b6000610cd282612f3d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d39576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d4584613009565b91509150610d5b8187610d56612f24565b613030565b610da757610d7086610d6b612f24565b612ca8565b610da6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e0d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1a8686866001613074565b8015610e2557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ef385610ecf88888761307a565b7c0200000000000000000000000000000000000000000000000000000000176130a2565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f795760006001850190506000600460008381526020019081526020016000205403610f77576000548114610f76578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fe186868660016130cd565b505050505050565b600e60009054906101000a900460ff1681565b600061100661246d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061107e57507386b82972282dd22348374bc63fd21620f7ed847b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156112fe576000600f6040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905061113061246d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361122f5780600001519150604051806040016040528060006fffffffffffffffffffffffffffffffff16815260200182602001516fffffffffffffffffffffffffffffffff16815250600f60008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050506112f8565b80602001519150604051806040016040528082600001516fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815250600f60008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050505b506113d4565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046fffffffffffffffffffffffffffffffff1690506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505b6000816fffffffffffffffffffffffffffffffff1603611420576040517f8735c8fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1660405161145890614b38565b60006040518083038185875af1925050503d8060008114611495576040519150601f19603f3d011682016040523d82523d6000602084013e61149a565b606091505b50509050806114d5576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f8bb044d1bb6a7b421504ef7f7045b22152b504f683e8c1bcbc8222af46cb68b38360405161151b919061447a565b60405180910390a25050565b611542838383604051806020016040528060008152506128f3565b505050565b600060096000876000013581526020019081526020016000206040518060600160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146117b1577386b82972282dd22348374bc63fd21620f7ed847b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806116cf57506116a061246d565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8061170557503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b1561173c576040517f233067ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117b08484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050601060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166130d3565b5b6000816040015167ffffffffffffffff16036117f9576040517feb56075600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61180a86611805612f2c565b613180565b611840576040517fd838648f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806020015167ffffffffffffffff16421015611888576040517f1d23a74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601060020160149054906101000a900463ffffffff1663ffffffff16816040015167ffffffffffffffff16101561196e57600085600a60006118c8612f2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089600001358152602001908152602001600020546119229190614b7c565b9050816040015167ffffffffffffffff1681111561196c576040517f15fcbc9d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b601060020160189054906101000a900463ffffffff1663ffffffff168511156119c3576040517f7a7e96df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601060020160149054906101000a900463ffffffff1663ffffffff16856119e8613292565b6119f29190614b7c565b1115611a2a576040517f8a164f6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a3a826000015187611f9a565b905080341015611a76576040517ff244866f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80341115611ab0576040517f6c9089c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aba33876132a5565b601060020160149054906101000a900463ffffffff1663ffffffff16826040015167ffffffffffffffff161015611b5e5785600a6000611af8612f2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000896000013581526020019081526020016000206000828254611b569190614b7c565b925050819055505b600034905060008073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611cbd576127106010600201601c9054906101000a900463ffffffff1663ffffffff1683611bc29190614bb0565b611bcc9190614c29565b905080600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a90046fffffffffffffffffffffffffffffffff16611c389190614c5a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508673ffffffffffffffffffffffffffffffffffffffff167f5e627b23e8981317689f5541931b5e9805545e7601aa2c86e84217555368dc0382604051611cb4919061447a565b60405180910390a25b6000600f6040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000612710601060030160009054906101000a900463ffffffff1663ffffffff1685611d8e9190614bb0565b611d989190614c29565b90506000818486611da99190614c9e565b611db39190614c9e565b90506040518060400160405280828560000151611dd09190614c5a565b6fffffffffffffffffffffffffffffffff168152602001838560200151611df79190614c5a565b6fffffffffffffffffffffffffffffffff16815250600f60008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550905050505050505050505050505050565b600c60009054906101000a900460ff1681565b611eb8612f2c565b73ffffffffffffffffffffffffffffffffffffffff16611ed661246d565b73ffffffffffffffffffffffffffffffffffffffff1614611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2390614869565b60405180910390fd5b600c60019054906101000a900460ff16611f72576040517f249fab5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060106001019081611f849190614a35565b5050565b6000611f9382612f3d565b9050919050565b60008082846fffffffffffffffffffffffffffffffff16611fbb9190614ce2565b905060648310611fe657600a600882611fd49190614ce2565b611fde9190614d3c565b915050612068565b601e8310612011576127106121db82611fff9190614ce2565b6120099190614d3c565b915050612068565b600a831061203a57600a6009826120289190614ce2565b6120329190614d3c565b915050612068565b600583106120635760646060826120519190614ce2565b61205b9190614d3c565b915050612068565b809150505b92915050565b612076612f2c565b73ffffffffffffffffffffffffffffffffffffffff1661209461246d565b73ffffffffffffffffffffffffffffffffffffffff16146120ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e190614869565b60405180910390fd5b60005b82829050811015612188573683838381811061210c5761210b614d6d565b5b905060a002019050806040016009600083600001358152602001908152602001600020818161213b9190614fdc565b905050806020013581600001357fe9a0c17645ed78ccc9996259f00297ffc75e6b9d22cd605ccc9992cc8ca3f4c160405160405180910390a350808061218090614fea565b9150506120ed565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121f4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61224d612f2c565b73ffffffffffffffffffffffffffffffffffffffff1661226b61246d565b73ffffffffffffffffffffffffffffffffffffffff16146122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b890614869565b60405180910390fd5b6122cb60006132c3565b565b60108060000180546122de906147ec565b80601f016020809104026020016040519081016040528092919081815260200182805461230a906147ec565b80156123575780601f1061232c57610100808354040283529160200191612357565b820191906000526020600020905b81548152906001019060200180831161233a57829003601f168201915b50505050509080600101805461236c906147ec565b80601f0160208091040260200160405190810160405280929190818152602001828054612398906147ec565b80156123e55780601f106123ba576101008083540402835291602001916123e5565b820191906000526020600020905b8154815290600101906020018083116123c857829003601f168201915b5050505050908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160149054906101000a900463ffffffff16908060020160189054906101000a900463ffffffff169080600201601c9054906101000a900463ffffffff16908060030160009054906101000a900463ffffffff16905087565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546124a6906147ec565b80601f01602080910402602001604051908101604052809291908181526020018280546124d2906147ec565b801561251f5780601f106124f45761010080835404028352916020019161251f565b820191906000526020600020905b81548152906001019060200180831161250257829003601f168201915b5050505050905090565b600b6020528060005260406000206000915054906101000a90046fffffffffffffffffffffffffffffffff1681565b612560612f2c565b73ffffffffffffffffffffffffffffffffffffffff1661257e61246d565b73ffffffffffffffffffffffffffffffffffffffff16146125d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cb90614869565b60405180910390fd5b6040516020016125e390615089565b604051602081830303815290604052805190602001208160405160200161260a91906150cf565b6040516020818303038152906040528051906020012014612657576040517f5ee88f9700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600e60006101000a81548160ff02191690831515021790555050565b61267d612f24565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126e1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006126ee612f24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661279b612f24565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127e09190613d5c565b60405180910390a35050565b6127f4612f2c565b73ffffffffffffffffffffffffffffffffffffffff1661281261246d565b73ffffffffffffffffffffffffffffffffffffffff1614612868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285f90614869565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b60096020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16908060000160189054906101000a900467ffffffffffffffff16905083565b6128fe848484610cc7565b60008373ffffffffffffffffffffffffffffffffffffffff163b146129605761292984848484613389565b61295f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f8060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b60606129bb82612ec5565b6129f1576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600c60009054906101000a900460ff16151503612a41576010600001612a1a836134d9565b604051602001612a2b929190615169565b6040516020818303038152906040529050612aa1565b600060106001018054612a53906147ec565b905003612a6f5760405180602001604052806000815250612a9e565b6010600101612a7d836134d9565b604051602001612a8e929190615169565b6040516020818303038152906040525b90505b919050565b612aae612f2c565b73ffffffffffffffffffffffffffffffffffffffff16612acc61246d565b73ffffffffffffffffffffffffffffffffffffffff1614612b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1990614869565b60405180910390fd5b604051602001612b3190615089565b6040516020818303038152906040528051906020012081604051602001612b5891906150cf565b6040516020818303038152906040528051906020012014612ba5576040517f5ee88f9700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600c60016101000a81548160ff02191690831515021790555050565b600c60019054906101000a900460ff1681565b612bde612f2c565b73ffffffffffffffffffffffffffffffffffffffff16612bfc61246d565b73ffffffffffffffffffffffffffffffffffffffff1614612c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4990614869565b60405180910390fd5b80600960008581526020019081526020016000208181612c729190614fdc565b90505081837fe9a0c17645ed78ccc9996259f00297ffc75e6b9d22cd605ccc9992cc8ca3f4c160405160405180910390a3505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612d44612f2c565b73ffffffffffffffffffffffffffffffffffffffff16612d6261246d565b73ffffffffffffffffffffffffffffffffffffffff1614612db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612daf90614869565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1e906151ff565b60405180910390fd5b612e30816132c3565b50565b612e3b612f2c565b73ffffffffffffffffffffffffffffffffffffffff16612e5961246d565b73ffffffffffffffffffffffffffffffffffffffff1614612eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea690614869565b60405180910390fd5b8060106000019081612ec19190614a35565b5050565b600081612ed0612f34565b11158015612edf575060005482105b8015612f1d575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b60006001905090565b60008082905080612f4c612f34565b11612fd257600054811015612fd15760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612fcf575b60008103612fc5576004600083600190039350838152602001908152602001600020549050612f9b565b8092505050613004565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613091868684613639565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000613104846040516020016130e99190615267565b60405160208183030381529060405280519060200120613642565b905060006131128285613672565b90508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613179576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600080836000013503613196576001905061328c565b6000826040516020016131a99190615267565b60405160208183030381529060405280519060200120905060005b8480602001906131d49190615291565b90508110156132805760008580602001906131ef9190615291565b83818110613200576131ff614d6d565b5b905060200201359050808311613240578281604051602001613223929190615315565b60405160208183030381529060405280519060200120925061326c565b8083604051602001613253929190615315565b6040516020818303038152906040528051906020012092505b50808061327890614fea565b9150506131c4565b50836000013581149150505b92915050565b600061329c612f34565b60005403905090565b6132bf828260405180602001604052806000815250613699565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133af612f24565b8786866040518563ffffffff1660e01b81526004016133d19493929190615396565b6020604051808303816000875af192505050801561340d57506040513d601f19601f8201168201806040525081019061340a91906153f7565b60015b613486573d806000811461343d576040519150601f19603f3d011682016040523d82523d6000602084013e613442565b606091505b50600081510361347e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203613520576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613634565b600082905060005b6000821461355257808061353b90614fea565b915050600a8261354b9190614d3c565b9150613528565b60008167ffffffffffffffff81111561356e5761356d613f5e565b5b6040519080825280601f01601f1916602001820160405280156135a05781602001600182028036833780820191505090505b5090505b6000851461362d576001826135b99190615424565b9150600a856135c89190615458565b60306135d49190614b7c565b60f81b8183815181106135ea576135e9614d6d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136269190614d3c565b94506135a4565b8093505050505b919050565b60009392505050565b60008160405160200161365591906154d5565b604051602081830303815290604052805190602001209050919050565b60008060006136818585613736565b9150915061368e816137b7565b819250505092915050565b6136a38383613983565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461373157600080549050600083820390505b6136e36000868380600101945086613389565b613719576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106136d057816000541461372e57600080fd5b50505b505050565b60008060418351036137775760008060006020860151925060408601519150606086015160001a905061376b87828585613b3e565b945094505050506137b0565b60408351036137a757600080602085015191506040850151905061379c868383613c4a565b9350935050506137b0565b60006002915091505b9250929050565b600060048111156137cb576137ca6154fb565b5b8160048111156137de576137dd6154fb565b5b031561398057600160048111156137f8576137f76154fb565b5b81600481111561380b5761380a6154fb565b5b0361384b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384290615576565b60405180910390fd5b6002600481111561385f5761385e6154fb565b5b816004811115613872576138716154fb565b5b036138b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138a9906155e2565b60405180910390fd5b600360048111156138c6576138c56154fb565b5b8160048111156138d9576138d86154fb565b5b03613919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391090615674565b60405180910390fd5b60048081111561392c5761392b6154fb565b5b81600481111561393f5761393e6154fb565b5b0361397f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397690615706565b60405180910390fd5b5b50565b600080549050600082036139c3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139d06000848385613074565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613a4783613a38600086600061307a565b613a4185613c98565b176130a2565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613ae857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613aad565b5060008203613b23576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613b3960008483856130cd565b505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613b79576000600391509150613c41565b601b8560ff1614158015613b915750601c8560ff1614155b15613ba3576000600491509150613c41565b600060018787878760405160008152602001604052604051613bc89493929190615751565b6020604051602081039080840390855afa158015613bea573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613c3857600060019250925050613c41565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613c8a87828885613b3e565b935093505050935093915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613cf181613cbc565b8114613cfc57600080fd5b50565b600081359050613d0e81613ce8565b92915050565b600060208284031215613d2a57613d29613cb2565b5b6000613d3884828501613cff565b91505092915050565b60008115159050919050565b613d5681613d41565b82525050565b6000602082019050613d716000830184613d4d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613db1578082015181840152602081019050613d96565b60008484015250505050565b6000601f19601f8301169050919050565b6000613dd982613d77565b613de38185613d82565b9350613df3818560208601613d93565b613dfc81613dbd565b840191505092915050565b60006020820190508181036000830152613e218184613dce565b905092915050565b6000819050919050565b613e3c81613e29565b8114613e4757600080fd5b50565b600081359050613e5981613e33565b92915050565b600060208284031215613e7557613e74613cb2565b5b6000613e8384828501613e4a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613eb782613e8c565b9050919050565b613ec781613eac565b82525050565b6000602082019050613ee26000830184613ebe565b92915050565b613ef181613eac565b8114613efc57600080fd5b50565b600081359050613f0e81613ee8565b92915050565b60008060408385031215613f2b57613f2a613cb2565b5b6000613f3985828601613eff565b9250506020613f4a85828601613e4a565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f9682613dbd565b810181811067ffffffffffffffff82111715613fb557613fb4613f5e565b5b80604052505050565b6000613fc8613ca8565b9050613fd48282613f8d565b919050565b600067ffffffffffffffff821115613ff457613ff3613f5e565b5b613ffd82613dbd565b9050602081019050919050565b82818337600083830152505050565b600061402c61402784613fd9565b613fbe565b90508281526020810184848401111561404857614047613f59565b5b61405384828561400a565b509392505050565b600082601f8301126140705761406f613f54565b5b8135614080848260208601614019565b91505092915050565b60006020828403121561409f5761409e613cb2565b5b600082013567ffffffffffffffff8111156140bd576140bc613cb7565b5b6140c98482850161405b565b91505092915050565b6140db81613e29565b82525050565b60006020820190506140f660008301846140d2565b92915050565b60008060006060848603121561411557614114613cb2565b5b600061412386828701613eff565b935050602061413486828701613eff565b925050604061414586828701613e4a565b9150509250925092565b600080fd5b60006040828403121561416a5761416961414f565b5b81905092915050565b600080fd5b600080fd5b60008083601f84011261419357614192613f54565b5b8235905067ffffffffffffffff8111156141b0576141af614173565b5b6020830191508360018202830111156141cc576141cb614178565b5b9250929050565b6000806000806000608086880312156141ef576141ee613cb2565b5b600086013567ffffffffffffffff81111561420d5761420c613cb7565b5b61421988828901614154565b955050602061422a88828901613e4a565b945050604061423b88828901613eff565b935050606086013567ffffffffffffffff81111561425c5761425b613cb7565b5b6142688882890161417d565b92509250509295509295909350565b60006fffffffffffffffffffffffffffffffff82169050919050565b61429c81614277565b81146142a757600080fd5b50565b6000813590506142b981614293565b92915050565b600080604083850312156142d6576142d5613cb2565b5b60006142e4858286016142aa565b92505060206142f585828601613e4a565b9150509250929050565b60008083601f84011261431557614314613f54565b5b8235905067ffffffffffffffff81111561433257614331614173565b5b6020830191508360a082028301111561434e5761434d614178565b5b9250929050565b6000806020838503121561436c5761436b613cb2565b5b600083013567ffffffffffffffff81111561438a57614389613cb7565b5b614396858286016142ff565b92509250509250929050565b6000602082840312156143b8576143b7613cb2565b5b60006143c684828501613eff565b91505092915050565b600063ffffffff82169050919050565b6143e8816143cf565b82525050565b600060e0820190508181036000830152614408818a613dce565b9050818103602083015261441c8189613dce565b905061442b6040830188613ebe565b61443860608301876143df565b61444560808301866143df565b61445260a08301856143df565b61445f60c08301846143df565b98975050505050505050565b61447481614277565b82525050565b600060208201905061448f600083018461446b565b92915050565b61449e81613d41565b81146144a957600080fd5b50565b6000813590506144bb81614495565b92915050565b600080604083850312156144d8576144d7613cb2565b5b60006144e685828601613eff565b92505060206144f7858286016144ac565b9150509250929050565b6000819050919050565b61451481614501565b811461451f57600080fd5b50565b6000813590506145318161450b565b92915050565b60006020828403121561454d5761454c613cb2565b5b600061455b84828501614522565b91505092915050565b600067ffffffffffffffff82169050919050565b61458181614564565b82525050565b600060608201905061459c600083018661446b565b6145a96020830185614578565b6145b66040830184614578565b949350505050565b600067ffffffffffffffff8211156145d9576145d8613f5e565b5b6145e282613dbd565b9050602081019050919050565b60006146026145fd846145be565b613fbe565b90508281526020810184848401111561461e5761461d613f59565b5b61462984828561400a565b509392505050565b600082601f83011261464657614645613f54565b5b81356146568482602086016145ef565b91505092915050565b6000806000806080858703121561467957614678613cb2565b5b600061468787828801613eff565b945050602061469887828801613eff565b93505060406146a987828801613e4a565b925050606085013567ffffffffffffffff8111156146ca576146c9613cb7565b5b6146d687828801614631565b91505092959194509250565b60006040820190506146f7600083018561446b565b614704602083018461446b565b9392505050565b6000606082840312156147215761472061414f565b5b81905092915050565b600080600060a0848603121561474357614742613cb2565b5b600061475186828701614522565b935050602061476286828701614522565b92505060406147738682870161470b565b9150509250925092565b6000806040838503121561479457614793613cb2565b5b60006147a285828601613eff565b92505060206147b385828601613eff565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061480457607f821691505b602082108103614817576148166147bd565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614853602083613d82565b915061485e8261481d565b602082019050919050565b6000602082019050818103600083015261488281614846565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148eb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826148ae565b6148f586836148ae565b95508019841693508086168417925050509392505050565b6000819050919050565b600061493261492d61492884613e29565b61490d565b613e29565b9050919050565b6000819050919050565b61494c83614917565b61496061495882614939565b8484546148bb565b825550505050565b600090565b614975614968565b614980818484614943565b505050565b5b818110156149a45761499960008261496d565b600181019050614986565b5050565b601f8211156149e9576149ba81614889565b6149c38461489e565b810160208510156149d2578190505b6149e66149de8561489e565b830182614985565b50505b505050565b600082821c905092915050565b6000614a0c600019846008026149ee565b1980831691505092915050565b6000614a2583836149fb565b9150826002028217905092915050565b614a3e82613d77565b67ffffffffffffffff811115614a5757614a56613f5e565b5b614a6182546147ec565b614a6c8282856149a8565b600060209050601f831160018114614a9f5760008415614a8d578287015190505b614a978582614a19565b865550614aff565b601f198416614aad86614889565b60005b82811015614ad557848901518255600182019150602085019450602081019050614ab0565b86831015614af25784890151614aee601f8916826149fb565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b50565b6000614b22600083614b07565b9150614b2d82614b12565b600082019050919050565b6000614b4382614b15565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b8782613e29565b9150614b9283613e29565b9250828201905080821115614baa57614ba9614b4d565b5b92915050565b6000614bbb82614277565b9150614bc683614277565b9250816fffffffffffffffffffffffffffffffff0483118215151615614bef57614bee614b4d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c3482614277565b9150614c3f83614277565b925082614c4f57614c4e614bfa565b5b828204905092915050565b6000614c6582614277565b9150614c7083614277565b925082820190506fffffffffffffffffffffffffffffffff811115614c9857614c97614b4d565b5b92915050565b6000614ca982614277565b9150614cb483614277565b925082820390506fffffffffffffffffffffffffffffffff811115614cdc57614cdb614b4d565b5b92915050565b6000614ced82613e29565b9150614cf883613e29565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d3157614d30614b4d565b5b828202905092915050565b6000614d4782613e29565b9150614d5283613e29565b925082614d6257614d61614bfa565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008135614da981614293565b80915050919050565b60008160001b9050919050565b60006fffffffffffffffffffffffffffffffff614ddb84614db2565b9350801983169250808416831791505092915050565b6000614e0c614e07614e0284614277565b61490d565b614277565b9050919050565b6000819050919050565b614e2682614df1565b614e39614e3282614e13565b8354614dbf565b8255505050565b614e4981614564565b8114614e5457600080fd5b50565b60008135614e6481614e40565b80915050919050565b60008160801b9050919050565b600077ffffffffffffffff00000000000000000000000000000000614e9e84614e6d565b9350801983169250808416831791505092915050565b6000614ecf614eca614ec584614564565b61490d565b614564565b9050919050565b6000819050919050565b614ee982614eb4565b614efc614ef582614ed6565b8354614e7a565b8255505050565b60008160c01b9050919050565b60007fffffffffffffffff000000000000000000000000000000000000000000000000614f3c84614f03565b9350801983169250808416831791505092915050565b614f5b82614eb4565b614f6e614f6782614ed6565b8354614f10565b8255505050565b600081016000830180614f8781614d9c565b9050614f938184614e1d565b505050600081016020830180614fa881614e57565b9050614fb48184614ee0565b505050600081016040830180614fc981614e57565b9050614fd58184614f52565b5050505050565b614fe68282614f75565b5050565b6000614ff582613e29565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361502757615026614b4d565b5b600182019050919050565b600081905092915050565b7f666f726576657200000000000000000000000000000000000000000000000000600082015250565b6000615073600783615032565b915061507e8261503d565b600782019050919050565b600061509482615066565b9150819050919050565b60006150a982613d77565b6150b38185615032565b93506150c3818560208601613d93565b80840191505092915050565b60006150db828461509e565b915081905092915050565b600081546150f3816147ec565b6150fd8186615032565b94506001821660008114615118576001811461512d57615160565b60ff1983168652811515820286019350615160565b61513685614889565b60005b8381101561515857815481890152600182019150602081019050615139565b838801955050505b50505092915050565b600061517582856150e6565b9150615181828461509e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151e9602683613d82565b91506151f48261518d565b604082019050919050565b60006020820190508181036000830152615218816151dc565b9050919050565b60008160601b9050919050565b60006152378261521f565b9050919050565b60006152498261522c565b9050919050565b61526161525c82613eac565b61523e565b82525050565b60006152738284615250565b60148201915081905092915050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126152ae576152ad615282565b5b80840192508235915067ffffffffffffffff8211156152d0576152cf615287565b5b6020830192506020820236038313156152ec576152eb61528c565b5b509250929050565b6000819050919050565b61530f61530a82614501565b6152f4565b82525050565b600061532182856152fe565b60208201915061533182846152fe565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061536882615341565b615372818561534c565b9350615382818560208601613d93565b61538b81613dbd565b840191505092915050565b60006080820190506153ab6000830187613ebe565b6153b86020830186613ebe565b6153c560408301856140d2565b81810360608301526153d7818461535d565b905095945050505050565b6000815190506153f181613ce8565b92915050565b60006020828403121561540d5761540c613cb2565b5b600061541b848285016153e2565b91505092915050565b600061542f82613e29565b915061543a83613e29565b925082820390508181111561545257615451614b4d565b5b92915050565b600061546382613e29565b915061546e83613e29565b92508261547e5761547d614bfa565b5b828206905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b60006154bf601c83615032565b91506154ca82615489565b601c82019050919050565b60006154e0826154b2565b91506154ec82846152fe565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000615560601883613d82565b915061556b8261552a565b602082019050919050565b6000602082019050818103600083015261558f81615553565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006155cc601f83613d82565b91506155d782615596565b602082019050919050565b600060208201905081810360008301526155fb816155bf565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b600061565e602283613d82565b915061566982615602565b604082019050919050565b6000602082019050818103600083015261568d81615651565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006156f0602283613d82565b91506156fb82615694565b604082019050919050565b6000602082019050818103600083015261571f816156e3565b9050919050565b61572f81614501565b82525050565b600060ff82169050919050565b61574b81615735565b82525050565b60006080820190506157666000830187615726565b6157736020830186615742565b6157806040830185615726565b61578d6060830184615726565b9594505050505056fea2646970667358221220e753ac089c532b933887ae2fda619562ce370b1eb6a5616feb586b4b059a927264736f6c63430008100033
Deployed Bytecode Sourcemap
66287:8808:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20428:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21330:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27813:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27254:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67509:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72079:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17081:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31526:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67538:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72566:772;;;;;;;;;;;;;:::i;:::-;;34439:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68264:2008;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67456:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71847:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22723:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70278:552;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73344:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18265:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55543:103;;;;;;;;;;;;;:::i;:::-;;67614:20;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;54892:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21506:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67210:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72316:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28371:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71279:63;;;;;;;;;;;;;:::i;:::-;;67097:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;35222:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67577:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;70836:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71490:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67481:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73621:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28836:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55801:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71718:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20428:639;20513:4;20852:10;20837:25;;:11;:25;;;;:102;;;;20929:10;20914:25;;:11;:25;;;;20837:102;:179;;;;21006:10;20991:25;;:11;:25;;;;20837:179;20817:199;;20428:639;;;:::o;21330:100::-;21384:13;21417:5;21410:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21330:100;:::o;27813:218::-;27889:7;27914:16;27922:7;27914;:16::i;:::-;27909:64;;27939:34;;;;;;;;;;;;;;27909:64;27993:15;:24;28009:7;27993:24;;;;;;;;;;;:30;;;;;;;;;;;;27986:37;;27813:218;;;:::o;27254:400::-;27335:13;27351:16;27359:7;27351;:16::i;:::-;27335:32;;27407:5;27384:28;;:19;:17;:19::i;:::-;:28;;;27380:175;;27432:44;27449:5;27456:19;:17;:19::i;:::-;27432:16;:44::i;:::-;27427:128;;27504:35;;;;;;;;;;;;;;27427:128;27380:175;27600:2;27567:15;:24;27583:7;27567:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;27638:7;27634:2;27618:28;;27627:5;27618:28;;;;;;;;;;;;27324:330;27254:400;;:::o;67509:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72079:190::-;55123:12;:10;:12::i;:::-;55112:23;;:7;:5;:7::i;:::-;:23;;;55104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72165:22:::1;;;;;;;;;;;72160:68;;72205:15;;;;;;;;;;;;;;72160:68;72249:14;72236:10;:27;;;;;;:::i;:::-;;72079:190:::0;:::o;17081:323::-;17142:7;17370:15;:13;:15::i;:::-;17355:12;;17339:13;;:28;:46;17332:53;;17081:323;:::o;31526:2817::-;31660:27;31690;31709:7;31690:18;:27::i;:::-;31660:57;;31775:4;31734:45;;31750:19;31734:45;;;31730:86;;31788:28;;;;;;;;;;;;;;31730:86;31830:27;31859:23;31886:35;31913:7;31886:26;:35::i;:::-;31829:92;;;;32021:68;32046:15;32063:4;32069:19;:17;:19::i;:::-;32021:24;:68::i;:::-;32016:180;;32109:43;32126:4;32132:19;:17;:19::i;:::-;32109:16;:43::i;:::-;32104:92;;32161:35;;;;;;;;;;;;;;32104:92;32016:180;32227:1;32213:16;;:2;:16;;;32209:52;;32238:23;;;;;;;;;;;;;;32209:52;32274:43;32296:4;32302:2;32306:7;32315:1;32274:21;:43::i;:::-;32410:15;32407:160;;;32550:1;32529:19;32522:30;32407:160;32947:18;:24;32966:4;32947:24;;;;;;;;;;;;;;;;32945:26;;;;;;;;;;;;33016:18;:22;33035:2;33016:22;;;;;;;;;;;;;;;;33014:24;;;;;;;;;;;33338:146;33375:2;33424:45;33439:4;33445:2;33449:19;33424:14;:45::i;:::-;13480:8;33396:73;33338:18;:146::i;:::-;33309:17;:26;33327:7;33309:26;;;;;;;;;;;:175;;;;33655:1;13480:8;33604:19;:47;:52;33600:627;;33677:19;33709:1;33699:7;:11;33677:33;;33866:1;33832:17;:30;33850:11;33832:30;;;;;;;;;;;;:35;33828:384;;33970:13;;33955:11;:28;33951:242;;34150:19;34117:17;:30;34135:11;34117:30;;;;;;;;;;;:52;;;;33951:242;33828:384;33658:569;33600:627;34274:7;34270:2;34255:27;;34264:4;34255:27;;;;;;;;;;;;34293:42;34314:4;34320:2;34324:7;34333:1;34293:20;:42::i;:::-;31649:2694;;;31526:2817;;;:::o;67538:34::-;;;;;;;;;;;;;:::o;72566:772::-;72600:11;72642:7;:5;:7::i;:::-;72628:21;;:10;:21;;;:47;;;;67302:42;72653:22;;:10;:22;;;72628:47;72624:491;;;72686:27;72716:12;72686:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72755:7;:5;:7::i;:::-;72741:21;;:10;:21;;;72737:273;;72781:7;:13;;;72775:19;;72820:54;;;;;;;;72842:1;72820:54;;;;;;72855:7;:16;;;72820:54;;;;;72805:12;:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72737:273;;;72907:7;:16;;;72901:22;;72949:51;;;;;;;;72971:7;:13;;;72949:51;;;;;;72996:1;72949:51;;;;;72934:12;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72737:273;72677:340;72624:491;;;73038:16;:28;73055:10;73038:28;;;;;;;;;;;;;;;;;;;;;;;;;73032:34;;73106:1;73075:16;:28;73092:10;73075:28;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;72624:491;73134:1;73127:3;:8;;;73123:52;;73153:14;;;;;;;;;;;;;;73123:52;73182:12;73200:10;:15;;73224:3;73200:33;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73181:52;;;73245:7;73240:54;;73270:16;;;;;;;;;;;;;;73240:54;73316:10;73305:27;;;73328:3;73305:27;;;;;;:::i;:::-;;;;;;;;72593:745;;72566:772::o;34439:185::-;34577:39;34594:4;34600:2;34604:7;34577:39;;;;;;;;;;;;:16;:39::i;:::-;34439:185;;;:::o;68264:2008::-;68410:15;68428:7;:17;68436:4;:8;;;68428:17;;;;;;;;;;;68410:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68479:1;68458:23;;:9;:23;;;68454:240;;67302:42;68496:21;;:9;:21;;;:45;;;;68534:7;:5;:7::i;:::-;68521:20;;:9;:20;;;68496:45;:72;;;;68558:10;68545:23;;:9;:23;;;68496:72;68492:123;;;68588:17;;;;;;;;;;;;;;68492:123;68623:63;68641:9;68652;;68623:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68663:6;:22;;;;;;;;;;;;68623:17;:63::i;:::-;68454:240;68717:1;68706;:7;;;:12;;;68702:57;;68736:15;;;;;;;;;;;;;;68702:57;68772:26;68779:4;68785:12;:10;:12::i;:::-;68772:6;:26::i;:::-;68767:83;;68816:26;;;;;;;;;;;;;;68767:83;68880:1;:7;;;68862:25;;:15;:25;68858:74;;;68905:19;;;;;;;;;;;;;;68858:74;68954:6;:16;;;;;;;;;;;;68944:26;;:1;:7;;;:26;;;68940:206;;;68981:22;69039:8;69006:6;:20;69013:12;:10;:12::i;:::-;69006:20;;;;;;;;;;;;;;;:30;69027:4;:8;;;69006:30;;;;;;;;;;;;:41;;;;:::i;:::-;68981:66;;69079:1;:7;;;69062:24;;:14;:24;69058:81;;;69106:23;;;;;;;;;;;;;;69058:81;68972:174;68940:206;69169:6;:19;;;;;;;;;;;;69158:30;;:8;:30;69154:82;;;69206:22;;;;;;;;;;;;;;69154:82;69278:6;:16;;;;;;;;;;;;69248:46;;69266:8;69249:14;:12;:14::i;:::-;:25;;;;:::i;:::-;69248:46;69244:95;;;69312:19;;;;;;;;;;;;;;69244:95;69347:12;69362:31;69375:1;:7;;;69384:8;69362:12;:31::i;:::-;69347:46;;69418:4;69406:9;:16;69402:67;;;69440:21;;;;;;;;;;;;;;69402:67;69493:4;69481:9;:16;69477:64;;;69515:18;;;;;;;;;;;;;;69477:64;69549:31;69559:10;69571:8;69549:9;:31::i;:::-;69603:6;:16;;;;;;;;;;;;69593:26;;:1;:7;;;:26;;;69589:91;;;69664:8;69630:6;:20;69637:12;:10;:12::i;:::-;69630:20;;;;;;;;;;;;;;;:30;69651:4;:8;;;69630:30;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;69589:91;69688:13;69712:9;69688:34;;69731:20;69787:1;69766:23;;:9;:23;;;69762:197;;69847:5;69824:6;:19;;;;;;;;;;;;69816:27;;:5;:27;;;;:::i;:::-;69815:37;;;;:::i;:::-;69800:52;;69892:12;69861:16;:27;69878:9;69861:27;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;69927:9;69918:33;;;69938:12;69918:33;;;;;;:::i;:::-;;;;;;;;69762:197;69967:27;69997:12;69967:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70016:19;70069:5;70047:6;:18;;;;;;;;;;;;70039:26;;:5;:26;;;;:::i;:::-;70038:36;;;;:::i;:::-;70016:58;;70081:16;70123:11;70108:12;70100:5;:20;;;;:::i;:::-;:34;;;;:::i;:::-;70081:53;;70156:110;;;;;;;;70201:8;70185:7;:13;;;:24;;;;:::i;:::-;70156:110;;;;;;70247:11;70228:7;:16;;;:30;;;;:::i;:::-;70156:110;;;;;70141:12;:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68403:1869;;;;;;;68264:2008;;;;;:::o;67456:20::-;;;;;;;;;;;;;:::o;71847:164::-;55123:12;:10;:12::i;:::-;55112:23;;:7;:5;:7::i;:::-;:23;;;55104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71920:11:::1;;;;;;;;;;;71915:57;;71949:15;;;;;;;;;;;;;;71915:57;71997:8;71980:6;:14;;:25;;;;;;:::i;:::-;;71847:164:::0;:::o;22723:152::-;22795:7;22838:27;22857:7;22838:18;:27::i;:::-;22815:52;;22723:152;;;:::o;70278:552::-;70355:7;70470:12;70493:9;70485:5;:17;;;;;;:::i;:::-;70470:32;;70530:3;70517:9;:16;70513:312;;70564:2;70560:1;70553:4;:8;;;;:::i;:::-;:13;;;;:::i;:::-;70546:20;;;;;70513:312;70599:2;70586:9;:15;70582:243;;70635:5;70628:4;70621;:11;;;;:::i;:::-;:19;;;;:::i;:::-;70614:26;;;;;70582:243;70673:2;70660:9;:15;70656:169;;70706:2;70702:1;70695:4;:8;;;;:::i;:::-;:13;;;;:::i;:::-;70688:20;;;;;70656:169;70741:1;70728:9;:14;70724:101;;70774:3;70769:2;70762:4;:9;;;;:::i;:::-;:15;;;;:::i;:::-;70755:22;;;;;70724:101;70811:4;70804:11;;;70278:552;;;;;:::o;73344:271::-;55123:12;:10;:12::i;:::-;55112:23;;:7;:5;:7::i;:::-;:23;;;55104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73429:9:::1;73424:186;73448:10;;:17;;73444:1;:21;73424:186;;;73481:24;73508:10;;73519:1;73508:13;;;;;;;:::i;:::-;;;;;;;73481:40;;73550:4;:11;;73530:7;:17;73538:4;:8;;;73530:17;;;;;;;;;;;:31;;;;;;:::i;:::-;;;;73593:4;:8;;;73583:4;:8;;;73575:27;;;;;;;;;;73472:138;73467:3;;;;;:::i;:::-;;;;73424:186;;;;73344:271:::0;;:::o;18265:233::-;18337:7;18378:1;18361:19;;:5;:19;;;18357:60;;18389:28;;;;;;;;;;;;;;18357:60;12424:13;18435:18;:25;18454:5;18435:25;;;;;;;;;;;;;;;;:55;18428:62;;18265:233;;;:::o;55543:103::-;55123:12;:10;:12::i;:::-;55112:23;;:7;:5;:7::i;:::-;:23;;;55104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55608:30:::1;55635:1;55608:18;:30::i;:::-;55543:103::o:0;67614:20::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54892:87::-;54938:7;54965:6;;;;;;;;;;;54958:13;;54892:87;:::o;21506:104::-;21562:13;21595:7;21588:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21506:104;:::o;67210:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;72316:244::-;55123:12;:10;:12::i;:::-;55112:23;;:7;:5;:7::i;:::-;:23;;;55104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72447:27:::1;;;;;;;:::i;:::-;;;;;;;;;;;;;72437:38;;;;;;72423:8;72406:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;72396:37;;;;;;:79;72392:124;;72493:15;;;;;;;;;;;;;;72392:124;72549:5;72524:22;;:30;;;;;;;;;;;;;;;;;;72316:244:::0;:::o;28371:308::-;28482:19;:17;:19::i;:::-;28470:31;;:8;:31;;;28466:61;;28510:17;;;;;;;;;;;;;;28466:61;28592:8;28540:18;:39;28559:19;:17;:19::i;:::-;28540:39;;;;;;;;;;;;;;;:49;28580:8;28540:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;28652:8;28616:55;;28631:19;:17;:19::i;:::-;28616:55;;;28662:8;28616:55;;;;;;:::i;:::-;;;;;;;;28371:308;;:::o;71279:63::-;55123:12;:10;:12::i;:::-;55112:23;;:7;:5;:7::i;:::-;:23;;;55104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71332:4:::1;71321:8;;:15;;;;;;;;;;;;;;;;;;71279:63::o:0;67097:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35222:399::-;35389:31;35402:4;35408:2;35412:7;35389:12;:31::i;:::-;35453:1;35435:2;:14;;;:19;35431:183;;35474:56;35505:4;35511:2;35515:7;35524:5;35474:30;:56::i;:::-;35469:145;;35558:40;;;;;;;;;;;;;;35469:145;35431:183;35222:399;;;;:::o;67577:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70836:437::-;70909:13;70936:16;70944:7;70936;:16::i;:::-;70931:59;;70961:29;;;;;;;;;;;;;;70931:59;71015:5;71003:17;;:8;;;;;;;;;;;:17;;;70999:120;;71062:6;:20;;71084:25;71101:7;71084:16;:25::i;:::-;71045:65;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71031:80;;;;70999:120;71173:1;71147:6;:14;;71141:28;;;;;:::i;:::-;;;:33;:126;;;;;;;;;;;;;;;;;71210:6;:14;;71226:25;71243:7;71226:16;:25::i;:::-;71193:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71141:126;71127:140;;70836:437;;;;:::o;71490:222::-;55123:12;:10;:12::i;:::-;55112:23;;:7;:5;:7::i;:::-;:23;;;55104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71610:27:::1;;;;;;;:::i;:::-;;;;;;;;;;;;;71600:38;;;;;;71586:8;71569:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;71559:37;;;;;;:79;71555:124;;71656:15;;;;;;;;;;;;;;71555:124;71701:5;71687:11;;:19;;;;;;;;;;;;;;;;;;71490:222:::0;:::o;67481:23::-;;;;;;;;;;;;;:::o;73621:178::-;55123:12;:10;:12::i;:::-;55112:23;;:7;:5;:7::i;:::-;:23;;;55104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73755:7:::1;73739;:13;73747:4;73739:13;;;;;;;;;;;:23;;;;;;:::i;:::-;;;;73788:4;73782;73774:19;;;;;;;;;;73621:178:::0;;;:::o;28836:164::-;28933:4;28957:18;:25;28976:5;28957:25;;;;;;;;;;;;;;;:35;28983:8;28957:35;;;;;;;;;;;;;;;;;;;;;;;;;28950:42;;28836:164;;;;:::o;55801:201::-;55123:12;:10;:12::i;:::-;55112:23;;:7;:5;:7::i;:::-;:23;;;55104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55910:1:::1;55890:22;;:8;:22;;::::0;55882:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;55966:28;55985:8;55966:18;:28::i;:::-;55801:201:::0;:::o;71718:123::-;55123:12;:10;:12::i;:::-;55112:23;;:7;:5;:7::i;:::-;:23;;;55104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71821:14:::1;71798:6;:20;;:37;;;;;;:::i;:::-;;71718:123:::0;:::o;29258:282::-;29323:4;29379:7;29360:15;:13;:15::i;:::-;:26;;:66;;;;;29413:13;;29403:7;:23;29360:66;:153;;;;;29512:1;13200:8;29464:17;:26;29482:7;29464:26;;;;;;;;;;;;:44;:49;29360:153;29340:173;;29258:282;;;:::o;51296:105::-;51356:7;51383:10;51376:17;;51296:105;:::o;53757:98::-;53810:7;53837:10;53830:17;;53757:98;:::o;71348:95::-;71413:7;71436:1;71429:8;;71348:95;:::o;23878:1275::-;23945:7;23965:12;23980:7;23965:22;;24048:4;24029:15;:13;:15::i;:::-;:23;24025:1061;;24082:13;;24075:4;:20;24071:1015;;;24120:14;24137:17;:23;24155:4;24137:23;;;;;;;;;;;;24120:40;;24254:1;13200:8;24226:6;:24;:29;24222:845;;24891:113;24908:1;24898:6;:11;24891:113;;24951:17;:25;24969:6;;;;;;;24951:25;;;;;;;;;;;;24942:34;;24891:113;;;25037:6;25030:13;;;;;;24222:845;24097:989;24071:1015;24025:1061;25114:31;;;;;;;;;;;;;;23878:1275;;;;:::o;30421:485::-;30523:27;30552:23;30593:38;30634:15;:24;30650:7;30634:24;;;;;;;;;;;30593:65;;30811:18;30788:41;;30868:19;30862:26;30843:45;;30773:126;30421:485;;;:::o;29649:659::-;29798:11;29963:16;29956:5;29952:28;29943:37;;30123:16;30112:9;30108:32;30095:45;;30273:15;30262:9;30259:30;30251:5;30240:9;30237:20;30234:56;30224:66;;29649:659;;;;;:::o;36283:159::-;;;;;:::o;50605:311::-;50740:7;50760:16;13604:3;50786:19;:41;;50760:68;;13604:3;50854:31;50865:4;50871:2;50875:9;50854:10;:31::i;:::-;50846:40;;:62;;50839:69;;;50605:311;;;;;:::o;25701:450::-;25781:14;25949:16;25942:5;25938:28;25929:37;;26126:5;26112:11;26087:23;26083:41;26080:52;26073:5;26070:63;26060:73;;25701:450;;;;:::o;37107:158::-;;;;;:::o;74486:606::-;74690:25;74718:82;74782:9;74765:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;74755:38;;;;;;74718:28;:82::i;:::-;74690:110;;74807:14;74824:43;74838:17;74857:9;74824:13;:43::i;:::-;74807:60;;75028:15;75018:25;;:6;:25;;;75014:73;;75061:18;;;;;;;;;;;;;;75014:73;74615:477;;74486:606;;;:::o;73911:569::-;73987:4;74004:14;:4;:8;;;:14;74000:31;;74027:4;74020:11;;;;74000:31;74040:20;74090:7;74073:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;74063:36;;;;;;74040:59;;74111:9;74106:331;74130:4;:10;;;;;;;;:::i;:::-;:17;;74126:1;:21;74106:331;;;74163:20;74186:4;:10;;;;;;;;:::i;:::-;74197:1;74186:13;;;;;;;:::i;:::-;;;;;;;;74163:36;;74228:12;74212;:28;74208:222;;74295:12;74309;74278:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74268:55;;;;;;74253:70;;74208:222;;;74392:12;74406;74375:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74365:55;;;;;;74350:70;;74208:222;74154:283;74149:3;;;;;:::i;:::-;;;;74106:331;;;;74466:4;:8;;;74450:12;:24;74443:31;;;73911:569;;;;;:::o;17502:296::-;17557:7;17764:15;:13;:15::i;:::-;17748:13;;:31;17741:38;;17502:296;:::o;45128:112::-;45205:27;45215:2;45219:8;45205:27;;;;;;;;;;;;:9;:27::i;:::-;45128:112;;:::o;56162:191::-;56236:16;56255:6;;;;;;;;;;;56236:25;;56281:8;56272:6;;:17;;;;;;;;;;;;;;;;;;56336:8;56305:40;;56326:8;56305:40;;;;;;;;;;;;56225:128;56162:191;:::o;37705:716::-;37868:4;37914:2;37889:45;;;37935:19;:17;:19::i;:::-;37956:4;37962:7;37971:5;37889:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37885:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38189:1;38172:6;:13;:18;38168:235;;38218:40;;;;;;;;;;;;;;38168:235;38361:6;38355:13;38346:6;38342:2;38338:15;38331:38;37885:529;38058:54;;;38048:64;;;:6;:64;;;;38041:71;;;37705:716;;;;;;:::o;342:723::-;398:13;628:1;619:5;:10;615:53;;646:10;;;;;;;;;;;;;;;;;;;;;615:53;678:12;693:5;678:20;;709:14;734:78;749:1;741:4;:9;734:78;;767:8;;;;;:::i;:::-;;;;798:2;790:10;;;;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;822:39;;872:154;888:1;879:5;:10;872:154;;916:1;906:11;;;;;:::i;:::-;;;983:2;975:5;:10;;;;:::i;:::-;962:2;:24;;;;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1012:2;1003:11;;;;;:::i;:::-;;;872:154;;;1050:6;1036:21;;;;;342:723;;;;:::o;50306:147::-;50443:6;50306:147;;;;;:::o;64527:269::-;64596:7;64782:4;64729:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;64719:69;;;;;;64712:76;;64527:269;;;:::o;60678:231::-;60756:7;60777:17;60796:18;60818:27;60829:4;60835:9;60818:10;:27::i;:::-;60776:69;;;;60856:18;60868:5;60856:11;:18::i;:::-;60892:9;60885:16;;;;60678:231;;;;:::o;44355:689::-;44486:19;44492:2;44496:8;44486:5;:19::i;:::-;44565:1;44547:2;:14;;;:19;44543:483;;44587:11;44601:13;;44587:27;;44633:13;44655:8;44649:3;:14;44633:30;;44682:233;44713:62;44752:1;44756:2;44760:7;;;;;;44769:5;44713:30;:62::i;:::-;44708:167;;44811:40;;;;;;;;;;;;;;44708:167;44910:3;44902:5;:11;44682:233;;44997:3;44980:13;;:20;44976:34;;45002:8;;;44976:34;44568:458;;44543:483;44355:689;;;:::o;58568:1308::-;58649:7;58658:12;58903:2;58883:9;:16;:22;58879:990;;58922:9;58946;58970:7;59179:4;59168:9;59164:20;59158:27;59153:32;;59229:4;59218:9;59214:20;59208:27;59203:32;;59287:4;59276:9;59272:20;59266:27;59263:1;59258:36;59253:41;;59330:25;59341:4;59347:1;59350;59353;59330:10;:25::i;:::-;59323:32;;;;;;;;;58879:990;59397:2;59377:9;:16;:22;59373:496;;59416:9;59440:10;59652:4;59641:9;59637:20;59631:27;59626:32;;59703:4;59692:9;59688:20;59682:27;59676:33;;59745:23;59756:4;59762:1;59765:2;59745:10;:23::i;:::-;59738:30;;;;;;;;59373:496;59817:1;59821:35;59801:56;;;;58568:1308;;;;;;:::o;56839:643::-;56917:20;56908:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;56904:571;56954:7;56904:571;57015:29;57006:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;57002:473;;57061:34;;;;;;;;;;:::i;:::-;;;;;;;;57002:473;57126:35;57117:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;57113:362;;57178:41;;;;;;;;;;:::i;:::-;;;;;;;;57113:362;57250:30;57241:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;57237:238;;57297:44;;;;;;;;;;:::i;:::-;;;;;;;;57237:238;57372:30;57363:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;57359:116;;57419:44;;;;;;;;;;:::i;:::-;;;;;;;;57359:116;56839:643;;:::o;38883:2720::-;38956:20;38979:13;;38956:36;;39019:1;39007:8;:13;39003:44;;39029:18;;;;;;;;;;;;;;39003:44;39060:61;39090:1;39094:2;39098:12;39112:8;39060:21;:61::i;:::-;39604:1;12562:2;39574:1;:26;;39573:32;39561:8;:45;39535:18;:22;39554:2;39535:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;39883:139;39920:2;39974:33;39997:1;40001:2;40005:1;39974:14;:33::i;:::-;39941:30;39962:8;39941:20;:30::i;:::-;:66;39883:18;:139::i;:::-;39849:17;:31;39867:12;39849:31;;;;;;;;;;;:173;;;;40039:16;40070:11;40099:8;40084:12;:23;40070:37;;40620:16;40616:2;40612:25;40600:37;;40992:12;40952:8;40911:1;40849:25;40790:1;40729;40702:335;41117:1;41103:12;41099:20;41057:346;41158:3;41149:7;41146:16;41057:346;;41376:7;41366:8;41363:1;41336:25;41333:1;41330;41325:59;41211:1;41202:7;41198:15;41187:26;;41057:346;;;41061:77;41448:1;41436:8;:13;41432:45;;41458:19;;;;;;;;;;;;;;41432:45;41510:3;41494:13;:19;;;;39309:2216;;41535:60;41564:1;41568:2;41572:12;41586:8;41535:20;:60::i;:::-;38945:2658;38883:2720;;:::o;62177:1632::-;62308:7;62317:12;63242:66;63237:1;63229:10;;:79;63225:163;;;63341:1;63345:30;63325:51;;;;;;63225:163;63407:2;63402:1;:7;;;;:18;;;;;63418:2;63413:1;:7;;;;63402:18;63398:102;;;63453:1;63457:30;63437:51;;;;;;63398:102;63597:14;63614:24;63624:4;63630:1;63633;63636;63614:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63597:41;;63671:1;63653:20;;:6;:20;;;63649:103;;63706:1;63710:29;63690:50;;;;;;;63649:103;63772:6;63780:20;63764:37;;;;;62177:1632;;;;;;;;:::o;61172:391::-;61286:7;61295:12;61320:9;61340:7;61395:66;61391:2;61387:75;61382:80;;61499:2;61494;61489:3;61485:12;61481:21;61476:26;;61530:25;61541:4;61547:1;61550;61553;61530:10;:25::i;:::-;61523:32;;;;;;61172:391;;;;;;:::o;26253:324::-;26323:14;26556:1;26546:8;26543:15;26517:24;26513:46;26503:56;;26253:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:180;5184:77;5181:1;5174:88;5281:4;5278:1;5271:15;5305:4;5302:1;5295:15;5322:281;5405:27;5427:4;5405:27;:::i;:::-;5397:6;5393:40;5535:6;5523:10;5520:22;5499:18;5487:10;5484:34;5481:62;5478:88;;;5546:18;;:::i;:::-;5478:88;5586:10;5582:2;5575:22;5365:238;5322:281;;:::o;5609:129::-;5643:6;5670:20;;:::i;:::-;5660:30;;5699:33;5727:4;5719:6;5699:33;:::i;:::-;5609:129;;;:::o;5744:308::-;5806:4;5896:18;5888:6;5885:30;5882:56;;;5918:18;;:::i;:::-;5882:56;5956:29;5978:6;5956:29;:::i;:::-;5948:37;;6040:4;6034;6030:15;6022:23;;5744:308;;;:::o;6058:146::-;6155:6;6150:3;6145;6132:30;6196:1;6187:6;6182:3;6178:16;6171:27;6058:146;;;:::o;6210:425::-;6288:5;6313:66;6329:49;6371:6;6329:49;:::i;:::-;6313:66;:::i;:::-;6304:75;;6402:6;6395:5;6388:21;6440:4;6433:5;6429:16;6478:3;6469:6;6464:3;6460:16;6457:25;6454:112;;;6485:79;;:::i;:::-;6454:112;6575:54;6622:6;6617:3;6612;6575:54;:::i;:::-;6294:341;6210:425;;;;;:::o;6655:340::-;6711:5;6760:3;6753:4;6745:6;6741:17;6737:27;6727:122;;6768:79;;:::i;:::-;6727:122;6885:6;6872:20;6910:79;6985:3;6977:6;6970:4;6962:6;6958:17;6910:79;:::i;:::-;6901:88;;6717:278;6655:340;;;;:::o;7001:509::-;7070:6;7119:2;7107:9;7098:7;7094:23;7090:32;7087:119;;;7125:79;;:::i;:::-;7087:119;7273:1;7262:9;7258:17;7245:31;7303:18;7295:6;7292:30;7289:117;;;7325:79;;:::i;:::-;7289:117;7430:63;7485:7;7476:6;7465:9;7461:22;7430:63;:::i;:::-;7420:73;;7216:287;7001:509;;;;:::o;7516:118::-;7603:24;7621:5;7603:24;:::i;:::-;7598:3;7591:37;7516:118;;:::o;7640:222::-;7733:4;7771:2;7760:9;7756:18;7748:26;;7784:71;7852:1;7841:9;7837:17;7828:6;7784:71;:::i;:::-;7640:222;;;;:::o;7868:619::-;7945:6;7953;7961;8010:2;7998:9;7989:7;7985:23;7981:32;7978:119;;;8016:79;;:::i;:::-;7978:119;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;8391:2;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8362:118;7868:619;;;;;:::o;8493:117::-;8602:1;8599;8592:12;8643:228;8713:5;8754:2;8745:6;8740:3;8736:16;8732:25;8729:112;;;8760:79;;:::i;:::-;8729:112;8859:6;8850:15;;8643:228;;;;:::o;8877:117::-;8986:1;8983;8976:12;9000:117;9109:1;9106;9099:12;9136:552;9193:8;9203:6;9253:3;9246:4;9238:6;9234:17;9230:27;9220:122;;9261:79;;:::i;:::-;9220:122;9374:6;9361:20;9351:30;;9404:18;9396:6;9393:30;9390:117;;;9426:79;;:::i;:::-;9390:117;9540:4;9532:6;9528:17;9516:29;;9594:3;9586:4;9578:6;9574:17;9564:8;9560:32;9557:41;9554:128;;;9601:79;;:::i;:::-;9554:128;9136:552;;;;;:::o;9694:1171::-;9815:6;9823;9831;9839;9847;9896:3;9884:9;9875:7;9871:23;9867:33;9864:120;;;9903:79;;:::i;:::-;9864:120;10051:1;10040:9;10036:17;10023:31;10081:18;10073:6;10070:30;10067:117;;;10103:79;;:::i;:::-;10067:117;10208:77;10277:7;10268:6;10257:9;10253:22;10208:77;:::i;:::-;10198:87;;9994:301;10334:2;10360:53;10405:7;10396:6;10385:9;10381:22;10360:53;:::i;:::-;10350:63;;10305:118;10462:2;10488:53;10533:7;10524:6;10513:9;10509:22;10488:53;:::i;:::-;10478:63;;10433:118;10618:2;10607:9;10603:18;10590:32;10649:18;10641:6;10638:30;10635:117;;;10671:79;;:::i;:::-;10635:117;10784:64;10840:7;10831:6;10820:9;10816:22;10784:64;:::i;:::-;10766:82;;;;10561:297;9694:1171;;;;;;;;:::o;10871:118::-;10908:7;10948:34;10941:5;10937:46;10926:57;;10871:118;;;:::o;10995:122::-;11068:24;11086:5;11068:24;:::i;:::-;11061:5;11058:35;11048:63;;11107:1;11104;11097:12;11048:63;10995:122;:::o;11123:139::-;11169:5;11207:6;11194:20;11185:29;;11223:33;11250:5;11223:33;:::i;:::-;11123:139;;;;:::o;11268:474::-;11336:6;11344;11393:2;11381:9;11372:7;11368:23;11364:32;11361:119;;;11399:79;;:::i;:::-;11361:119;11519:1;11544:53;11589:7;11580:6;11569:9;11565:22;11544:53;:::i;:::-;11534:63;;11490:117;11646:2;11672:53;11717:7;11708:6;11697:9;11693:22;11672:53;:::i;:::-;11662:63;;11617:118;11268:474;;;;;:::o;11783:598::-;11886:8;11896:6;11946:3;11939:4;11931:6;11927:17;11923:27;11913:122;;11954:79;;:::i;:::-;11913:122;12067:6;12054:20;12044:30;;12097:18;12089:6;12086:30;12083:117;;;12119:79;;:::i;:::-;12083:117;12233:4;12225:6;12221:17;12209:29;;12287:3;12279:4;12271:6;12267:17;12257:8;12253:32;12250:41;12247:128;;;12294:79;;:::i;:::-;12247:128;11783:598;;;;;:::o;12387:619::-;12503:6;12511;12560:2;12548:9;12539:7;12535:23;12531:32;12528:119;;;12566:79;;:::i;:::-;12528:119;12714:1;12703:9;12699:17;12686:31;12744:18;12736:6;12733:30;12730:117;;;12766:79;;:::i;:::-;12730:117;12879:110;12981:7;12972:6;12961:9;12957:22;12879:110;:::i;:::-;12861:128;;;;12657:342;12387:619;;;;;:::o;13012:329::-;13071:6;13120:2;13108:9;13099:7;13095:23;13091:32;13088:119;;;13126:79;;:::i;:::-;13088:119;13246:1;13271:53;13316:7;13307:6;13296:9;13292:22;13271:53;:::i;:::-;13261:63;;13217:117;13012:329;;;;:::o;13347:93::-;13383:7;13423:10;13416:5;13412:22;13401:33;;13347:93;;;:::o;13446:115::-;13531:23;13548:5;13531:23;:::i;:::-;13526:3;13519:36;13446:115;;:::o;13567:1052::-;13860:4;13898:3;13887:9;13883:19;13875:27;;13948:9;13942:4;13938:20;13934:1;13923:9;13919:17;13912:47;13976:78;14049:4;14040:6;13976:78;:::i;:::-;13968:86;;14101:9;14095:4;14091:20;14086:2;14075:9;14071:18;14064:48;14129:78;14202:4;14193:6;14129:78;:::i;:::-;14121:86;;14217:72;14285:2;14274:9;14270:18;14261:6;14217:72;:::i;:::-;14299:70;14365:2;14354:9;14350:18;14341:6;14299:70;:::i;:::-;14379:71;14445:3;14434:9;14430:19;14421:6;14379:71;:::i;:::-;14460;14526:3;14515:9;14511:19;14502:6;14460:71;:::i;:::-;14541;14607:3;14596:9;14592:19;14583:6;14541:71;:::i;:::-;13567:1052;;;;;;;;;;:::o;14625:118::-;14712:24;14730:5;14712:24;:::i;:::-;14707:3;14700:37;14625:118;;:::o;14749:222::-;14842:4;14880:2;14869:9;14865:18;14857:26;;14893:71;14961:1;14950:9;14946:17;14937:6;14893:71;:::i;:::-;14749:222;;;;:::o;14977:116::-;15047:21;15062:5;15047:21;:::i;:::-;15040:5;15037:32;15027:60;;15083:1;15080;15073:12;15027:60;14977:116;:::o;15099:133::-;15142:5;15180:6;15167:20;15158:29;;15196:30;15220:5;15196:30;:::i;:::-;15099:133;;;;:::o;15238:468::-;15303:6;15311;15360:2;15348:9;15339:7;15335:23;15331:32;15328:119;;;15366:79;;:::i;:::-;15328:119;15486:1;15511:53;15556:7;15547:6;15536:9;15532:22;15511:53;:::i;:::-;15501:63;;15457:117;15613:2;15639:50;15681:7;15672:6;15661:9;15657:22;15639:50;:::i;:::-;15629:60;;15584:115;15238:468;;;;;:::o;15712:77::-;15749:7;15778:5;15767:16;;15712:77;;;:::o;15795:122::-;15868:24;15886:5;15868:24;:::i;:::-;15861:5;15858:35;15848:63;;15907:1;15904;15897:12;15848:63;15795:122;:::o;15923:139::-;15969:5;16007:6;15994:20;15985:29;;16023:33;16050:5;16023:33;:::i;:::-;15923:139;;;;:::o;16068:329::-;16127:6;16176:2;16164:9;16155:7;16151:23;16147:32;16144:119;;;16182:79;;:::i;:::-;16144:119;16302:1;16327:53;16372:7;16363:6;16352:9;16348:22;16327:53;:::i;:::-;16317:63;;16273:117;16068:329;;;;:::o;16403:101::-;16439:7;16479:18;16472:5;16468:30;16457:41;;16403:101;;;:::o;16510:115::-;16595:23;16612:5;16595:23;:::i;:::-;16590:3;16583:36;16510:115;;:::o;16631:434::-;16776:4;16814:2;16803:9;16799:18;16791:26;;16827:71;16895:1;16884:9;16880:17;16871:6;16827:71;:::i;:::-;16908:70;16974:2;16963:9;16959:18;16950:6;16908:70;:::i;:::-;16988;17054:2;17043:9;17039:18;17030:6;16988:70;:::i;:::-;16631:434;;;;;;:::o;17071:307::-;17132:4;17222:18;17214:6;17211:30;17208:56;;;17244:18;;:::i;:::-;17208:56;17282:29;17304:6;17282:29;:::i;:::-;17274:37;;17366:4;17360;17356:15;17348:23;;17071:307;;;:::o;17384:423::-;17461:5;17486:65;17502:48;17543:6;17502:48;:::i;:::-;17486:65;:::i;:::-;17477:74;;17574:6;17567:5;17560:21;17612:4;17605:5;17601:16;17650:3;17641:6;17636:3;17632:16;17629:25;17626:112;;;17657:79;;:::i;:::-;17626:112;17747:54;17794:6;17789:3;17784;17747:54;:::i;:::-;17467:340;17384:423;;;;;:::o;17826:338::-;17881:5;17930:3;17923:4;17915:6;17911:17;17907:27;17897:122;;17938:79;;:::i;:::-;17897:122;18055:6;18042:20;18080:78;18154:3;18146:6;18139:4;18131:6;18127:17;18080:78;:::i;:::-;18071:87;;17887:277;17826:338;;;;:::o;18170:943::-;18265:6;18273;18281;18289;18338:3;18326:9;18317:7;18313:23;18309:33;18306:120;;;18345:79;;:::i;:::-;18306:120;18465:1;18490:53;18535:7;18526:6;18515:9;18511:22;18490:53;:::i;:::-;18480:63;;18436:117;18592:2;18618:53;18663:7;18654:6;18643:9;18639:22;18618:53;:::i;:::-;18608:63;;18563:118;18720:2;18746:53;18791:7;18782:6;18771:9;18767:22;18746:53;:::i;:::-;18736:63;;18691:118;18876:2;18865:9;18861:18;18848:32;18907:18;18899:6;18896:30;18893:117;;;18929:79;;:::i;:::-;18893:117;19034:62;19088:7;19079:6;19068:9;19064:22;19034:62;:::i;:::-;19024:72;;18819:287;18170:943;;;;;;;:::o;19119:332::-;19240:4;19278:2;19267:9;19263:18;19255:26;;19291:71;19359:1;19348:9;19344:17;19335:6;19291:71;:::i;:::-;19372:72;19440:2;19429:9;19425:18;19416:6;19372:72;:::i;:::-;19119:332;;;;;:::o;19486:230::-;19558:5;19599:2;19590:6;19585:3;19581:16;19577:25;19574:112;;;19605:79;;:::i;:::-;19574:112;19704:6;19695:15;;19486:230;;;;:::o;19722:672::-;19825:6;19833;19841;19890:3;19878:9;19869:7;19865:23;19861:33;19858:120;;;19897:79;;:::i;:::-;19858:120;20017:1;20042:53;20087:7;20078:6;20067:9;20063:22;20042:53;:::i;:::-;20032:63;;19988:117;20144:2;20170:53;20215:7;20206:6;20195:9;20191:22;20170:53;:::i;:::-;20160:63;;20115:118;20272:2;20298:79;20369:7;20360:6;20349:9;20345:22;20298:79;:::i;:::-;20288:89;;20243:144;19722:672;;;;;:::o;20400:474::-;20468:6;20476;20525:2;20513:9;20504:7;20500:23;20496:32;20493:119;;;20531:79;;:::i;:::-;20493:119;20651:1;20676:53;20721:7;20712:6;20701:9;20697:22;20676:53;:::i;:::-;20666:63;;20622:117;20778:2;20804:53;20849:7;20840:6;20829:9;20825:22;20804:53;:::i;:::-;20794:63;;20749:118;20400:474;;;;;:::o;20880:180::-;20928:77;20925:1;20918:88;21025:4;21022:1;21015:15;21049:4;21046:1;21039:15;21066:320;21110:6;21147:1;21141:4;21137:12;21127:22;;21194:1;21188:4;21184:12;21215:18;21205:81;;21271:4;21263:6;21259:17;21249:27;;21205:81;21333:2;21325:6;21322:14;21302:18;21299:38;21296:84;;21352:18;;:::i;:::-;21296:84;21117:269;21066:320;;;:::o;21392:182::-;21532:34;21528:1;21520:6;21516:14;21509:58;21392:182;:::o;21580:366::-;21722:3;21743:67;21807:2;21802:3;21743:67;:::i;:::-;21736:74;;21819:93;21908:3;21819:93;:::i;:::-;21937:2;21932:3;21928:12;21921:19;;21580:366;;;:::o;21952:419::-;22118:4;22156:2;22145:9;22141:18;22133:26;;22205:9;22199:4;22195:20;22191:1;22180:9;22176:17;22169:47;22233:131;22359:4;22233:131;:::i;:::-;22225:139;;21952:419;;;:::o;22377:141::-;22426:4;22449:3;22441:11;;22472:3;22469:1;22462:14;22506:4;22503:1;22493:18;22485:26;;22377:141;;;:::o;22524:93::-;22561:6;22608:2;22603;22596:5;22592:14;22588:23;22578:33;;22524:93;;;:::o;22623:107::-;22667:8;22717:5;22711:4;22707:16;22686:37;;22623:107;;;;:::o;22736:393::-;22805:6;22855:1;22843:10;22839:18;22878:97;22908:66;22897:9;22878:97;:::i;:::-;22996:39;23026:8;23015:9;22996:39;:::i;:::-;22984:51;;23068:4;23064:9;23057:5;23053:21;23044:30;;23117:4;23107:8;23103:19;23096:5;23093:30;23083:40;;22812:317;;22736:393;;;;;:::o;23135:60::-;23163:3;23184:5;23177:12;;23135:60;;;:::o;23201:142::-;23251:9;23284:53;23302:34;23311:24;23329:5;23311:24;:::i;:::-;23302:34;:::i;:::-;23284:53;:::i;:::-;23271:66;;23201:142;;;:::o;23349:75::-;23392:3;23413:5;23406:12;;23349:75;;;:::o;23430:269::-;23540:39;23571:7;23540:39;:::i;:::-;23601:91;23650:41;23674:16;23650:41;:::i;:::-;23642:6;23635:4;23629:11;23601:91;:::i;:::-;23595:4;23588:105;23506:193;23430:269;;;:::o;23705:73::-;23750:3;23705:73;:::o;23784:189::-;23861:32;;:::i;:::-;23902:65;23960:6;23952;23946:4;23902:65;:::i;:::-;23837:136;23784:189;;:::o;23979:186::-;24039:120;24056:3;24049:5;24046:14;24039:120;;;24110:39;24147:1;24140:5;24110:39;:::i;:::-;24083:1;24076:5;24072:13;24063:22;;24039:120;;;23979:186;;:::o;24171:543::-;24272:2;24267:3;24264:11;24261:446;;;24306:38;24338:5;24306:38;:::i;:::-;24390:29;24408:10;24390:29;:::i;:::-;24380:8;24376:44;24573:2;24561:10;24558:18;24555:49;;;24594:8;24579:23;;24555:49;24617:80;24673:22;24691:3;24673:22;:::i;:::-;24663:8;24659:37;24646:11;24617:80;:::i;:::-;24276:431;;24261:446;24171:543;;;:::o;24720:117::-;24774:8;24824:5;24818:4;24814:16;24793:37;;24720:117;;;;:::o;24843:169::-;24887:6;24920:51;24968:1;24964:6;24956:5;24953:1;24949:13;24920:51;:::i;:::-;24916:56;25001:4;24995;24991:15;24981:25;;24894:118;24843:169;;;;:::o;25017:295::-;25093:4;25239:29;25264:3;25258:4;25239:29;:::i;:::-;25231:37;;25301:3;25298:1;25294:11;25288:4;25285:21;25277:29;;25017:295;;;;:::o;25317:1395::-;25434:37;25467:3;25434:37;:::i;:::-;25536:18;25528:6;25525:30;25522:56;;;25558:18;;:::i;:::-;25522:56;25602:38;25634:4;25628:11;25602:38;:::i;:::-;25687:67;25747:6;25739;25733:4;25687:67;:::i;:::-;25781:1;25805:4;25792:17;;25837:2;25829:6;25826:14;25854:1;25849:618;;;;26511:1;26528:6;26525:77;;;26577:9;26572:3;26568:19;26562:26;26553:35;;26525:77;26628:67;26688:6;26681:5;26628:67;:::i;:::-;26622:4;26615:81;26484:222;25819:887;;25849:618;25901:4;25897:9;25889:6;25885:22;25935:37;25967:4;25935:37;:::i;:::-;25994:1;26008:208;26022:7;26019:1;26016:14;26008:208;;;26101:9;26096:3;26092:19;26086:26;26078:6;26071:42;26152:1;26144:6;26140:14;26130:24;;26199:2;26188:9;26184:18;26171:31;;26045:4;26042:1;26038:12;26033:17;;26008:208;;;26244:6;26235:7;26232:19;26229:179;;;26302:9;26297:3;26293:19;26287:26;26345:48;26387:4;26379:6;26375:17;26364:9;26345:48;:::i;:::-;26337:6;26330:64;26252:156;26229:179;26454:1;26450;26442:6;26438:14;26434:22;26428:4;26421:36;25856:611;;;25819:887;;25409:1303;;;25317:1395;;:::o;26718:147::-;26819:11;26856:3;26841:18;;26718:147;;;;:::o;26871:114::-;;:::o;26991:398::-;27150:3;27171:83;27252:1;27247:3;27171:83;:::i;:::-;27164:90;;27263:93;27352:3;27263:93;:::i;:::-;27381:1;27376:3;27372:11;27365:18;;26991:398;;;:::o;27395:379::-;27579:3;27601:147;27744:3;27601:147;:::i;:::-;27594:154;;27765:3;27758:10;;27395:379;;;:::o;27780:180::-;27828:77;27825:1;27818:88;27925:4;27922:1;27915:15;27949:4;27946:1;27939:15;27966:191;28006:3;28025:20;28043:1;28025:20;:::i;:::-;28020:25;;28059:20;28077:1;28059:20;:::i;:::-;28054:25;;28102:1;28099;28095:9;28088:16;;28123:3;28120:1;28117:10;28114:36;;;28130:18;;:::i;:::-;28114:36;27966:191;;;;:::o;28163:316::-;28203:7;28226:20;28244:1;28226:20;:::i;:::-;28221:25;;28260:20;28278:1;28260:20;:::i;:::-;28255:25;;28416:1;28380:34;28376:42;28373:1;28370:49;28365:1;28358:9;28351:17;28347:73;28344:99;;;28423:18;;:::i;:::-;28344:99;28471:1;28468;28464:9;28453:20;;28163:316;;;;:::o;28485:180::-;28533:77;28530:1;28523:88;28630:4;28627:1;28620:15;28654:4;28651:1;28644:15;28671:185;28711:1;28728:20;28746:1;28728:20;:::i;:::-;28723:25;;28762:20;28780:1;28762:20;:::i;:::-;28757:25;;28801:1;28791:35;;28806:18;;:::i;:::-;28791:35;28848:1;28845;28841:9;28836:14;;28671:185;;;;:::o;28862:224::-;28902:3;28921:20;28939:1;28921:20;:::i;:::-;28916:25;;28955:20;28973:1;28955:20;:::i;:::-;28950:25;;28998:1;28995;28991:9;28984:16;;29021:34;29016:3;29013:43;29010:69;;;29059:18;;:::i;:::-;29010:69;28862:224;;;;:::o;29092:227::-;29132:4;29152:20;29170:1;29152:20;:::i;:::-;29147:25;;29186:20;29204:1;29186:20;:::i;:::-;29181:25;;29230:1;29227;29223:9;29215:17;;29254:34;29248:4;29245:44;29242:70;;;29292:18;;:::i;:::-;29242:70;29092:227;;;;:::o;29325:348::-;29365:7;29388:20;29406:1;29388:20;:::i;:::-;29383:25;;29422:20;29440:1;29422:20;:::i;:::-;29417:25;;29610:1;29542:66;29538:74;29535:1;29532:81;29527:1;29520:9;29513:17;29509:105;29506:131;;;29617:18;;:::i;:::-;29506:131;29665:1;29662;29658:9;29647:20;;29325:348;;;;:::o;29679:185::-;29719:1;29736:20;29754:1;29736:20;:::i;:::-;29731:25;;29770:20;29788:1;29770:20;:::i;:::-;29765:25;;29809:1;29799:35;;29814:18;;:::i;:::-;29799:35;29856:1;29853;29849:9;29844:14;;29679:185;;;;:::o;29870:180::-;29918:77;29915:1;29908:88;30015:4;30012:1;30005:15;30039:4;30036:1;30029:15;30242:186;30287:11;30336:3;30323:17;30349:33;30376:5;30349:33;:::i;:::-;30416:5;30392:29;;30299:129;30242:186;;;:::o;30434:92::-;30466:8;30513:5;30510:1;30506:13;30485:34;;30434:92;;;:::o;30532:258::-;30590:6;30619:34;30674:22;30687:8;30674:22;:::i;:::-;30662:34;;30729:4;30725:9;30718:5;30714:21;30705:30;;30778:4;30768:8;30764:19;30757:5;30754:30;30744:40;;30597:193;30532:258;;;;:::o;30796:142::-;30846:9;30879:53;30897:34;30906:24;30924:5;30906:24;:::i;:::-;30897:34;:::i;:::-;30879:53;:::i;:::-;30866:66;;30796:142;;;:::o;30944:75::-;30987:3;31008:5;31001:12;;30944:75;;;:::o;31025:262::-;31135:39;31166:7;31135:39;:::i;:::-;31196:84;31238:41;31262:16;31238:41;:::i;:::-;31231:4;31225:11;31196:84;:::i;:::-;31190:4;31183:98;31101:186;31025:262;;:::o;31293:120::-;31365:23;31382:5;31365:23;:::i;:::-;31358:5;31355:34;31345:62;;31403:1;31400;31393:12;31345:62;31293:120;:::o;31419:184::-;31463:11;31512:3;31499:17;31525:32;31551:5;31525:32;:::i;:::-;31591:5;31567:29;;31475:128;31419:184;;;:::o;31609:96::-;31643:8;31692:5;31687:3;31683:15;31662:36;;31609:96;;;:::o;31711:276::-;31769:6;31798:50;31869:24;31884:8;31869:24;:::i;:::-;31857:36;;31926:4;31922:9;31915:5;31911:21;31902:30;;31975:4;31965:8;31961:19;31954:5;31951:30;31941:40;;31776:211;31711:276;;;;:::o;31993:138::-;32041:9;32074:51;32091:33;32100:23;32117:5;32100:23;:::i;:::-;32091:33;:::i;:::-;32074:51;:::i;:::-;32061:64;;31993:138;;;:::o;32137:74::-;32179:3;32200:5;32193:12;;32137:74;;;:::o;32217:258::-;32326:37;32355:7;32326:37;:::i;:::-;32385:83;32427:40;32450:16;32427:40;:::i;:::-;32420:4;32414:11;32385:83;:::i;:::-;32379:4;32372:97;32292:183;32217:258;;:::o;32481:96::-;32515:8;32564:5;32559:3;32555:15;32534:36;;32481:96;;;:::o;32583:292::-;32641:6;32670:66;32757:24;32772:8;32757:24;:::i;:::-;32745:36;;32814:4;32810:9;32803:5;32799:21;32790:30;;32863:4;32853:8;32849:19;32842:5;32839:30;32829:40;;32648:227;32583:292;;;;:::o;32881:258::-;32990:37;33019:7;32990:37;:::i;:::-;33049:83;33091:40;33114:16;33091:40;:::i;:::-;33084:4;33078:11;33049:83;:::i;:::-;33043:4;33036:97;32956:183;32881:258;;:::o;33145:1137::-;33319:1;33313:4;33309:12;33365:1;33358:5;33354:13;33415:12;33458:42;33486:13;33458:42;:::i;:::-;33441:59;;33514:78;33578:13;33566:10;33514:78;:::i;:::-;33276:327;;;33656:1;33650:4;33646:12;33702:2;33695:5;33691:14;33753:12;33796:41;33823:13;33796:41;:::i;:::-;33779:58;;33851:77;33914:13;33902:10;33851:77;:::i;:::-;33613:326;;;33992:1;33986:4;33982:12;34038:2;34031:5;34027:14;34089:12;34132:41;34159:13;34132:41;:::i;:::-;34115:58;;34187:77;34250:13;34238:10;34187:77;:::i;:::-;33949:326;;;33145:1137;;:::o;34288:252::-;34422:112;34526:7;34520:4;34422:112;:::i;:::-;34288:252;;:::o;34546:233::-;34585:3;34608:24;34626:5;34608:24;:::i;:::-;34599:33;;34654:66;34647:5;34644:77;34641:103;;34724:18;;:::i;:::-;34641:103;34771:1;34764:5;34760:13;34753:20;;34546:233;;;:::o;34785:148::-;34887:11;34924:3;34909:18;;34785:148;;;;:::o;34939:157::-;35079:9;35075:1;35067:6;35063:14;35056:33;34939:157;:::o;35102:400::-;35262:3;35283:84;35365:1;35360:3;35283:84;:::i;:::-;35276:91;;35376:93;35465:3;35376:93;:::i;:::-;35494:1;35489:3;35485:11;35478:18;;35102:400;;;:::o;35508:381::-;35693:3;35715:148;35859:3;35715:148;:::i;:::-;35708:155;;35880:3;35873:10;;35508:381;;;:::o;35895:390::-;36001:3;36029:39;36062:5;36029:39;:::i;:::-;36084:89;36166:6;36161:3;36084:89;:::i;:::-;36077:96;;36182:65;36240:6;36235:3;36228:4;36221:5;36217:16;36182:65;:::i;:::-;36272:6;36267:3;36263:16;36256:23;;36005:280;35895:390;;;;:::o;36291:275::-;36423:3;36445:95;36536:3;36527:6;36445:95;:::i;:::-;36438:102;;36557:3;36550:10;;36291:275;;;;:::o;36596:874::-;36699:3;36736:5;36730:12;36765:36;36791:9;36765:36;:::i;:::-;36817:89;36899:6;36894:3;36817:89;:::i;:::-;36810:96;;36937:1;36926:9;36922:17;36953:1;36948:166;;;;37128:1;37123:341;;;;36915:549;;36948:166;37032:4;37028:9;37017;37013:25;37008:3;37001:38;37094:6;37087:14;37080:22;37072:6;37068:35;37063:3;37059:45;37052:52;;36948:166;;37123:341;37190:38;37222:5;37190:38;:::i;:::-;37250:1;37264:154;37278:6;37275:1;37272:13;37264:154;;;37352:7;37346:14;37342:1;37337:3;37333:11;37326:35;37402:1;37393:7;37389:15;37378:26;;37300:4;37297:1;37293:12;37288:17;;37264:154;;;37447:6;37442:3;37438:16;37431:23;;37130:334;;36915:549;;36703:767;;36596:874;;;;:::o;37476:429::-;37653:3;37675:92;37763:3;37754:6;37675:92;:::i;:::-;37668:99;;37784:95;37875:3;37866:6;37784:95;:::i;:::-;37777:102;;37896:3;37889:10;;37476:429;;;;;:::o;37911:225::-;38051:34;38047:1;38039:6;38035:14;38028:58;38120:8;38115:2;38107:6;38103:15;38096:33;37911:225;:::o;38142:366::-;38284:3;38305:67;38369:2;38364:3;38305:67;:::i;:::-;38298:74;;38381:93;38470:3;38381:93;:::i;:::-;38499:2;38494:3;38490:12;38483:19;;38142:366;;;:::o;38514:419::-;38680:4;38718:2;38707:9;38703:18;38695:26;;38767:9;38761:4;38757:20;38753:1;38742:9;38738:17;38731:47;38795:131;38921:4;38795:131;:::i;:::-;38787:139;;38514:419;;;:::o;38939:94::-;38972:8;39020:5;39016:2;39012:14;38991:35;;38939:94;;;:::o;39039:::-;39078:7;39107:20;39121:5;39107:20;:::i;:::-;39096:31;;39039:94;;;:::o;39139:100::-;39178:7;39207:26;39227:5;39207:26;:::i;:::-;39196:37;;39139:100;;;:::o;39245:157::-;39350:45;39370:24;39388:5;39370:24;:::i;:::-;39350:45;:::i;:::-;39345:3;39338:58;39245:157;;:::o;39408:256::-;39520:3;39535:75;39606:3;39597:6;39535:75;:::i;:::-;39635:2;39630:3;39626:12;39619:19;;39655:3;39648:10;;39408:256;;;;:::o;39670:117::-;39779:1;39776;39769:12;39793:117;39902:1;39899;39892:12;39916:117;40025:1;40022;40015:12;40039:740;40132:4;40138:6;40194:11;40181:25;40294:1;40288:4;40284:12;40273:8;40257:14;40253:29;40249:48;40229:18;40225:73;40215:168;;40302:79;;:::i;:::-;40215:168;40414:18;40404:8;40400:33;40392:41;;40466:4;40453:18;40443:28;;40494:18;40486:6;40483:30;40480:117;;;40516:79;;:::i;:::-;40480:117;40624:2;40618:4;40614:13;40606:21;;40681:4;40673:6;40669:17;40653:14;40649:38;40643:4;40639:49;40636:136;;;40691:79;;:::i;:::-;40636:136;40145:634;40039:740;;;;;:::o;40785:79::-;40824:7;40853:5;40842:16;;40785:79;;;:::o;40870:157::-;40975:45;40995:24;41013:5;40995:24;:::i;:::-;40975:45;:::i;:::-;40970:3;40963:58;40870:157;;:::o;41033:397::-;41173:3;41188:75;41259:3;41250:6;41188:75;:::i;:::-;41288:2;41283:3;41279:12;41272:19;;41301:75;41372:3;41363:6;41301:75;:::i;:::-;41401:2;41396:3;41392:12;41385:19;;41421:3;41414:10;;41033:397;;;;;:::o;41436:98::-;41487:6;41521:5;41515:12;41505:22;;41436:98;;;:::o;41540:168::-;41623:11;41657:6;41652:3;41645:19;41697:4;41692:3;41688:14;41673:29;;41540:168;;;;:::o;41714:373::-;41800:3;41828:38;41860:5;41828:38;:::i;:::-;41882:70;41945:6;41940:3;41882:70;:::i;:::-;41875:77;;41961:65;42019:6;42014:3;42007:4;42000:5;41996:16;41961:65;:::i;:::-;42051:29;42073:6;42051:29;:::i;:::-;42046:3;42042:39;42035:46;;41804:283;41714:373;;;;:::o;42093:640::-;42288:4;42326:3;42315:9;42311:19;42303:27;;42340:71;42408:1;42397:9;42393:17;42384:6;42340:71;:::i;:::-;42421:72;42489:2;42478:9;42474:18;42465:6;42421:72;:::i;:::-;42503;42571:2;42560:9;42556:18;42547:6;42503:72;:::i;:::-;42622:9;42616:4;42612:20;42607:2;42596:9;42592:18;42585:48;42650:76;42721:4;42712:6;42650:76;:::i;:::-;42642:84;;42093:640;;;;;;;:::o;42739:141::-;42795:5;42826:6;42820:13;42811:22;;42842:32;42868:5;42842:32;:::i;:::-;42739:141;;;;:::o;42886:349::-;42955:6;43004:2;42992:9;42983:7;42979:23;42975:32;42972:119;;;43010:79;;:::i;:::-;42972:119;43130:1;43155:63;43210:7;43201:6;43190:9;43186:22;43155:63;:::i;:::-;43145:73;;43101:127;42886:349;;;;:::o;43241:194::-;43281:4;43301:20;43319:1;43301:20;:::i;:::-;43296:25;;43335:20;43353:1;43335:20;:::i;:::-;43330:25;;43379:1;43376;43372:9;43364:17;;43403:1;43397:4;43394:11;43391:37;;;43408:18;;:::i;:::-;43391:37;43241:194;;;;:::o;43441:176::-;43473:1;43490:20;43508:1;43490:20;:::i;:::-;43485:25;;43524:20;43542:1;43524:20;:::i;:::-;43519:25;;43563:1;43553:35;;43568:18;;:::i;:::-;43553:35;43609:1;43606;43602:9;43597:14;;43441:176;;;;:::o;43623:214::-;43763:66;43759:1;43751:6;43747:14;43740:90;43623:214;:::o;43843:402::-;44003:3;44024:85;44106:2;44101:3;44024:85;:::i;:::-;44017:92;;44118:93;44207:3;44118:93;:::i;:::-;44236:2;44231:3;44227:12;44220:19;;43843:402;;;:::o;44251:522::-;44464:3;44486:148;44630:3;44486:148;:::i;:::-;44479:155;;44644:75;44715:3;44706:6;44644:75;:::i;:::-;44744:2;44739:3;44735:12;44728:19;;44764:3;44757:10;;44251:522;;;;:::o;44779:180::-;44827:77;44824:1;44817:88;44924:4;44921:1;44914:15;44948:4;44945:1;44938:15;44965:174;45105:26;45101:1;45093:6;45089:14;45082:50;44965:174;:::o;45145:366::-;45287:3;45308:67;45372:2;45367:3;45308:67;:::i;:::-;45301:74;;45384:93;45473:3;45384:93;:::i;:::-;45502:2;45497:3;45493:12;45486:19;;45145:366;;;:::o;45517:419::-;45683:4;45721:2;45710:9;45706:18;45698:26;;45770:9;45764:4;45760:20;45756:1;45745:9;45741:17;45734:47;45798:131;45924:4;45798:131;:::i;:::-;45790:139;;45517:419;;;:::o;45942:181::-;46082:33;46078:1;46070:6;46066:14;46059:57;45942:181;:::o;46129:366::-;46271:3;46292:67;46356:2;46351:3;46292:67;:::i;:::-;46285:74;;46368:93;46457:3;46368:93;:::i;:::-;46486:2;46481:3;46477:12;46470:19;;46129:366;;;:::o;46501:419::-;46667:4;46705:2;46694:9;46690:18;46682:26;;46754:9;46748:4;46744:20;46740:1;46729:9;46725:17;46718:47;46782:131;46908:4;46782:131;:::i;:::-;46774:139;;46501:419;;;:::o;46926:221::-;47066:34;47062:1;47054:6;47050:14;47043:58;47135:4;47130:2;47122:6;47118:15;47111:29;46926:221;:::o;47153:366::-;47295:3;47316:67;47380:2;47375:3;47316:67;:::i;:::-;47309:74;;47392:93;47481:3;47392:93;:::i;:::-;47510:2;47505:3;47501:12;47494:19;;47153:366;;;:::o;47525:419::-;47691:4;47729:2;47718:9;47714:18;47706:26;;47778:9;47772:4;47768:20;47764:1;47753:9;47749:17;47742:47;47806:131;47932:4;47806:131;:::i;:::-;47798:139;;47525:419;;;:::o;47950:221::-;48090:34;48086:1;48078:6;48074:14;48067:58;48159:4;48154:2;48146:6;48142:15;48135:29;47950:221;:::o;48177:366::-;48319:3;48340:67;48404:2;48399:3;48340:67;:::i;:::-;48333:74;;48416:93;48505:3;48416:93;:::i;:::-;48534:2;48529:3;48525:12;48518:19;;48177:366;;;:::o;48549:419::-;48715:4;48753:2;48742:9;48738:18;48730:26;;48802:9;48796:4;48792:20;48788:1;48777:9;48773:17;48766:47;48830:131;48956:4;48830:131;:::i;:::-;48822:139;;48549:419;;;:::o;48974:118::-;49061:24;49079:5;49061:24;:::i;:::-;49056:3;49049:37;48974:118;;:::o;49098:86::-;49133:7;49173:4;49166:5;49162:16;49151:27;;49098:86;;;:::o;49190:112::-;49273:22;49289:5;49273:22;:::i;:::-;49268:3;49261:35;49190:112;;:::o;49308:545::-;49481:4;49519:3;49508:9;49504:19;49496:27;;49533:71;49601:1;49590:9;49586:17;49577:6;49533:71;:::i;:::-;49614:68;49678:2;49667:9;49663:18;49654:6;49614:68;:::i;:::-;49692:72;49760:2;49749:9;49745:18;49736:6;49692:72;:::i;:::-;49774;49842:2;49831:9;49827:18;49818:6;49774:72;:::i;:::-;49308:545;;;;;;;:::o
Swarm Source
ipfs://e753ac089c532b933887ae2fda619562ce370b1eb6a5616feb586b4b059a9272
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.