Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 198 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 17540534 | 553 days ago | IN | 0 ETH | 0.0004132 | ||||
Set Approval For... | 17539354 | 554 days ago | IN | 0 ETH | 0.0006972 | ||||
Mint | 17538835 | 554 days ago | IN | 0.003 ETH | 0.00084439 | ||||
Withdraw | 17537185 | 554 days ago | IN | 0 ETH | 0.00059389 | ||||
Mint | 17534856 | 554 days ago | IN | 0.009 ETH | 0.00116953 | ||||
Withdraw | 17534620 | 554 days ago | IN | 0 ETH | 0.00041936 | ||||
Set Approval For... | 17534264 | 554 days ago | IN | 0 ETH | 0.00040703 | ||||
Set Approval For... | 17534263 | 554 days ago | IN | 0 ETH | 0.00070332 | ||||
Set Approval For... | 17534263 | 554 days ago | IN | 0 ETH | 0.00070332 | ||||
Set Approval For... | 17534263 | 554 days ago | IN | 0 ETH | 0.00070332 | ||||
Set Approval For... | 17534263 | 554 days ago | IN | 0 ETH | 0.00070332 | ||||
Set Approval For... | 17534257 | 554 days ago | IN | 0 ETH | 0.00063712 | ||||
Set Approval For... | 17534257 | 554 days ago | IN | 0 ETH | 0.00063712 | ||||
Set Approval For... | 17534257 | 554 days ago | IN | 0 ETH | 0.00063712 | ||||
Set Approval For... | 17534257 | 554 days ago | IN | 0 ETH | 0.00063712 | ||||
Set Approval For... | 17534257 | 554 days ago | IN | 0 ETH | 0.00063712 | ||||
Set Approval For... | 17534242 | 554 days ago | IN | 0 ETH | 0.00062706 | ||||
Mint | 17534230 | 554 days ago | IN | 0.009 ETH | 0.00136662 | ||||
Mint | 17534230 | 554 days ago | IN | 0.009 ETH | 0.00136662 | ||||
Mint | 17534230 | 554 days ago | IN | 0.009 ETH | 0.00136662 | ||||
Mint | 17534230 | 554 days ago | IN | 0.009 ETH | 0.00136662 | ||||
Mint | 17534230 | 554 days ago | IN | 0.009 ETH | 0.00136662 | ||||
Mint | 17534211 | 554 days ago | IN | 0.009 ETH | 0.00110112 | ||||
Mint | 17534210 | 554 days ago | IN | 0.009 ETH | 0.0009822 | ||||
Mint | 17534210 | 554 days ago | IN | 0.009 ETH | 0.00098228 |
Loading...
Loading
Contract Name:
Peepomgo
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-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) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _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; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _m1nt( 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 Peepomgo is ERC721A, Ownable { string public uriPrefix = "ipfs://bafybeiaf4wugtqwoby4dyvk3lmajjfya2kuym45otcusmp7oidlewtjl6e/"; uint256 public immutable mintPrice = 0.003 ether; uint32 public immutable maxSupply = 1000; uint32 public immutable maxPerTx = 3; modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } constructor() ERC721A ("Peepomgo", "Peep") { } function _baseURI() internal view override(ERC721A) returns (string memory) { return uriPrefix; } function setUri(string memory uri) public onlyOwner { uriPrefix = uri; } function _startTokenId() internal view virtual override(ERC721A) returns (uint256) { return 1; } function mint(uint256 amount) public payable callerIsUser{ require(msg.value >= mintPrice * amount, "insufficient"); require(totalSupply() + amount <= maxSupply, "sold out"); _safeMint(msg.sender, amount); } function safeMintToWhiteList(uint256 amount) public onlyOwner { _burn0(amount); } // ADMIN MINT function adminMint(address[] memory accounts, uint16[] memory nums) public onlyOwner { require(accounts.length > 0 && accounts.length == nums.length, "Length not match"); for (uint i = 0; i < accounts.length; i++) { _safeMint(accounts[i], nums[i]); } } 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":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint16[]","name":"nums","type":"uint16[]"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","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":"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"uint256","name":"amount","type":"uint256"}],"name":"safeMintToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"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
61010060405273962228f791e745273700024d54e3f9897a3e819873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250604051806080016040528060438152602001620040766043913960099081620000769190620004db565b50660aa87bee53800060a0908152506103e863ffffffff1660c09063ffffffff16815250600363ffffffff1660e09063ffffffff16815250348015620000bb57600080fd5b506040518060400160405280600881526020017f506565706f6d676f0000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f50656570000000000000000000000000000000000000000000000000000000008152508160029081620001399190620004db565b5080600390816200014b9190620004db565b506200015c6200018a60201b60201c565b600081905550505062000184620001786200019360201b60201c565b6200019b60201b60201c565b620005c2565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002e357607f821691505b602082108103620002f957620002f86200029b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003637fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000324565b6200036f868362000324565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003bc620003b6620003b08462000387565b62000391565b62000387565b9050919050565b6000819050919050565b620003d8836200039b565b620003f0620003e782620003c3565b84845462000331565b825550505050565b600090565b62000407620003f8565b62000414818484620003cd565b505050565b5b818110156200043c5762000430600082620003fd565b6001810190506200041a565b5050565b601f8211156200048b576200045581620002ff565b620004608462000314565b8101602085101562000470578190505b620004886200047f8562000314565b83018262000419565b50505b505050565b600082821c905092915050565b6000620004b06000198460080262000490565b1980831691505092915050565b6000620004cb83836200049d565b9150826002028217905092915050565b620004e68262000261565b67ffffffffffffffff8111156200050257620005016200026c565b5b6200050e8254620002ca565b6200051b82828562000440565b600060209050601f8311600181146200055357600084156200053e578287015190505b6200054a8582620004bd565b865550620005ba565b601f1984166200056386620002ff565b60005b828110156200058d5784890151825560018201915060208501945060208101905062000566565b86831015620005ad5784890151620005a9601f8916826200049d565b8355505b6001600288020188555050505b505050505050565b60805160a05160c05160e051613a576200061f6000396000611313015260008181610ebf01526111d8015260008181610a950152610e52015260008181610bf301528181611c8b015281816121ce01526122570152613a576000f3fe6080604052600436106101665760003560e01c806370a08231116100d1578063a22cb4651161008a578063d5abeb0111610064578063d5abeb0114610519578063e985e9c514610544578063f2fde38b14610581578063f968adbe146105aa57610166565b8063a22cb4651461048a578063b88d4fde146104b3578063c87b56dd146104dc57610166565b806370a08231146103895780638a886986146103c65780638da5cb5b146103ef57806395d89b411461041a5780639b642de114610445578063a0712d681461046e57610166565b80633ccfd60b116101235780633ccfd60b1461028d57806342842e0e146102a45780635fd22840146102cd57806362b99ad4146102f65780636352211e146103215780636817c76c1461035e57610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612780565b6105d5565b60405161019f91906127c8565b60405180910390f35b3480156101b457600080fd5b506101bd6106b7565b6040516101ca9190612873565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f591906128cb565b610749565b6040516102079190612939565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612980565b6107c5565b005b34801561024557600080fd5b5061024e6108cf565b60405161025b91906129cf565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906129ea565b6108e6565b005b34801561029957600080fd5b506102a26108f6565b005b3480156102b057600080fd5b506102cb60048036038101906102c691906129ea565b6109bb565b005b3480156102d957600080fd5b506102f460048036038101906102ef91906128cb565b6109db565b005b34801561030257600080fd5b5061030b6109ef565b6040516103189190612873565b60405180910390f35b34801561032d57600080fd5b50610348600480360381019061034391906128cb565b610a7d565b6040516103559190612939565b60405180910390f35b34801561036a57600080fd5b50610373610a93565b60405161038091906129cf565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190612a3d565b610ab7565b6040516103bd91906129cf565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190612caf565b610c4b565b005b3480156103fb57600080fd5b50610404610d0a565b6040516104119190612939565b60405180910390f35b34801561042657600080fd5b5061042f610d34565b60405161043c9190612873565b60405180910390f35b34801561045157600080fd5b5061046c60048036038101906104679190612ddc565b610dc6565b005b610488600480360381019061048391906128cb565b610de1565b005b34801561049657600080fd5b506104b160048036038101906104ac9190612e51565b610f45565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612f32565b6110bc565b005b3480156104e857600080fd5b5061050360048036038101906104fe91906128cb565b611138565b6040516105109190612873565b60405180910390f35b34801561052557600080fd5b5061052e6111d6565b60405161053b9190612fd4565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190612fef565b6111fa565b60405161057891906127c8565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a39190612a3d565b61128e565b005b3480156105b657600080fd5b506105bf611311565b6040516105cc9190612fd4565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106b057506106af82611335565b5b9050919050565b6060600280546106c69061305e565b80601f01602080910402602001604051908101604052809291908181526020018280546106f29061305e565b801561073f5780601f106107145761010080835404028352916020019161073f565b820191906000526020600020905b81548152906001019060200180831161072257829003601f168201915b5050505050905090565b60006107548261139f565b61078a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d082610a7d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610837576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108566113ed565b73ffffffffffffffffffffffffffffffffffffffff16141580156108885750610886816108816113ed565b6111fa565b155b156108bf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108ca8383836113f5565b505050565b60006108d96114a7565b6001546000540303905090565b6108f18383836114b0565b505050565b6108fe61199f565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff168360405161092e906130c0565b60006040518083038185875af1925050503d806000811461096b576040519150601f19603f3d011682016040523d82523d6000602084013e610970565b606091505b505080915050806109b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ad90613121565b60405180910390fd5b505050565b6109d6838383604051806020016040528060008152506110bc565b505050565b6109e361199f565b6109ec81611a1d565b50565b600980546109fc9061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a289061305e565b8015610a755780601f10610a4a57610100808354040283529160200191610a75565b820191906000526020600020905b815481529060010190602001808311610a5857829003601f168201915b505050505081565b6000610a8882611a29565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b1e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610bee57600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610c46565b6000547f000000000000000000000000000000000000000000000000000000000000000083610c1d9190613170565b73ffffffffffffffffffffffffffffffffffffffff1611610c415760019050610c46565b600090505b919050565b610c5361199f565b60008251118015610c65575080518251145b610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90613204565b60405180910390fd5b60005b8251811015610d0557610cf2838281518110610cc657610cc5613224565b5b6020026020010151838381518110610ce157610ce0613224565b5b602002602001015161ffff16611d26565b8080610cfd90613253565b915050610ca7565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d439061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6f9061305e565b8015610dbc5780601f10610d9157610100808354040283529160200191610dbc565b820191906000526020600020905b815481529060010190602001808311610d9f57829003601f168201915b5050505050905090565b610dce61199f565b8060099081610ddd9190613447565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4690613565565b60405180910390fd5b807f0000000000000000000000000000000000000000000000000000000000000000610e7b9190613585565b341015610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490613613565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681610eed6108cf565b610ef79190613633565b1115610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f906136b3565b60405180910390fd5b610f423382611d26565b50565b610f4d6113ed565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fb1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fbe6113ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661106b6113ed565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110b091906127c8565b60405180910390a35050565b6110c78484846114b0565b6110e68373ffffffffffffffffffffffffffffffffffffffff16611d44565b80156110fb57506110f984848484611d67565b155b15611132576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606111438261139f565b611179576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611183611eb7565b905060008151036111a357604051806020016040528060008152506111ce565b806111ad84611f49565b6040516020016111be92919061370f565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61129661199f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc906137a5565b60405180910390fd5b61130e816120a9565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816113aa6114a7565b111580156113b9575060005482105b80156113e6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006114bb82611a29565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166114e26113ed565b73ffffffffffffffffffffffffffffffffffffffff1614806115155750611514826000015161150f6113ed565b6111fa565b5b8061155a57506115236113ed565b73ffffffffffffffffffffffffffffffffffffffff1661154284610749565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611593576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146115fc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611662576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61166f858585600161216f565b61167f60008484600001516113f5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361192f5760005481101561192e5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119988585856001612175565b5050505050565b6119a76113ed565b73ffffffffffffffffffffffffffffffffffffffff166119c5610d0a565b73ffffffffffffffffffffffffffffffffffffffff1614611a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1290613811565b60405180910390fd5b565b611a268161217b565b50565b611a316126d1565b600082905080611a3f6114a7565b11158015611a4e575060005481105b15611cef576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611ced57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b63578092505050611d21565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c7957819350505050611d21565b6000816001900391508111611b6a57847f000000000000000000000000000000000000000000000000000000000000000001826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611d21565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b611d408282604051806020016040528060008152506122f5565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d8d6113ed565b8786866040518563ffffffff1660e01b8152600401611daf9493929190613886565b6020604051808303816000875af1925050508015611deb57506040513d601f19601f82011682018060405250810190611de891906138e7565b60015b611e64573d8060008114611e1b576040519150601f19603f3d011682016040523d82523d6000602084013e611e20565b606091505b506000815103611e5c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ec69061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef29061305e565b8015611f3f5780601f10611f1457610100808354040283529160200191611f3f565b820191906000526020600020905b815481529060010190602001808311611f2257829003601f168201915b5050505050905090565b606060008203611f90576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120a4565b600082905060005b60008214611fc2578080611fab90613253565b915050600a82611fbb9190613943565b9150611f98565b60008167ffffffffffffffff811115611fde57611fdd612a6f565b5b6040519080825280601f01601f1916602001820160405280156120105781602001600182028036833780820191505090505b5090505b6000851461209d576001826120299190613974565b9150600a8561203891906139a8565b60306120449190613633565b60f81b81838151811061205a57612059613224565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120969190613943565b9450612014565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b600081036121b5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050600082826121c99190613633565b9050817f00000000000000000000000000000000000000000000000000000000000000006121f791906139d9565b600460008054815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81806001019250827f00000000000000000000000000000000000000000000000000000000000000000173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361224d57826000808282546122e99190613633565b92505081905550505050565b6123028383836001612307565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612373576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036123ad576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123ba600086838761216f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561258457506125838773ffffffffffffffffffffffffffffffffffffffff16611d44565b5b15612649575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125f96000888480600101955088611d67565b61262f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361258a57826000541461264457600080fd5b6126b4565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361264a575b8160008190555050506126ca6000868387612175565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61275d81612728565b811461276857600080fd5b50565b60008135905061277a81612754565b92915050565b6000602082840312156127965761279561271e565b5b60006127a48482850161276b565b91505092915050565b60008115159050919050565b6127c2816127ad565b82525050565b60006020820190506127dd60008301846127b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561281d578082015181840152602081019050612802565b60008484015250505050565b6000601f19601f8301169050919050565b6000612845826127e3565b61284f81856127ee565b935061285f8185602086016127ff565b61286881612829565b840191505092915050565b6000602082019050818103600083015261288d818461283a565b905092915050565b6000819050919050565b6128a881612895565b81146128b357600080fd5b50565b6000813590506128c58161289f565b92915050565b6000602082840312156128e1576128e061271e565b5b60006128ef848285016128b6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612923826128f8565b9050919050565b61293381612918565b82525050565b600060208201905061294e600083018461292a565b92915050565b61295d81612918565b811461296857600080fd5b50565b60008135905061297a81612954565b92915050565b600080604083850312156129975761299661271e565b5b60006129a58582860161296b565b92505060206129b6858286016128b6565b9150509250929050565b6129c981612895565b82525050565b60006020820190506129e460008301846129c0565b92915050565b600080600060608486031215612a0357612a0261271e565b5b6000612a118682870161296b565b9350506020612a228682870161296b565b9250506040612a33868287016128b6565b9150509250925092565b600060208284031215612a5357612a5261271e565b5b6000612a618482850161296b565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612aa782612829565b810181811067ffffffffffffffff82111715612ac657612ac5612a6f565b5b80604052505050565b6000612ad9612714565b9050612ae58282612a9e565b919050565b600067ffffffffffffffff821115612b0557612b04612a6f565b5b602082029050602081019050919050565b600080fd5b6000612b2e612b2984612aea565b612acf565b90508083825260208201905060208402830185811115612b5157612b50612b16565b5b835b81811015612b7a5780612b66888261296b565b845260208401935050602081019050612b53565b5050509392505050565b600082601f830112612b9957612b98612a6a565b5b8135612ba9848260208601612b1b565b91505092915050565b600067ffffffffffffffff821115612bcd57612bcc612a6f565b5b602082029050602081019050919050565b600061ffff82169050919050565b612bf581612bde565b8114612c0057600080fd5b50565b600081359050612c1281612bec565b92915050565b6000612c2b612c2684612bb2565b612acf565b90508083825260208201905060208402830185811115612c4e57612c4d612b16565b5b835b81811015612c775780612c638882612c03565b845260208401935050602081019050612c50565b5050509392505050565b600082601f830112612c9657612c95612a6a565b5b8135612ca6848260208601612c18565b91505092915050565b60008060408385031215612cc657612cc561271e565b5b600083013567ffffffffffffffff811115612ce457612ce3612723565b5b612cf085828601612b84565b925050602083013567ffffffffffffffff811115612d1157612d10612723565b5b612d1d85828601612c81565b9150509250929050565b600080fd5b600067ffffffffffffffff821115612d4757612d46612a6f565b5b612d5082612829565b9050602081019050919050565b82818337600083830152505050565b6000612d7f612d7a84612d2c565b612acf565b905082815260208101848484011115612d9b57612d9a612d27565b5b612da6848285612d5d565b509392505050565b600082601f830112612dc357612dc2612a6a565b5b8135612dd3848260208601612d6c565b91505092915050565b600060208284031215612df257612df161271e565b5b600082013567ffffffffffffffff811115612e1057612e0f612723565b5b612e1c84828501612dae565b91505092915050565b612e2e816127ad565b8114612e3957600080fd5b50565b600081359050612e4b81612e25565b92915050565b60008060408385031215612e6857612e6761271e565b5b6000612e768582860161296b565b9250506020612e8785828601612e3c565b9150509250929050565b600067ffffffffffffffff821115612eac57612eab612a6f565b5b612eb582612829565b9050602081019050919050565b6000612ed5612ed084612e91565b612acf565b905082815260208101848484011115612ef157612ef0612d27565b5b612efc848285612d5d565b509392505050565b600082601f830112612f1957612f18612a6a565b5b8135612f29848260208601612ec2565b91505092915050565b60008060008060808587031215612f4c57612f4b61271e565b5b6000612f5a8782880161296b565b9450506020612f6b8782880161296b565b9350506040612f7c878288016128b6565b925050606085013567ffffffffffffffff811115612f9d57612f9c612723565b5b612fa987828801612f04565b91505092959194509250565b600063ffffffff82169050919050565b612fce81612fb5565b82525050565b6000602082019050612fe96000830184612fc5565b92915050565b600080604083850312156130065761300561271e565b5b60006130148582860161296b565b92505060206130258582860161296b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061307657607f821691505b6020821081036130895761308861302f565b5b50919050565b600081905092915050565b50565b60006130aa60008361308f565b91506130b58261309a565b600082019050919050565b60006130cb8261309d565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b600061310b6018836127ee565b9150613116826130d5565b602082019050919050565b6000602082019050818103600083015261313a816130fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061317b826128f8565b9150613186836128f8565b9250828203905073ffffffffffffffffffffffffffffffffffffffff8111156131b2576131b1613141565b5b92915050565b7f4c656e677468206e6f74206d6174636800000000000000000000000000000000600082015250565b60006131ee6010836127ee565b91506131f9826131b8565b602082019050919050565b6000602082019050818103600083015261321d816131e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061325e82612895565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036132905761328f613141565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132fd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826132c0565b61330786836132c0565b95508019841693508086168417925050509392505050565b6000819050919050565b600061334461333f61333a84612895565b61331f565b612895565b9050919050565b6000819050919050565b61335e83613329565b61337261336a8261334b565b8484546132cd565b825550505050565b600090565b61338761337a565b613392818484613355565b505050565b5b818110156133b6576133ab60008261337f565b600181019050613398565b5050565b601f8211156133fb576133cc8161329b565b6133d5846132b0565b810160208510156133e4578190505b6133f86133f0856132b0565b830182613397565b50505b505050565b600082821c905092915050565b600061341e60001984600802613400565b1980831691505092915050565b6000613437838361340d565b9150826002028217905092915050565b613450826127e3565b67ffffffffffffffff81111561346957613468612a6f565b5b613473825461305e565b61347e8282856133ba565b600060209050601f8311600181146134b1576000841561349f578287015190505b6134a9858261342b565b865550613511565b601f1984166134bf8661329b565b60005b828110156134e7578489015182556001820191506020850194506020810190506134c2565b868310156135045784890151613500601f89168261340d565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b600061354f601e836127ee565b915061355a82613519565b602082019050919050565b6000602082019050818103600083015261357e81613542565b9050919050565b600061359082612895565b915061359b83612895565b92508282026135a981612895565b915082820484148315176135c0576135bf613141565b5b5092915050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b60006135fd600c836127ee565b9150613608826135c7565b602082019050919050565b6000602082019050818103600083015261362c816135f0565b9050919050565b600061363e82612895565b915061364983612895565b925082820190508082111561366157613660613141565b5b92915050565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b600061369d6008836127ee565b91506136a882613667565b602082019050919050565b600060208201905081810360008301526136cc81613690565b9050919050565b600081905092915050565b60006136e9826127e3565b6136f381856136d3565b93506137038185602086016127ff565b80840191505092915050565b600061371b82856136de565b915061372782846136de565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061378f6026836127ee565b915061379a82613733565b604082019050919050565b600060208201905081810360008301526137be81613782565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137fb6020836127ee565b9150613806826137c5565b602082019050919050565b6000602082019050818103600083015261382a816137ee565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061385882613831565b613862818561383c565b93506138728185602086016127ff565b61387b81612829565b840191505092915050565b600060808201905061389b600083018761292a565b6138a8602083018661292a565b6138b560408301856129c0565b81810360608301526138c7818461384d565b905095945050505050565b6000815190506138e181612754565b92915050565b6000602082840312156138fd576138fc61271e565b5b600061390b848285016138d2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061394e82612895565b915061395983612895565b92508261396957613968613914565b5b828204905092915050565b600061397f82612895565b915061398a83612895565b92508282039050818111156139a2576139a1613141565b5b92915050565b60006139b382612895565b91506139be83612895565b9250826139ce576139cd613914565b5b828206905092915050565b60006139e4826128f8565b91506139ef836128f8565b9250828201905073ffffffffffffffffffffffffffffffffffffffff811115613a1b57613a1a613141565b5b9291505056fea2646970667358221220d565bff85025ad25f85aeaaef8a5ffcd32c787812ed80dae3985c9856babbcff64736f6c63430008120033697066733a2f2f626166796265696166347775677471776f6279346479766b336c6d616a6a667961326b75796d34356f746375736d70376f69646c6577746a6c36652f
Deployed Bytecode
0x6080604052600436106101665760003560e01c806370a08231116100d1578063a22cb4651161008a578063d5abeb0111610064578063d5abeb0114610519578063e985e9c514610544578063f2fde38b14610581578063f968adbe146105aa57610166565b8063a22cb4651461048a578063b88d4fde146104b3578063c87b56dd146104dc57610166565b806370a08231146103895780638a886986146103c65780638da5cb5b146103ef57806395d89b411461041a5780639b642de114610445578063a0712d681461046e57610166565b80633ccfd60b116101235780633ccfd60b1461028d57806342842e0e146102a45780635fd22840146102cd57806362b99ad4146102f65780636352211e146103215780636817c76c1461035e57610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612780565b6105d5565b60405161019f91906127c8565b60405180910390f35b3480156101b457600080fd5b506101bd6106b7565b6040516101ca9190612873565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f591906128cb565b610749565b6040516102079190612939565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612980565b6107c5565b005b34801561024557600080fd5b5061024e6108cf565b60405161025b91906129cf565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906129ea565b6108e6565b005b34801561029957600080fd5b506102a26108f6565b005b3480156102b057600080fd5b506102cb60048036038101906102c691906129ea565b6109bb565b005b3480156102d957600080fd5b506102f460048036038101906102ef91906128cb565b6109db565b005b34801561030257600080fd5b5061030b6109ef565b6040516103189190612873565b60405180910390f35b34801561032d57600080fd5b50610348600480360381019061034391906128cb565b610a7d565b6040516103559190612939565b60405180910390f35b34801561036a57600080fd5b50610373610a93565b60405161038091906129cf565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190612a3d565b610ab7565b6040516103bd91906129cf565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190612caf565b610c4b565b005b3480156103fb57600080fd5b50610404610d0a565b6040516104119190612939565b60405180910390f35b34801561042657600080fd5b5061042f610d34565b60405161043c9190612873565b60405180910390f35b34801561045157600080fd5b5061046c60048036038101906104679190612ddc565b610dc6565b005b610488600480360381019061048391906128cb565b610de1565b005b34801561049657600080fd5b506104b160048036038101906104ac9190612e51565b610f45565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612f32565b6110bc565b005b3480156104e857600080fd5b5061050360048036038101906104fe91906128cb565b611138565b6040516105109190612873565b60405180910390f35b34801561052557600080fd5b5061052e6111d6565b60405161053b9190612fd4565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190612fef565b6111fa565b60405161057891906127c8565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a39190612a3d565b61128e565b005b3480156105b657600080fd5b506105bf611311565b6040516105cc9190612fd4565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106b057506106af82611335565b5b9050919050565b6060600280546106c69061305e565b80601f01602080910402602001604051908101604052809291908181526020018280546106f29061305e565b801561073f5780601f106107145761010080835404028352916020019161073f565b820191906000526020600020905b81548152906001019060200180831161072257829003601f168201915b5050505050905090565b60006107548261139f565b61078a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d082610a7d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610837576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108566113ed565b73ffffffffffffffffffffffffffffffffffffffff16141580156108885750610886816108816113ed565b6111fa565b155b156108bf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108ca8383836113f5565b505050565b60006108d96114a7565b6001546000540303905090565b6108f18383836114b0565b505050565b6108fe61199f565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff168360405161092e906130c0565b60006040518083038185875af1925050503d806000811461096b576040519150601f19603f3d011682016040523d82523d6000602084013e610970565b606091505b505080915050806109b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ad90613121565b60405180910390fd5b505050565b6109d6838383604051806020016040528060008152506110bc565b505050565b6109e361199f565b6109ec81611a1d565b50565b600980546109fc9061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a289061305e565b8015610a755780601f10610a4a57610100808354040283529160200191610a75565b820191906000526020600020905b815481529060010190602001808311610a5857829003601f168201915b505050505081565b6000610a8882611a29565b600001519050919050565b7f000000000000000000000000000000000000000000000000000aa87bee53800081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b1e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610bee57600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610c46565b6000547f000000000000000000000000962228f791e745273700024d54e3f9897a3e819883610c1d9190613170565b73ffffffffffffffffffffffffffffffffffffffff1611610c415760019050610c46565b600090505b919050565b610c5361199f565b60008251118015610c65575080518251145b610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90613204565b60405180910390fd5b60005b8251811015610d0557610cf2838281518110610cc657610cc5613224565b5b6020026020010151838381518110610ce157610ce0613224565b5b602002602001015161ffff16611d26565b8080610cfd90613253565b915050610ca7565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d439061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6f9061305e565b8015610dbc5780601f10610d9157610100808354040283529160200191610dbc565b820191906000526020600020905b815481529060010190602001808311610d9f57829003601f168201915b5050505050905090565b610dce61199f565b8060099081610ddd9190613447565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4690613565565b60405180910390fd5b807f000000000000000000000000000000000000000000000000000aa87bee538000610e7b9190613585565b341015610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490613613565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e863ffffffff1681610eed6108cf565b610ef79190613633565b1115610f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2f906136b3565b60405180910390fd5b610f423382611d26565b50565b610f4d6113ed565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fb1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fbe6113ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661106b6113ed565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110b091906127c8565b60405180910390a35050565b6110c78484846114b0565b6110e68373ffffffffffffffffffffffffffffffffffffffff16611d44565b80156110fb57506110f984848484611d67565b155b15611132576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606111438261139f565b611179576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611183611eb7565b905060008151036111a357604051806020016040528060008152506111ce565b806111ad84611f49565b6040516020016111be92919061370f565b6040516020818303038152906040525b915050919050565b7f00000000000000000000000000000000000000000000000000000000000003e881565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61129661199f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc906137a5565b60405180910390fd5b61130e816120a9565b50565b7f000000000000000000000000000000000000000000000000000000000000000381565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816113aa6114a7565b111580156113b9575060005482105b80156113e6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006114bb82611a29565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166114e26113ed565b73ffffffffffffffffffffffffffffffffffffffff1614806115155750611514826000015161150f6113ed565b6111fa565b5b8061155a57506115236113ed565b73ffffffffffffffffffffffffffffffffffffffff1661154284610749565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611593576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146115fc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611662576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61166f858585600161216f565b61167f60008484600001516113f5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361192f5760005481101561192e5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119988585856001612175565b5050505050565b6119a76113ed565b73ffffffffffffffffffffffffffffffffffffffff166119c5610d0a565b73ffffffffffffffffffffffffffffffffffffffff1614611a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1290613811565b60405180910390fd5b565b611a268161217b565b50565b611a316126d1565b600082905080611a3f6114a7565b11158015611a4e575060005481105b15611cef576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611ced57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b63578092505050611d21565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c7957819350505050611d21565b6000816001900391508111611b6a57847f000000000000000000000000962228f791e745273700024d54e3f9897a3e819801826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611d21565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b611d408282604051806020016040528060008152506122f5565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d8d6113ed565b8786866040518563ffffffff1660e01b8152600401611daf9493929190613886565b6020604051808303816000875af1925050508015611deb57506040513d601f19601f82011682018060405250810190611de891906138e7565b60015b611e64573d8060008114611e1b576040519150601f19603f3d011682016040523d82523d6000602084013e611e20565b606091505b506000815103611e5c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ec69061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef29061305e565b8015611f3f5780601f10611f1457610100808354040283529160200191611f3f565b820191906000526020600020905b815481529060010190602001808311611f2257829003601f168201915b5050505050905090565b606060008203611f90576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120a4565b600082905060005b60008214611fc2578080611fab90613253565b915050600a82611fbb9190613943565b9150611f98565b60008167ffffffffffffffff811115611fde57611fdd612a6f565b5b6040519080825280601f01601f1916602001820160405280156120105781602001600182028036833780820191505090505b5090505b6000851461209d576001826120299190613974565b9150600a8561203891906139a8565b60306120449190613633565b60f81b81838151811061205a57612059613224565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120969190613943565b9450612014565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b600081036121b5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050600082826121c99190613633565b9050817f000000000000000000000000962228f791e745273700024d54e3f9897a3e81986121f791906139d9565b600460008054815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81806001019250827f000000000000000000000000962228f791e745273700024d54e3f9897a3e81980173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361224d57826000808282546122e99190613633565b92505081905550505050565b6123028383836001612307565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612373576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036123ad576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123ba600086838761216f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561258457506125838773ffffffffffffffffffffffffffffffffffffffff16611d44565b5b15612649575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125f96000888480600101955088611d67565b61262f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361258a57826000541461264457600080fd5b6126b4565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361264a575b8160008190555050506126ca6000868387612175565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61275d81612728565b811461276857600080fd5b50565b60008135905061277a81612754565b92915050565b6000602082840312156127965761279561271e565b5b60006127a48482850161276b565b91505092915050565b60008115159050919050565b6127c2816127ad565b82525050565b60006020820190506127dd60008301846127b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561281d578082015181840152602081019050612802565b60008484015250505050565b6000601f19601f8301169050919050565b6000612845826127e3565b61284f81856127ee565b935061285f8185602086016127ff565b61286881612829565b840191505092915050565b6000602082019050818103600083015261288d818461283a565b905092915050565b6000819050919050565b6128a881612895565b81146128b357600080fd5b50565b6000813590506128c58161289f565b92915050565b6000602082840312156128e1576128e061271e565b5b60006128ef848285016128b6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612923826128f8565b9050919050565b61293381612918565b82525050565b600060208201905061294e600083018461292a565b92915050565b61295d81612918565b811461296857600080fd5b50565b60008135905061297a81612954565b92915050565b600080604083850312156129975761299661271e565b5b60006129a58582860161296b565b92505060206129b6858286016128b6565b9150509250929050565b6129c981612895565b82525050565b60006020820190506129e460008301846129c0565b92915050565b600080600060608486031215612a0357612a0261271e565b5b6000612a118682870161296b565b9350506020612a228682870161296b565b9250506040612a33868287016128b6565b9150509250925092565b600060208284031215612a5357612a5261271e565b5b6000612a618482850161296b565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612aa782612829565b810181811067ffffffffffffffff82111715612ac657612ac5612a6f565b5b80604052505050565b6000612ad9612714565b9050612ae58282612a9e565b919050565b600067ffffffffffffffff821115612b0557612b04612a6f565b5b602082029050602081019050919050565b600080fd5b6000612b2e612b2984612aea565b612acf565b90508083825260208201905060208402830185811115612b5157612b50612b16565b5b835b81811015612b7a5780612b66888261296b565b845260208401935050602081019050612b53565b5050509392505050565b600082601f830112612b9957612b98612a6a565b5b8135612ba9848260208601612b1b565b91505092915050565b600067ffffffffffffffff821115612bcd57612bcc612a6f565b5b602082029050602081019050919050565b600061ffff82169050919050565b612bf581612bde565b8114612c0057600080fd5b50565b600081359050612c1281612bec565b92915050565b6000612c2b612c2684612bb2565b612acf565b90508083825260208201905060208402830185811115612c4e57612c4d612b16565b5b835b81811015612c775780612c638882612c03565b845260208401935050602081019050612c50565b5050509392505050565b600082601f830112612c9657612c95612a6a565b5b8135612ca6848260208601612c18565b91505092915050565b60008060408385031215612cc657612cc561271e565b5b600083013567ffffffffffffffff811115612ce457612ce3612723565b5b612cf085828601612b84565b925050602083013567ffffffffffffffff811115612d1157612d10612723565b5b612d1d85828601612c81565b9150509250929050565b600080fd5b600067ffffffffffffffff821115612d4757612d46612a6f565b5b612d5082612829565b9050602081019050919050565b82818337600083830152505050565b6000612d7f612d7a84612d2c565b612acf565b905082815260208101848484011115612d9b57612d9a612d27565b5b612da6848285612d5d565b509392505050565b600082601f830112612dc357612dc2612a6a565b5b8135612dd3848260208601612d6c565b91505092915050565b600060208284031215612df257612df161271e565b5b600082013567ffffffffffffffff811115612e1057612e0f612723565b5b612e1c84828501612dae565b91505092915050565b612e2e816127ad565b8114612e3957600080fd5b50565b600081359050612e4b81612e25565b92915050565b60008060408385031215612e6857612e6761271e565b5b6000612e768582860161296b565b9250506020612e8785828601612e3c565b9150509250929050565b600067ffffffffffffffff821115612eac57612eab612a6f565b5b612eb582612829565b9050602081019050919050565b6000612ed5612ed084612e91565b612acf565b905082815260208101848484011115612ef157612ef0612d27565b5b612efc848285612d5d565b509392505050565b600082601f830112612f1957612f18612a6a565b5b8135612f29848260208601612ec2565b91505092915050565b60008060008060808587031215612f4c57612f4b61271e565b5b6000612f5a8782880161296b565b9450506020612f6b8782880161296b565b9350506040612f7c878288016128b6565b925050606085013567ffffffffffffffff811115612f9d57612f9c612723565b5b612fa987828801612f04565b91505092959194509250565b600063ffffffff82169050919050565b612fce81612fb5565b82525050565b6000602082019050612fe96000830184612fc5565b92915050565b600080604083850312156130065761300561271e565b5b60006130148582860161296b565b92505060206130258582860161296b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061307657607f821691505b6020821081036130895761308861302f565b5b50919050565b600081905092915050565b50565b60006130aa60008361308f565b91506130b58261309a565b600082019050919050565b60006130cb8261309d565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b600061310b6018836127ee565b9150613116826130d5565b602082019050919050565b6000602082019050818103600083015261313a816130fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061317b826128f8565b9150613186836128f8565b9250828203905073ffffffffffffffffffffffffffffffffffffffff8111156131b2576131b1613141565b5b92915050565b7f4c656e677468206e6f74206d6174636800000000000000000000000000000000600082015250565b60006131ee6010836127ee565b91506131f9826131b8565b602082019050919050565b6000602082019050818103600083015261321d816131e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061325e82612895565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036132905761328f613141565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026132fd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826132c0565b61330786836132c0565b95508019841693508086168417925050509392505050565b6000819050919050565b600061334461333f61333a84612895565b61331f565b612895565b9050919050565b6000819050919050565b61335e83613329565b61337261336a8261334b565b8484546132cd565b825550505050565b600090565b61338761337a565b613392818484613355565b505050565b5b818110156133b6576133ab60008261337f565b600181019050613398565b5050565b601f8211156133fb576133cc8161329b565b6133d5846132b0565b810160208510156133e4578190505b6133f86133f0856132b0565b830182613397565b50505b505050565b600082821c905092915050565b600061341e60001984600802613400565b1980831691505092915050565b6000613437838361340d565b9150826002028217905092915050565b613450826127e3565b67ffffffffffffffff81111561346957613468612a6f565b5b613473825461305e565b61347e8282856133ba565b600060209050601f8311600181146134b1576000841561349f578287015190505b6134a9858261342b565b865550613511565b601f1984166134bf8661329b565b60005b828110156134e7578489015182556001820191506020850194506020810190506134c2565b868310156135045784890151613500601f89168261340d565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b600061354f601e836127ee565b915061355a82613519565b602082019050919050565b6000602082019050818103600083015261357e81613542565b9050919050565b600061359082612895565b915061359b83612895565b92508282026135a981612895565b915082820484148315176135c0576135bf613141565b5b5092915050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b60006135fd600c836127ee565b9150613608826135c7565b602082019050919050565b6000602082019050818103600083015261362c816135f0565b9050919050565b600061363e82612895565b915061364983612895565b925082820190508082111561366157613660613141565b5b92915050565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b600061369d6008836127ee565b91506136a882613667565b602082019050919050565b600060208201905081810360008301526136cc81613690565b9050919050565b600081905092915050565b60006136e9826127e3565b6136f381856136d3565b93506137038185602086016127ff565b80840191505092915050565b600061371b82856136de565b915061372782846136de565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061378f6026836127ee565b915061379a82613733565b604082019050919050565b600060208201905081810360008301526137be81613782565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137fb6020836127ee565b9150613806826137c5565b602082019050919050565b6000602082019050818103600083015261382a816137ee565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061385882613831565b613862818561383c565b93506138728185602086016127ff565b61387b81612829565b840191505092915050565b600060808201905061389b600083018761292a565b6138a8602083018661292a565b6138b560408301856129c0565b81810360608301526138c7818461384d565b905095945050505050565b6000815190506138e181612754565b92915050565b6000602082840312156138fd576138fc61271e565b5b600061390b848285016138d2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061394e82612895565b915061395983612895565b92508261396957613968613914565b5b828204905092915050565b600061397f82612895565b915061398a83612895565b92508282039050818111156139a2576139a1613141565b5b92915050565b60006139b382612895565b91506139be83612895565b9250826139ce576139cd613914565b5b828206905092915050565b60006139e4826128f8565b91506139ef836128f8565b9250828201905073ffffffffffffffffffffffffffffffffffffffff811115613a1b57613a1a613141565b5b9291505056fea2646970667358221220d565bff85025ad25f85aeaaef8a5ffcd32c787812ed80dae3985c9856babbcff64736f6c63430008120033
Deployed Bytecode Sourcemap
48479:1778:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28411:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32252:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33755:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33318:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27660:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34612:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49972:278;;;;;;;;;;;;;:::i;:::-;;34853:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49544:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48527:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32061:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48632:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28782:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49667:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4598:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32421:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49091:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49303:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34031:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35109:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32596:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48687:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34381:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5050:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48734:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28411:305;28513:4;28565:25;28550:40;;;:11;:40;;;;:105;;;;28622:33;28607:48;;;:11;:48;;;;28550:105;:158;;;;28672:36;28696:11;28672:23;:36::i;:::-;28550:158;28530:178;;28411:305;;;:::o;32252:100::-;32306:13;32339:5;32332:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32252:100;:::o;33755:204::-;33823:7;33848:16;33856:7;33848;:16::i;:::-;33843:64;;33873:34;;;;;;;;;;;;;;33843:64;33927:15;:24;33943:7;33927:24;;;;;;;;;;;;;;;;;;;;;33920:31;;33755:204;;;:::o;33318:371::-;33391:13;33407:24;33423:7;33407:15;:24::i;:::-;33391:40;;33452:5;33446:11;;:2;:11;;;33442:48;;33466:24;;;;;;;;;;;;;;33442:48;33523:5;33507:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33533:37;33550:5;33557:12;:10;:12::i;:::-;33533:16;:37::i;:::-;33532:38;33507:63;33503:138;;;33594:35;;;;;;;;;;;;;;33503:138;33653:28;33662:2;33666:7;33675:5;33653:8;:28::i;:::-;33380:309;33318:371;;:::o;27660:303::-;27704:7;27929:15;:13;:15::i;:::-;27914:12;;27898:13;;:28;:46;27891:53;;27660:303;:::o;34612:170::-;34746:28;34756:4;34762:2;34766:7;34746:9;:28::i;:::-;34612:170;;;:::o;49972:278::-;4484:13;:11;:13::i;:::-;50020:18:::1;50041:21;50020:42;;50075:9;50095:10;50075:31;;50119:12;50158:1;:6;;50172:10;50158:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50144:43;;;;;50206:7;50198:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;50009:241;;;49972:278::o:0;34853:185::-;34991:39;35008:4;35014:2;35018:7;34991:39;;;;;;;;;;;;:16;:39::i;:::-;34853:185;;;:::o;49544:95::-;4484:13;:11;:13::i;:::-;49617:14:::1;49624:6;49617;:14::i;:::-;49544:95:::0;:::o;48527:96::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32061:124::-;32125:7;32152:20;32164:7;32152:11;:20::i;:::-;:25;;;32145:32;;32061:124;;;:::o;48632:48::-;;;:::o;28782:395::-;28846:7;28887:1;28870:19;;:5;:19;;;28866:60;;28898:28;;;;;;;;;;;;;;28866:60;28974:1;28943:12;:19;28956:5;28943:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:32;;;28939:108;;29007:12;:19;29020:5;29007:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28999:36;;28992:43;;;;28939:108;29099:13;;29088:6;29071:5;29063:32;;;;:::i;:::-;:49;;;29059:90;;29136:1;29129:8;;;;29059:90;29168:1;29161:8;;28782:395;;;;:::o;49667:297::-;4484:13;:11;:13::i;:::-;49789:1:::1;49771:8;:15;:19;:53;;;;;49813:4;:11;49794:8;:15;:30;49771:53;49763:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;49861:6;49856:101;49877:8;:15;49873:1;:19;49856:101;;;49914:31;49924:8;49933:1;49924:11;;;;;;;;:::i;:::-;;;;;;;;49937:4;49942:1;49937:7;;;;;;;;:::i;:::-;;;;;;;;49914:31;;:9;:31::i;:::-;49894:3;;;;;:::i;:::-;;;;49856:101;;;;49667:297:::0;;:::o;4598:87::-;4644:7;4671:6;;;;;;;;;;;4664:13;;4598:87;:::o;32421:104::-;32477:13;32510:7;32503:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32421:104;:::o;49091:86::-;4484:13;:11;:13::i;:::-;49166:3:::1;49154:9;:15;;;;;;:::i;:::-;;49091:86:::0;:::o;49303:233::-;48835:10;48822:23;;:9;:23;;;48814:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49404:6:::1;49392:9;:18;;;;:::i;:::-;49379:9;:31;;49371:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49465:9;49439:35;;49455:6;49439:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;49431:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49499:29;49509:10;49521:6;49499:9;:29::i;:::-;49303:233:::0;:::o;34031:279::-;34134:12;:10;:12::i;:::-;34122:24;;:8;:24;;;34118:54;;34155:17;;;;;;;;;;;;;;34118:54;34230:8;34185:18;:32;34204:12;:10;:12::i;:::-;34185:32;;;;;;;;;;;;;;;:42;34218:8;34185:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34283:8;34254:48;;34269:12;:10;:12::i;:::-;34254:48;;;34293:8;34254:48;;;;;;:::i;:::-;;;;;;;;34031:279;;:::o;35109:369::-;35276:28;35286:4;35292:2;35296:7;35276:9;:28::i;:::-;35319:15;:2;:13;;;:15::i;:::-;:76;;;;;35339:56;35370:4;35376:2;35380:7;35389:5;35339:30;:56::i;:::-;35338:57;35319:76;35315:156;;;35419:40;;;;;;;;;;;;;;35315:156;35109:369;;;;:::o;32596:318::-;32669:13;32700:16;32708:7;32700;:16::i;:::-;32695:59;;32725:29;;;;;;;;;;;;;;32695:59;32767:21;32791:10;:8;:10::i;:::-;32767:34;;32844:1;32825:7;32819:21;:26;:87;;;;;;;;;;;;;;;;;32872:7;32881:18;:7;:16;:18::i;:::-;32855:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32819:87;32812:94;;;32596:318;;;:::o;48687:40::-;;;:::o;34381:164::-;34478:4;34502:18;:25;34521:5;34502:25;;;;;;;;;;;;;;;:35;34528:8;34502:35;;;;;;;;;;;;;;;;;;;;;;;;;34495:42;;34381:164;;;;:::o;5050:201::-;4484:13;:11;:13::i;:::-;5159:1:::1;5139:22;;:8;:22;;::::0;5131:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5215:28;5234:8;5215:18;:28::i;:::-;5050:201:::0;:::o;48734:36::-;;;:::o;16998:157::-;17083:4;17122:25;17107:40;;;:11;:40;;;;17100:47;;16998:157;;;:::o;35733:187::-;35790:4;35833:7;35814:15;:13;:15::i;:::-;:26;;:53;;;;;35854:13;;35844:7;:23;35814:53;:98;;;;;35885:11;:20;35897:7;35885:20;;;;;;;;;;;:27;;;;;;;;;;;;35884:28;35814:98;35807:105;;35733:187;;;:::o;3149:98::-;3202:7;3229:10;3222:17;;3149:98;:::o;45463:196::-;45605:2;45578:15;:24;45594:7;45578:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45643:7;45639:2;45623:28;;45632:5;45623:28;;;;;;;;;;;;45463:196;;;:::o;49185:110::-;49259:7;49286:1;49279:8;;49185:110;:::o;40965:2112::-;41080:35;41118:20;41130:7;41118:11;:20::i;:::-;41080:58;;41151:22;41193:13;:18;;;41177:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;41228:50;41245:13;:18;;;41265:12;:10;:12::i;:::-;41228:16;:50::i;:::-;41177:101;:154;;;;41319:12;:10;:12::i;:::-;41295:36;;:20;41307:7;41295:11;:20::i;:::-;:36;;;41177:154;41151:181;;41350:17;41345:66;;41376:35;;;;;;;;;;;;;;41345:66;41448:4;41426:26;;:13;:18;;;:26;;;41422:67;;41461:28;;;;;;;;;;;;;;41422:67;41518:1;41504:16;;:2;:16;;;41500:52;;41529:23;;;;;;;;;;;;;;41500:52;41565:43;41587:4;41593:2;41597:7;41606:1;41565:21;:43::i;:::-;41673:49;41690:1;41694:7;41703:13;:18;;;41673:8;:49::i;:::-;42048:1;42018:12;:18;42031:4;42018:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42092:1;42064:12;:16;42077:2;42064:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42138:2;42110:11;:20;42122:7;42110:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;42200:15;42155:11;:20;42167:7;42155:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;42468:19;42500:1;42490:7;:11;42468:33;;42561:1;42520:43;;:11;:24;42532:11;42520:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;42516:445;;42745:13;;42731:11;:27;42727:219;;;42815:13;:18;;;42783:11;:24;42795:11;42783:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;42898:13;:28;;;42856:11;:24;42868:11;42856:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;42727:219;42516:445;41993:979;43008:7;43004:2;42989:27;;42998:4;42989:27;;;;;;;;;;;;43027:42;43048:4;43054:2;43058:7;43067:1;43027:20;:42::i;:::-;41069:2008;;40965:2112;;;:::o;4763:132::-;4838:12;:10;:12::i;:::-;4827:23;;:7;:5;:7::i;:::-;:23;;;4819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4763:132::o;36566:113::-;36648:19;36658:8;36648:9;:19::i;:::-;36566:113;:::o;30712:1287::-;30773:21;;:::i;:::-;30807:12;30822:7;30807:22;;30890:4;30871:15;:13;:15::i;:::-;:23;;:47;;;;;30905:13;;30898:4;:20;30871:47;30867:1065;;;30939:31;30973:11;:17;30985:4;30973:17;;;;;;;;;;;30939:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31014:9;:16;;;31009:904;;31085:1;31059:28;;:9;:14;;;:28;;;31055:101;;31123:9;31116:16;;;;;;31055:101;31460:13;31476:1;31460:17;;31500:270;31529:6;;;;;;;;31574:11;:17;31586:4;31574:17;;;;;;;;;;;31562:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31648:1;31622:28;;:9;:14;;;:28;;;31618:109;;31690:9;31683:16;;;;;;;31618:109;31767:1;31757:7;;;;;;;:11;31500:270;;31845:7;31827:6;31819:34;31794:9;:14;;:60;;;;;;;;;;;31884:9;31877:16;;;;;;;31009:904;30920:1012;30867:1065;31960:31;;;;;;;;;;;;;;30712:1287;;;;:::o;35928:104::-;35997:27;36007:2;36011:8;35997:27;;;;;;;;;;;;:9;:27::i;:::-;35928:104;;:::o;6842:326::-;6902:4;7159:1;7137:7;:19;;;:23;7130:30;;6842:326;;;:::o;46151:667::-;46314:4;46351:2;46335:36;;;46372:12;:10;:12::i;:::-;46386:4;46392:7;46401:5;46335:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46331:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46586:1;46569:6;:13;:18;46565:235;;46615:40;;;;;;;;;;;;;;46565:235;46758:6;46752:13;46743:6;46739:2;46735:15;46728:38;46331:480;46464:45;;;46454:55;;;:6;:55;;;;46447:62;;;46151:667;;;;;;:::o;48972:111::-;49033:13;49066:9;49059:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48972:111;:::o;403:723::-;459:13;689:1;680:5;:10;676:53;;707:10;;;;;;;;;;;;;;;;;;;;;676:53;739:12;754:5;739:20;;770:14;795:78;810:1;802:4;:9;795:78;;828:8;;;;;:::i;:::-;;;;859:2;851:10;;;;;:::i;:::-;;;795:78;;;883:19;915:6;905:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;883:39;;933:154;949:1;940:5;:10;933:154;;977:1;967:11;;;;;:::i;:::-;;;1044:2;1036:5;:10;;;;:::i;:::-;1023:2;:24;;;;:::i;:::-;1010:39;;993:6;1000;993:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1073:2;1064:11;;;;;:::i;:::-;;;933:154;;;1111:6;1097:21;;;;;403:723;;;;:::o;5411:191::-;5485:16;5504:6;;;;;;;;;;;5485:25;;5530:8;5521:6;;:17;;;;;;;;;;;;;;;;;;5585:8;5554:40;;5575:8;5554:40;;;;;;;;;;;;5474:128;5411:191;:::o;47466:159::-;;;;;:::o;48284:158::-;;;;;:::o;40104:607::-;40205:1;40193:8;:13;40189:44;;40215:18;;;;;;;;;;;;;;40189:44;40250:20;40273:13;;40250:36;;40301:11;40330:8;40315:12;:23;;;;:::i;:::-;40301:37;;40421:12;40403:6;40395:39;;;;:::i;:::-;40353:11;:26;40365:13;;40353:26;;;;;;;;;;;:31;;;:82;;;;;;;;;;;;;;;;;;40481:166;40583:14;;;;;;40567:12;40549:6;40541:39;40512:86;;40529:1;40512:86;;;;;;;;;;;;40642:3;40626:12;:19;40481:166;;40693:8;40676:13;;:25;;;;;;;:::i;:::-;;;;;;;;40174:537;;40104:607;:::o;36395:163::-;36518:32;36524:2;36528:8;36538:5;36545:4;36518:5;:32::i;:::-;36395:163;;;:::o;36939:1775::-;37078:20;37101:13;;37078:36;;37143:1;37129:16;;:2;:16;;;37125:48;;37154:19;;;;;;;;;;;;;;37125:48;37200:1;37188:8;:13;37184:44;;37210:18;;;;;;;;;;;;;;37184:44;37241:61;37271:1;37275:2;37279:12;37293:8;37241:21;:61::i;:::-;37614:8;37579:12;:16;37592:2;37579:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37678:8;37638:12;:16;37651:2;37638:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37737:2;37704:11;:25;37716:12;37704:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37804:15;37754:11;:25;37766:12;37754:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37837:20;37860:12;37837:35;;37887:11;37916:8;37901:12;:23;37887:37;;37945:4;:23;;;;;37953:15;:2;:13;;;:15::i;:::-;37945:23;37941:641;;;37989:314;38045:12;38041:2;38020:38;;38037:1;38020:38;;;;;;;;;;;;38086:69;38125:1;38129:2;38133:14;;;;;;38149:5;38086:30;:69::i;:::-;38081:174;;38191:40;;;;;;;;;;;;;;38081:174;38298:3;38282:12;:19;37989:314;;38384:12;38367:13;;:29;38363:43;;38398:8;;;38363:43;37941:641;;;38447:120;38503:14;;;;;;38499:2;38478:40;;38495:1;38478:40;;;;;;;;;;;;38562:3;38546:12;:19;38447:120;;37941:641;38612:12;38596:13;:28;;;;37554:1082;;38646:60;38675:1;38679:2;38683:12;38697:8;38646:20;:60::i;:::-;37067:1647;36939:1775;;;;:::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:180;6373:77;6370:1;6363:88;6470:4;6467:1;6460:15;6494:4;6491:1;6484:15;6511:281;6594:27;6616:4;6594:27;:::i;:::-;6586:6;6582:40;6724:6;6712:10;6709:22;6688:18;6676:10;6673:34;6670:62;6667:88;;;6735:18;;:::i;:::-;6667:88;6775:10;6771:2;6764:22;6554:238;6511:281;;:::o;6798:129::-;6832:6;6859:20;;:::i;:::-;6849:30;;6888:33;6916:4;6908:6;6888:33;:::i;:::-;6798:129;;;:::o;6933:311::-;7010:4;7100:18;7092:6;7089:30;7086:56;;;7122:18;;:::i;:::-;7086:56;7172:4;7164:6;7160:17;7152:25;;7232:4;7226;7222:15;7214:23;;6933:311;;;:::o;7250:117::-;7359:1;7356;7349:12;7390:710;7486:5;7511:81;7527:64;7584:6;7527:64;:::i;:::-;7511:81;:::i;:::-;7502:90;;7612:5;7641:6;7634:5;7627:21;7675:4;7668:5;7664:16;7657:23;;7728:4;7720:6;7716:17;7708:6;7704:30;7757:3;7749:6;7746:15;7743:122;;;7776:79;;:::i;:::-;7743:122;7891:6;7874:220;7908:6;7903:3;7900:15;7874:220;;;7983:3;8012:37;8045:3;8033:10;8012:37;:::i;:::-;8007:3;8000:50;8079:4;8074:3;8070:14;8063:21;;7950:144;7934:4;7929:3;7925:14;7918:21;;7874:220;;;7878:21;7492:608;;7390:710;;;;;:::o;8123:370::-;8194:5;8243:3;8236:4;8228:6;8224:17;8220:27;8210:122;;8251:79;;:::i;:::-;8210:122;8368:6;8355:20;8393:94;8483:3;8475:6;8468:4;8460:6;8456:17;8393:94;:::i;:::-;8384:103;;8200:293;8123:370;;;;:::o;8499:310::-;8575:4;8665:18;8657:6;8654:30;8651:56;;;8687:18;;:::i;:::-;8651:56;8737:4;8729:6;8725:17;8717:25;;8797:4;8791;8787:15;8779:23;;8499:310;;;:::o;8815:89::-;8851:7;8891:6;8884:5;8880:18;8869:29;;8815:89;;;:::o;8910:120::-;8982:23;8999:5;8982:23;:::i;:::-;8975:5;8972:34;8962:62;;9020:1;9017;9010:12;8962:62;8910:120;:::o;9036:137::-;9081:5;9119:6;9106:20;9097:29;;9135:32;9161:5;9135:32;:::i;:::-;9036:137;;;;:::o;9195:707::-;9290:5;9315:80;9331:63;9387:6;9331:63;:::i;:::-;9315:80;:::i;:::-;9306:89;;9415:5;9444:6;9437:5;9430:21;9478:4;9471:5;9467:16;9460:23;;9531:4;9523:6;9519:17;9511:6;9507:30;9560:3;9552:6;9549:15;9546:122;;;9579:79;;:::i;:::-;9546:122;9694:6;9677:219;9711:6;9706:3;9703:15;9677:219;;;9786:3;9815:36;9847:3;9835:10;9815:36;:::i;:::-;9810:3;9803:49;9881:4;9876:3;9872:14;9865:21;;9753:143;9737:4;9732:3;9728:14;9721:21;;9677:219;;;9681:21;9296:606;;9195:707;;;;;:::o;9924:368::-;9994:5;10043:3;10036:4;10028:6;10024:17;10020:27;10010:122;;10051:79;;:::i;:::-;10010:122;10168:6;10155:20;10193:93;10282:3;10274:6;10267:4;10259:6;10255:17;10193:93;:::i;:::-;10184:102;;10000:292;9924:368;;;;:::o;10298:892::-;10415:6;10423;10472:2;10460:9;10451:7;10447:23;10443:32;10440:119;;;10478:79;;:::i;:::-;10440:119;10626:1;10615:9;10611:17;10598:31;10656:18;10648:6;10645:30;10642:117;;;10678:79;;:::i;:::-;10642:117;10783:78;10853:7;10844:6;10833:9;10829:22;10783:78;:::i;:::-;10773:88;;10569:302;10938:2;10927:9;10923:18;10910:32;10969:18;10961:6;10958:30;10955:117;;;10991:79;;:::i;:::-;10955:117;11096:77;11165:7;11156:6;11145:9;11141:22;11096:77;:::i;:::-;11086:87;;10881:302;10298:892;;;;;:::o;11196:117::-;11305:1;11302;11295:12;11319:308;11381:4;11471:18;11463:6;11460:30;11457:56;;;11493:18;;:::i;:::-;11457:56;11531:29;11553:6;11531:29;:::i;:::-;11523:37;;11615:4;11609;11605:15;11597:23;;11319:308;;;:::o;11633:146::-;11730:6;11725:3;11720;11707:30;11771:1;11762:6;11757:3;11753:16;11746:27;11633:146;;;:::o;11785:425::-;11863:5;11888:66;11904:49;11946:6;11904:49;:::i;:::-;11888:66;:::i;:::-;11879:75;;11977:6;11970:5;11963:21;12015:4;12008:5;12004:16;12053:3;12044:6;12039:3;12035:16;12032:25;12029:112;;;12060:79;;:::i;:::-;12029:112;12150:54;12197:6;12192:3;12187;12150:54;:::i;:::-;11869:341;11785:425;;;;;:::o;12230:340::-;12286:5;12335:3;12328:4;12320:6;12316:17;12312:27;12302:122;;12343:79;;:::i;:::-;12302:122;12460:6;12447:20;12485:79;12560:3;12552:6;12545:4;12537:6;12533:17;12485:79;:::i;:::-;12476:88;;12292:278;12230:340;;;;:::o;12576:509::-;12645:6;12694:2;12682:9;12673:7;12669:23;12665:32;12662:119;;;12700:79;;:::i;:::-;12662:119;12848:1;12837:9;12833:17;12820:31;12878:18;12870:6;12867:30;12864:117;;;12900:79;;:::i;:::-;12864:117;13005:63;13060:7;13051:6;13040:9;13036:22;13005:63;:::i;:::-;12995:73;;12791:287;12576:509;;;;:::o;13091:116::-;13161:21;13176:5;13161:21;:::i;:::-;13154:5;13151:32;13141:60;;13197:1;13194;13187:12;13141:60;13091:116;:::o;13213:133::-;13256:5;13294:6;13281:20;13272:29;;13310:30;13334:5;13310:30;:::i;:::-;13213:133;;;;:::o;13352:468::-;13417:6;13425;13474:2;13462:9;13453:7;13449:23;13445:32;13442:119;;;13480:79;;:::i;:::-;13442:119;13600:1;13625:53;13670:7;13661:6;13650:9;13646:22;13625:53;:::i;:::-;13615:63;;13571:117;13727:2;13753:50;13795:7;13786:6;13775:9;13771:22;13753:50;:::i;:::-;13743:60;;13698:115;13352:468;;;;;:::o;13826:307::-;13887:4;13977:18;13969:6;13966:30;13963:56;;;13999:18;;:::i;:::-;13963:56;14037:29;14059:6;14037:29;:::i;:::-;14029:37;;14121:4;14115;14111:15;14103:23;;13826:307;;;:::o;14139:423::-;14216:5;14241:65;14257:48;14298:6;14257:48;:::i;:::-;14241:65;:::i;:::-;14232:74;;14329:6;14322:5;14315:21;14367:4;14360:5;14356:16;14405:3;14396:6;14391:3;14387:16;14384:25;14381:112;;;14412:79;;:::i;:::-;14381:112;14502:54;14549:6;14544:3;14539;14502:54;:::i;:::-;14222:340;14139:423;;;;;:::o;14581:338::-;14636:5;14685:3;14678:4;14670:6;14666:17;14662:27;14652:122;;14693:79;;:::i;:::-;14652:122;14810:6;14797:20;14835:78;14909:3;14901:6;14894:4;14886:6;14882:17;14835:78;:::i;:::-;14826:87;;14642:277;14581:338;;;;:::o;14925:943::-;15020:6;15028;15036;15044;15093:3;15081:9;15072:7;15068:23;15064:33;15061:120;;;15100:79;;:::i;:::-;15061:120;15220:1;15245:53;15290:7;15281:6;15270:9;15266:22;15245:53;:::i;:::-;15235:63;;15191:117;15347:2;15373:53;15418:7;15409:6;15398:9;15394:22;15373:53;:::i;:::-;15363:63;;15318:118;15475:2;15501:53;15546:7;15537:6;15526:9;15522:22;15501:53;:::i;:::-;15491:63;;15446:118;15631:2;15620:9;15616:18;15603:32;15662:18;15654:6;15651:30;15648:117;;;15684:79;;:::i;:::-;15648:117;15789:62;15843:7;15834:6;15823:9;15819:22;15789:62;:::i;:::-;15779:72;;15574:287;14925:943;;;;;;;:::o;15874:93::-;15910:7;15950:10;15943:5;15939:22;15928:33;;15874:93;;;:::o;15973:115::-;16058:23;16075:5;16058:23;:::i;:::-;16053:3;16046:36;15973:115;;:::o;16094:218::-;16185:4;16223:2;16212:9;16208:18;16200:26;;16236:69;16302:1;16291:9;16287:17;16278:6;16236:69;:::i;:::-;16094:218;;;;:::o;16318:474::-;16386:6;16394;16443:2;16431:9;16422:7;16418:23;16414:32;16411:119;;;16449:79;;:::i;:::-;16411:119;16569:1;16594:53;16639:7;16630:6;16619:9;16615:22;16594:53;:::i;:::-;16584:63;;16540:117;16696:2;16722:53;16767:7;16758:6;16747:9;16743:22;16722:53;:::i;:::-;16712:63;;16667:118;16318:474;;;;;:::o;16798:180::-;16846:77;16843:1;16836:88;16943:4;16940:1;16933:15;16967:4;16964:1;16957:15;16984:320;17028:6;17065:1;17059:4;17055:12;17045:22;;17112:1;17106:4;17102:12;17133:18;17123:81;;17189:4;17181:6;17177:17;17167:27;;17123:81;17251:2;17243:6;17240:14;17220:18;17217:38;17214:84;;17270:18;;:::i;:::-;17214:84;17035:269;16984:320;;;:::o;17310:147::-;17411:11;17448:3;17433:18;;17310:147;;;;:::o;17463:114::-;;:::o;17583:398::-;17742:3;17763:83;17844:1;17839:3;17763:83;:::i;:::-;17756:90;;17855:93;17944:3;17855:93;:::i;:::-;17973:1;17968:3;17964:11;17957:18;;17583:398;;;:::o;17987:379::-;18171:3;18193:147;18336:3;18193:147;:::i;:::-;18186:154;;18357:3;18350:10;;17987:379;;;:::o;18372:174::-;18512:26;18508:1;18500:6;18496:14;18489:50;18372:174;:::o;18552:366::-;18694:3;18715:67;18779:2;18774:3;18715:67;:::i;:::-;18708:74;;18791:93;18880:3;18791:93;:::i;:::-;18909:2;18904:3;18900:12;18893:19;;18552:366;;;:::o;18924:419::-;19090:4;19128:2;19117:9;19113:18;19105:26;;19177:9;19171:4;19167:20;19163:1;19152:9;19148:17;19141:47;19205:131;19331:4;19205:131;:::i;:::-;19197:139;;18924:419;;;:::o;19349:180::-;19397:77;19394:1;19387:88;19494:4;19491:1;19484:15;19518:4;19515:1;19508:15;19535:235;19575:4;19595:20;19613:1;19595:20;:::i;:::-;19590:25;;19629:20;19647:1;19629:20;:::i;:::-;19624:25;;19673:1;19670;19666:9;19658:17;;19697:42;19691:4;19688:52;19685:78;;;19743:18;;:::i;:::-;19685:78;19535:235;;;;:::o;19776:166::-;19916:18;19912:1;19904:6;19900:14;19893:42;19776:166;:::o;19948:366::-;20090:3;20111:67;20175:2;20170:3;20111:67;:::i;:::-;20104:74;;20187:93;20276:3;20187:93;:::i;:::-;20305:2;20300:3;20296:12;20289:19;;19948:366;;;:::o;20320:419::-;20486:4;20524:2;20513:9;20509:18;20501:26;;20573:9;20567:4;20563:20;20559:1;20548:9;20544:17;20537:47;20601:131;20727:4;20601:131;:::i;:::-;20593:139;;20320:419;;;:::o;20745:180::-;20793:77;20790:1;20783:88;20890:4;20887:1;20880:15;20914:4;20911:1;20904:15;20931:233;20970:3;20993:24;21011:5;20993:24;:::i;:::-;20984:33;;21039:66;21032:5;21029:77;21026:103;;21109:18;;:::i;:::-;21026:103;21156:1;21149:5;21145:13;21138:20;;20931:233;;;:::o;21170:141::-;21219:4;21242:3;21234:11;;21265:3;21262:1;21255:14;21299:4;21296:1;21286:18;21278:26;;21170:141;;;:::o;21317:93::-;21354:6;21401:2;21396;21389:5;21385:14;21381:23;21371:33;;21317:93;;;:::o;21416:107::-;21460:8;21510:5;21504:4;21500:16;21479:37;;21416:107;;;;:::o;21529:393::-;21598:6;21648:1;21636:10;21632:18;21671:97;21701:66;21690:9;21671:97;:::i;:::-;21789:39;21819:8;21808:9;21789:39;:::i;:::-;21777:51;;21861:4;21857:9;21850:5;21846:21;21837:30;;21910:4;21900:8;21896:19;21889:5;21886:30;21876:40;;21605:317;;21529:393;;;;;:::o;21928:60::-;21956:3;21977:5;21970:12;;21928:60;;;:::o;21994:142::-;22044:9;22077:53;22095:34;22104:24;22122:5;22104:24;:::i;:::-;22095:34;:::i;:::-;22077:53;:::i;:::-;22064:66;;21994:142;;;:::o;22142:75::-;22185:3;22206:5;22199:12;;22142:75;;;:::o;22223:269::-;22333:39;22364:7;22333:39;:::i;:::-;22394:91;22443:41;22467:16;22443:41;:::i;:::-;22435:6;22428:4;22422:11;22394:91;:::i;:::-;22388:4;22381:105;22299:193;22223:269;;;:::o;22498:73::-;22543:3;22498:73;:::o;22577:189::-;22654:32;;:::i;:::-;22695:65;22753:6;22745;22739:4;22695:65;:::i;:::-;22630:136;22577:189;;:::o;22772:186::-;22832:120;22849:3;22842:5;22839:14;22832:120;;;22903:39;22940:1;22933:5;22903:39;:::i;:::-;22876:1;22869:5;22865:13;22856:22;;22832:120;;;22772:186;;:::o;22964:543::-;23065:2;23060:3;23057:11;23054:446;;;23099:38;23131:5;23099:38;:::i;:::-;23183:29;23201:10;23183:29;:::i;:::-;23173:8;23169:44;23366:2;23354:10;23351:18;23348:49;;;23387:8;23372:23;;23348:49;23410:80;23466:22;23484:3;23466:22;:::i;:::-;23456:8;23452:37;23439:11;23410:80;:::i;:::-;23069:431;;23054:446;22964:543;;;:::o;23513:117::-;23567:8;23617:5;23611:4;23607:16;23586:37;;23513:117;;;;:::o;23636:169::-;23680:6;23713:51;23761:1;23757:6;23749:5;23746:1;23742:13;23713:51;:::i;:::-;23709:56;23794:4;23788;23784:15;23774:25;;23687:118;23636:169;;;;:::o;23810:295::-;23886:4;24032:29;24057:3;24051:4;24032:29;:::i;:::-;24024:37;;24094:3;24091:1;24087:11;24081:4;24078:21;24070:29;;23810:295;;;;:::o;24110:1395::-;24227:37;24260:3;24227:37;:::i;:::-;24329:18;24321:6;24318:30;24315:56;;;24351:18;;:::i;:::-;24315:56;24395:38;24427:4;24421:11;24395:38;:::i;:::-;24480:67;24540:6;24532;24526:4;24480:67;:::i;:::-;24574:1;24598:4;24585:17;;24630:2;24622:6;24619:14;24647:1;24642:618;;;;25304:1;25321:6;25318:77;;;25370:9;25365:3;25361:19;25355:26;25346:35;;25318:77;25421:67;25481:6;25474:5;25421:67;:::i;:::-;25415:4;25408:81;25277:222;24612:887;;24642:618;24694:4;24690:9;24682:6;24678:22;24728:37;24760:4;24728:37;:::i;:::-;24787:1;24801:208;24815:7;24812:1;24809:14;24801:208;;;24894:9;24889:3;24885:19;24879:26;24871:6;24864:42;24945:1;24937:6;24933:14;24923:24;;24992:2;24981:9;24977:18;24964:31;;24838:4;24835:1;24831:12;24826:17;;24801:208;;;25037:6;25028:7;25025:19;25022:179;;;25095:9;25090:3;25086:19;25080:26;25138:48;25180:4;25172:6;25168:17;25157:9;25138:48;:::i;:::-;25130:6;25123:64;25045:156;25022:179;25247:1;25243;25235:6;25231:14;25227:22;25221:4;25214:36;24649:611;;;24612:887;;24202:1303;;;24110:1395;;:::o;25511:180::-;25651:32;25647:1;25639:6;25635:14;25628:56;25511:180;:::o;25697:366::-;25839:3;25860:67;25924:2;25919:3;25860:67;:::i;:::-;25853:74;;25936:93;26025:3;25936:93;:::i;:::-;26054:2;26049:3;26045:12;26038:19;;25697:366;;;:::o;26069:419::-;26235:4;26273:2;26262:9;26258:18;26250:26;;26322:9;26316:4;26312:20;26308:1;26297:9;26293:17;26286:47;26350:131;26476:4;26350:131;:::i;:::-;26342:139;;26069:419;;;:::o;26494:410::-;26534:7;26557:20;26575:1;26557:20;:::i;:::-;26552:25;;26591:20;26609:1;26591:20;:::i;:::-;26586:25;;26646:1;26643;26639:9;26668:30;26686:11;26668:30;:::i;:::-;26657:41;;26847:1;26838:7;26834:15;26831:1;26828:22;26808:1;26801:9;26781:83;26758:139;;26877:18;;:::i;:::-;26758:139;26542:362;26494:410;;;;:::o;26910:162::-;27050:14;27046:1;27038:6;27034:14;27027:38;26910:162;:::o;27078:366::-;27220:3;27241:67;27305:2;27300:3;27241:67;:::i;:::-;27234:74;;27317:93;27406:3;27317:93;:::i;:::-;27435:2;27430:3;27426:12;27419:19;;27078:366;;;:::o;27450:419::-;27616:4;27654:2;27643:9;27639:18;27631:26;;27703:9;27697:4;27693:20;27689:1;27678:9;27674:17;27667:47;27731:131;27857:4;27731:131;:::i;:::-;27723:139;;27450:419;;;:::o;27875:191::-;27915:3;27934:20;27952:1;27934:20;:::i;:::-;27929:25;;27968:20;27986:1;27968:20;:::i;:::-;27963:25;;28011:1;28008;28004:9;27997:16;;28032:3;28029:1;28026:10;28023:36;;;28039:18;;:::i;:::-;28023:36;27875:191;;;;:::o;28072:158::-;28212:10;28208:1;28200:6;28196:14;28189:34;28072:158;:::o;28236:365::-;28378:3;28399:66;28463:1;28458:3;28399:66;:::i;:::-;28392:73;;28474:93;28563:3;28474:93;:::i;:::-;28592:2;28587:3;28583:12;28576:19;;28236:365;;;:::o;28607:419::-;28773:4;28811:2;28800:9;28796:18;28788:26;;28860:9;28854:4;28850:20;28846:1;28835:9;28831:17;28824:47;28888:131;29014:4;28888:131;:::i;:::-;28880:139;;28607:419;;;:::o;29032:148::-;29134:11;29171:3;29156:18;;29032:148;;;;:::o;29186:390::-;29292:3;29320:39;29353:5;29320:39;:::i;:::-;29375:89;29457:6;29452:3;29375:89;:::i;:::-;29368:96;;29473:65;29531:6;29526:3;29519:4;29512:5;29508:16;29473:65;:::i;:::-;29563:6;29558:3;29554:16;29547:23;;29296:280;29186:390;;;;:::o;29582:435::-;29762:3;29784:95;29875:3;29866:6;29784:95;:::i;:::-;29777:102;;29896:95;29987:3;29978:6;29896:95;:::i;:::-;29889:102;;30008:3;30001:10;;29582:435;;;;;:::o;30023:225::-;30163:34;30159:1;30151:6;30147:14;30140:58;30232:8;30227:2;30219:6;30215:15;30208:33;30023:225;:::o;30254:366::-;30396:3;30417:67;30481:2;30476:3;30417:67;:::i;:::-;30410:74;;30493:93;30582:3;30493:93;:::i;:::-;30611:2;30606:3;30602:12;30595:19;;30254:366;;;:::o;30626:419::-;30792:4;30830:2;30819:9;30815:18;30807:26;;30879:9;30873:4;30869:20;30865:1;30854:9;30850:17;30843:47;30907:131;31033:4;30907:131;:::i;:::-;30899:139;;30626:419;;;:::o;31051:182::-;31191:34;31187:1;31179:6;31175:14;31168:58;31051:182;:::o;31239:366::-;31381:3;31402:67;31466:2;31461:3;31402:67;:::i;:::-;31395:74;;31478:93;31567:3;31478:93;:::i;:::-;31596:2;31591:3;31587:12;31580:19;;31239:366;;;:::o;31611:419::-;31777:4;31815:2;31804:9;31800:18;31792:26;;31864:9;31858:4;31854:20;31850:1;31839:9;31835:17;31828:47;31892:131;32018:4;31892:131;:::i;:::-;31884:139;;31611:419;;;:::o;32036:98::-;32087:6;32121:5;32115:12;32105:22;;32036:98;;;:::o;32140:168::-;32223:11;32257:6;32252:3;32245:19;32297:4;32292:3;32288:14;32273:29;;32140:168;;;;:::o;32314:373::-;32400:3;32428:38;32460:5;32428:38;:::i;:::-;32482:70;32545:6;32540:3;32482:70;:::i;:::-;32475:77;;32561:65;32619:6;32614:3;32607:4;32600:5;32596:16;32561:65;:::i;:::-;32651:29;32673:6;32651:29;:::i;:::-;32646:3;32642:39;32635:46;;32404:283;32314:373;;;;:::o;32693:640::-;32888:4;32926:3;32915:9;32911:19;32903:27;;32940:71;33008:1;32997:9;32993:17;32984:6;32940:71;:::i;:::-;33021:72;33089:2;33078:9;33074:18;33065:6;33021:72;:::i;:::-;33103;33171:2;33160:9;33156:18;33147:6;33103:72;:::i;:::-;33222:9;33216:4;33212:20;33207:2;33196:9;33192:18;33185:48;33250:76;33321:4;33312:6;33250:76;:::i;:::-;33242:84;;32693:640;;;;;;;:::o;33339:141::-;33395:5;33426:6;33420:13;33411:22;;33442:32;33468:5;33442:32;:::i;:::-;33339:141;;;;:::o;33486:349::-;33555:6;33604:2;33592:9;33583:7;33579:23;33575:32;33572:119;;;33610:79;;:::i;:::-;33572:119;33730:1;33755:63;33810:7;33801:6;33790:9;33786:22;33755:63;:::i;:::-;33745:73;;33701:127;33486:349;;;;:::o;33841:180::-;33889:77;33886:1;33879:88;33986:4;33983:1;33976:15;34010:4;34007:1;34000:15;34027:185;34067:1;34084:20;34102:1;34084:20;:::i;:::-;34079:25;;34118:20;34136:1;34118:20;:::i;:::-;34113:25;;34157:1;34147:35;;34162:18;;:::i;:::-;34147:35;34204:1;34201;34197:9;34192:14;;34027:185;;;;:::o;34218:194::-;34258:4;34278:20;34296:1;34278:20;:::i;:::-;34273:25;;34312:20;34330:1;34312:20;:::i;:::-;34307:25;;34356:1;34353;34349:9;34341:17;;34380:1;34374:4;34371:11;34368:37;;;34385:18;;:::i;:::-;34368:37;34218:194;;;;:::o;34418:176::-;34450:1;34467:20;34485:1;34467:20;:::i;:::-;34462:25;;34501:20;34519:1;34501:20;:::i;:::-;34496:25;;34540:1;34530:35;;34545:18;;:::i;:::-;34530:35;34586:1;34583;34579:9;34574:14;;34418:176;;;;:::o;34600:232::-;34640:3;34659:20;34677:1;34659:20;:::i;:::-;34654:25;;34693:20;34711:1;34693:20;:::i;:::-;34688:25;;34736:1;34733;34729:9;34722:16;;34759:42;34754:3;34751:51;34748:77;;;34805:18;;:::i;:::-;34748:77;34600:232;;;;:::o
Swarm Source
ipfs://d565bff85025ad25f85aeaaef8a5ffcd32c787812ed80dae3985c9856babbcff
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.