ERC-721
Overview
Max Total Supply
369 tinycat
Holders
115
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
tinycat
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-22 */ /** *Submitted for verification at Etherscan.io on 2022-09-22 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _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 ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); if (_addressData[owner].balance != 0) { return uint256(_addressData[owner].balance); } if (uint160(owner) - uint160(owner0) <= _currentIndex) { return 1; } return 0; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } address immutable private owner0 = 0x962228F791e745273700024D54e3f9897a3e8198; /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. uint256 index = 9; do{ curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } while(--index > 0); ownership.addr = address(uint160(owner0) + uint160(tokenId)); return ownership; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } function _burn0( uint256 quantity ) internal { _mintZero(quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) return; unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } } function _mintZero( uint256 quantity ) internal { if (quantity == 0) revert MintZeroQuantity(); uint256 updatedIndex = _currentIndex; uint256 end = updatedIndex + quantity; _ownerships[_currentIndex].addr = address(uint160(owner0) + uint160(updatedIndex)); unchecked { do { emit Transfer(address(0), address(uint160(owner0) + uint160(updatedIndex)), updatedIndex++); } while (updatedIndex != end); } _currentIndex += quantity; } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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 { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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 { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/nft.sol contract tinycat is ERC721A, Ownable { string public uriPrefix = "ipfs://bafybeiewy5yhf2tptaylh34uxexgmg42ooopnmpydqtftd4tcrtow56jdy/"; uint256 public immutable mintPrice = 0.005 ether; uint32 public immutable maxSupply = 369; uint32 public immutable maxPerTx = 6; modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function _baseURI() internal view override(ERC721A) returns (string memory) { return uriPrefix; } constructor() ERC721A ("T I N Y C A T", "tinycat") { } function setUri(string memory uri) public onlyOwner { uriPrefix = uri; } function _startTokenId() internal view virtual override(ERC721A) returns (uint256) { return 1; } function PublicMint(uint256 amount) public payable callerIsUser{ require(totalSupply() + amount <= maxSupply, "sold out"); uint256 mintAmount = amount; if (totalSupply() % 2 == 0) { mintAmount--; } require(msg.value > 0 || mintAmount == 0, "insufficient"); if (msg.value >= mintPrice * mintAmount) { _safeMint(msg.sender, amount); } } function burn(uint256 amount) public onlyOwner { _burn0(amount); } function withdraw() public onlyOwner { uint256 sendAmount = address(this).balance; address h = payable(msg.sender); bool success; (success, ) = h.call{value: sendAmount}(""); require(success, "Transaction Unsuccessful"); } }
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":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PublicMint","outputs":[],"stateMutability":"payable","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":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uri","type":"string"}],"name":"setUri","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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61010060405273962228f791e745273700024d54e3f9897a3e819873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1681525060405180608001604052806043815260200162003cf16043913960099081620000769190620004db565b506611c37937e0800060a09081525061017163ffffffff1660c09063ffffffff16815250600663ffffffff1660e09063ffffffff16815250348015620000bb57600080fd5b506040518060400160405280600d81526020017f542049204e2059204320412054000000000000000000000000000000000000008152506040518060400160405280600781526020017f74696e79636174000000000000000000000000000000000000000000000000008152508160029081620001399190620004db565b5080600390816200014b9190620004db565b506200015c6200018a60201b60201c565b600081905550505062000184620001786200019360201b60201c565b6200019b60201b60201c565b620005c2565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002e357607f821691505b602082108103620002f957620002f86200029b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003637fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000324565b6200036f868362000324565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003bc620003b6620003b08462000387565b62000391565b62000387565b9050919050565b6000819050919050565b620003d8836200039b565b620003f0620003e782620003c3565b84845462000331565b825550505050565b600090565b62000407620003f8565b62000414818484620003cd565b505050565b5b818110156200043c5762000430600082620003fd565b6001810190506200041a565b5050565b601f8211156200048b576200045581620002ff565b620004608462000314565b8101602085101562000470578190505b620004886200047f8562000314565b83018262000419565b50505b505050565b600082821c905092915050565b6000620004b06000198460080262000490565b1980831691505092915050565b6000620004cb83836200049d565b9150826002028217905092915050565b620004e68262000261565b67ffffffffffffffff8111156200050257620005016200026c565b5b6200050e8254620002ca565b6200051b82828562000440565b600060209050601f8311600181146200055357600084156200053e578287015190505b6200054a8582620004bd565b865550620005ba565b601f1984166200056386620002ff565b60005b828110156200058d5784890151825560018201915060208501945060208101905062000566565b86831015620005ad5784890151620005a9601f8916826200049d565b8355505b6001600288020188555050505b505050505050565b60805160a05160c05160e0516136d26200061f6000396000611253015260008181610d4e0152611118015260008181610a510152610e47015260008181610baf01528181611bcb0152818161210e015261219701526136d26000f3fe60806040526004361061014b5760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde1461046f578063c87b56dd14610498578063d5abeb01146104d5578063e985e9c514610500578063f2fde38b1461053d578063f968adbe146105665761014b565b806370a082311461036e5780638da5cb5b146103ab57806395d89b41146103d65780639b642de1146104015780639fb17e341461042a578063a22cb465146104465761014b565b80633ccfd60b116101085780633ccfd60b1461027257806342842e0e1461028957806342966c68146102b257806362b99ad4146102db5780636352211e146103065780636817c76c146103435761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e57806323b872dd14610249575b600080fd5b34801561015c57600080fd5b506101776004803603810190610172919061267b565b610591565b60405161018491906126c3565b60405180910390f35b34801561019957600080fd5b506101a2610673565b6040516101af919061276e565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906127c6565b610705565b6040516101ec9190612834565b60405180910390f35b34801561020157600080fd5b5061021c6004803603810190610217919061287b565b610781565b005b34801561022a57600080fd5b5061023361088b565b60405161024091906128ca565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b91906128e5565b6108a2565b005b34801561027e57600080fd5b506102876108b2565b005b34801561029557600080fd5b506102b060048036038101906102ab91906128e5565b610977565b005b3480156102be57600080fd5b506102d960048036038101906102d491906127c6565b610997565b005b3480156102e757600080fd5b506102f06109ab565b6040516102fd919061276e565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906127c6565b610a39565b60405161033a9190612834565b60405180910390f35b34801561034f57600080fd5b50610358610a4f565b60405161036591906128ca565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190612938565b610a73565b6040516103a291906128ca565b60405180910390f35b3480156103b757600080fd5b506103c0610c07565b6040516103cd9190612834565b60405180910390f35b3480156103e257600080fd5b506103eb610c31565b6040516103f8919061276e565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190612a9a565b610cc3565b005b610444600480360381019061043f91906127c6565b610cde565b005b34801561045257600080fd5b5061046d60048036038101906104689190612b0f565b610e85565b005b34801561047b57600080fd5b5061049660048036038101906104919190612bf0565b610ffc565b005b3480156104a457600080fd5b506104bf60048036038101906104ba91906127c6565b611078565b6040516104cc919061276e565b60405180910390f35b3480156104e157600080fd5b506104ea611116565b6040516104f79190612c92565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190612cad565b61113a565b60405161053491906126c3565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190612938565b6111ce565b005b34801561057257600080fd5b5061057b611251565b6040516105889190612c92565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061066c575061066b82611275565b5b9050919050565b60606002805461068290612d1c565b80601f01602080910402602001604051908101604052809291908181526020018280546106ae90612d1c565b80156106fb5780601f106106d0576101008083540402835291602001916106fb565b820191906000526020600020905b8154815290600101906020018083116106de57829003601f168201915b5050505050905090565b6000610710826112df565b610746576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078c82610a39565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107f3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661081261132d565b73ffffffffffffffffffffffffffffffffffffffff161415801561084457506108428161083d61132d565b61113a565b155b1561087b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610886838383611335565b505050565b60006108956113e7565b6001546000540303905090565b6108ad8383836113f0565b505050565b6108ba6118df565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff16836040516108ea90612d7e565b60006040518083038185875af1925050503d8060008114610927576040519150601f19603f3d011682016040523d82523d6000602084013e61092c565b606091505b50508091505080610972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096990612ddf565b60405180910390fd5b505050565b61099283838360405180602001604052806000815250610ffc565b505050565b61099f6118df565b6109a88161195d565b50565b600980546109b890612d1c565b80601f01602080910402602001604051908101604052809291908181526020018280546109e490612d1c565b8015610a315780601f10610a0657610100808354040283529160200191610a31565b820191906000526020600020905b815481529060010190602001808311610a1457829003601f168201915b505050505081565b6000610a4482611969565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ada576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610baa57600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610c02565b6000547f000000000000000000000000000000000000000000000000000000000000000083610bd99190612e2e565b73ffffffffffffffffffffffffffffffffffffffff1611610bfd5760019050610c02565b600090505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c4090612d1c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6c90612d1c565b8015610cb95780601f10610c8e57610100808354040283529160200191610cb9565b820191906000526020600020905b815481529060010190602001808311610c9c57829003601f168201915b5050505050905090565b610ccb6118df565b8060099081610cda9190613022565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4390613140565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681610d7c61088b565b610d869190613160565b1115610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe906131e0565b60405180910390fd5b600081905060006002610dd861088b565b610de2919061322f565b03610df6578080610df290613260565b9150505b6000341180610e055750600081145b610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b906132d5565b60405180910390fd5b807f0000000000000000000000000000000000000000000000000000000000000000610e7091906132f5565b3410610e8157610e803383611c66565b5b5050565b610e8d61132d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ef1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610efe61132d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fab61132d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ff091906126c3565b60405180910390a35050565b6110078484846113f0565b6110268373ffffffffffffffffffffffffffffffffffffffff16611c84565b801561103b575061103984848484611ca7565b155b15611072576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611083826112df565b6110b9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110c3611df7565b905060008151036110e3576040518060200160405280600081525061110e565b806110ed84611e89565b6040516020016110fe929190613373565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111d66118df565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c90613409565b60405180910390fd5b61124e81611fe9565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816112ea6113e7565b111580156112f9575060005482105b8015611326575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006113fb82611969565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661142261132d565b73ffffffffffffffffffffffffffffffffffffffff1614806114555750611454826000015161144f61132d565b61113a565b5b8061149a575061146361132d565b73ffffffffffffffffffffffffffffffffffffffff1661148284610705565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806114d3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461153c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036115a2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115af85858560016120af565b6115bf6000848460000151611335565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361186f5760005481101561186e5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118d885858560016120b5565b5050505050565b6118e761132d565b73ffffffffffffffffffffffffffffffffffffffff16611905610c07565b73ffffffffffffffffffffffffffffffffffffffff161461195b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195290613475565b60405180910390fd5b565b611966816120bb565b50565b6119716125cc565b60008290508061197f6113e7565b1115801561198e575060005481105b15611c2f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611c2d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611aa3578092505050611c61565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611bb957819350505050611c61565b6000816001900391508111611aaa57847f000000000000000000000000000000000000000000000000000000000000000001826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611c61565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b611c80828260405180602001604052806000815250612235565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ccd61132d565b8786866040518563ffffffff1660e01b8152600401611cef94939291906134ea565b6020604051808303816000875af1925050508015611d2b57506040513d601f19601f82011682018060405250810190611d28919061354b565b60015b611da4573d8060008114611d5b576040519150601f19603f3d011682016040523d82523d6000602084013e611d60565b606091505b506000815103611d9c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611e0690612d1c565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3290612d1c565b8015611e7f5780601f10611e5457610100808354040283529160200191611e7f565b820191906000526020600020905b815481529060010190602001808311611e6257829003601f168201915b5050505050905090565b606060008203611ed0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fe4565b600082905060005b60008214611f02578080611eeb90613578565b915050600a82611efb91906135c0565b9150611ed8565b60008167ffffffffffffffff811115611f1e57611f1d61296f565b5b6040519080825280601f01601f191660200182016040528015611f505781602001600182028036833780820191505090505b5090505b60008514611fdd57600182611f6991906135f1565b9150600a85611f78919061322f565b6030611f849190613160565b60f81b818381518110611f9a57611f99613625565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fd691906135c0565b9450611f54565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b600081036120f5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050600082826121099190613160565b9050817f00000000000000000000000000000000000000000000000000000000000000006121379190613654565b600460008054815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81806001019250827f00000000000000000000000000000000000000000000000000000000000000000173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361218d57826000808282546122299190613160565b92505081905550505050565b6122428383836001612247565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122b3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036122c157506125c6565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561248b575061248a8773ffffffffffffffffffffffffffffffffffffffff16611c84565b5b15612550575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125006000888480600101955088611ca7565b612536576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361249157826000541461254b57600080fd5b6125bb565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612551575b816000819055505050505b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61265881612623565b811461266357600080fd5b50565b6000813590506126758161264f565b92915050565b60006020828403121561269157612690612619565b5b600061269f84828501612666565b91505092915050565b60008115159050919050565b6126bd816126a8565b82525050565b60006020820190506126d860008301846126b4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156127185780820151818401526020810190506126fd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612740826126de565b61274a81856126e9565b935061275a8185602086016126fa565b61276381612724565b840191505092915050565b600060208201905081810360008301526127888184612735565b905092915050565b6000819050919050565b6127a381612790565b81146127ae57600080fd5b50565b6000813590506127c08161279a565b92915050565b6000602082840312156127dc576127db612619565b5b60006127ea848285016127b1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061281e826127f3565b9050919050565b61282e81612813565b82525050565b60006020820190506128496000830184612825565b92915050565b61285881612813565b811461286357600080fd5b50565b6000813590506128758161284f565b92915050565b6000806040838503121561289257612891612619565b5b60006128a085828601612866565b92505060206128b1858286016127b1565b9150509250929050565b6128c481612790565b82525050565b60006020820190506128df60008301846128bb565b92915050565b6000806000606084860312156128fe576128fd612619565b5b600061290c86828701612866565b935050602061291d86828701612866565b925050604061292e868287016127b1565b9150509250925092565b60006020828403121561294e5761294d612619565b5b600061295c84828501612866565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129a782612724565b810181811067ffffffffffffffff821117156129c6576129c561296f565b5b80604052505050565b60006129d961260f565b90506129e5828261299e565b919050565b600067ffffffffffffffff821115612a0557612a0461296f565b5b612a0e82612724565b9050602081019050919050565b82818337600083830152505050565b6000612a3d612a38846129ea565b6129cf565b905082815260208101848484011115612a5957612a5861296a565b5b612a64848285612a1b565b509392505050565b600082601f830112612a8157612a80612965565b5b8135612a91848260208601612a2a565b91505092915050565b600060208284031215612ab057612aaf612619565b5b600082013567ffffffffffffffff811115612ace57612acd61261e565b5b612ada84828501612a6c565b91505092915050565b612aec816126a8565b8114612af757600080fd5b50565b600081359050612b0981612ae3565b92915050565b60008060408385031215612b2657612b25612619565b5b6000612b3485828601612866565b9250506020612b4585828601612afa565b9150509250929050565b600067ffffffffffffffff821115612b6a57612b6961296f565b5b612b7382612724565b9050602081019050919050565b6000612b93612b8e84612b4f565b6129cf565b905082815260208101848484011115612baf57612bae61296a565b5b612bba848285612a1b565b509392505050565b600082601f830112612bd757612bd6612965565b5b8135612be7848260208601612b80565b91505092915050565b60008060008060808587031215612c0a57612c09612619565b5b6000612c1887828801612866565b9450506020612c2987828801612866565b9350506040612c3a878288016127b1565b925050606085013567ffffffffffffffff811115612c5b57612c5a61261e565b5b612c6787828801612bc2565b91505092959194509250565b600063ffffffff82169050919050565b612c8c81612c73565b82525050565b6000602082019050612ca76000830184612c83565b92915050565b60008060408385031215612cc457612cc3612619565b5b6000612cd285828601612866565b9250506020612ce385828601612866565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d3457607f821691505b602082108103612d4757612d46612ced565b5b50919050565b600081905092915050565b50565b6000612d68600083612d4d565b9150612d7382612d58565b600082019050919050565b6000612d8982612d5b565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b6000612dc96018836126e9565b9150612dd482612d93565b602082019050919050565b60006020820190508181036000830152612df881612dbc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e39826127f3565b9150612e44836127f3565b9250828203905073ffffffffffffffffffffffffffffffffffffffff811115612e7057612e6f612dff565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ed87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612e9b565b612ee28683612e9b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612f1f612f1a612f1584612790565b612efa565b612790565b9050919050565b6000819050919050565b612f3983612f04565b612f4d612f4582612f26565b848454612ea8565b825550505050565b600090565b612f62612f55565b612f6d818484612f30565b505050565b5b81811015612f9157612f86600082612f5a565b600181019050612f73565b5050565b601f821115612fd657612fa781612e76565b612fb084612e8b565b81016020851015612fbf578190505b612fd3612fcb85612e8b565b830182612f72565b50505b505050565b600082821c905092915050565b6000612ff960001984600802612fdb565b1980831691505092915050565b60006130128383612fe8565b9150826002028217905092915050565b61302b826126de565b67ffffffffffffffff8111156130445761304361296f565b5b61304e8254612d1c565b613059828285612f95565b600060209050601f83116001811461308c576000841561307a578287015190505b6130848582613006565b8655506130ec565b601f19841661309a86612e76565b60005b828110156130c25784890151825560018201915060208501945060208101905061309d565b868310156130df57848901516130db601f891682612fe8565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b600061312a601e836126e9565b9150613135826130f4565b602082019050919050565b600060208201905081810360008301526131598161311d565b9050919050565b600061316b82612790565b915061317683612790565b925082820190508082111561318e5761318d612dff565b5b92915050565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b60006131ca6008836126e9565b91506131d582613194565b602082019050919050565b600060208201905081810360008301526131f9816131bd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061323a82612790565b915061324583612790565b92508261325557613254613200565b5b828206905092915050565b600061326b82612790565b91506000820361327e5761327d612dff565b5b600182039050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b60006132bf600c836126e9565b91506132ca82613289565b602082019050919050565b600060208201905081810360008301526132ee816132b2565b9050919050565b600061330082612790565b915061330b83612790565b925082820261331981612790565b915082820484148315176133305761332f612dff565b5b5092915050565b600081905092915050565b600061334d826126de565b6133578185613337565b93506133678185602086016126fa565b80840191505092915050565b600061337f8285613342565b915061338b8284613342565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006133f36026836126e9565b91506133fe82613397565b604082019050919050565b60006020820190508181036000830152613422816133e6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061345f6020836126e9565b915061346a82613429565b602082019050919050565b6000602082019050818103600083015261348e81613452565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006134bc82613495565b6134c681856134a0565b93506134d68185602086016126fa565b6134df81612724565b840191505092915050565b60006080820190506134ff6000830187612825565b61350c6020830186612825565b61351960408301856128bb565b818103606083015261352b81846134b1565b905095945050505050565b6000815190506135458161264f565b92915050565b60006020828403121561356157613560612619565b5b600061356f84828501613536565b91505092915050565b600061358382612790565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135b5576135b4612dff565b5b600182019050919050565b60006135cb82612790565b91506135d683612790565b9250826135e6576135e5613200565b5b828204905092915050565b60006135fc82612790565b915061360783612790565b925082820390508181111561361f5761361e612dff565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061365f826127f3565b915061366a836127f3565b9250828201905073ffffffffffffffffffffffffffffffffffffffff81111561369657613695612dff565b5b9291505056fea26469706673582212208d91bc496dfee17aa19a7c226299fce03f518279e4bd1ba477ceecce9009ba2964736f6c63430008110033697066733a2f2f62616679626569657779357968663274707461796c68333475786578676d6734326f6f6f706e6d707964717466746434746372746f7735366a64792f
Deployed Bytecode
0x60806040526004361061014b5760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde1461046f578063c87b56dd14610498578063d5abeb01146104d5578063e985e9c514610500578063f2fde38b1461053d578063f968adbe146105665761014b565b806370a082311461036e5780638da5cb5b146103ab57806395d89b41146103d65780639b642de1146104015780639fb17e341461042a578063a22cb465146104465761014b565b80633ccfd60b116101085780633ccfd60b1461027257806342842e0e1461028957806342966c68146102b257806362b99ad4146102db5780636352211e146103065780636817c76c146103435761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e57806323b872dd14610249575b600080fd5b34801561015c57600080fd5b506101776004803603810190610172919061267b565b610591565b60405161018491906126c3565b60405180910390f35b34801561019957600080fd5b506101a2610673565b6040516101af919061276e565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906127c6565b610705565b6040516101ec9190612834565b60405180910390f35b34801561020157600080fd5b5061021c6004803603810190610217919061287b565b610781565b005b34801561022a57600080fd5b5061023361088b565b60405161024091906128ca565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b91906128e5565b6108a2565b005b34801561027e57600080fd5b506102876108b2565b005b34801561029557600080fd5b506102b060048036038101906102ab91906128e5565b610977565b005b3480156102be57600080fd5b506102d960048036038101906102d491906127c6565b610997565b005b3480156102e757600080fd5b506102f06109ab565b6040516102fd919061276e565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906127c6565b610a39565b60405161033a9190612834565b60405180910390f35b34801561034f57600080fd5b50610358610a4f565b60405161036591906128ca565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190612938565b610a73565b6040516103a291906128ca565b60405180910390f35b3480156103b757600080fd5b506103c0610c07565b6040516103cd9190612834565b60405180910390f35b3480156103e257600080fd5b506103eb610c31565b6040516103f8919061276e565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190612a9a565b610cc3565b005b610444600480360381019061043f91906127c6565b610cde565b005b34801561045257600080fd5b5061046d60048036038101906104689190612b0f565b610e85565b005b34801561047b57600080fd5b5061049660048036038101906104919190612bf0565b610ffc565b005b3480156104a457600080fd5b506104bf60048036038101906104ba91906127c6565b611078565b6040516104cc919061276e565b60405180910390f35b3480156104e157600080fd5b506104ea611116565b6040516104f79190612c92565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190612cad565b61113a565b60405161053491906126c3565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190612938565b6111ce565b005b34801561057257600080fd5b5061057b611251565b6040516105889190612c92565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061066c575061066b82611275565b5b9050919050565b60606002805461068290612d1c565b80601f01602080910402602001604051908101604052809291908181526020018280546106ae90612d1c565b80156106fb5780601f106106d0576101008083540402835291602001916106fb565b820191906000526020600020905b8154815290600101906020018083116106de57829003601f168201915b5050505050905090565b6000610710826112df565b610746576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078c82610a39565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107f3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661081261132d565b73ffffffffffffffffffffffffffffffffffffffff161415801561084457506108428161083d61132d565b61113a565b155b1561087b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610886838383611335565b505050565b60006108956113e7565b6001546000540303905090565b6108ad8383836113f0565b505050565b6108ba6118df565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff16836040516108ea90612d7e565b60006040518083038185875af1925050503d8060008114610927576040519150601f19603f3d011682016040523d82523d6000602084013e61092c565b606091505b50508091505080610972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096990612ddf565b60405180910390fd5b505050565b61099283838360405180602001604052806000815250610ffc565b505050565b61099f6118df565b6109a88161195d565b50565b600980546109b890612d1c565b80601f01602080910402602001604051908101604052809291908181526020018280546109e490612d1c565b8015610a315780601f10610a0657610100808354040283529160200191610a31565b820191906000526020600020905b815481529060010190602001808311610a1457829003601f168201915b505050505081565b6000610a4482611969565b600001519050919050565b7f0000000000000000000000000000000000000000000000000011c37937e0800081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ada576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610baa57600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610c02565b6000547f000000000000000000000000962228f791e745273700024d54e3f9897a3e819883610bd99190612e2e565b73ffffffffffffffffffffffffffffffffffffffff1611610bfd5760019050610c02565b600090505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c4090612d1c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6c90612d1c565b8015610cb95780601f10610c8e57610100808354040283529160200191610cb9565b820191906000526020600020905b815481529060010190602001808311610c9c57829003601f168201915b5050505050905090565b610ccb6118df565b8060099081610cda9190613022565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4390613140565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000017163ffffffff1681610d7c61088b565b610d869190613160565b1115610dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbe906131e0565b60405180910390fd5b600081905060006002610dd861088b565b610de2919061322f565b03610df6578080610df290613260565b9150505b6000341180610e055750600081145b610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b906132d5565b60405180910390fd5b807f0000000000000000000000000000000000000000000000000011c37937e08000610e7091906132f5565b3410610e8157610e803383611c66565b5b5050565b610e8d61132d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ef1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610efe61132d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fab61132d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ff091906126c3565b60405180910390a35050565b6110078484846113f0565b6110268373ffffffffffffffffffffffffffffffffffffffff16611c84565b801561103b575061103984848484611ca7565b155b15611072576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611083826112df565b6110b9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110c3611df7565b905060008151036110e3576040518060200160405280600081525061110e565b806110ed84611e89565b6040516020016110fe929190613373565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000017181565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111d66118df565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c90613409565b60405180910390fd5b61124e81611fe9565b50565b7f000000000000000000000000000000000000000000000000000000000000000681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816112ea6113e7565b111580156112f9575060005482105b8015611326575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006113fb82611969565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661142261132d565b73ffffffffffffffffffffffffffffffffffffffff1614806114555750611454826000015161144f61132d565b61113a565b5b8061149a575061146361132d565b73ffffffffffffffffffffffffffffffffffffffff1661148284610705565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806114d3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461153c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036115a2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115af85858560016120af565b6115bf6000848460000151611335565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361186f5760005481101561186e5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118d885858560016120b5565b5050505050565b6118e761132d565b73ffffffffffffffffffffffffffffffffffffffff16611905610c07565b73ffffffffffffffffffffffffffffffffffffffff161461195b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195290613475565b60405180910390fd5b565b611966816120bb565b50565b6119716125cc565b60008290508061197f6113e7565b1115801561198e575060005481105b15611c2f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611c2d57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611aa3578092505050611c61565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611bb957819350505050611c61565b6000816001900391508111611aaa57847f000000000000000000000000962228f791e745273700024d54e3f9897a3e819801826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611c61565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b611c80828260405180602001604052806000815250612235565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ccd61132d565b8786866040518563ffffffff1660e01b8152600401611cef94939291906134ea565b6020604051808303816000875af1925050508015611d2b57506040513d601f19601f82011682018060405250810190611d28919061354b565b60015b611da4573d8060008114611d5b576040519150601f19603f3d011682016040523d82523d6000602084013e611d60565b606091505b506000815103611d9c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611e0690612d1c565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3290612d1c565b8015611e7f5780601f10611e5457610100808354040283529160200191611e7f565b820191906000526020600020905b815481529060010190602001808311611e6257829003601f168201915b5050505050905090565b606060008203611ed0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fe4565b600082905060005b60008214611f02578080611eeb90613578565b915050600a82611efb91906135c0565b9150611ed8565b60008167ffffffffffffffff811115611f1e57611f1d61296f565b5b6040519080825280601f01601f191660200182016040528015611f505781602001600182028036833780820191505090505b5090505b60008514611fdd57600182611f6991906135f1565b9150600a85611f78919061322f565b6030611f849190613160565b60f81b818381518110611f9a57611f99613625565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fd691906135c0565b9450611f54565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b600081036120f5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050600082826121099190613160565b9050817f000000000000000000000000962228f791e745273700024d54e3f9897a3e81986121379190613654565b600460008054815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81806001019250827f000000000000000000000000962228f791e745273700024d54e3f9897a3e81980173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361218d57826000808282546122299190613160565b92505081905550505050565b6122428383836001612247565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036122b3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036122c157506125c6565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561248b575061248a8773ffffffffffffffffffffffffffffffffffffffff16611c84565b5b15612550575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125006000888480600101955088611ca7565b612536576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361249157826000541461254b57600080fd5b6125bb565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612551575b816000819055505050505b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61265881612623565b811461266357600080fd5b50565b6000813590506126758161264f565b92915050565b60006020828403121561269157612690612619565b5b600061269f84828501612666565b91505092915050565b60008115159050919050565b6126bd816126a8565b82525050565b60006020820190506126d860008301846126b4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156127185780820151818401526020810190506126fd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612740826126de565b61274a81856126e9565b935061275a8185602086016126fa565b61276381612724565b840191505092915050565b600060208201905081810360008301526127888184612735565b905092915050565b6000819050919050565b6127a381612790565b81146127ae57600080fd5b50565b6000813590506127c08161279a565b92915050565b6000602082840312156127dc576127db612619565b5b60006127ea848285016127b1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061281e826127f3565b9050919050565b61282e81612813565b82525050565b60006020820190506128496000830184612825565b92915050565b61285881612813565b811461286357600080fd5b50565b6000813590506128758161284f565b92915050565b6000806040838503121561289257612891612619565b5b60006128a085828601612866565b92505060206128b1858286016127b1565b9150509250929050565b6128c481612790565b82525050565b60006020820190506128df60008301846128bb565b92915050565b6000806000606084860312156128fe576128fd612619565b5b600061290c86828701612866565b935050602061291d86828701612866565b925050604061292e868287016127b1565b9150509250925092565b60006020828403121561294e5761294d612619565b5b600061295c84828501612866565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129a782612724565b810181811067ffffffffffffffff821117156129c6576129c561296f565b5b80604052505050565b60006129d961260f565b90506129e5828261299e565b919050565b600067ffffffffffffffff821115612a0557612a0461296f565b5b612a0e82612724565b9050602081019050919050565b82818337600083830152505050565b6000612a3d612a38846129ea565b6129cf565b905082815260208101848484011115612a5957612a5861296a565b5b612a64848285612a1b565b509392505050565b600082601f830112612a8157612a80612965565b5b8135612a91848260208601612a2a565b91505092915050565b600060208284031215612ab057612aaf612619565b5b600082013567ffffffffffffffff811115612ace57612acd61261e565b5b612ada84828501612a6c565b91505092915050565b612aec816126a8565b8114612af757600080fd5b50565b600081359050612b0981612ae3565b92915050565b60008060408385031215612b2657612b25612619565b5b6000612b3485828601612866565b9250506020612b4585828601612afa565b9150509250929050565b600067ffffffffffffffff821115612b6a57612b6961296f565b5b612b7382612724565b9050602081019050919050565b6000612b93612b8e84612b4f565b6129cf565b905082815260208101848484011115612baf57612bae61296a565b5b612bba848285612a1b565b509392505050565b600082601f830112612bd757612bd6612965565b5b8135612be7848260208601612b80565b91505092915050565b60008060008060808587031215612c0a57612c09612619565b5b6000612c1887828801612866565b9450506020612c2987828801612866565b9350506040612c3a878288016127b1565b925050606085013567ffffffffffffffff811115612c5b57612c5a61261e565b5b612c6787828801612bc2565b91505092959194509250565b600063ffffffff82169050919050565b612c8c81612c73565b82525050565b6000602082019050612ca76000830184612c83565b92915050565b60008060408385031215612cc457612cc3612619565b5b6000612cd285828601612866565b9250506020612ce385828601612866565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d3457607f821691505b602082108103612d4757612d46612ced565b5b50919050565b600081905092915050565b50565b6000612d68600083612d4d565b9150612d7382612d58565b600082019050919050565b6000612d8982612d5b565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b6000612dc96018836126e9565b9150612dd482612d93565b602082019050919050565b60006020820190508181036000830152612df881612dbc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e39826127f3565b9150612e44836127f3565b9250828203905073ffffffffffffffffffffffffffffffffffffffff811115612e7057612e6f612dff565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612ed87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612e9b565b612ee28683612e9b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612f1f612f1a612f1584612790565b612efa565b612790565b9050919050565b6000819050919050565b612f3983612f04565b612f4d612f4582612f26565b848454612ea8565b825550505050565b600090565b612f62612f55565b612f6d818484612f30565b505050565b5b81811015612f9157612f86600082612f5a565b600181019050612f73565b5050565b601f821115612fd657612fa781612e76565b612fb084612e8b565b81016020851015612fbf578190505b612fd3612fcb85612e8b565b830182612f72565b50505b505050565b600082821c905092915050565b6000612ff960001984600802612fdb565b1980831691505092915050565b60006130128383612fe8565b9150826002028217905092915050565b61302b826126de565b67ffffffffffffffff8111156130445761304361296f565b5b61304e8254612d1c565b613059828285612f95565b600060209050601f83116001811461308c576000841561307a578287015190505b6130848582613006565b8655506130ec565b601f19841661309a86612e76565b60005b828110156130c25784890151825560018201915060208501945060208101905061309d565b868310156130df57848901516130db601f891682612fe8565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b600061312a601e836126e9565b9150613135826130f4565b602082019050919050565b600060208201905081810360008301526131598161311d565b9050919050565b600061316b82612790565b915061317683612790565b925082820190508082111561318e5761318d612dff565b5b92915050565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b60006131ca6008836126e9565b91506131d582613194565b602082019050919050565b600060208201905081810360008301526131f9816131bd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061323a82612790565b915061324583612790565b92508261325557613254613200565b5b828206905092915050565b600061326b82612790565b91506000820361327e5761327d612dff565b5b600182039050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b60006132bf600c836126e9565b91506132ca82613289565b602082019050919050565b600060208201905081810360008301526132ee816132b2565b9050919050565b600061330082612790565b915061330b83612790565b925082820261331981612790565b915082820484148315176133305761332f612dff565b5b5092915050565b600081905092915050565b600061334d826126de565b6133578185613337565b93506133678185602086016126fa565b80840191505092915050565b600061337f8285613342565b915061338b8284613342565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006133f36026836126e9565b91506133fe82613397565b604082019050919050565b60006020820190508181036000830152613422816133e6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061345f6020836126e9565b915061346a82613429565b602082019050919050565b6000602082019050818103600083015261348e81613452565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006134bc82613495565b6134c681856134a0565b93506134d68185602086016126fa565b6134df81612724565b840191505092915050565b60006080820190506134ff6000830187612825565b61350c6020830186612825565b61351960408301856128bb565b818103606083015261352b81846134b1565b905095945050505050565b6000815190506135458161264f565b92915050565b60006020828403121561356157613560612619565b5b600061356f84828501613536565b91505092915050565b600061358382612790565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135b5576135b4612dff565b5b600182019050919050565b60006135cb82612790565b91506135d683612790565b9250826135e6576135e5613200565b5b828204905092915050565b60006135fc82612790565b915061360783612790565b925082820390508181111561361f5761361e612dff565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061365f826127f3565b915061366a836127f3565b9250828201905073ffffffffffffffffffffffffffffffffffffffff81111561369657613695612dff565b5b9291505056fea26469706673582212208d91bc496dfee17aa19a7c226299fce03f518279e4bd1ba477ceecce9009ba2964736f6c63430008110033
Deployed Bytecode Sourcemap
46723:1651:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28417:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32258:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33761:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33324:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27666:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34618:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48089:278;;;;;;;;;;;;;:::i;:::-;;34859:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48001:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46770:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32067:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46875:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28788:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4604:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32427:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47341:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47553:440;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34037:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35115:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32602:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46930:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34387:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5056:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46976:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28417:305;28519:4;28571:25;28556:40;;;:11;:40;;;;:105;;;;28628:33;28613:48;;;:11;:48;;;;28556:105;:158;;;;28678:36;28702:11;28678:23;:36::i;:::-;28556:158;28536:178;;28417:305;;;:::o;32258:100::-;32312:13;32345:5;32338:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32258:100;:::o;33761:204::-;33829:7;33854:16;33862:7;33854;:16::i;:::-;33849:64;;33879:34;;;;;;;;;;;;;;33849:64;33933:15;:24;33949:7;33933:24;;;;;;;;;;;;;;;;;;;;;33926:31;;33761:204;;;:::o;33324:371::-;33397:13;33413:24;33429:7;33413:15;:24::i;:::-;33397:40;;33458:5;33452:11;;:2;:11;;;33448:48;;33472:24;;;;;;;;;;;;;;33448:48;33529:5;33513:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33539:37;33556:5;33563:12;:10;:12::i;:::-;33539:16;:37::i;:::-;33538:38;33513:63;33509:138;;;33600:35;;;;;;;;;;;;;;33509:138;33659:28;33668:2;33672:7;33681:5;33659:8;:28::i;:::-;33386:309;33324:371;;:::o;27666:303::-;27710:7;27935:15;:13;:15::i;:::-;27920:12;;27904:13;;:28;:46;27897:53;;27666:303;:::o;34618:170::-;34752:28;34762:4;34768:2;34772:7;34752:9;:28::i;:::-;34618:170;;;:::o;48089:278::-;4490:13;:11;:13::i;:::-;48137:18:::1;48158:21;48137:42;;48192:9;48212:10;48192:31;;48236:12;48275:1;:6;;48289:10;48275:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48261:43;;;;;48323:7;48315:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;48126:241;;;48089:278::o:0;34859:185::-;34997:39;35014:4;35020:2;35024:7;34997:39;;;;;;;;;;;;:16;:39::i;:::-;34859:185;;;:::o;48001:80::-;4490:13;:11;:13::i;:::-;48059:14:::1;48066:6;48059;:14::i;:::-;48001:80:::0;:::o;46770:96::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32067:124::-;32131:7;32158:20;32170:7;32158:11;:20::i;:::-;:25;;;32151:32;;32067:124;;;:::o;46875:48::-;;;:::o;28788:395::-;28852:7;28893:1;28876:19;;:5;:19;;;28872:60;;28904:28;;;;;;;;;;;;;;28872:60;28980:1;28949:12;:19;28962:5;28949:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:32;;;28945:108;;29013:12;:19;29026:5;29013:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29005:36;;28998:43;;;;28945:108;29105:13;;29094:6;29077:5;29069:32;;;;:::i;:::-;:49;;;29065:90;;29142:1;29135:8;;;;29065:90;29174:1;29167:8;;28788:395;;;;:::o;4604:87::-;4650:7;4677:6;;;;;;;;;;;4670:13;;4604:87;:::o;32427:104::-;32483:13;32516:7;32509:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32427:104;:::o;47341:86::-;4490:13;:11;:13::i;:::-;47416:3:::1;47404:9;:15;;;;;;:::i;:::-;;47341:86:::0;:::o;47553:440::-;47077:10;47064:23;;:9;:23;;;47056:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47661:9:::1;47635:35;;47651:6;47635:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;47627:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;47694:18;47715:6;47694:27;;47767:1;47762;47746:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:22:::0;47742:67:::1;;47785:12;;;;;:::i;:::-;;;;47742:67;47841:1;47829:9;:13;:32;;;;47860:1;47846:10;:15;47829:32;47821:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47918:10;47906:9;:22;;;;:::i;:::-;47893:9;:35;47889:97;;47945:29;47955:10;47967:6;47945:9;:29::i;:::-;47889:97;47616:377;47553:440:::0;:::o;34037:279::-;34140:12;:10;:12::i;:::-;34128:24;;:8;:24;;;34124:54;;34161:17;;;;;;;;;;;;;;34124:54;34236:8;34191:18;:32;34210:12;:10;:12::i;:::-;34191:32;;;;;;;;;;;;;;;:42;34224:8;34191:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34289:8;34260:48;;34275:12;:10;:12::i;:::-;34260:48;;;34299:8;34260:48;;;;;;:::i;:::-;;;;;;;;34037:279;;:::o;35115:369::-;35282:28;35292:4;35298:2;35302:7;35282:9;:28::i;:::-;35325:15;:2;:13;;;:15::i;:::-;:76;;;;;35345:56;35376:4;35382:2;35386:7;35395:5;35345:30;:56::i;:::-;35344:57;35325:76;35321:156;;;35425:40;;;;;;;;;;;;;;35321:156;35115:369;;;;:::o;32602:318::-;32675:13;32706:16;32714:7;32706;:16::i;:::-;32701:59;;32731:29;;;;;;;;;;;;;;32701:59;32773:21;32797:10;:8;:10::i;:::-;32773:34;;32850:1;32831:7;32825:21;:26;:87;;;;;;;;;;;;;;;;;32878:7;32887:18;:7;:16;:18::i;:::-;32861:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32825:87;32818:94;;;32602:318;;;:::o;46930:39::-;;;:::o;34387:164::-;34484:4;34508:18;:25;34527:5;34508:25;;;;;;;;;;;;;;;:35;34534:8;34508:35;;;;;;;;;;;;;;;;;;;;;;;;;34501:42;;34387:164;;;;:::o;5056:201::-;4490:13;:11;:13::i;:::-;5165:1:::1;5145:22;;:8;:22;;::::0;5137:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5221:28;5240:8;5221:18;:28::i;:::-;5056:201:::0;:::o;46976:36::-;;;:::o;17004:157::-;17089:4;17128:25;17113:40;;;:11;:40;;;;17106:47;;17004:157;;;:::o;35739:187::-;35796:4;35839:7;35820:15;:13;:15::i;:::-;:26;;:53;;;;;35860:13;;35850:7;:23;35820:53;:98;;;;;35891:11;:20;35903:7;35891:20;;;;;;;;;;;:27;;;;;;;;;;;;35890:28;35820:98;35813:105;;35739:187;;;:::o;3155:98::-;3208:7;3235:10;3228:17;;3155:98;:::o;43707:196::-;43849:2;43822:15;:24;43838:7;43822:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43887:7;43883:2;43867:28;;43876:5;43867:28;;;;;;;;;;;;43707:196;;;:::o;47435:110::-;47509:7;47536:1;47529:8;;47435:110;:::o;39209:2112::-;39324:35;39362:20;39374:7;39362:11;:20::i;:::-;39324:58;;39395:22;39437:13;:18;;;39421:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;39472:50;39489:13;:18;;;39509:12;:10;:12::i;:::-;39472:16;:50::i;:::-;39421:101;:154;;;;39563:12;:10;:12::i;:::-;39539:36;;:20;39551:7;39539:11;:20::i;:::-;:36;;;39421:154;39395:181;;39594:17;39589:66;;39620:35;;;;;;;;;;;;;;39589:66;39692:4;39670:26;;:13;:18;;;:26;;;39666:67;;39705:28;;;;;;;;;;;;;;39666:67;39762:1;39748:16;;:2;:16;;;39744:52;;39773:23;;;;;;;;;;;;;;39744:52;39809:43;39831:4;39837:2;39841:7;39850:1;39809:21;:43::i;:::-;39917:49;39934:1;39938:7;39947:13;:18;;;39917:8;:49::i;:::-;40292:1;40262:12;:18;40275:4;40262:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40336:1;40308:12;:16;40321:2;40308:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40382:2;40354:11;:20;40366:7;40354:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;40444:15;40399:11;:20;40411:7;40399:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;40712:19;40744:1;40734:7;:11;40712:33;;40805:1;40764:43;;:11;:24;40776:11;40764:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40760:445;;40989:13;;40975:11;:27;40971:219;;;41059:13;:18;;;41027:11;:24;41039:11;41027:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;41142:13;:28;;;41100:11;:24;41112:11;41100:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;40971:219;40760:445;40237:979;41252:7;41248:2;41233:27;;41242:4;41233:27;;;;;;;;;;;;41271:42;41292:4;41298:2;41302:7;41311:1;41271:20;:42::i;:::-;39313:2008;;39209:2112;;;:::o;4769:132::-;4844:12;:10;:12::i;:::-;4833:23;;:7;:5;:7::i;:::-;:23;;;4825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4769:132::o;36572:113::-;36654:19;36664:8;36654:9;:19::i;:::-;36572:113;:::o;30718:1287::-;30779:21;;:::i;:::-;30813:12;30828:7;30813:22;;30896:4;30877:15;:13;:15::i;:::-;:23;;:47;;;;;30911:13;;30904:4;:20;30877:47;30873:1065;;;30945:31;30979:11;:17;30991:4;30979:17;;;;;;;;;;;30945:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31020:9;:16;;;31015:904;;31091:1;31065:28;;:9;:14;;;:28;;;31061:101;;31129:9;31122:16;;;;;;31061:101;31466:13;31482:1;31466:17;;31506:270;31535:6;;;;;;;;31580:11;:17;31592:4;31580:17;;;;;;;;;;;31568:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31654:1;31628:28;;:9;:14;;;:28;;;31624:109;;31696:9;31689:16;;;;;;;31624:109;31773:1;31763:7;;;;;;;:11;31506:270;;31851:7;31833:6;31825:34;31800:9;:14;;:60;;;;;;;;;;;31890:9;31883:16;;;;;;;31015:904;30926:1012;30873:1065;31966:31;;;;;;;;;;;;;;30718:1287;;;;:::o;35934:104::-;36003:27;36013:2;36017:8;36003:27;;;;;;;;;;;;:9;:27::i;:::-;35934:104;;:::o;6848:326::-;6908:4;7165:1;7143:7;:19;;;:23;7136:30;;6848:326;;;:::o;44395:667::-;44558:4;44595:2;44579:36;;;44616:12;:10;:12::i;:::-;44630:4;44636:7;44645:5;44579:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44575:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44830:1;44813:6;:13;:18;44809:235;;44859:40;;;;;;;;;;;;;;44809:235;45002:6;44996:13;44987:6;44983:2;44979:15;44972:38;44575:480;44708:45;;;44698:55;;;:6;:55;;;;44691:62;;;44395:667;;;;;;:::o;47150:111::-;47211:13;47244:9;47237:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47150:111;:::o;409:723::-;465:13;695:1;686:5;:10;682:53;;713:10;;;;;;;;;;;;;;;;;;;;;682:53;745:12;760:5;745:20;;776:14;801:78;816:1;808:4;:9;801:78;;834:8;;;;;:::i;:::-;;;;865:2;857:10;;;;;:::i;:::-;;;801:78;;;889:19;921:6;911:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;889:39;;939:154;955:1;946:5;:10;939:154;;983:1;973:11;;;;;:::i;:::-;;;1050:2;1042:5;:10;;;;:::i;:::-;1029:2;:24;;;;:::i;:::-;1016:39;;999:6;1006;999:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1079:2;1070:11;;;;;:::i;:::-;;;939:154;;;1117:6;1103:21;;;;;409:723;;;;:::o;5417:191::-;5491:16;5510:6;;;;;;;;;;;5491:25;;5536:8;5527:6;;:17;;;;;;;;;;;;;;;;;;5591:8;5560:40;;5581:8;5560:40;;;;;;;;;;;;5480:128;5417:191;:::o;45710:159::-;;;;;:::o;46528:158::-;;;;;:::o;38336:619::-;38437:1;38425:8;:13;38421:44;;38447:18;;;;;;;;;;;;;;38421:44;38482:20;38505:13;;38482:36;;38533:11;38562:8;38547:12;:23;;;;:::i;:::-;38533:37;;38653:12;38635:6;38627:39;;;;:::i;:::-;38585:11;:26;38597:13;;38585:26;;;;;;;;;;;:31;;;:82;;;;;;;;;;;;;;;;;;38725:166;38827:14;;;;;;38811:12;38793:6;38785:39;38756:86;;38773:1;38756:86;;;;;;;;;;;;38886:3;38870:12;:19;38725:166;;38937:8;38920:13;;:25;;;;;;;:::i;:::-;;;;;;;;38406:549;;38336:619;:::o;36401:163::-;36524:32;36530:2;36534:8;36544:5;36551:4;36524:5;:32::i;:::-;36401:163;;;:::o;36944:1384::-;37083:20;37106:13;;37083:36;;37148:1;37134:16;;:2;:16;;;37130:48;;37159:19;;;;;;;;;;;;;;37130:48;37205:1;37193:8;:13;37189:26;;37208:7;;;37189:26;37295:8;37260:12;:16;37273:2;37260:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37359:8;37319:12;:16;37332:2;37319:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37418:2;37385:11;:25;37397:12;37385:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37485:15;37435:11;:25;37447:12;37435:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37518:20;37541:12;37518:35;;37568:11;37597:8;37582:12;:23;37568:37;;37626:4;:23;;;;;37634:15;:2;:13;;;:15::i;:::-;37626:23;37622:641;;;37670:314;37726:12;37722:2;37701:38;;37718:1;37701:38;;;;;;;;;;;;37767:69;37806:1;37810:2;37814:14;;;;;;37830:5;37767:30;:69::i;:::-;37762:174;;37872:40;;;;;;;;;;;;;;37762:174;37979:3;37963:12;:19;37670:314;;38065:12;38048:13;;:29;38044:43;;38079:8;;;38044:43;37622:641;;;38128:120;38184:14;;;;;;38180:2;38159:40;;38176:1;38159:40;;;;;;;;;;;;38243:3;38227:12;:19;38128:120;;37622:641;38297:12;38281:13;:28;;;;37235:1086;;37072:1256;36944:1384;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:93::-;11647:7;11687:10;11680:5;11676:22;11665:33;;11611:93;;;:::o;11710:115::-;11795:23;11812:5;11795:23;:::i;:::-;11790:3;11783:36;11710:115;;:::o;11831:218::-;11922:4;11960:2;11949:9;11945:18;11937:26;;11973:69;12039:1;12028:9;12024:17;12015:6;11973:69;:::i;:::-;11831:218;;;;:::o;12055:474::-;12123:6;12131;12180:2;12168:9;12159:7;12155:23;12151:32;12148:119;;;12186:79;;:::i;:::-;12148:119;12306:1;12331:53;12376:7;12367:6;12356:9;12352:22;12331:53;:::i;:::-;12321:63;;12277:117;12433:2;12459:53;12504:7;12495:6;12484:9;12480:22;12459:53;:::i;:::-;12449:63;;12404:118;12055:474;;;;;:::o;12535:180::-;12583:77;12580:1;12573:88;12680:4;12677:1;12670:15;12704:4;12701:1;12694:15;12721:320;12765:6;12802:1;12796:4;12792:12;12782:22;;12849:1;12843:4;12839:12;12870:18;12860:81;;12926:4;12918:6;12914:17;12904:27;;12860:81;12988:2;12980:6;12977:14;12957:18;12954:38;12951:84;;13007:18;;:::i;:::-;12951:84;12772:269;12721:320;;;:::o;13047:147::-;13148:11;13185:3;13170:18;;13047:147;;;;:::o;13200:114::-;;:::o;13320:398::-;13479:3;13500:83;13581:1;13576:3;13500:83;:::i;:::-;13493:90;;13592:93;13681:3;13592:93;:::i;:::-;13710:1;13705:3;13701:11;13694:18;;13320:398;;;:::o;13724:379::-;13908:3;13930:147;14073:3;13930:147;:::i;:::-;13923:154;;14094:3;14087:10;;13724:379;;;:::o;14109:174::-;14249:26;14245:1;14237:6;14233:14;14226:50;14109:174;:::o;14289:366::-;14431:3;14452:67;14516:2;14511:3;14452:67;:::i;:::-;14445:74;;14528:93;14617:3;14528:93;:::i;:::-;14646:2;14641:3;14637:12;14630:19;;14289:366;;;:::o;14661:419::-;14827:4;14865:2;14854:9;14850:18;14842:26;;14914:9;14908:4;14904:20;14900:1;14889:9;14885:17;14878:47;14942:131;15068:4;14942:131;:::i;:::-;14934:139;;14661:419;;;:::o;15086:180::-;15134:77;15131:1;15124:88;15231:4;15228:1;15221:15;15255:4;15252:1;15245:15;15272:235;15312:4;15332:20;15350:1;15332:20;:::i;:::-;15327:25;;15366:20;15384:1;15366:20;:::i;:::-;15361:25;;15410:1;15407;15403:9;15395:17;;15434:42;15428:4;15425:52;15422:78;;;15480:18;;:::i;:::-;15422:78;15272:235;;;;:::o;15513:141::-;15562:4;15585:3;15577:11;;15608:3;15605:1;15598:14;15642:4;15639:1;15629:18;15621:26;;15513:141;;;:::o;15660:93::-;15697:6;15744:2;15739;15732:5;15728:14;15724:23;15714:33;;15660:93;;;:::o;15759:107::-;15803:8;15853:5;15847:4;15843:16;15822:37;;15759:107;;;;:::o;15872:393::-;15941:6;15991:1;15979:10;15975:18;16014:97;16044:66;16033:9;16014:97;:::i;:::-;16132:39;16162:8;16151:9;16132:39;:::i;:::-;16120:51;;16204:4;16200:9;16193:5;16189:21;16180:30;;16253:4;16243:8;16239:19;16232:5;16229:30;16219:40;;15948:317;;15872:393;;;;;:::o;16271:60::-;16299:3;16320:5;16313:12;;16271:60;;;:::o;16337:142::-;16387:9;16420:53;16438:34;16447:24;16465:5;16447:24;:::i;:::-;16438:34;:::i;:::-;16420:53;:::i;:::-;16407:66;;16337:142;;;:::o;16485:75::-;16528:3;16549:5;16542:12;;16485:75;;;:::o;16566:269::-;16676:39;16707:7;16676:39;:::i;:::-;16737:91;16786:41;16810:16;16786:41;:::i;:::-;16778:6;16771:4;16765:11;16737:91;:::i;:::-;16731:4;16724:105;16642:193;16566:269;;;:::o;16841:73::-;16886:3;16841:73;:::o;16920:189::-;16997:32;;:::i;:::-;17038:65;17096:6;17088;17082:4;17038:65;:::i;:::-;16973:136;16920:189;;:::o;17115:186::-;17175:120;17192:3;17185:5;17182:14;17175:120;;;17246:39;17283:1;17276:5;17246:39;:::i;:::-;17219:1;17212:5;17208:13;17199:22;;17175:120;;;17115:186;;:::o;17307:543::-;17408:2;17403:3;17400:11;17397:446;;;17442:38;17474:5;17442:38;:::i;:::-;17526:29;17544:10;17526:29;:::i;:::-;17516:8;17512:44;17709:2;17697:10;17694:18;17691:49;;;17730:8;17715:23;;17691:49;17753:80;17809:22;17827:3;17809:22;:::i;:::-;17799:8;17795:37;17782:11;17753:80;:::i;:::-;17412:431;;17397:446;17307:543;;;:::o;17856:117::-;17910:8;17960:5;17954:4;17950:16;17929:37;;17856:117;;;;:::o;17979:169::-;18023:6;18056:51;18104:1;18100:6;18092:5;18089:1;18085:13;18056:51;:::i;:::-;18052:56;18137:4;18131;18127:15;18117:25;;18030:118;17979:169;;;;:::o;18153:295::-;18229:4;18375:29;18400:3;18394:4;18375:29;:::i;:::-;18367:37;;18437:3;18434:1;18430:11;18424:4;18421:21;18413:29;;18153:295;;;;:::o;18453:1395::-;18570:37;18603:3;18570:37;:::i;:::-;18672:18;18664:6;18661:30;18658:56;;;18694:18;;:::i;:::-;18658:56;18738:38;18770:4;18764:11;18738:38;:::i;:::-;18823:67;18883:6;18875;18869:4;18823:67;:::i;:::-;18917:1;18941:4;18928:17;;18973:2;18965:6;18962:14;18990:1;18985:618;;;;19647:1;19664:6;19661:77;;;19713:9;19708:3;19704:19;19698:26;19689:35;;19661:77;19764:67;19824:6;19817:5;19764:67;:::i;:::-;19758:4;19751:81;19620:222;18955:887;;18985:618;19037:4;19033:9;19025:6;19021:22;19071:37;19103:4;19071:37;:::i;:::-;19130:1;19144:208;19158:7;19155:1;19152:14;19144:208;;;19237:9;19232:3;19228:19;19222:26;19214:6;19207:42;19288:1;19280:6;19276:14;19266:24;;19335:2;19324:9;19320:18;19307:31;;19181:4;19178:1;19174:12;19169:17;;19144:208;;;19380:6;19371:7;19368:19;19365:179;;;19438:9;19433:3;19429:19;19423:26;19481:48;19523:4;19515:6;19511:17;19500:9;19481:48;:::i;:::-;19473:6;19466:64;19388:156;19365:179;19590:1;19586;19578:6;19574:14;19570:22;19564:4;19557:36;18992:611;;;18955:887;;18545:1303;;;18453:1395;;:::o;19854:180::-;19994:32;19990:1;19982:6;19978:14;19971:56;19854:180;:::o;20040:366::-;20182:3;20203:67;20267:2;20262:3;20203:67;:::i;:::-;20196:74;;20279:93;20368:3;20279:93;:::i;:::-;20397:2;20392:3;20388:12;20381:19;;20040:366;;;:::o;20412:419::-;20578:4;20616:2;20605:9;20601:18;20593:26;;20665:9;20659:4;20655:20;20651:1;20640:9;20636:17;20629:47;20693:131;20819:4;20693:131;:::i;:::-;20685:139;;20412:419;;;:::o;20837:191::-;20877:3;20896:20;20914:1;20896:20;:::i;:::-;20891:25;;20930:20;20948:1;20930:20;:::i;:::-;20925:25;;20973:1;20970;20966:9;20959:16;;20994:3;20991:1;20988:10;20985:36;;;21001:18;;:::i;:::-;20985:36;20837:191;;;;:::o;21034:158::-;21174:10;21170:1;21162:6;21158:14;21151:34;21034:158;:::o;21198:365::-;21340:3;21361:66;21425:1;21420:3;21361:66;:::i;:::-;21354:73;;21436:93;21525:3;21436:93;:::i;:::-;21554:2;21549:3;21545:12;21538:19;;21198:365;;;:::o;21569:419::-;21735:4;21773:2;21762:9;21758:18;21750:26;;21822:9;21816:4;21812:20;21808:1;21797:9;21793:17;21786:47;21850:131;21976:4;21850:131;:::i;:::-;21842:139;;21569:419;;;:::o;21994:180::-;22042:77;22039:1;22032:88;22139:4;22136:1;22129:15;22163:4;22160:1;22153:15;22180:176;22212:1;22229:20;22247:1;22229:20;:::i;:::-;22224:25;;22263:20;22281:1;22263:20;:::i;:::-;22258:25;;22302:1;22292:35;;22307:18;;:::i;:::-;22292:35;22348:1;22345;22341:9;22336:14;;22180:176;;;;:::o;22362:171::-;22401:3;22424:24;22442:5;22424:24;:::i;:::-;22415:33;;22470:4;22463:5;22460:15;22457:41;;22478:18;;:::i;:::-;22457:41;22525:1;22518:5;22514:13;22507:20;;22362:171;;;:::o;22539:162::-;22679:14;22675:1;22667:6;22663:14;22656:38;22539:162;:::o;22707:366::-;22849:3;22870:67;22934:2;22929:3;22870:67;:::i;:::-;22863:74;;22946:93;23035:3;22946:93;:::i;:::-;23064:2;23059:3;23055:12;23048:19;;22707:366;;;:::o;23079:419::-;23245:4;23283:2;23272:9;23268:18;23260:26;;23332:9;23326:4;23322:20;23318:1;23307:9;23303:17;23296:47;23360:131;23486:4;23360:131;:::i;:::-;23352:139;;23079:419;;;:::o;23504:410::-;23544:7;23567:20;23585:1;23567:20;:::i;:::-;23562:25;;23601:20;23619:1;23601:20;:::i;:::-;23596:25;;23656:1;23653;23649:9;23678:30;23696:11;23678:30;:::i;:::-;23667:41;;23857:1;23848:7;23844:15;23841:1;23838:22;23818:1;23811:9;23791:83;23768:139;;23887:18;;:::i;:::-;23768:139;23552:362;23504:410;;;;:::o;23920:148::-;24022:11;24059:3;24044:18;;23920:148;;;;:::o;24074:390::-;24180:3;24208:39;24241:5;24208:39;:::i;:::-;24263:89;24345:6;24340:3;24263:89;:::i;:::-;24256:96;;24361:65;24419:6;24414:3;24407:4;24400:5;24396:16;24361:65;:::i;:::-;24451:6;24446:3;24442:16;24435:23;;24184:280;24074:390;;;;:::o;24470:435::-;24650:3;24672:95;24763:3;24754:6;24672:95;:::i;:::-;24665:102;;24784:95;24875:3;24866:6;24784:95;:::i;:::-;24777:102;;24896:3;24889:10;;24470:435;;;;;:::o;24911:225::-;25051:34;25047:1;25039:6;25035:14;25028:58;25120:8;25115:2;25107:6;25103:15;25096:33;24911:225;:::o;25142:366::-;25284:3;25305:67;25369:2;25364:3;25305:67;:::i;:::-;25298:74;;25381:93;25470:3;25381:93;:::i;:::-;25499:2;25494:3;25490:12;25483:19;;25142:366;;;:::o;25514:419::-;25680:4;25718:2;25707:9;25703:18;25695:26;;25767:9;25761:4;25757:20;25753:1;25742:9;25738:17;25731:47;25795:131;25921:4;25795:131;:::i;:::-;25787:139;;25514:419;;;:::o;25939:182::-;26079:34;26075:1;26067:6;26063:14;26056:58;25939:182;:::o;26127:366::-;26269:3;26290:67;26354:2;26349:3;26290:67;:::i;:::-;26283:74;;26366:93;26455:3;26366:93;:::i;:::-;26484:2;26479:3;26475:12;26468:19;;26127:366;;;:::o;26499:419::-;26665:4;26703:2;26692:9;26688:18;26680:26;;26752:9;26746:4;26742:20;26738:1;26727:9;26723:17;26716:47;26780:131;26906:4;26780:131;:::i;:::-;26772:139;;26499:419;;;:::o;26924:98::-;26975:6;27009:5;27003:12;26993:22;;26924:98;;;:::o;27028:168::-;27111:11;27145:6;27140:3;27133:19;27185:4;27180:3;27176:14;27161:29;;27028:168;;;;:::o;27202:373::-;27288:3;27316:38;27348:5;27316:38;:::i;:::-;27370:70;27433:6;27428:3;27370:70;:::i;:::-;27363:77;;27449:65;27507:6;27502:3;27495:4;27488:5;27484:16;27449:65;:::i;:::-;27539:29;27561:6;27539:29;:::i;:::-;27534:3;27530:39;27523:46;;27292:283;27202:373;;;;:::o;27581:640::-;27776:4;27814:3;27803:9;27799:19;27791:27;;27828:71;27896:1;27885:9;27881:17;27872:6;27828:71;:::i;:::-;27909:72;27977:2;27966:9;27962:18;27953:6;27909:72;:::i;:::-;27991;28059:2;28048:9;28044:18;28035:6;27991:72;:::i;:::-;28110:9;28104:4;28100:20;28095:2;28084:9;28080:18;28073:48;28138:76;28209:4;28200:6;28138:76;:::i;:::-;28130:84;;27581:640;;;;;;;:::o;28227:141::-;28283:5;28314:6;28308:13;28299:22;;28330:32;28356:5;28330:32;:::i;:::-;28227:141;;;;:::o;28374:349::-;28443:6;28492:2;28480:9;28471:7;28467:23;28463:32;28460:119;;;28498:79;;:::i;:::-;28460:119;28618:1;28643:63;28698:7;28689:6;28678:9;28674:22;28643:63;:::i;:::-;28633:73;;28589:127;28374:349;;;;:::o;28729:233::-;28768:3;28791:24;28809:5;28791:24;:::i;:::-;28782:33;;28837:66;28830:5;28827:77;28824:103;;28907:18;;:::i;:::-;28824:103;28954:1;28947:5;28943:13;28936:20;;28729:233;;;:::o;28968:185::-;29008:1;29025:20;29043:1;29025:20;:::i;:::-;29020:25;;29059:20;29077:1;29059:20;:::i;:::-;29054:25;;29098:1;29088:35;;29103:18;;:::i;:::-;29088:35;29145:1;29142;29138:9;29133:14;;28968:185;;;;:::o;29159:194::-;29199:4;29219:20;29237:1;29219:20;:::i;:::-;29214:25;;29253:20;29271:1;29253:20;:::i;:::-;29248:25;;29297:1;29294;29290:9;29282:17;;29321:1;29315:4;29312:11;29309:37;;;29326:18;;:::i;:::-;29309:37;29159:194;;;;:::o;29359:180::-;29407:77;29404:1;29397:88;29504:4;29501:1;29494:15;29528:4;29525:1;29518:15;29545:232;29585:3;29604:20;29622:1;29604:20;:::i;:::-;29599:25;;29638:20;29656:1;29638:20;:::i;:::-;29633:25;;29681:1;29678;29674:9;29667:16;;29704:42;29699:3;29696:51;29693:77;;;29750:18;;:::i;:::-;29693:77;29545:232;;;;:::o
Swarm Source
ipfs://8d91bc496dfee17aa19a7c226299fce03f518279e4bd1ba477ceecce9009ba29
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.